Covered HVAC
WhatsApp-first AI operations platform for HVAC contractors, powered by Amazon Nova.
Live demo: http://98.90.84.106
The Problem
Small HVAC contractors juggle phone calls, texts, and spreadsheets to diagnose equipment, quote jobs, and schedule techs. A single missed message means lost revenue. Hiring a full-time dispatcher costs $40K+/year — money most 2–5 person shops don't have.
The Solution
Covered is an AI dispatcher that lives on WhatsApp. Technicians text in flash codes and get back manufacturer-specific diagnostics. Customers request quotes and receive AHRI-certified proposals with real pricing. Dispatchers say "send her the quote" and a PDF lands in the customer's WhatsApp — no human touches it.
The key insight: LLMs orchestrate, but never calculate. Pricing, equipment sizing, and certification lookups are all deterministic Rust code. Nova decides what to do; pure math does the work.
Architecture
┌─────────────┐ ┌──────────────────┐ ┌─────────────────┐
│ WhatsApp │────▶│ Integration │────▶│ Rust API │
│ (Baileys) │◀────│ Worker (TS) │◀────│ (Axum) │
└─────────────┘ └──────────────────┘ └────────┬────────┘
│ ▲ │
│ │ ▼
┌────▼────┴────┐ ┌─────────────────┐
│ SQS │ │ Orchestrator │
│ (LocalStack)│ │ (Society of │
└──────────────┘ │ Mind) │
└────────┬────────┘
┌─────────────┐ │
│ Web UI │ ┌──────────────────┐ │
│ (Next.js) │────▶│ PostgreSQL │◀──────────┘
└─────────────┘ └──────────────────┘ │
▼
┌─────────────────┐
│ Amazon Nova │
│ (Bedrock) │
└─────────────────┘
Message flow: WhatsApp inbound → Worker normalizes → API ingests → Orchestrator classifies (TiageMind) → Specialist Mind runs tool loop → Response enqueued to SQS → Worker delivers via WhatsApp.
Key Features
Society of Mind
Every inbound message is classified by TiageMind (Nova Micro, <200ms) and routed to a specialist:
| Mind | Model | Reasoning | Purpose |
|---|---|---|---|
| TiageMind | Nova 2 Micro | None | Intent classification via constrained decoding |
| DiagnosticMind | Nova 2 Lite | High | Flash code diagnosis using equipment manuals |
| QuotingMind | Nova 2 Lite | Medium | Equipment sizing → catalog search → quote draft |
| SchedulingMind | Nova 2 Lite | Medium | Availability check → appointment booking |
Zero-LLM Deterministic Crates
- Manual-J Sizing (
covered-manualj) — ASHRAE climate zone BTU estimation. Pure Rust math, no API calls. - Pricing Engine (
covered-pricing) — Banker's rounding, tax computation. Reproducible to the penny. - AHRI Certification — Real cert numbers from database lookups, never hallucinated.
WhatsApp-Native
- Baileys integration for direct WhatsApp messaging (no Twilio)
- PDF quote delivery as WhatsApp document attachments
- Media support: images, video, audio, documents normalized and base64-encoded
- TCPA-compliant consent management (STOP/START keywords)
AI Reasoning Transparency
Every Nova turn — thinking text, tool calls, token counts — is persisted and visible in the web UI's real-time Reasoning Feed. Dispatchers see exactly why the AI made each decision.
Demo Walkthrough (3 minutes)
Minute 1: Field Diagnostic
A technician texts: "GSX14 won't start, 4 LED flashes"
→ Nova searches the actual Goodman service manual via docs_search
→ Returns: "4 flashes = open temperature limit device — likely dirty filter or restricted airflow"
→ Not hardcoded. Works for any model with an ingested manual.
Minute 2: AHRI Heat Pump Quote
A customer texts: "We need to replace our AC with a heat pump. 2200 sqft."
→ Manual-J sizes to 3 tons (pure Rust math)
→ catalog_search finds DSZC180361 with AHRI cert #202584561
→ pricing::compute() calculates $3,050 + tax with banker's rounding
→ Quote rendered with share link — 5 tool calls, zero human intervention.
Minute 3: WhatsApp PDF Delivery
Dispatcher says: "Send Elena the quote as a PDF"
→ Nova calls quote_sendPdf tool → SQS message enqueued
→ Integration worker generates PDF with pdfkit
→ PDF document drops into customer's WhatsApp
→ Three services, one coherent action.
Getting Started
Prerequisites
- Docker & Docker Compose
- Rust toolchain (1.80+)
- Node.js 20+
- just command runner
- AWS account with Bedrock access (Nova 2 Lite + Nova 2 Micro enabled in us-east-1)
Setup
# 1. Clone and configure
git clone https://github.com/trockhans/covered.git
cd covered
cp .env.example .env
# Fill in AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY
# 2. Start everything
just demo-run
# 3. Open the UI
open http://localhost:3000
The demo-run command starts PostgreSQL, LocalStack (SQS), the Rust API, integration worker, and Next.js web UI via Docker Compose.
Key URLs (local)
| Service | URL |
|---|---|
| Web UI | http://localhost:3000 |
| AI Reasoning Feed | http://localhost:3000/reasoning |
| Web Chat | http://localhost:3000/chat |
| Rust API | http://localhost:8080 |
| Integration Worker | http://localhost:3001 |
Project Structure
covered/
├── crates/
│ ├── core/ # Domain types (Job, Customer, Quote, etc.)
│ ├── db/ # PostgreSQL repos + 18 migrations
│ ├── api/ # Axum HTTP server + route handlers
│ ├── orchestrator/ # Bedrock client, tool registry (20 tools),
│ │ # Society of Mind, loop runner, tool guards
│ ├── manualj/ # ASHRAE Manual-J BTU estimator (zero LLM)
│ ├── pricing/ # Deterministic pricing engine (zero LLM)
│ ├── workflow-engine/ # Configurable workflow runner
│ └── auth/ # Magic link + JWT + RBAC
├── apps/
│ ├── integration-worker/ # WhatsApp (Baileys) + SQS consumer (TypeScript)
│ └── web-ui/ # Next.js 15 ops dashboard
├── fixtures/
│ ├── seed.sql # Demo data (tenant, customers, jobs, catalog)
│ └── demo_script.md # Full demo walkthrough
├── tests/golden/ # 10 acceptance test scenarios
├── docker-compose.yml
├── docker-compose.prod.yml
└── justfile # All dev/test/CI commands
Built with Amazon Nova
Covered uses Amazon Nova 2 via Bedrock as its AI engine:
- Nova 2 Lite — Main orchestration and specialist minds (diagnostic, quoting, scheduling). Extended thinking enabled for complex reasoning paths.
- Nova 2 Micro — TiageMind intent classification. Constrained decoding via
toolChoice: { tool: { name: "triage_classify" } }guarantees valid JSON output in <200ms. - Prompt Caching —
CachePointBlockinserted after the first system block. Subsequent turns within the 5-minute TTL read cached tokens at reduced cost. - Constrained Decoding — Tool schemas enforce
additionalProperties: falseon all 23 tools. TiageMind and QuotingMind use forced tool choice for deterministic first-turn output. - Session Concurrency —
pg_advisory_lockprevents race conditions when multiple messages arrive for the same phone number. - Tool Result Truncation — Results over 8,000 characters are truncated to prevent context window bloat.
Why Nova?
Nova's native tool use and extended thinking make it ideal for multi-step orchestration. The Society of Mind pattern — a cheap classifier routing to expensive specialists — keeps latency low and costs predictable. Constrained decoding eliminates JSON parsing failures entirely.
Tech Stack
| Layer | Technology |
|---|---|
| AI Engine | Amazon Nova 2 Lite + Micro (Bedrock) |
| API Server | Rust, Axum, SQLx |
| Web UI | Next.js 15 (App Router), TypeScript |
| Messaging | WhatsApp via Baileys, SQS (LocalStack) |
| Database | PostgreSQL 16 |
| Infrastructure | Docker Compose, AWS EC2 |
| PDF Generation | pdfkit (Node.js) |
| Equipment Sizing | Custom Rust crate (ASHRAE Manual-J) |
| Pricing | Custom Rust crate (banker's rounding) |
Testing
just test # Rust unit tests
just test-api # API integration tests (needs live DB)
just test-golden # 10 golden transcript scenarios
just test-worker # Integration worker (Vitest)
just test-ui # Web UI components (Vitest)
just test-all # Everything
License
Built for the Amazon Nova AI Hackathon 2026. #AmazonNova
Built With
- nova
- rust
- typescript
Log in or sign up for Devpost to join the conversation.