BonoboAI
Full-Stack Developer – AI Integration
BonoboAI reads a customer's free-text inquiry, prices it against a product catalog, and drafts a branded proposal an operator can review and send. I led the AI integration and rebuilt the product end to end across two iterations.
React, TypeScript, Supabase, Serverless Functions, AI/LLM, Tailwind CSS
Overview
An operator pastes in a customer’s request; BonoboAI reads it, works out the pricing against a product catalog, and produces a branded proposal (line items, totals, and a short narrative) ready to review, edit, and send as a PDF.
My Role
Full-stack developer and AI-integration lead. I built the platform across two iterations (v0 → v1), owning the path from a raw customer message to a finished, editable proposal.
What I Built
- A full v1 rebuild: login, onboarding, and an operator inbox for managing incoming requests
- A rich-text proposal editor operators use to fine-tune the AI-generated quote before it goes out
- The pipeline connecting the app to the AI that reads a customer’s message and drafts the priced proposal
- A shared component library so the product stays consistent and is fast to extend
Outcome
The product collapses a manual, error-prone quoting task into a review step: instead of writing a proposal from scratch, an operator starts from a drafted, priced document and just refines it. The AI handles extraction and pricing; the human keeps final say before anything reaches a client.
Under the Hood
- Supabase Edge Functions running structured-JSON LLM extraction that pulls 8+ fields (location, installation type, logistics) from free text and reasons per line item
- Nearest-store matching: geocodes the customer address, computes driving distance to the closest location via OpenRouteService (ZTL-aware), and applies distance-based surcharges automatically
- Multi-organization support: each org configures its own catalog, pricing rules, Q&A flows, and templates
- A Plate-based rich-text editor, off-screen PDF rendering for client delivery, and a split-panel inbox driven by Zustand
- SWR for data fetching with cache invalidation on status changes; Storybook-documented design system