Every small business that wants to sell to the federal government gets the same advice:
"You need a capability statement."
A capability statement is a one-page résumé for your company: what you do, your NAICS codes, your certifications, your past performance, and why a contracting officer should care. It's often the first thing a buyer sees. Sometimes it's the only thing.
And almost every small business I've worked with in about 12 years of federal contracting has one of two versions:
1 None, or
2 A Word doc from 2019 with a stretched logo and the phrase "synergistic solutions."
So I built Capability Statement Studio: answer a few questions, and get a polished, one-page, federal-ready PDF. I launched it on Product Hunt for the Google Cloud Run Hackathon. Here's how it went, including the parts that went sideways.
What it does
You sit through a short interview (yes, an AI interviews you, which is the most 2026 sentence I've ever written). It asks about your business, your certifications, your codes, and your past work. Then you watch your statement get written in real time, and you download a one-page PDF.
There's no "a human will review your submission in 3–5 business days." The PDF is the product. That turned out to matter a lot.
The stack
• Frontend: React
• API: Express, in a pnpm monorepo
• Database: Postgres via Drizzle ORM, hosted on Neon
• Auth: Clerk
• AI: Claude (Sonnet 4.6) through the Anthropic SDK
• PDFs: PDFMonkey, with a Liquid template
• Hosting: Google Cloud Run, auto-deployed from GitHub through Cloud Build
I prototyped in Replit, pushed to GitHub, and pointed a Cloud Build trigger at my launch branch. Every sync rebuilds the Docker image and ships a new revision in about 10 minutes. It's the closest I've come to feeling like a real DevOps person, and I'm not one.
Three agents, one job
The engine is a small pipeline of three Claude-powered roles:
• Discovery runs the interview and figures out what's missing.
• Writer drafts the four core sections: overview, core competencies, differentiators and past performance.
• Auditor checks the draft before anything reaches the page.
Splitting it up this way made each prompt simpler and each failure easier to find. When something was wrong, I could usually tell which agent got confused, instead of staring at one giant prompt like it owed me money.
The prompts live in the database with version numbers, which felt very grown-up until it bit me in production. More on that below.
The PDF fight
Here's the part nobody warns you about: the AI was the easy part. The formatting nearly killed me.
The first version "downloaded" a PDF by opening the browser's print dialog. Technically a PDF. Spiritually a crime scene. Margins wandered. Sections spilled onto page two. It looked like a capability statement that had been through a car wash.
The fix was moving PDF generation to the server with PDFMonkey, and treating the layout like a real design system instead of a webpage that happens to print:
• 8 pt is a hard floor. Spacing compresses first, and text only shrinks after that. If it still can't fit legibly, the download is blocked with a clear explanation instead of quietly cutting content.
• One page, enforced. There's a height check before download, because "page 2 of your one-page statement" is not a vibe.
• Nothing gets silently dropped. I wrote a completeness check that makes sure every item the customer supplied actually appears in the final PDF.
• Palettes are data, not hard-coded colors. There are presets like Midnight Navy and Gold, plus a custom color with a contrast check, and the customer can always override it.
The bug that would have embarrassed me in front of a contracting officer
While testing, I found that a customer could select SDVOSB, confirm it, then add HUBZone, and every certification would vanish from the PDF. No warning. Just gone.
The cause was very small and very human. Adding or removing a certification unchecked the "I confirm these are accurate" box, and the PDF only prints certifications when that box is checked. The download gate never asked about it.
For a lot of small businesses, those certifications are the whole point of the statement. So the fix keeps the confirmation unless a certification is actually removed, adds a gate item for unconfirmed certifications, and shows exactly which certification badges will print.
I tested it in a bunch of different click orders, because users will always find the one order you didn't test.
Deploying to Cloud Run: a comedy in five errors
Cloud Run itself was great. My ability to paste environment variables correctly at 2 AM was not.
1 "DATABASE_URL must be set." My first deploy had zero environment variables. Bold strategy. Fix: Edit & deploy new revision, then add them.
2 The Anthropic client crashed on startup because the base URL variable was missing.
3 ERR_INVALID_URL. I'd pasted Neon's connection string with the psql '…' wrapper still around it. Read what you paste, friends.
4 The interview kept saying "I couldn't add that just now." The new Neon database had no prompts in it. Remember the versioned prompts living in the database? Yeah. Fix: a seed SQL script with the current Discovery, Writer and Auditor versions. Lesson: if your prompts live in the database, your deploy checklist has to include the database.
5 How I finally debugged all of it: Cloud Run → Observability → Logs. Widen the time range, then read the red and orange lines like tea leaves.
A smaller gotcha: Neon wanted the direct connection, not the pooled one, with sslmode=require.
What I'd do differently
• Seed the database as part of the deploy. Don't count on remembering at midnight.
• Put secrets in Secret Manager from day one.
• Design the PDF first. If the output is a document, the document is the app. I built the AI first and the layout second, and paid for it.
• Test against real customer data, not a perfect sample. My first template was designed around a gorgeous example PDF, and it had no slot for certification badges. Real data humbles you fast.
Try it
Capability Statement Studio is live in beta:
👉 Try Capability Statement Studio (https://capabilities-statement-studio-273414889851.us-east1.run.app/?utm_source=devto&utm_medium=article&utm_campaign=launch)
And it's on Product Hunt, where I'd genuinely love your feedback:
👉 Capability Statement Studio on Product Hunt (https://www.producthunt.com/products/ready-capability-statements-in-minutes)
If you've ever built a tool where the real product was a document, tell me what broke for you in the comments. I'll feel less alone.
For further actions, you may consider blocking this person and/or reporting abuse

Top comments (0)