A.O.Akinloluwa Olumuyide, home

LiveDemo client

AI app · 2026

Proposal app with human approval

Sales notes in, a client-ready proposal out, with price and timeline taken from the template, never generated.

The number

2 of 6

sections the model never writes: price and timeline

Role
Built end to end: spec, build, deploy
Timeline
2026
Stack
Next.js · Vercel · Supabase Postgres · Anthropic API · Resend · Magic-link sign-in

Watch the walkthroughLive app (opens in a new tab)Repository (opens in a new tab)

the walkthroughWatch on Google Drive (opens in a new tab)Open the live app (opens in a new tab)

The problem

Proposals took too long to write, and how good they were depended on who wrote them.

A salesperson has notes from a discovery call. They need a client-ready proposal, and a second person has to approve it before the client sees it.

  • No invented prices or dates
  • Nobody approves their own work

What I asked first

The brief left these open. I decided each one in the design doc before building.

  1. Does the approver have to be someone else? The brief doesn't require two people. I did it anyway: approving your own proposal is theatre.
  2. Should the salesperson fill in a form? A form with eleven fields made them write the proposal themselves. So it's notes in, fields pulled out, and they confirm each one beside the phrase it came from.
  3. Who writes the price and the timeline? Nobody generates them. They're filled in from the confirmed fields, so the model can't invent a price or a date.
  4. What happens when an approved proposal needs a change? It's frozen. An edit makes a new version, and the approved one stays exactly as it was approved.
  5. What if a file arrives after the writing? Every section written before it is marked with the file's name and gets a rewrite button. Nothing rewrites itself.

How it runs

Proposal app with human approval · 8 steps
  • Person
  • AI
  • Code
  • Result
  1. Intake

    01, Human:

    Call notes in

    Salesperson

    Notes from the discovery call, and any files.

  2. 02, AI:

    Fields pulled out

    Sonnet

    Each one shows the phrase it came from.

  3. 03, Human:

    Salesperson confirms

    Salesperson

    Nothing is fixed until they do.

  4. Write

    04, AI:

    Sections written

    Sonnet

    Four sections, one at a time, in order.

  5. 05, Code:

    Price and timeline filled in

    Template

    From the confirmed fields, never the model.

  6. 06, Human:

    Salesperson revises

    Salesperson

    Any section can be rewritten, up to five times.

    Then: step 4 (rewrite a section); step 7.

  7. Approve and send

    07, Human:

    Someone else approves

    Approver

    Or sends it back with a note.

  8. 08, Output:

    Sent and logged

    Resend

    Once per version, however often Send is pressed.

Enforced, not requested

  1. The writer can't approve A second person approves. The server checks, not just the screen.
  2. Prices and dates come from the form A written section with a price or date that isn't in the confirmed fields is rejected.
  3. Approved means frozen An edit makes a new version. The approved one never changes.
  4. One delivery per version Pressing Send twice can't deliver twice. The database holds that rule.
  5. An old version can't be sent Once there's a newer one, the older one has no Send button.
  6. Late changes are flagged A section written before a field changed, or a file arrived, says what changed.
  7. Spend has a ceiling 60 AI calls an hour across everyone, and five rewrites per section.

The thing that nearly got past me

Incident

The Send button was live on an out-of-date proposal

An approved proposal is frozen, so any change makes a new version. But the old version stayed approved, and its Send button still worked long after the new one became the real work. The client's link always shows the latest version sent, so sending the old one would have pulled everyone holding that link back to it.

The fixA version with a newer one can't be sent. It shows no Send button at all, just a link to the current version, and the server refuses it too.

The build, in numbers

  • 2 of 6

    sections the model never writes: the price and the timeline

  • 2

    people on every proposal. Whoever writes it can't approve it.

  • 1

    delivery per approved version, however often Send is pressed

  • 60

    AI calls an hour across every user, so a public demo can't run up a bill

  • 5

    rewrites per section, at most

From the design, as built.

What it refuses to do

  • Invent a price or a date They're filled in from what the salesperson confirmed.
  • Let the writer approve their own proposal A different person has to.
  • Send the same version twice One delivery per version, however often Send is pressed.
  • Email a stranger from the demo In demo mode, every email goes to one set address.

What I took from it

An approval by the person who wrote it is theatre. I build the control, not the look of one.

The limit I'd fix first

if I did it again

  • There's no PDF export and no e-signature. The client reads the proposal as a web page.

Check it yourself

Contact

Got a messy problem?

Tell me what's broken, or what your team keeps doing by hand. Hiring? Tell me about the role. Or just book a call.