Lessons from Lovable

Bouncing between Lovable and Claude. Lessons from vibe-coding two mobile betting apps.

AI-Augmented prototyping, UI, UX, Information Architecture
At a similar time, I had my first baby, the FIFA World Cup was kicking off, and I was organising a stag party for my brother.

Using Lovable with Claude, I made 2 web apps:

World Cup Sweepstakes

Mobile-first app following the World Cup live, with a custom-rules sweepstake league built on top.

Betting at Mondello

A mobile-first betting pool app built for a group of friends at a live rallycross event.

Here's the stack:

1
Lovable
AI app builder, generates React from natural language prompts. Uses Supabase as a backend.
2
Supabase
Lovable’s backend, Postgres database, Edge Functions, pg_cron
3
Claude
Requirements gathering, prompt writing, debugging partner

Workflow

Both apps were built for mobile, and almost entirely by mobile, since one hand was occupied feeding or settling my newborn son in the early hours of days. Voice memos into Claude initially led to a structured requirements doc in Google Drive. I also planned build phases with Claude before touching Lovable. Batching changes using Claude to write the prompts saved credits and produced better output than one-at-a-time prompting in Lovable. 

Claude was also my debugging partner: writing SQL queries to paste into Supabase. In the World Cup Sweepstakes app, this included diagnosing live match status bugs, tracking a silent data-wipe bug caused by a blanket upsert overwriting manual card data every 5 minutes.

I just needed to understand the problem clearly enough to explain it.

Feature Browser

Use the feature browser below to check out some of the results.

Browse all 73 features
Browse all 73 features
Randomised test data generation
Simulator for testing
Constrained results entry
Configurable payout weights
Explicit delete-event confirmation
Multi-event architecture
Hidden admin entry point
Settled/Unsettled toggle & indicator
Player breakdown overlay (Spent/Won/Net)
Revolut-ready settlement instructions
Post-results breakdown
Dynamic payout model explainer
No car validation by design
Already-backed-car guardrail toast
Quick-select car pills + manual entry
Top-anchored drawer pattern
Clear "Add your bet" CTA
"Your bets" indication on race cards
Automatic, date-aware race closing
Clear status states per race
Tab navigation
Subtle settings entry point
Switch Player for shared devices
Event-scoped identity persistence
Name-based login, no accounts
Custom bracket-resolution logic
Silent data-loss bug via blanket upsert
Zero-dependency emoji flags
Irish timezone normalisation
Live match indicator
Manual card/booking entry workflow
Per-match point distribution breakdown
Remaining-teams count
"Currently…" bonus status indicators
Weighted Dirtiest Team ranking
Bonus leaderboard drawers
Redesigned Player Breakdown modal
Cross-group qualification highlighting
Dual group navigation
Penalty shootout score formatting
Eliminated-team visual treatment
Group Standings floating button
Jump to Latest floating button
Tap-to-open match analysis
Per-fixture rich display
Bracket-aware knockout grouping
Nested round segmented control
Stage-based pill filtering
Fixtures-first landing tab
Four-tab navigation shell
Feature Browser
Close
Worldcup Sweepstakes 2026
Betting at Mondello
Information Architecture
QA
Debugging
Testing
Security
Admin
Product Thinking
Logic
Copy
Design System
Technical
Polish
Data
Backend
Interaction
UI
UX
Name-based login, no accounts
Onboarding & Identity
No sign-up, no passwords. On first visit a player picks their name from the current Event's player list — removes all account-management overhead for a closed-group, occasional-use app.
UX
https://cdn.prod.website-files.com/673a35901c2243457712fd2c/6a8168952dfe53624a98ece3_Screen%20Recording%202026-08-16%20at%2007.19.09_mp4.mp4
Fixtures-first landing tab
Navigation & Structure
The highest-frequency use case — checking today's or live scores — is the first thing you see on open.
UX
https://cdn.prod.website-files.com/673a35901c2243457712fd2c/6a8043dde93dbeea5826b820_Screen%20Recording%202026-08-14%20at%2022.20.42_mp4.mp4
Event-scoped identity persistence
Onboarding & Identity
The chosen name is cached in local storage, keyed to the current Event's ID. If the admin switches which Event is live, the app detects the mismatch and re-prompts — preventing someone being silently logged in as the wrong player.
UX
Backend
Data
https://cdn.prod.website-files.com/673a35901c2243457712fd2c/6a81689b379aff3b206bad1b_ScreenRecording_08-16-2026%2007-15-51_1_mp4.mp4
Nested round segmented control
Fixtures & Results
A second-level filter inside the stage pills (R1/R2/R3 within Group Stage; QF/SF/F within Finals) so the list never has to show every match in a stage at once.
UX
Interaction
https://cdn.prod.website-files.com/673a35901c2243457712fd2c/6a804d1ee93dbeea58281457_Screen%20Recording%202026-08-14%20at%2022.46.15_mp4.mp4
Bracket-aware knockout grouping
Fixtures & Results
The two fixtures feeding a shared next-round slot are visually grouped in one container. Required custom backend infrastructure — a bracket_slots table and slot-resolution logic — since the source API has no concept of bracket position.
UX
Backend
Data
https://cdn.prod.website-files.com/673a35901c2243457712fd2c/6a804d27d2bce427c137e70b_Screen%20Recording%202026-08-14%20at%2022.49.21_mp4.mp4
Tap-to-open match analysis
Fixtures & Results
Any completed or live fixture opens its full analysis in a modal directly from the list, rather than a separate navigation step.
UX
Interaction
https://cdn.prod.website-files.com/673a35901c2243457712fd2c/6a804d430ffe83c819971f1a_Screen%20Recording%202026-08-14%20at%2022.52.51_mp4.mp4
Jump to Latest floating button
Fixtures & Results
Scrolls straight to today's/most recent matches so nobody has to manually scroll a 104-match list. Hides itself once that boundary is already in view, and stops the neighbouring button expanding into the gap.
UX
Interaction
https://cdn.prod.website-files.com/673a35901c2243457712fd2c/6a804d49e13ef13a2c1b3d50_Screen%20Recording%202026-08-14%20at%2023.14.21_mp4.mp4
Automatic, date-aware race closing
Race List & Status
Races close the instant their scheduled time passes, combining the race's time with the Event's actual date. An early version ignored the Event date, meaning triggers could fire on the wrong day.
Backend
Logic
https://cdn.prod.website-files.com/673a35901c2243457712fd2c/6a8168b32df4a6e465297d7e_Screen%20Recording%202026-08-16%20at%2007.37.35_mp4.mp4
Eliminated-team visual treatment
Fixtures & Results
Strikethrough, muted/desaturated colour, and reduced opacity applied the moment a team is out, so tournament progress is communicated visually without reading every result.
UI
UX
"Your bets" indication on race cards
Race List & Status
Lets a player see at a glance which of their own bets are riding on a given race — identified as a UX gap, not something Lovable surfaced unprompted.
UX
https://cdn.prod.website-files.com/673a35901c2243457712fd2c/6a8168ba21e78077738af05e_Screen%20Recording%202026-08-16%20at%2007.42.04_mp4.mp4
Clear "Add your bet" CTA
Betting Flow
Full-width, unmissable 'Add your bet' button.
UX
UI
https://cdn.prod.website-files.com/673a35901c2243457712fd2c/6a8168c57f709160fa72a698_Screen%20Recording%202026-08-16%20at%2007.45.14_mp4.mp4
Dual group navigation
Group Standings Modal
Swipe between groups, or jump straight to one via a horizontal pill selector — supports both sequential browsing and direct lookup.
UX
Interaction
https://cdn.prod.website-files.com/673a35901c2243457712fd2c/6a80a939e93dbeea5837290b_Screen%20Recording%202026-08-15%20at%2013.29.15_mp4.mp4
Top-anchored drawer pattern
Betting Flow
Add Bet/Player/Race/Event opens from the top of the screen rather than a centred modal — chosen specifically to stop the mobile keyboard covering the form, a bug hit with the original pattern.
UX
Interaction
https://cdn.prod.website-files.com/673a35901c2243457712fd2c/6a8168cf1c4e4e5a87b48ee7_Screen%20Recording%202026-08-16%20at%2008.33.05_mp4.mp4
Quick-select car pills + manual entry
Betting Flow
Every car already backed appears as a tappable pill. A numeric input below lets a player bet on a car with no pill yet. Pill and manual entry are mutually exclusive.
UI
Interaction
https://cdn.prod.website-files.com/673a35901c2243457712fd2c/6a8168d8d2bce427c15c24f8_Screen%20Recording%202026-08-16%20at%2007.55.06_mp4.mp4
Redesigned Player Breakdown modal
Leaderboard
Reworked mid-project from a split view into a single chronological list with bonus points pinned to the top, so a player sees their headline achievements before scrolling into individual match contributions.
UX
https://cdn.prod.website-files.com/673a35901c2243457712fd2c/6a80a94afd8dc3da5c97820c_Screen%20Recording%202026-08-15%20at%2013.31.16_mp4.mp4
Already-backed-car guardrail toast
Betting Flow
Tapping a pill for a car you've already backed surfaces 'You've already bet on this car' — a small guardrail against duplicate bets.
UX
Interaction
https://cdn.prod.website-files.com/673a35901c2243457712fd2c/6a8168e41aedb0161f810500_Screen%20Recording%202026-08-16%20at%2007.56.52_mp4.mp4
Bonus leaderboard drawers
Leaderboard
Dirtiest Team and Heaviest Defeat rankings, reachable directly from their rule descriptions on the Rules tab and through the main leaderboard.
UX
Interaction
https://cdn.prod.website-files.com/673a35901c2243457712fd2c/6a80a95984c3f3b8a26d769e_Screen%20Recording%202026-08-15%20at%2017.44.08_mp4.mp4
No car validation by design
Betting Flow
Betting doesn't check entered car numbers against a real car list. A deliberate simplicity trade-off, covered by the disclaimer — not an oversight.
Product Thinking
Data
"Currently…" bonus status indicators
Remaining-teams count
Team Assignments
Each participant's accordion header shows how many of their eight teams are still alive, so status is visible without expanding every section.
UX
UI
Revolut-ready settlement instructions
Leaderboard
Tells each player how much to send or expect back — 'Withdraw €X' in green or 'Add €X' in red — with a brief explanation of the Revolut group mechanic.
UX
Data
Manual card/booking entry workflow
Match Analysis Modal
Yellow and red card stepper inputs per team, saving to Supabase immediately — built because discipline data is paywalled across every free-tier API investigated. 'Bookings saved' confirmation animates in from the bottom, matching where the floating pills sit on other tabs — a small detail kept consistent across the whole app.
UX
Backend
https://cdn.prod.website-files.com/673a35901c2243457712fd2c/6a80a98c03ff3bd567b5ebcc_Screen%20Recording%202026-08-15%20at%2018.28.59_mp4.mp4
Live match indicator
Polish
A pulsing green dot on live matches is the only motion in an otherwise static UI — added to stop the interface feeling flat, while respecting prefers-reduced-motion.
UI
Interaction
Irish timezone normalisation
Zero-dependency emoji flags
Polish
Used throughout instead of image assets — renders correctly across iOS and modern browsers with no extra loading time or licensing considerations.
UI
Technical
https://cdn.prod.website-files.com/673a35901c2243457712fd2c/6a80a9dc8e351d6e5e102f4e_Screen%20Recording%202026-08-15%20at%2018.37.06_mp4.mp4
Silent data-loss bug via blanket upsert
Engineering
The polling Edge Function was overwriting manually entered card data on every sync because it wrote every column instead of only the ones it owned. Fixed with an explicit column list.
Backend
Data
Hidden admin entry point
Admin
Admin reached via the settings menu rather than a login wall — security through obscurity, judged right for a small known group. PIN discussed and shelved: risk of locking out the Master Admin on race day judged worse than the risk of a friend snooping.
Product Thinking
Security
Explicit delete-event confirmation
Admin
Deleting an Event triggers a plainly-worded warning about permanent data loss, with a destructive red button against a Cancel — sized to match how much data one delete actually removes.
UX
Copy
Configurable payout weights
Admin
The 1st/2nd/3rd weighting is editable per Event, with a confirmation modal that adds a warning if bets already exist — and triggers a full recalculation of all historical payouts on confirm.
Backend
Data
UX
https://cdn.prod.website-files.com/673a35901c2243457712fd2c/6a8168f02dfe53624a98f6f9_Screen%20Recording%202026-08-16%20at%2008.16.03_mp4.mp4
Constrained results entry
Admin
When entering 1st/2nd/3rd, admin only sees car numbers actually backed in that race — cutting out invalid entries by construction rather than by validation after the fact.
UX
Data
https://cdn.prod.website-files.com/673a35901c2243457712fd2c/6a8168f858006f0f46bab58d_Screen%20Recording%202026-08-16%20at%2008.18.10_mp4.mp4
Simulator for testing
Simulator
Rather than a separate tool, the Simulator is a secondary link inside the Add Event drawer — extends the same form with additional fields so it never competes with the primary 'just add an event' path.
UX
Interaction
https://cdn.prod.website-files.com/673a35901c2243457712fd2c/6a816903e13ef13a2c3e9b45_Screen%20Recording%202026-08-16%20at%2007.32.58_mp4.mp4
This is some text inside of a div block.

Feature title

This is some text inside of a div block.

Description copy.

Features Browser
Close
World Cup Sweepstakes
Betting at Mondello
Information Architecture
QA
Debugging
Testing
Security
Admin
Product Thinking
Logic
Copy
Design System
Technical
Polish
Data
Backend
Interaction
UI
UX
Name-based login, no accounts
UX

No sign-up, no passwords. On first visit a player picks their name from the current Event's player list — removes all account-management overhead for a closed-group, occasional-use app.

https://cdn.prod.website-files.com/673a35901c2243457712fd2c/6a8168952dfe53624a98ece3_Screen%20Recording%202026-08-16%20at%2007.19.09_mp4.mp4
Fixtures-first landing tab
UX

The highest-frequency use case — checking today's or live scores — is the first thing you see on open.

Event-scoped identity persistence
UX
Backend
Data

The chosen name is cached in local storage, keyed to the current Event's ID. If the admin switches which Event is live, the app detects the mismatch and re-prompts — preventing someone being silently logged in as the wrong player.

https://cdn.prod.website-files.com/673a35901c2243457712fd2c/6a81689b379aff3b206bad1b_ScreenRecording_08-16-2026%2007-15-51_1_mp4.mp4
Nested round segmented control
UX
Interaction

A second-level filter inside the stage pills (R1/R2/R3 within Group Stage; QF/SF/F within Finals) so the list never has to show every match in a stage at once.

Bracket-aware knockout grouping
UX
Backend
Data

The two fixtures feeding a shared next-round slot are visually grouped in one container. Required custom backend infrastructure — a bracket_slots table and slot-resolution logic — since the source API has no concept of bracket position.

Tap-to-open match analysis
UX
Interaction

Any completed or live fixture opens its full analysis in a modal directly from the list, rather than a separate navigation step.

https://cdn.prod.website-files.com/673a35901c2243457712fd2c/6a804d430ffe83c819971f1a_Screen%20Recording%202026-08-14%20at%2022.52.51_mp4.mp4
Jump to Latest floating button
UX
Interaction

Scrolls straight to today's/most recent matches so nobody has to manually scroll a 104-match list. Hides itself once that boundary is already in view, and stops the neighbouring button expanding into the gap.

Automatic, date-aware race closing
Backend
Logic

Races close the instant their scheduled time passes, combining the race's time with the Event's actual date. An early version ignored the Event date, meaning triggers could fire on the wrong day.

https://cdn.prod.website-files.com/673a35901c2243457712fd2c/6a8168b32df4a6e465297d7e_Screen%20Recording%202026-08-16%20at%2007.37.35_mp4.mp4
Eliminated-team visual treatment
UI
UX

Strikethrough, muted/desaturated colour, and reduced opacity applied the moment a team is out, so tournament progress is communicated visually without reading every result.

"Your bets" indication on race cards
UX

Lets a player see at a glance which of their own bets are riding on a given race — identified as a UX gap, not something Lovable surfaced unprompted.

https://cdn.prod.website-files.com/673a35901c2243457712fd2c/6a8168ba21e78077738af05e_Screen%20Recording%202026-08-16%20at%2007.42.04_mp4.mp4
Clear "Add your bet" CTA
UX
UI

Full-width, unmissable 'Add your bet' button.

https://cdn.prod.website-files.com/673a35901c2243457712fd2c/6a8168c57f709160fa72a698_Screen%20Recording%202026-08-16%20at%2007.45.14_mp4.mp4
Dual group navigation
UX
Interaction

Swipe between groups, or jump straight to one via a horizontal pill selector — supports both sequential browsing and direct lookup.

https://cdn.prod.website-files.com/673a35901c2243457712fd2c/6a80a939e93dbeea5837290b_Screen%20Recording%202026-08-15%20at%2013.29.15_mp4.mp4
Top-anchored drawer pattern
UX
Interaction

Add Bet/Player/Race/Event opens from the top of the screen rather than a centred modal — chosen specifically to stop the mobile keyboard covering the form, a bug hit with the original pattern.

https://cdn.prod.website-files.com/673a35901c2243457712fd2c/6a8168cf1c4e4e5a87b48ee7_Screen%20Recording%202026-08-16%20at%2008.33.05_mp4.mp4
Quick-select car pills + manual entry
UI
Interaction

Every car already backed appears as a tappable pill. A numeric input below lets a player bet on a car with no pill yet. Pill and manual entry are mutually exclusive.

Redesigned Player Breakdown modal
UX

Reworked mid-project from a split view into a single chronological list with bonus points pinned to the top, so a player sees their headline achievements before scrolling into individual match contributions.

https://cdn.prod.website-files.com/673a35901c2243457712fd2c/6a80a94afd8dc3da5c97820c_Screen%20Recording%202026-08-15%20at%2013.31.16_mp4.mp4
Already-backed-car guardrail toast
UX
Interaction

Tapping a pill for a car you've already backed surfaces 'You've already bet on this car' — a small guardrail against duplicate bets.

Bonus leaderboard drawers
UX
Interaction

Dirtiest Team and Heaviest Defeat rankings, reachable directly from their rule descriptions on the Rules tab and through the main leaderboard.

No car validation by design
Product Thinking
Data

Betting doesn't check entered car numbers against a real car list. A deliberate simplicity trade-off, covered by the disclaimer — not an oversight.

"Currently…" bonus status indicators
UX
Data

The four live-tracked bonus categories show their current leader directly on the Rules tab, with no separate view needed.

Remaining-teams count
UX
UI

Each participant's accordion header shows how many of their eight teams are still alive, so status is visible without expanding every section.

Revolut-ready settlement instructions
UX
Data

Tells each player how much to send or expect back — 'Withdraw €X' in green or 'Add €X' in red — with a brief explanation of the Revolut group mechanic.

Manual card/booking entry workflow
UX
Backend

Yellow and red card stepper inputs per team, saving to Supabase immediately — built because discipline data is paywalled across every free-tier API investigated. 'Bookings saved' confirmation animates in from the bottom, matching where the floating pills sit on other tabs — a small detail kept consistent across the whole app.

Live match indicator
UI
Interaction

A pulsing green dot on live matches is the only motion in an otherwise static UI — added to stop the interface feeling flat, while respecting prefers-reduced-motion.

Irish timezone normalisation
UX

All match times converted to Irish time — removes mental timezone conversion for the actual users of the app.

Zero-dependency emoji flags
UI
Technical

Used throughout instead of image assets — renders correctly across iOS and modern browsers with no extra loading time or licensing considerations.

https://cdn.prod.website-files.com/673a35901c2243457712fd2c/6a80a9dc8e351d6e5e102f4e_Screen%20Recording%202026-08-15%20at%2018.37.06_mp4.mp4
Silent data-loss bug via blanket upsert
Backend
Data

The polling Edge Function was overwriting manually entered card data on every sync because it wrote every column instead of only the ones it owned. Fixed with an explicit column list.

Hidden admin entry point
Product Thinking
Security

Admin reached via the settings menu rather than a login wall — security through obscurity, judged right for a small known group. PIN discussed and shelved: risk of locking out the Master Admin on race day judged worse than the risk of a friend snooping.

Explicit delete-event confirmation
UX
Copy

Deleting an Event triggers a plainly-worded warning about permanent data loss, with a destructive red button against a Cancel — sized to match how much data one delete actually removes.

Configurable payout weights
Backend
Data
UX

The 1st/2nd/3rd weighting is editable per Event, with a confirmation modal that adds a warning if bets already exist — and triggers a full recalculation of all historical payouts on confirm.

Constrained results entry
UX
Data

When entering 1st/2nd/3rd, admin only sees car numbers actually backed in that race — cutting out invalid entries by construction rather than by validation after the fact.

https://cdn.prod.website-files.com/673a35901c2243457712fd2c/6a8168f858006f0f46bab58d_Screen%20Recording%202026-08-16%20at%2008.18.10_mp4.mp4
Simulator for testing
UX
Interaction

Rather than a separate tool, the Simulator is a secondary link inside the Add Event drawer — extends the same form with additional fields so it never competes with the primary 'just add an event' path.

While we're on the topic of AI workflows, it's worth pausing here to discuss the development of the browser above.

Since Claude had all of the context for the 2 web apps, I had it generate a features list in a Google Doc and build and populate the backend in Webflow. 73 items written and uploaded in minutes; very satisfying!

I had Claude build the frontend with the help of markdown/skill files for Lumos (Webflow framework) and my variable values. The beautiful difference here is that, unlike Lovable, Webflow offers the granular frontend control.

Read more
Show less

The Verdict? 

Lovable and Claude continue to impress. I loved the workflow. Idea to working prototype is insanely fast. Admitedly, the initial pass at the UI for both apps was tacky, but it just took one (detailed) prompt to achieve for a clean, minimal UI that I was happy enough with. Then I could really leverage the speed of idea to development to iterate fast and layer on UX enhancements.

The iterative loop: Prompt it, use it, identify gaps, fix it, repeat. Fast and satisfying. 

I'm not the first to say it, but this is how it is:

  • AI app builders are excellent for personal projects and prototyping. Not finished product quality without serious refinement.
  • They get you to ~80–90% fast. Very fast. The last 10–20% is where design intuition matters most.

Some of the drawbacks: 

  • The lack of granular UI control is frustrating. Credits spent on small visual tweaks felt wasteful. 
  • Component (and code in general) reuse is a problem (e.g. same segmented control built twice as separate components)
  • I've not dug deep, but presumably the underlying code quality is untidy. 

The industry is changing, so are our roles. Thankfully, I feel more valuable than ever.

Reflection

There's a lot of concern about the future of design. Playing with Lovable made me feel like I know lots of valuable sh*t. When the web was built only by developers, it took some time to realise there was a huge space for designers to step in and occupy, congribute and improve things. More time revealed that we could benefit from specialist designers in UX, UI, motion, copy and so much more. Now, it feels to me like the pendulum is almost swinging back again. With AI by our sides, individuals with a broader reach and less depth, can achieve so much more. UX instinct, UI sensibility, and a surface technical understanding, can build today what would have needed a full team of specialists only a couple of years ago. 

The output might need a technical review but I’m talking from the design point of view here and it’s very exciting.

More Projects

Screenshot of Orla Kelly's portfolio homepage
Orla Kelly Artist Portfolio
Melissa O'Donnell Artist Portfolio
Abstract motion graphic thumbnail showing geometric shapes and patterns used for Demo 2025.
Demo: Design in Motion Festival