README.md
# Butlr We wait on hold so you don't have to. Credit cards, hospitals, restaurants, anywhere a queue stands between you and a human. ## Phase 1 — onboarding MVP (this is what's built) - Submission form capturing: business name, business phone, the goal of the call, account info (account number, last-4 SSN, billing ZIP, DOB, verbal-auth password), callback name/phone/email, best-time window, max hold time, max spend, recording consent, terms consent - 13 category presets (credit-card-increase, credit-card-dispute, hospital-billing, hospital-appointment, restaurant-reservation, airline-change, cable-cancel, insurance-claim, utility-dispute, warranty-claim, mortgage-loan, subscription-cancel, other) - Per-category default goal text pre-fills the textarea - Call queue + per-call detail page with masked-sensitive fields + Reveal toggle - Security: helmet (CSP/HSTS/X-Frame-Options/Referrer-Policy/Permissions-Policy), express-rate-limit (200/min global, 20/min on /api), x-powered-by disabled - Standing rules: logo UL, hamburger UR, Gucci-style huge hero, dark/light toggle with localStorage persistence ## Phase 2 (not yet) - Twilio Voice integration — actual dial, IVR navigation, hold-music detection, human-agent detection, bridge-to-user - Optional AI voice agent for low-stakes calls (reservations, simple cancellations) - SMS / email notifications when an agent picks up - Encrypted-at-rest sensitive fields - Stripe billing for the $9/$29 plans ## Run ``` PORT=9932 node server.js # → http://localhost:9932 ``` ## Routes - `/` — home + use-case grid - `/new` — submission form (?category=foo to preset) - `/new` POST — submit - `/calls` — your queue - `/calls/:id` — per-call detail (`?reveal=1` to see sensitive fields) - `/api/category/:id` — JSON for the form's preset hints - `/how-it-works` - `/healthz`