| Decision | Choice | Rationale |
| Frontend framework |
Vanilla HTML/JS — no React, no Vue |
No build step. Claude reads the full file in one context window. Instant iteration. Tradeoff accepted: discipline required to keep app.html readable as it grows. |
| App structure |
Single app.html file (~4000 lines) |
GitHub Pages compatible · all state in JS · no module bundling. sed-based env swap at deploy time stays trivial. |
| Backend |
Supabase Edge Functions (Deno) |
Serverless, zero infra, TypeScript, co-located with the DB. 21 functions deployed; free tier still sufficient. |
| AI access |
Claude Sonnet 4 via claude-proxy |
API key never exposed in client-side code. Single place to audit all AI calls. Model: claude-sonnet-4-20250514. |
| Email delivery + inbound |
Resend (Pro plan, per-client subdomains) |
Better deliverability than raw SMTP, webhook support for open/click/bounce/inbound, generous free tier, doubles as Supabase Auth SMTP. Resend Inbound launched Apr 26 replaced Postmark — single provider, −$10/mo (D51). |
| Cold channels |
Email + (later) LinkedIn only — D54 |
Cold WhatsApp / SMS / Telegram are non-starters in US B2B (TCPA, Meta commerce policy, 10DLC marketing reg). LinkedIn cold deferred to Phase 9 post-pilot. |
| Post-consent channels |
SMS + WhatsApp via Twilio — D54 |
Same playbook a human SDR uses: prospect opts in via email reply, MarIA extracts phone/preferred_channel, then we use the channel they chose. Shared IQForce 10DLC + WABA — no per-client carrier registration needed. |
| Voice (MVP) |
Cal.com schedule → WhatsApp at the slot |
No outbound voice infra during MVP. Real AI voice (Vapi / Bland) deferred to Phase 10 after pilot data tells us which provider fits. |
| Hosting |
GitHub Pages + A/AAAA on apex (D57) |
Free static hosting · auto-deploy from GitHub Actions · Let's Encrypt cert. GoDaddy URL-forwarding removed May 7 because the apex subpath (iqforce.solutions/app.html) was 405-ing. |
| Multi-tenancy |
Single DB · RLS via auth.uid() |
One Postgres, one schema, RLS-scoped policies (Pattern B) on every table. No schema-per-tenant. Simple to operate, easy to audit. |
| HITL |
Mandatory during pilot — D38 |
Every outbound message held in Review Queue until operator approves. Toggle UI intentionally hidden. Returns post-pilot once trust is established. |
| Geo scope |
US-only — D37 |
Eliminates GDPR / CASL exposure during pilot. Enforced at CSV import + on every send-* function. EU / Canada deferred until DPAs + GDPR data-flow assessment are done. |
| Retention |
3-tier: 12mo bodies / 4yr consent / indef opt-outs |
Public commitment on SMS Consent page §8 + Pilot Agreement §11.3. Enforced in code by purge-expired-records running daily 03:00 UTC. |
| Billing |
Stripe — Phase 13, three tiers |
90-day demo → $500 promo / $2K Starter / $5K Growth. Webhook-driven subscription lifecycle. |