01 / 21

GetPosals

A proposal tool I designed and built at CodeBuddy. Thirty flows, twelve days.

Role
Design and build, solo
Company
CodeBuddy
Dates
24 Feb to 11 Mar 2026

The brief

The CEO had seen what I was shipping with AI tools, so he handed me a product and asked me to lead it. Design and build, both.

Thirty flows. Seventy-two hours of work. Twelve days.

I said yes before I did the maths.

The raw input a proposal starts from

The person building the proposal already has useful context in the lead: the company, contact, value, and source material.

The product had to turn that context into a working document without making them enter it all again.

GetPosals lead detail view showing enriched company data for a prospective client, including employee count, revenue, location, and tech stack.
Lead detail, the raw input a proposal starts from

Deciding the foundations once

You cannot design thirty flows in twelve days by starting each one fresh.

The shell and tokens came from IntelBuddy, a product we already had. I pulled brand values straight out of Figma instead of reading hex off a screen, so Brand/800 was #5124B4 because Figma said so, not because it looked close.

What I saved on foundations, I spent on the four screens that actually needed thinking.

GetPosals proposals list view: a table of proposals with status, assignee, value, score, and dates.
The structural pattern the rest of the app inherited

Part one

The ProGenie argument

A split panel versus full-screen chat, settled in one meeting.

The argument

The real question was how much of the source material you should see while the AI writes.

I designed a split panel. The CEO wanted full-screen chat. Cleaner, fewer distractions, and he was not wrong about that.

So I built both.

Chat on the left, the documents on the right, live

ProGenie AI chat mid-conversation on the left, discussing a platform redesign project and budget, next to a live Files sidebar on the right showing a real source document, TechNova discovery notes PDF, plus Links and custom-instructions affordances.
Chat on the left, the documents it is reading on the right, livefig. 03

How it landed

I walked him through one scenario and stopped at the moment the full-screen version produces a budget figure the user does not recognise.

In mine, you glance right and see which document it came from. In his, there is nowhere to look.

He changed his mind in that meeting, and gave me decision authority over the rest of the product.

The rule that came out of it

The AI can draft. It does not decide.

ProGenie takes files, pasted text, links and custom instructions, and every one of them stays visible beside the conversation. What comes out is editable sections, not locked copy you accept or regenerate.

AI is very good at removing the blank page. It should not also remove your ownership of the document.

GetPosals proposal workspace, Workflow Automation tab, showing the automation rule set applied to this proposal.
The same rule, applied automatically downstream

Do not ask twice

A proposal started from a lead already knows the company, the contact, the value, the documents.

So creation asks one question: do you want help, or a blank page.

Not a form. You already told us this.

GetPosals new-proposal entry point reached from a lead's detail page, offering an AI-assisted start instead of a blank form.
Starting from what is already known, not a blank form

Moving my own favourite thing out of the way

On 30 March I demoted the feature I was proudest of.

The overview opened with the AI summary and a row of insight cards. It was the most impressive thing on the page, which is why I had put it first.

Sitting with it, the order was wrong. Someone opening a proposal wants the lead, the scope, the team, the money.

The best part of the page was not the part anyone needed first.

Before and after: the assistant moves into its own tab

Before
Before: AI summary pinned across the top. Drawn, as no screenshot of this state survives
After
GetPosals proposal workspace, AI Assistant tab, showing the assistant now living as one tab among several rather than sitting above the page.
After: same assistant, moved into its own tab

Part two

Shipping the back end

Real data, real bugs, and a mobile width that had to hold.

I built the back end too

Hono on Cloudflare Workers, D1 across nine tables, R2 for files, Gemini for generation.

These figures are computed from real proposal and lead data. Nothing on this screen is mocked.

GetPosals analytics dashboard showing live-calculated pipeline, trend, stage, source, and team performance data.
Pipeline, trend and team performance, all computed

Two decisions I would defend

Two decisions I would defend.

The data layer tries D1 and falls back to localStorage, so the interface survives the API being down.

And on 11 March the Gemini key moved out of the source and into a Worker secret. Quiet to fix early, embarrassing to fix late.

GetPosals proposal workspace, Finance tab, showing calculated financial breakdown for the proposal.
The same computation, surfaced per proposal

Then I broke it on purpose

A race condition sending anyone who opened a deck straight back to onboarding. A hooks-order crash in the proposal detail. Statistics falling over on a proposal nobody had viewed yet.

Five bugs, fixed, with a 53-test automated pass behind them.

There was nobody to hand it to, so I kept going.

It had to hold at 390 pixels too

GetPosals proposal workspace rendered at 390px mobile width, Overview tab.

Proposal workspace at 390

GetPosals ProGenie chat rendered at 390px mobile width, empty-state greeting.

ProGenie at 390

Thirty flows became one working product

In twelve days, the work moved from a lead brief to a connected proposal product with a real Cloudflare data layer, Gemini generation, responsive mobile flows and a 53-test pass.

The clearest qualitative outcome was trust: after the ProGenie review, the CEO gave me decision authority over the rest of the product.

GetPosals dashboard showing stat tiles for leads, active proposals, pipeline value, and win probability, alongside recent activity.
The connected system at the end of the twelve-day build

What I took from it

Fast projects make it easy to polish one screen at a time.

The quality lives between the screens. What context survives the jump, what you are offered next, and whether the document still feels like yours.

The CEO scenario review validated the product direction, and 53 automated tests validated technical behaviour. I did not run an end-user usability study in the twelve-day build; that is the next evidence I would add.

Built with

Frontend
React, Vite, TypeScript
Styling
Tailwind CSS
Back end
Hono on Cloudflare Workers, D1, R2
AI
Gemini
Export
pdf-lib
Made with
Figma and Figma Make, Codex, Cursor, GitHub Copilot, Claude Code. I pick the tool per phase, not per project.

Thanks for walking through it

Dhrumil Kherde, product designer.

dhrumilkherde.com