Made Open

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

LayerWhat Gets Exercised
Credential WalletTwilio + 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 ServiceRaw Twilio payload → normalized Message entity
Data ServiceContact lookup, conversation created, message stored
NATS JetStreamEvents flow through the spine without data loss
pg-bossJobs enqueued, prioritized, executed
Rules ServiceRule with person group + location condition evaluates
Android LocationDevice streams location to hub; rule reads it
ChannelServiceOutbound SMS sent via Twilio channel plugin
Policy ServiceEvery action authorized, every step in audit log
MeilisearchContact name indexed; searchable from web app
Web AppUser 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:

DataCount
Contacts18 (family, work, friends)
Locations2 (Home, Work)
Rules2 (family-calls-at-work, unknown-caller-to-voicemail)
Conversations3 (with 11 messages)
Twilio credentialsPre-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:

MilestoneTests When Done
NATS starts and accepts connectionsPublish + subscribe a test event
Meilisearch startsIndex and query a document
Supabase local stack runsConnect, auth, CRUD a row
Hub starts without errorsGET /api/health returns 200
Plugin Manager loads a pluginms-graph plugin loads, init() called
MS Graph connector syncsContacts appear in PostgreSQL after OAuth
Twilio webhook receivedPOST to /webhooks/calling/inbound → event in NATS
Rule evaluatesCreate a rule, trigger the event, verify action enqueued
Outbound SMS sentJob executes, Twilio confirms delivery
Android location streamslocation_history rows appear in Supabase
Web app shows contactsLogin → contacts list populated from Supabase
Full demo executesSee 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.