Skip to content
back to portfolio

Culmination Digital LLC2026

SoloSteady, income documentation for self-employed mortgage applicants

A one-time income summary for self-employed people applying for bank-statement mortgages. The buyer connects a bank through Plaid, the app analyzes twelve consecutive months of deposits with deterministic rules plus Claude for classification, and produces a PDF the buyer downloads and submits themselves. Consumer-delivered by design: the product never furnishes data to a lender.

Founder, sole engineerNext.jsTypeScriptPlaidStripeAnthropic SDKPostgreSQLVercel

Live: solosteady.com

One of two products I build and run solo under my LLC, Culmination Digital. Source is private.

SoloSteady makes one document: a 12-month income summary for self-employed people applying for a bank-statement mortgage, the kind of loan underwritten on deposits instead of tax returns. The buyer connects a bank, the app analyzes a year of real deposits, and the buyer downloads a PDF and submits it themselves. One product, one price, one job.

Why it exists

Self-employed borrowers get asked to prove income in a format that W-2 employees never have to think about, and most of them assemble it by hand from statements and spreadsheets. The first version of this product tried to serve renters and landlords too. Eight rounds of research said no: landlords accept free bank statements, and a landlord-facing verification link would have pushed the product toward being a consumer reporting agency under federal law. So the product narrowed to the one buyer with a real, recurring, document-shaped need.

How it's built

Next.js 16 App Router on Vercel, TypeScript strict, Postgres, Stripe for the one-time purchase, Plaid for the bank connection, the Anthropic SDK for classification, Resend for transactional email, Sentry and Upstash for observability and rate limiting. The analysis pipeline is deterministic first: deposits are gathered across the requested window, filtered, grouped by month, and summarized by rules that can be explained line by line. Claude is used for the part rules do badly, classifying what a deposit is, and its output is checked against the deterministic totals rather than trusted on its own.

Two design decisions do most of the work. Plaid only, no PDF upload. A bank statement PDF is trivially forgeable by the one person with a motive to forge it, and the parsing path was the most failure-prone code in the system; the upload path is gated off, not deleted. Consumer-delivered only. The product never sends, shows, or furnishes a buyer's data to a lender or anyone else. The buyer receives the document and delivers it. That single rule is what keeps the product on the right side of the consumer-reporting-agency test, which is purpose-based, so even the marketing copy is checked at build time for language that would imply a lender relies on the output.

The trade-offs

Plaid-only means the product depends on what each bank exposes through Plaid; some institutions return less than twelve months, and the product has to say so plainly instead of padding the gap. Consumer-delivered means no lender integrations, no "verified by" badge, and no data network effects, which are exactly the features a growth-minded version would build first. I chose the narrower product because the legal exposure of the wider one was not a risk I could manage alone, and because the narrow one is honest about what it is.

What is not built yet

Nothing beyond the one document is planned. Improvements go into the analysis quality, the clarity of the PDF, and the copy, in that order.