Inspiration
We read Mold Busters' sample jobs and found the TRUE money leak. After 45 hours from the inspection and an 82-minute write-up by TWO staff, the customer ended up NOT accepting Mold Buster's services...
Across both sample jobs, $4,778.87 in estimates were viewed and never accepted.
Mold Busters doesn't need AI to find mold. They already do that. They need every customer answered, every report out the same day, and every follow-up to answer the real question. That's Asper.
What it does
Asper runs the office. People inspect.
For the customer (no app, EN/FR):
- Open a link or scan a QR. Five taps tell us where the problem is.
- Go live with Bruce, our ElevenLabs voice agent. He coaches the phone camera like an inspector on the phone: "step back", "tilt up to the ceiling", "turn on a light". The focus box turns green when the phone is steady. Tap, done.
- Or upload guided photos instead.
- In about 2 minutes: what's visible, what photos can't tell, the right next service at Mold Busters' real prices, and a PDF.
- Book on-site, buy a $20 full AI report (anyone outside the service area), or get a $50 Tenant Action Pack: letters to the landlord written from the evidence, a 14-day formal notice, a city complaint, and LTB/TAL application prep. Nothing goes out without the tenant's OK.
For Mold Busters' staff:
- The case files itself. Photos, Bruce's transcript, answers and the pre-assessment land in one record: the Evidence Passport.
- The Hub (/hub): approve or deny. Every customer thread comes with a drafted reply built from their own case. Job 1 asks "does the estimate cover the faucet?" The draft answers it. One click.
- Inspectors tap in readings (moisture, thermal, swab, ball-slope) and dictate notes. AI turns notes into findings and drops anything the note never said.
- Reports that can't lie. Every sentence cites a finding or photo. Uncited sentences get deleted. The Approve button locks while a blocking problem is open: a positive swaboutside the estimate's scope, or conflicting booking dates. Exports a PDF in Mold Busters' format and a FreshBooks estimate CSV.
- Follow-ups that answer the question. Instead of "10% off": "the likely moisture source is the upstairs shower that failed the ball-slope test, not the basement spot. EstimateEST-CASE01 ($4,181) holds until Dec 6."
- Ask Asper anything. "I have legal issues with case 42 from 2 years ago." Asper returns a numbered brief built only from the record, plus a ZIP of every message, photo andapproval with a SHA-256 manifest, so a lawyer can prove nothing was changed.
- Memory. Customers' own words are saved with where they said them. Family details become talking points for a person, never automated texts. Health info never goes in a message.
- Storm check-ins. Environment Canada issues a rainfall warning, Asper matches it to customers by postal area and drafts check-ins.
- Compliance built in. CASL consent with expiry, STOP/ARRÊT, quiet hours (9 PM to 9 AM), max 1 marketing text a week, and a kill switch on every page.
Simulated in the demo: SMS/email sending, payments, CRM sync, and the storm alert. The on-site video step runs on a prepared real Mold Busters walkthrough.
How we built it
One record for everything. The Evidence Passport is a single Pydantic v2 model. Intake, live call, inspection, report, estimate, booking and follow-up all read and write the same typed record. That's why a report can cite the photo a customer took at 11 PM.
One AI entry point. Every AI call goes through llm.structured(): schema-validated output, 2 repair attempts, a fallback model, an exact-match cache and offline fixtures. Acircuit breaker stops calls when the free quota runs out. Every AI output shows a badge (Live AI, Replayed or Template), and every agent has a rule-based fallback. The full demo runs with zero AI available.
Vision that describes, never diagnoses. Nemotron VL via OpenRouter identifies the image type (thermal, swab kit, moisture meter, regular photo), boxes areas worth a closer look,and writes observations short enough for Bruce to say out loud. It never says "mold". Mold Busters' own reports say you can't confirm it without a lab.
Bruce. Named after the virtual-support persona Mold Busters already uses. The ElevenLabs key never touches the browser: our API mints a signed URL. Bruce runs the call with three tools: get_checklist, capture_photo and finish_assessment. The phone checks brightness and shake every 600 ms and tells Bruce, so he can say "it's a bit dark, turn on a light."
Code where it can't be wrong. Prices come from a price file, never the AI. Routing, booking, tax, the tenant letters and the legal brief are all deterministic code.
Environment Canada. Live weather alerts, filtered to water events, matched to customers by real forecast-zone outlines.
Stack: FastAPI, Pydantic v2, SQLite, Next.js 16, React 19, Tailwind v4, OpenRouter (Nemotron), ElevenLabs Agents, faster-whisper, ffmpeg, ReportLab, Playwright, pytest.
Challenges we ran into
- We killed our own first idea. "AI detects mold" demos well and fails in practice: 24 photos can't train a detector, and diagnosing from a photo is a liability. The real problem was unanswered customers and estimates nobody accepted.
- Free AI kept dying. 429s, 502s and an empty daily quota mid-build. We added retries, a backup model, caching, fixtures and rule fallbacks. Photo analysis went from 11.8 s to 2.3 s.
- White walls fooled auto-capture, and a timer bug meant auto-captured photos never saved. Our browser tests caught it. We switched to a manual shutter with a steady indicator.
- Spoken postal codes break voice AI. We moved every screening question out of the call and into taps. Bruce only does what voice is good at: coaching the camera.
- Testing a voice agent without burning credits. We built a simulator that speaks the ElevenLabs protocol and ran Bruce against 8 customer personas. One prompt scored higher but invented an answer the customer never gave. We caught it and threw it out.
- Compliance isn't a footer. A storm check-in with a booking link is a commercial message under CASL, so we split check-ins into safety-only and offer messages and unit-tested every consent rule.
Accomplishments that we're proud of
- The full loop works end to end: QR, Bruce, pre-assessment, tenant pack, Hub, cited report, approval, a follow-up that answers the real question, and a lawyer-ready evidence ZIP.
- 0 of 24 sample photos where the AI called something mold. 23 of 24 image types recognised. 2.3 s per photo.
- An Approve button that refuses to approve a report with a blocking problem.
- 38 of 38 postal areas matched to the correct Environment Canada forecast zone.
- Bruce scored 85.14 / 88 across 8 simulated personas, with 0 rule violations.
- 97 backend tests, Playwright tests on desktop, iPhone and Pixel sizes, and a full demo that runs with no AI.
What we learned
The biggest loss in a trades business isn't technical. It's a customer whose question never got answered. Put voice where it's strong (coaching a camera) and taps where it's weak (postal codes). Anything that must never be wrong, like prices, health answers and legal records, belongs in code, not in a prompt.
What's next for Asper
- Process any uploaded walkthrough video automatically.
- Real texting: plug Linq for iMessage. We applied for a Linq key and are waiting on it, and the messaging layer has one place where a provider plugs in, but the infrastructure is in place for it to work.
- Real checkout with Stripe for the $20 report and $50 tenant pack.
- Live calls with Bruce on real phones.
- Two-way sync with Close, FreshBooks and Google Calendar.

Log in or sign up for Devpost to join the conversation.