What shipped
Built a runnable local MVP for MissedWire that proves the core missed-call recovery loop:
- onboarding page for a home-service business
- local customer and missed-call persistence in SQLite
- Twilio-style voice webhook for missed calls
- SMS generation layer with local template fallback and optional Anthropic support
- outbound SMS delivery layer with local demo logging and optional Twilio support
- inbound SMS webhook for caller replies
- owner notification layer with local demo logging and optional Resend support
- dashboard showing missed calls, SMS state, replies, and a manual converted toggle
- smoke test covering the full sandbox flow
Architecture
- Python standard library only: chosen to keep the MVP runnable without installing dependencies.
- SQLite instead of Supabase/Postgres: faster local setup and easy inspection of state.
- WSGI app with direct route handling: small surface area and easy to test in-process.
- Provider abstraction in
missedwire/sms.py: makes demo mode the default while allowing live API upgrades by setting env vars. - Shared-number-first onboarding: intentionally simplified to match the brief's night-one scope, while still auto-assigning unique demo numbers locally.
Trimmed scope
Deliberately left out to preserve coherence and keep the MVP runnable:
- Stripe subscriptions and trials
- authentication and multi-tenant access control
- per-customer Twilio number provisioning
- Supabase auth and row-level security
- A2P 10DLC registration workflow
- background jobs, retries, and webhook signature verification
- production deployment config
Limitations
- The local server uses
wsgirefand is not production-ready. - In demo mode, outbound SMS and owner alerts are simulated rather than delivered.
- The dashboard is intentionally thin and assumes one active local operator context.
- The app processes the SMS send inline during the webhook request rather than dispatching to a queue.
- There is no carrier-forwarding wizard or call-forwarding validation flow yet.
Verification
python3 -m py_compile app.py missedwire/*.py scripts/smoke_test.pypython3 scripts/smoke_test.py
The smoke test passed in-process. Binding a localhost port was not permitted in this sandbox, so live socket verification was not possible here, but the app includes a normal python3 app.py server entrypoint for local use.
Suggested next steps
- Replace SQLite with Postgres or Supabase and add proper customer auth.
- Add Twilio signature validation and idempotency protection for webhook retries.
- Move SMS generation and delivery into a background job worker so webhook responses stay fast.
- Add real Twilio number provisioning and per-customer routing.
- Add Stripe billing and trial gating.
- Add carrier-specific call forwarding instructions and a test-setup flow.