01 / 18

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 brief, the raw input

Everything starts from a lead, with whatever is already known about the company sitting in it.

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 fromfig. 01

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 inheritedfig. 02

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.

The argument, ProGenie split panel

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

The argument, 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 downstreamfig. 04

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 formfig. 05

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.

Moving my own favourite thing out of the way, before and after

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

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 computedfig. 07

I built the back end too, two decisions

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 proposalfig. 07

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.

Then I broke it on purpose, and it had to hold at 390

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

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.

GetPosals dashboard showing stat tiles for leads, active proposals, pipeline value, and win probability, alongside recent activity.
The whole system, in one viewfig. 09

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

dhrumilkherde.com