Inspiration
Small contractors lose money on extra work agreed on the spot: "While you're here, can you also…" It's usually a handshake. Nobody writes it down, and when the final bill arrives the homeowner remembers it differently. Writing a proper change order takes time a carpenter on a ladder doesn't have, and many crews speak Spanish while the homeowner reads English.
What it does
Chalkline turns a short voice memo into a signed, paid change order before the contractor leaves the house.
- Say it. The contractor speaks the extra work in any language and adds photos.
- Review. Claude writes an itemized change order in plain English: labor at the contractor's hourly rate, materials only at prices they said out loud, and a short list of anything to double-check.
- Sign. The homeowner scans a QR code, reviews the work on their own phone and signs with a finger. They can also decline.
- Pay. Only after the signature does Chalkline create and send the PayPal invoice. The homeowner pays with PayPal and the contractor's screen stamps Paid.
Every change order keeps the original memo, the translation, the audio, photos, signature and a time-stamped paper trail. A dashboard shows what's collected, what's owed and what's waiting on a signature, with one-tap PayPal reminders.
How we built it
- App: Next.js 16, React 19, TypeScript and Tailwind CSS 4, hosted on Render, with data in Turso (libSQL).
- Speech: Whisper large-v3 on Groq, with a job-specific vocabulary prompt. Words Whisper invents on silence are filtered out, and low-confidence parts are underlined for the contractor.
- AI: Claude Opus 5.5 with structured outputs validated by Zod. It reads the memo and photos, translates, splits labor from materials, writes the homeowner summary and flags gaps.
- Money in code, not in the model: prices come from the contractor's rate or their own words. Totals are rounded per line the same way PayPal does it, and each invoice is checked against the signed amount before it's sent.
- PayPal: the Invoicing API v2 creates, sends and reads invoices and sends reminders.
INVOICING.INVOICE.PAIDwebhooks are verified with PayPal's signature verification API and confirmed against the invoice status, with a status check as backup.
Challenges we ran into
- Browser speech recognition failed outside Chrome, so we switched to recording audio and transcribing it on the server.
- Making the signed total and PayPal's total match to the cent when hours are fractional.
- Surviving failures: if PayPal is unavailable after a homeowner signs, the signature is kept and the contractor can resend the invoice without creating a duplicate.
Accomplishments that we're proud of
- "No signature, no invoice." The AI drafts, people decide, PayPal collects.
- A Spanish voice memo becomes an English change order the homeowner can read, sign and pay on their own phone.
- An automated run of 83 checks covering real microphone audio, drawn signatures, a simulated PayPal outage and bad input, plus a full end-to-end run against the live site.
What we learned
- Let the model structure and translate, and keep it away from prices.
- In payments, trust comes from the paper trail as much as from the payment itself.
What's next for Chalkline
- Contractor accounts and job setup.
- Deposits and progress billing for larger changes.
- A one-tap evidence pack for disputed payments.
- More languages and trade vocabularies.
Built With
- anthropic
- claude
- groq
- libsql
- next.js
- paypal
- paypal-invoicing-api
- paypal-webhooks
- react
- render
- tailwindcss
- turso
- typescript
- whisper

