MVP: The Intelligent Call Router
Current Status
The MVP demo is fully operational. All layers are implemented and tested (10,000+ tests across the monorepo).
make quickstart # Install deps, start infra, seed demo data
make mock-call # Triggers inbound call → rules fire → SMS sent
Log in as demo@made-open.dev / demopassword to see the full flow.
The MVP is not a feature list. It is a single end-to-end workflow that exercises every architectural layer. If this workflow runs correctly, the entire platform foundation is proven.
The Demo
A phone call comes in. The platform knows who is calling (MS Graph contacts), knows where the user is right now (Android location), evaluates a rule the user defined, and automatically sends the caller an SMS with a better number to reach them.
No human intervenes. The platform just handles it.
What This Proves
| Layer | What Gets Exercised |
|---|---|
| Credential Wallet | Twilio + MS Graph credentials stored, capabilities activated |
| Connector Plugin (MS Graph) | Contacts synced from Exchange to PostgreSQL |
| Channel Plugin (Twilio) | Inbound webhook received, communication.CallStarted published |
| ETL Service | Raw Twilio payload → normalized Message entity |
| Data Service | Contact lookup, conversation created, message stored |
| NATS JetStream | Events flow through the spine without data loss |
| pg-boss | Jobs enqueued, prioritized, executed |
| Rules Service | Rule with person group + location condition evaluates |
| Android Location | Device streams location to hub; rule reads it |
| ChannelService | Outbound SMS sent via Twilio channel plugin |
| Policy Service | Every action authorized, every step in audit log |
| Meilisearch | Contact name indexed; searchable from web app |
| Web App | User sees call in conversation history; sees rule triggered |
Quick Demo (Seed Data)
The quickstart script seeds a fully functional demo account. No manual credential entry required.
make quickstart # Install deps, start infra, seed demo data
# Log in as: demo@made-open.dev / demopassword
make mock-call # Triggers inbound call → rules fire → SMS sent
What's pre-loaded for the demo user:
| Data | Count |
|---|---|
| Contacts | 18 (family, work, friends) |
| Locations | 2 (Home, Work) |
| Rules | 2 (family-calls-at-work, unknown-caller-to-voicemail) |
| Conversations | 3 (with 11 messages) |
| Twilio credentials | Pre-configured (pointing at mock-api on :4102) |
This lets you skip directly to "THE CALL" section below and see the full end-to-end flow.
Step-by-Step Execution
Note: The setup steps below document manual credential entry. If you used
make quickstart, the demo user already has credentials, contacts, rules, and locations pre-configured — skip to "THE CALL" (step 7).
SETUP (done once)
─────
1. User opens web app, logs in (Supabase Auth)
2. Settings → Add Twilio credentials
→ Account SID + Auth Token stored in Supabase Vault
→ Capability Registry activates: voice, sms, video
→ Dashboard: communication section appears
3. Settings → Add Microsoft 365
→ OAuth redirect to Microsoft login
→ Access + refresh tokens stored in Vault
→ Capability Registry activates: contacts, calendar, email
→ MS Graph connector begins first sync
4. Wait for sync
→ MS Graph connector pulls contacts from Exchange
→ ETL normalizes to Person entities in PostgreSQL
→ Search Service indexes persons in Meilisearch
→ Contacts appear in web app and Android app
5. Android app: grant location permission "Allow all the time"
→ LocationService begins streaming location to hub
→ location_history rows appear in Supabase
→ Hub's Present plane knows: user is at location "Work"
6. Web app: create a Rule
WHEN: communication.CallStarted
IF: caller is in contact group "Partner" AND location = "Work"
THEN: send SMS to caller:
"Hey, I'm at the office. Reach me at +1 727 555 0100."
→ Rule stored in rules table
→ Rules Service loads it into evaluation cache
THE CALL
────────
7. Partner's phone dials user's Twilio number
8. Twilio → POST to hub /webhooks/calling/inbound
9. CallingService receives webhook
→ Publishes communication.CallStarted to NATS
→ Data: { from: "+17275550199", to: "+17275550100", callSid: "CA..." }
10. Rules Service subscribes to communication.CallStarted
→ Loads all enabled rules with this trigger
→ Evaluates: Is caller "+17275550199" in group "Partner"?
→ Data Service: lookup person by phone number → found: Jane (Partner)
→ YES
→ Evaluates: Is current location "Work"?
→ Present plane: last location update for user's devices → "Work"
→ YES
→ Rule matches → enqueue action
11. Job Queue: SendOutgoingMessageJob enqueued (interactive queue, < 5s target)
12. ChannelService executes job
→ Twilio channel plugin: POST to Twilio API
→ SMS delivered to "+17275550199"
13. Data Service writes:
→ Message entity: direction=outbound, body="Hey, I'm at the office..."
→ conversation updated
14. Policy Service logs every step to audit_log
15. Supabase Realtime: web app receives update
→ Conversations section shows the outbound SMS
→ Activity feed shows: "Rule 'Partner at Work' triggered"
VERIFICATION
────────────
16. User checks web app:
→ Contacts: Jane appears with her Exchange data
→ Conversations: inbound call + outbound SMS in one thread
→ Rules: rule shows "Triggered 1 time"
→ Audit Log: 12+ entries covering the full execution chain
17. User queries NATS:
→ communication.CallStarted event visible in platform-events stream
→ communication.MessageSent event with same correlationId
18. User checks Supabase:
→ messages table: both call record and SMS
→ location_history: device positions plotted over time
→ audit_log: complete tamper-proof record
Pre-MVP Milestones
These must all pass before attempting the full demo:
| Milestone | Tests When Done |
|---|---|
| NATS starts and accepts connections | Publish + subscribe a test event |
| Meilisearch starts | Index and query a document |
| Supabase local stack runs | Connect, auth, CRUD a row |
| Hub starts without errors | GET /api/health returns 200 |
| Plugin Manager loads a plugin | ms-graph plugin loads, init() called |
| MS Graph connector syncs | Contacts appear in PostgreSQL after OAuth |
| Twilio webhook received | POST to /webhooks/calling/inbound → event in NATS |
| Rule evaluates | Create a rule, trigger the event, verify action enqueued |
| Outbound SMS sent | Job executes, Twilio confirms delivery |
| Android location streams | location_history rows appear in Supabase |
| Web app shows contacts | Login → contacts list populated from Supabase |
| Full demo executes | See above |
What the MVP Explicitly Does Not Include
- iOS app
- AI chat
- Video calling (Twilio capability is there; polished UI is not)
- Federation / DIDComm / ActivityPub
- Windows browser automation
- Marketplace or reputation system
These all come later. The MVP proves the spine.