Demo | Features | Getting started | Architecture | Deploy
One click replays the full 11-step pipeline → synthetic fixtures, no backend, no signup, about 60 seconds.
❤️ Sponsor this project ❤️
Voice-agent GTM runtime that turns an inbound call into a branded PDF proposal ready for operator review. An ElevenLabs agent takes the call, a provider waterfall enriches the lead, structured LLM extraction generates the proposal, every step writes audit logs, and operators review the result in the ops-console. One repo, one runnable thing, end-to-end against synthetic fixtures (DEMO_MODE) or a live backend.
flowchart LR
A[Voice intake] --> B[Lead enrichment]
B --> C[LLM extraction]
C --> D[PDF render]
D --> E[Ops console]
- 🧭 Voice intake: an ElevenLabs agent takes the call; the post-call webhook only processes payloads that pass HMAC-SHA256 signature verification.
- 🧭 Lead enrichment: a provider waterfall adds context to each lead before extraction, falling through Clay (via an n8n webhook), People Data Labs, Abstract API, and Enrich.so until one answers. Fields you supply always win over enriched data.
- 🧭 Structured LLM extraction: the transcript becomes typed proposal fields through an 11-step pipeline covering intake, extraction, enrichment, pricing, compliance, scope, PDF render, and audit.
- 🧭 Branded PDF: PyMuPDF renders each proposal from branded HTML templates driven by the token system.
- 🧭 Audit trail: every pipeline step writes an audit log the console surfaces.
- 🧭 Ops console: React with no build step; the same UI runs static against bundled fixtures (
DEMO_MODE) or a live backend, with the Agents route and the Evals regression lab mounting live ElevenLabs ConvAI playgrounds. - 🧭 Presales CLI: the same pipeline runs headless from the command line.
Launch the canned proposal trace →
Click once. The Generate page auto-loads the HVAC sample brief and replays the 11-step pipeline (intake → extract → enrichment → pricing → compliance → scope → PDF render → audit). No backend, no signup, no operator interaction. Lands on a ready-to-review proposal in about 60 seconds.
app.wranngle.com is the canonical host; gtm-ops.pages.dev is the preview host, where DEMO_MODE activates. In DEMO_MODE the page intercepts /api/* and serves bundled fixtures, so the whole console stays interactive without a live backend. /console/?route=evals opens the native eval dashboard and /eval-runs/ serves the harness output.
![]() |
![]() |
![]() |
|---|
Generate, Evals, and Settings routes.
| Voice ElevenLabs conversational agent |
Enrichment Clay, People Data Labs, Abstract API, Enrich.so |
Extraction structured LLM output |
PDF PyMuPDF render |
Review ops console over audit logs |
Enrichment chains these providers as fallbacks; every other leg is a single vendor.
Live mode (full Express backend):
-
Install dependencies, including PyMuPDF for PDF rendering:
bun install python3 -m venv .venv .venv/bin/python -m pip install --require-hashes -r requirements.txt
-
Start the server:
bun run start # Express on :3000
Static / DEMO_MODE (no backend, fixture-driven):
cd apps/ops-console
python3 -m http.server 4173 # then open http://localhost:4173/console/Every /api/* call falls through to bundled JSON fixtures; the same UI runs in both modes. The ElevenLabs Sales Coach and Sarah Intake widgets mount live when the ConvAI embed script is reachable, and fall back to a deep link on elevenlabs.io otherwise. Append ?admin=1 to the console URL to reveal admin-only agents.
bun run typecheck # tsc, no emit
bun run test:run # 2901 vitest unit tests
bun run test:console # 451 Playwright console UI tests
bun run test:e2e # 327 Playwright PDF and report tests
bun run eval:harness # run this repo through voice_ai_agent_evalsARCHITECTURE.md covers the product layers (intake → enrichment → voice → post-call → presales → ops-console) and the two satellites:
wranngle/voice_ai_agent_evals: eval harness wired to the live ElevenLabs agentwranngle/n8n: the sanitized n8n workflow library, single source of truth for workflows
eval-harness.manifest.json encodes the app-to-harness boundary: this repo owns fixtures and test semantics, the harness consumes the manifest and normalizes results.
DESIGN.md is the canonical brand spec. tokens/ carries the machine-readable extracts (tokens.css, tokens.json, tokens.tailwind.js); vendor those into consumer repos rather than copying the long-form spec.
apps/ops-console/ deploys to Cloudflare Pages. Pages Functions under functions/api/ serve a subset of /api/* (D1-backed where bindings exist, fixture fallback otherwise); /api/generate stays Express-only on a separate host.
bun run deploy # production
bun run deploy:preview # preview branch
bun run pages:dev # local CF Pages emulatorConfig lives in wrangler.toml, with security and cache headers in apps/ops-console/_headers and fixture fallbacks in apps/ops-console/_redirects.
View the interactive star history, drawn live even while star-history's image API is down.
MIT. See LICENSE.



