What I built, what I left out, and why
The requirements were to show how I approach building with AI: speed, thought process, UX and UI. I used Higgsfield first, then picked the one loop that matters most to a first-time visitor (type an idea, get an image) and made it work with no account and no dead ends.
Deliberately not built
Auth and account setup
No sign-up flow (Supabase, Convex, Clerk or similar). The brief asks for a live link that works for someone who isn't signed in as me, and Higgsfield's biggest friction is gating the first result behind an account. So the first result comes before any account.
Stripe and a credit-based system
No payments, credit ledger or paywall. Billing is a product of its own, and it adds nothing to a reviewer's first minute.
A paid default model
I don't have a paid Gemini key, and Gemini has no free API tier for image models. So the default is a keyless free model, with clearly labelled Demo images when it's busy, and Gemini is bring-your-own-key.
So I built bring-your-own-key instead
- Visitors paste their own Gemini key to unlock Google's Nano Banana models at Google's price, with no credit markup.
- The key goes from the visitor's browser straight to Google. It is never sent to Lumen's server.
- It is kept for the current tab only, unless "Remember on this device" is ticked.
- A bad key or missing quota shows Google's own message and a way to fix it, not a dead end.
If accounts and billing were in scope, I'd add
Google OAuth
One-click sign-in (Supabase Auth or Convex + Auth.js), offered only after the first free result, never before it.
Accounts page
Profile, saved keys and usage history, with generations stored server-side so history follows the account across devices.
Tier-based system
Free, Pro and Max tiers backed by Stripe subscriptions and a credit ledger, with the price shown before generating, not after.
Rate limiting
Per-user and per-IP limits at the API route (for example Upstash Redis with a sliding window), returning Retry-After so the UI can count down.
Throttling
A queue with per-tier concurrency, so bursts are smoothed instead of rejected, and paid tiers get priority without starving free users.