642 lines
21 KiB
Markdown
642 lines
21 KiB
Markdown
|
|
# Kalei — Architecture & User Journey Diagrams
|
||
|
|
|
||
|
|
All diagrams below are valid Mermaid syntax. Paste into any Mermaid renderer (mermaid.live, GitHub markdown, VS Code preview) to visualize.
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## 1. Complete User Journey
|
||
|
|
|
||
|
|
Shows the full lifecycle from app discovery through onboarding, daily habit loops, conversion, and long-term retention.
|
||
|
|
|
||
|
|
```mermaid
|
||
|
|
flowchart LR
|
||
|
|
subgraph Acquisition["Acquisition"]
|
||
|
|
A1["App Store Discovery"] --> A2["Download App"]
|
||
|
|
A2 --> A3["Open for First Time"]
|
||
|
|
end
|
||
|
|
|
||
|
|
subgraph Onboarding["Onboarding Flow"]
|
||
|
|
A3 --> O1["Welcome Screen"]
|
||
|
|
O1 --> O2["3 Swipeable Intro Cards"]
|
||
|
|
O2 --> O3["Choose Reframe Style\n(Brutal / Gentle / Logical / Philosophical / Humor)"]
|
||
|
|
O3 --> O4["Set Daily Check-in Time"]
|
||
|
|
O4 --> O5["Create Account\n(Email / Google / Apple)"]
|
||
|
|
O5 --> O6["First Reframe — WOW Moment"]
|
||
|
|
O6 --> O7["Land on Home Screen"]
|
||
|
|
end
|
||
|
|
|
||
|
|
subgraph DailyLoop["Daily Habit Loop"]
|
||
|
|
O7 --> D1["Push Notification\n'What's weighing on you?'"]
|
||
|
|
D1 --> D2{"User Intent"}
|
||
|
|
D2 -->|"Quick reframe"| T1["The Turn\n(Kaleidoscope)"]
|
||
|
|
D2 -->|"Need to process"| M1["The Mirror\n(Freeform Writing)"]
|
||
|
|
D2 -->|"Goal focus"| L1["The Lens\n(Manifestation)"]
|
||
|
|
D2 -->|"Review history"| G1["The Gallery"]
|
||
|
|
T1 --> D3["Save Reframe / Keepsake"]
|
||
|
|
M1 --> D3
|
||
|
|
L1 --> D3
|
||
|
|
D3 --> D4["Streak Updated"]
|
||
|
|
D4 --> D5["Return Tomorrow"]
|
||
|
|
D5 --> D1
|
||
|
|
end
|
||
|
|
|
||
|
|
subgraph Deepening["Engagement Deepening"]
|
||
|
|
G1 --> E1["See Thought Patterns Over Time"]
|
||
|
|
E1 --> E2["Weekly Summary\n(Sunday Push)"]
|
||
|
|
E2 --> E3["Discover Recurring Fragments"]
|
||
|
|
E3 --> E4["Motivation to Continue"]
|
||
|
|
E4 --> D1
|
||
|
|
end
|
||
|
|
|
||
|
|
subgraph Conversion["Free → Premium"]
|
||
|
|
D4 --> C1{"Hit Free Tier Limit?"}
|
||
|
|
C1 -->|"Yes"| C2["Soft Paywall\n'Unlock unlimited Turns'"]
|
||
|
|
C2 --> C3{"Convert?"}
|
||
|
|
C3 -->|"Yes"| C4["Subscribe to Prism\n($4.99/mo)"]
|
||
|
|
C3 -->|"Not yet"| D5
|
||
|
|
C4 --> C5["Full Access Unlocked"]
|
||
|
|
C5 --> D1
|
||
|
|
end
|
||
|
|
|
||
|
|
subgraph Retention["Long-Term Retention"]
|
||
|
|
C5 --> R1["Spectrum Dashboard\n(Prism+)"]
|
||
|
|
R1 --> R2["Monthly AI Insights"]
|
||
|
|
R2 --> R3["Growth Trajectory"]
|
||
|
|
R3 --> R4["Deep Self-Knowledge"]
|
||
|
|
R4 --> D1
|
||
|
|
end
|
||
|
|
```
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## 2. Backend System Architecture
|
||
|
|
|
||
|
|
The full backend from client through edge, API services, AI layer, data stores, and external integrations.
|
||
|
|
|
||
|
|
```mermaid
|
||
|
|
flowchart TB
|
||
|
|
subgraph Client["Client Layer"]
|
||
|
|
APP["React Native + Expo App"]
|
||
|
|
TURN_UI["Turn Screen"]
|
||
|
|
MIRROR_UI["Mirror Screen"]
|
||
|
|
LENS_UI["Lens Screen"]
|
||
|
|
GALLERY_UI["Gallery Screen"]
|
||
|
|
SPECTRUM_UI["Spectrum Dashboard"]
|
||
|
|
PROFILE_UI["Profile & Settings"]
|
||
|
|
end
|
||
|
|
|
||
|
|
subgraph Edge["Edge Layer"]
|
||
|
|
CF["Cloudflare\nDNS / CDN / DDoS"]
|
||
|
|
NGINX["Nginx\nReverse Proxy / SSL / Rate Limit"]
|
||
|
|
end
|
||
|
|
|
||
|
|
subgraph API["API Layer — Modular Monolith (Fastify)"]
|
||
|
|
GW["API Gateway & Auth\n(JWT + Refresh Rotation)"]
|
||
|
|
TURN_SVC["Turn Service"]
|
||
|
|
MIRROR_SVC["Mirror Service"]
|
||
|
|
LENS_SVC["Lens Service"]
|
||
|
|
SPECTRUM_SVC["Spectrum Service"]
|
||
|
|
SAFETY_SVC["Safety Service\n(Crisis Detection)"]
|
||
|
|
ENT_SVC["Entitlement Service\n(Plan Gating)"]
|
||
|
|
COST_SVC["Usage Meter &\nCost Guard"]
|
||
|
|
JOBS["Job Scheduler\n& Workers"]
|
||
|
|
NOTIF["Notification Service"]
|
||
|
|
end
|
||
|
|
|
||
|
|
subgraph AI["AI Layer (via OpenRouter Gateway)"]
|
||
|
|
AI_GW["AI Gateway\n(OpenRouter Provider Routing)"]
|
||
|
|
DEEPSEEK["DeepSeek V3.2\nvia DeepInfra/Fireworks\n(US/EU — Primary)"]
|
||
|
|
CLAUDE_FALLBACK["Claude Haiku 4.5\n(Automatic Fallback)"]
|
||
|
|
end
|
||
|
|
|
||
|
|
subgraph Data["Data Layer"]
|
||
|
|
PG["PostgreSQL 16\n(Source of Truth)"]
|
||
|
|
REDIS["Redis\n(Cache / Rate Limits / Counters)"]
|
||
|
|
OBJ["Object Storage\n(Spectrum Exports)"]
|
||
|
|
end
|
||
|
|
|
||
|
|
subgraph External["External Services"]
|
||
|
|
APPLE["Apple App Store\nBilling API"]
|
||
|
|
GOOGLE["Google Play\nBilling API"]
|
||
|
|
APNS["APNs"]
|
||
|
|
FCM["FCM"]
|
||
|
|
POSTHOG["PostHog\n(Self-Hosted Analytics)"]
|
||
|
|
GLITCHTIP["GlitchTip\n(Error Tracking)"]
|
||
|
|
end
|
||
|
|
|
||
|
|
APP --> CF --> NGINX --> GW
|
||
|
|
GW --> TURN_SVC
|
||
|
|
GW --> MIRROR_SVC
|
||
|
|
GW --> LENS_SVC
|
||
|
|
GW --> SPECTRUM_SVC
|
||
|
|
GW --> ENT_SVC
|
||
|
|
|
||
|
|
TURN_SVC --> SAFETY_SVC
|
||
|
|
MIRROR_SVC --> SAFETY_SVC
|
||
|
|
LENS_SVC --> SAFETY_SVC
|
||
|
|
|
||
|
|
TURN_SVC --> AI_GW
|
||
|
|
MIRROR_SVC --> AI_GW
|
||
|
|
LENS_SVC --> AI_GW
|
||
|
|
SPECTRUM_SVC --> AI_GW
|
||
|
|
|
||
|
|
AI_GW --> DEEPSEEK
|
||
|
|
AI_GW --> CLAUDE_FALLBACK
|
||
|
|
|
||
|
|
TURN_SVC --> COST_SVC
|
||
|
|
MIRROR_SVC --> COST_SVC
|
||
|
|
LENS_SVC --> COST_SVC
|
||
|
|
COST_SVC --> REDIS
|
||
|
|
|
||
|
|
TURN_SVC --> PG
|
||
|
|
MIRROR_SVC --> PG
|
||
|
|
LENS_SVC --> PG
|
||
|
|
SPECTRUM_SVC --> PG
|
||
|
|
ENT_SVC --> PG
|
||
|
|
JOBS --> PG
|
||
|
|
|
||
|
|
ENT_SVC --> APPLE
|
||
|
|
ENT_SVC --> GOOGLE
|
||
|
|
NOTIF --> APNS
|
||
|
|
NOTIF --> FCM
|
||
|
|
GW --> POSTHOG
|
||
|
|
GW --> GLITCHTIP
|
||
|
|
```
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## 3. The Mirror (Awareness) — Sequence Diagram
|
||
|
|
|
||
|
|
Complete sequence from session start through writing, fragment detection, inline reframing, and session reflection.
|
||
|
|
|
||
|
|
```mermaid
|
||
|
|
sequenceDiagram
|
||
|
|
participant U as User
|
||
|
|
participant App as Mobile App
|
||
|
|
participant API as Kalei API
|
||
|
|
participant Safety as Safety Service
|
||
|
|
participant Ent as Entitlement Service
|
||
|
|
participant AI as AI Gateway
|
||
|
|
participant Model as DeepSeek V3.2 via OpenRouter
|
||
|
|
participant DB as PostgreSQL
|
||
|
|
participant R as Redis
|
||
|
|
|
||
|
|
Note over U,R: Session Start
|
||
|
|
U->>App: Opens Mirror tab
|
||
|
|
App->>API: POST /mirror/sessions
|
||
|
|
API->>Ent: Check plan (free: 2/week, prism: unlimited)
|
||
|
|
Ent->>R: Read session counter
|
||
|
|
R-->>Ent: Counter value
|
||
|
|
Ent-->>API: Allowed / Denied
|
||
|
|
API->>DB: Create mirror_session row
|
||
|
|
API-->>App: Session ID + empty state prompt
|
||
|
|
|
||
|
|
Note over U,R: Writing & Fragment Detection Loop
|
||
|
|
U->>App: Writes message freely
|
||
|
|
App->>API: POST /mirror/messages
|
||
|
|
API->>Safety: Crisis precheck on text
|
||
|
|
alt Crisis Detected
|
||
|
|
Safety->>DB: Log safety_event
|
||
|
|
API-->>App: Crisis resources (hotlines, warm message)
|
||
|
|
else Safe Content
|
||
|
|
API->>AI: Fragment detection prompt + user text
|
||
|
|
AI->>Model: Inference request (cached system prompt)
|
||
|
|
Model-->>AI: JSON with fragments + confidence scores
|
||
|
|
AI-->>API: Validated structured result
|
||
|
|
API->>DB: Save message + fragments (confidence > 0.75)
|
||
|
|
API->>R: Increment usage counters
|
||
|
|
API-->>App: Message with highlighted fragments (amber glow + ◇ icons)
|
||
|
|
end
|
||
|
|
|
||
|
|
Note over U,R: User Taps a Fragment
|
||
|
|
U->>App: Taps highlighted fragment ◇
|
||
|
|
App->>API: POST /mirror/fragments/{id}/reframe
|
||
|
|
API->>AI: Reframe prompt + fragment + surrounding context
|
||
|
|
AI->>Model: Inference request
|
||
|
|
Model-->>AI: Reframe + distortion explanation
|
||
|
|
AI-->>API: Validated reframe response
|
||
|
|
API->>DB: Update fragment (was_tapped, was_reframed, reframe_text)
|
||
|
|
API-->>App: Mini-card slides up with reframe
|
||
|
|
App-->>U: Shows pattern name + alternative angle + Full Turn option
|
||
|
|
|
||
|
|
Note over U,R: Session Close & Reflection
|
||
|
|
U->>App: Presses Done / closes Mirror
|
||
|
|
App->>API: POST /mirror/sessions/{id}/close
|
||
|
|
API->>AI: Generate Reflection from all messages + fragments
|
||
|
|
AI->>Model: Batch summary request
|
||
|
|
Model-->>AI: Mosaic themes + fragment count + insight
|
||
|
|
AI-->>API: Reflection payload
|
||
|
|
API->>DB: Update session with reflection + pattern_seed
|
||
|
|
API-->>App: Reflection card (Mosaic + fragments found + patterns + one-line insight)
|
||
|
|
App-->>U: Reflection saved to Gallery
|
||
|
|
```
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## 4. The Turn (Kaleidoscope) — Sequence Diagram
|
||
|
|
|
||
|
|
The structured reframing flow with entitlement gating, safety checks, and multi-perspective AI generation.
|
||
|
|
|
||
|
|
```mermaid
|
||
|
|
sequenceDiagram
|
||
|
|
participant U as User
|
||
|
|
participant App as Mobile App
|
||
|
|
participant API as Kalei API
|
||
|
|
participant Ent as Entitlement Service
|
||
|
|
participant Safety as Safety Service
|
||
|
|
participant AI as AI Gateway
|
||
|
|
participant Model as DeepSeek V3.2 via OpenRouter
|
||
|
|
participant DB as PostgreSQL
|
||
|
|
participant Cost as Cost Guard
|
||
|
|
participant R as Redis
|
||
|
|
|
||
|
|
Note over U,R: User Submits a Fragment for Turning
|
||
|
|
U->>App: Types negative thought + selects style
|
||
|
|
App->>API: POST /turns {text, style, context}
|
||
|
|
|
||
|
|
Note over API,R: Validation & Gating
|
||
|
|
API->>Ent: Validate tier + daily Turn cap
|
||
|
|
Ent->>R: Check daily counter (free: 3/day)
|
||
|
|
R-->>Ent: Current count
|
||
|
|
Ent-->>API: Allowed / Limit reached
|
||
|
|
|
||
|
|
alt Limit Reached
|
||
|
|
API-->>App: Soft paywall prompt
|
||
|
|
App-->>U: "Unlock unlimited Turns with Prism"
|
||
|
|
else Allowed
|
||
|
|
Note over API,R: Safety Gate
|
||
|
|
API->>Safety: Crisis precheck on text
|
||
|
|
alt Crisis Detected
|
||
|
|
Safety->>DB: Log safety_event
|
||
|
|
API-->>App: Crisis resources response
|
||
|
|
App-->>U: Hotline numbers + warm message
|
||
|
|
else Safe Content
|
||
|
|
Note over API,R: AI Reframe Generation
|
||
|
|
API->>AI: Build prompt (cached system + user style + fragment + history context)
|
||
|
|
AI->>Model: Streaming inference request
|
||
|
|
Model-->>AI: 3 reframe perspectives + micro-action (if-then)
|
||
|
|
AI-->>API: Validated structured response + token count
|
||
|
|
|
||
|
|
Note over API,R: Record & Respond
|
||
|
|
API->>Cost: Record token usage + budget check
|
||
|
|
Cost->>R: Update per-user + global counters
|
||
|
|
API->>DB: Save turn + reframes + metadata
|
||
|
|
API-->>App: Stream final Turn result
|
||
|
|
|
||
|
|
Note over U,App: User Sees the Turn Card
|
||
|
|
App-->>U: Original fragment quoted
|
||
|
|
App-->>U: 3 perspective reframes in chosen style
|
||
|
|
App-->>U: Micro-action (Gollwitzer if-then)
|
||
|
|
App-->>U: "Why This Works" expandable science drawer
|
||
|
|
|
||
|
|
Note over U,App: Post-Turn Actions
|
||
|
|
U->>App: Save as Keepsake / Try Different Style / Share
|
||
|
|
App->>API: POST /turns/{id}/save
|
||
|
|
API->>DB: Mark as saved keepsake
|
||
|
|
API-->>App: Streak counter updated
|
||
|
|
end
|
||
|
|
end
|
||
|
|
```
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## 5. The Lens (Manifestation Engine) — 6-Step Flow
|
||
|
|
|
||
|
|
The complete goal creation and daily action system mapped to the 6 research-backed steps.
|
||
|
|
|
||
|
|
```mermaid
|
||
|
|
flowchart TB
|
||
|
|
subgraph Step1["Step 1: DECIDE — Clarity"]
|
||
|
|
S1A["User taps 'Create a Manifestation'"] --> S1B["AI Conversation (3-5 exchanges)\n'What do you want to achieve?'"]
|
||
|
|
S1B --> S1C["SMART Goal Refinement"]
|
||
|
|
S1C --> S1D["Output: Clarity Statement Card"]
|
||
|
|
end
|
||
|
|
|
||
|
|
subgraph Step2["Step 2: SEE IT — Mental Rehearsal"]
|
||
|
|
S1D --> S2A["AI generates personalized\nvisualization script"]
|
||
|
|
S2A --> S2B["First-person, sensory-rich,\nprocess-focused imagery"]
|
||
|
|
S2B --> S2C["User reads/listens\nMarks as complete"]
|
||
|
|
S2C --> S2D["Output: Vision Summary\n(revisitable daily)"]
|
||
|
|
end
|
||
|
|
|
||
|
|
subgraph Step3["Step 3: BELIEVE — Self-Efficacy"]
|
||
|
|
S2D --> S3A["AI asks:\n'What makes you doubt\nthis is possible?'"]
|
||
|
|
S3A --> S3B["User lists doubts"]
|
||
|
|
S3B --> S3C["AI addresses each with:\npast successes + transferable skills\n+ role models + small wins"]
|
||
|
|
S3C --> S3D["Output: Belief Statement Card\n'You CAN — here's the evidence'"]
|
||
|
|
end
|
||
|
|
|
||
|
|
subgraph Step4["Step 4: NOTICE — Attention Training"]
|
||
|
|
S3D --> S4A["AI sets up daily\nattention prompts"]
|
||
|
|
S4A --> S4B["Daily push:\n'Notice one thing aligned\nwith your goal today'"]
|
||
|
|
S4B --> S4C["User logs observations\nBuilds Evidence Journal"]
|
||
|
|
S4C --> S4D["AI surfaces patterns:\n'23 alignment instances\nthis month'"]
|
||
|
|
end
|
||
|
|
|
||
|
|
subgraph Step5["Step 5: ACT — Implementation Intentions"]
|
||
|
|
S4D --> S5A["AI generates weekly\nmicro-actions"]
|
||
|
|
S5A --> S5B["Gollwitzer if-then format:\n'If [time/situation],\nthen I will [15-min action]'"]
|
||
|
|
S5B --> S5C["User checks off\ncompleted actions"]
|
||
|
|
S5C --> S5D["AI adapts difficulty:\n2-min actions → scales up\nas habit solidifies"]
|
||
|
|
end
|
||
|
|
|
||
|
|
subgraph Step6["Step 6: REPEAT — Compound"]
|
||
|
|
S5D --> S6A["Habit Tracking Dashboard"]
|
||
|
|
S6A --> S6B["Visual growth charts\nMilestone celebrations"]
|
||
|
|
S6B --> S6C["Weekly AI Summary:\nreframes + patterns +\nprogress + adjustments"]
|
||
|
|
S6C --> S6D["Celebrates PROCESS\nnot just outcomes"]
|
||
|
|
S6D --> S4B
|
||
|
|
end
|
||
|
|
```
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## 6. AI Processing Pipeline & Cost Routing
|
||
|
|
|
||
|
|
How every AI request flows through the gateway with prompt caching, safety guards, and cost-aware provider routing.
|
||
|
|
|
||
|
|
```mermaid
|
||
|
|
flowchart LR
|
||
|
|
subgraph Input["Request Sources"]
|
||
|
|
MIRROR["Mirror\n(Fragment Detection)"]
|
||
|
|
TURN["Turn\n(3 Reframes)"]
|
||
|
|
LENS["Lens\n(Affirmations)"]
|
||
|
|
SPECTRUM["Spectrum\n(Weekly Insights)"]
|
||
|
|
end
|
||
|
|
|
||
|
|
subgraph Pipeline["AI Gateway Pipeline"]
|
||
|
|
PROMPT["Prompt Builder\n(System + User Context + Research Grounding)"]
|
||
|
|
CACHE["Prompt Cache Check\n(~20% savings on cached system prompts)"]
|
||
|
|
SAFETY_CHECK["Anti-Toxicity Guard\n(No toxic positivity / magical thinking)"]
|
||
|
|
ROUTER{"Cost Router\nBudget Check"}
|
||
|
|
end
|
||
|
|
|
||
|
|
subgraph PrimaryLane["Primary Lane (via OpenRouter)"]
|
||
|
|
DEEPSEEK_RT["DeepSeek V3.2\nvia DeepInfra/Fireworks\n($0.26/$0.38 per MTok)"]
|
||
|
|
end
|
||
|
|
|
||
|
|
subgraph FallbackLane["Fallback Lane (Auto-Failover)"]
|
||
|
|
CLAUDE_FB["Claude Haiku 4.5\n(Automatic on provider outage)"]
|
||
|
|
end
|
||
|
|
|
||
|
|
subgraph TemplateLane["Template Fallback (Budget Pressure)"]
|
||
|
|
TEMPLATE["Local Template System\n(Pre-written, no AI cost)"]
|
||
|
|
end
|
||
|
|
|
||
|
|
subgraph Output["Response Handling"]
|
||
|
|
VALIDATE["Structured Output\nValidation (JSON)"]
|
||
|
|
TOKEN_LOG["Token Usage Logger"]
|
||
|
|
BUDGET["Budget Tracker\n(Per-user daily + Global monthly)"]
|
||
|
|
RESPONSE["Stream Response\nto Client"]
|
||
|
|
end
|
||
|
|
|
||
|
|
subgraph Alerts["Cost Controls"]
|
||
|
|
ALERT50["50% Budget Alert"]
|
||
|
|
ALERT80["80% Budget Alert\nDegrade Lens to templates"]
|
||
|
|
ALERT95["95% Budget Alert\nPause Spectrum generation"]
|
||
|
|
HARDCAP["100% Hard Cap\nGraceful service message"]
|
||
|
|
end
|
||
|
|
|
||
|
|
MIRROR --> PROMPT
|
||
|
|
TURN --> PROMPT
|
||
|
|
LENS --> PROMPT
|
||
|
|
SPECTRUM --> PROMPT
|
||
|
|
|
||
|
|
PROMPT --> CACHE
|
||
|
|
CACHE --> SAFETY_CHECK
|
||
|
|
SAFETY_CHECK --> ROUTER
|
||
|
|
|
||
|
|
ROUTER -->|"All features\n(primary)"| DEEPSEEK_RT
|
||
|
|
ROUTER -->|"Provider outage\n(auto-failover)"| CLAUDE_FB
|
||
|
|
ROUTER -->|"Lens / basic content\n(budget pressure)"| TEMPLATE
|
||
|
|
|
||
|
|
DEEPSEEK_RT --> VALIDATE
|
||
|
|
CLAUDE_FB --> VALIDATE
|
||
|
|
TEMPLATE --> VALIDATE
|
||
|
|
|
||
|
|
VALIDATE --> TOKEN_LOG
|
||
|
|
TOKEN_LOG --> BUDGET
|
||
|
|
BUDGET --> RESPONSE
|
||
|
|
BUDGET --> ALERT50
|
||
|
|
BUDGET --> ALERT80
|
||
|
|
BUDGET --> ALERT95
|
||
|
|
BUDGET --> HARDCAP
|
||
|
|
```
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## 7. Safety & Crisis Detection Flow
|
||
|
|
|
||
|
|
The multi-stage safety pipeline that ensures crisis content is never reframed.
|
||
|
|
|
||
|
|
```mermaid
|
||
|
|
flowchart TB
|
||
|
|
subgraph Input["User Input Arrives"]
|
||
|
|
MSG["User text from\nMirror / Turn / Lens"]
|
||
|
|
end
|
||
|
|
|
||
|
|
subgraph Stage1["Stage 1: Deterministic Keyword Scan"]
|
||
|
|
KW["Keyword & Pattern Matcher\n(Regex-based, zero latency)"]
|
||
|
|
KW_YES{"Crisis keywords\ndetected?"}
|
||
|
|
end
|
||
|
|
|
||
|
|
subgraph Stage2["Stage 2: AI Confirmation"]
|
||
|
|
AI_CHECK["Low-latency AI model\nconfirms severity"]
|
||
|
|
AI_YES{"Confirmed\ncrisis?"}
|
||
|
|
end
|
||
|
|
|
||
|
|
subgraph CrisisResponse["Crisis Response — NEVER Reframed"]
|
||
|
|
CR1["Hardcoded crisis template\n(Not AI-generated)"]
|
||
|
|
CR2["Display local hotline numbers\n(988 Lifeline, Crisis Text Line)"]
|
||
|
|
CR3["Warm handoff message:\n'You matter. Help is available\nright now.'"]
|
||
|
|
CR4["Log safety_event to DB\nfor monitoring"]
|
||
|
|
end
|
||
|
|
|
||
|
|
subgraph NormalFlow["Normal Processing"]
|
||
|
|
PROCEED["Continue to AI Gateway\nfor reframing / detection"]
|
||
|
|
end
|
||
|
|
|
||
|
|
subgraph Monitoring["Safety Monitoring"]
|
||
|
|
FP["Track false positives\nfor filter tuning"]
|
||
|
|
FN["Track false negatives\nvia user reports"]
|
||
|
|
REVIEW["Weekly safety review loop"]
|
||
|
|
end
|
||
|
|
|
||
|
|
MSG --> KW
|
||
|
|
KW --> KW_YES
|
||
|
|
|
||
|
|
KW_YES -->|"Yes — high confidence\n(explicit phrases)"| CR1
|
||
|
|
KW_YES -->|"Maybe — ambiguous"| AI_CHECK
|
||
|
|
KW_YES -->|"No"| PROCEED
|
||
|
|
|
||
|
|
AI_CHECK --> AI_YES
|
||
|
|
AI_YES -->|"Yes"| CR1
|
||
|
|
AI_YES -->|"No — false alarm"| PROCEED
|
||
|
|
|
||
|
|
CR1 --> CR2
|
||
|
|
CR2 --> CR3
|
||
|
|
CR3 --> CR4
|
||
|
|
|
||
|
|
PROCEED --> FP
|
||
|
|
CR4 --> FN
|
||
|
|
FP --> REVIEW
|
||
|
|
FN --> REVIEW
|
||
|
|
```
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## 8. Subscription & Billing State Machine
|
||
|
|
|
||
|
|
All user states from anonymous through free, Prism, and Prism+ with renewal, grace period, and downgrade flows.
|
||
|
|
|
||
|
|
```mermaid
|
||
|
|
stateDiagram-v2
|
||
|
|
[*] --> Anonymous: App Downloaded
|
||
|
|
|
||
|
|
Anonymous --> FreeUser: Account Created
|
||
|
|
|
||
|
|
state FreeUser {
|
||
|
|
[*] --> ActiveFree
|
||
|
|
ActiveFree --> LimitHit: Daily/weekly cap reached
|
||
|
|
LimitHit --> ActiveFree: Next day/week resets
|
||
|
|
LimitHit --> PaywallShown: Soft upgrade prompt
|
||
|
|
}
|
||
|
|
|
||
|
|
state PrismSubscriber {
|
||
|
|
[*] --> ActivePrism
|
||
|
|
ActivePrism --> PrismRenewal: Monthly renewal
|
||
|
|
PrismRenewal --> ActivePrism: Payment success
|
||
|
|
PrismRenewal --> GracePeriod: Payment failed
|
||
|
|
GracePeriod --> ActivePrism: Retry success
|
||
|
|
GracePeriod --> Expired: Grace period ends
|
||
|
|
}
|
||
|
|
|
||
|
|
state PrismPlusSubscriber {
|
||
|
|
[*] --> ActivePrismPlus
|
||
|
|
ActivePrismPlus --> PlusMRenewal: Monthly renewal
|
||
|
|
PlusMRenewal --> ActivePrismPlus: Payment success
|
||
|
|
PlusMRenewal --> PlusGrace: Payment failed
|
||
|
|
PlusGrace --> ActivePrismPlus: Retry success
|
||
|
|
PlusGrace --> PlusExpired: Grace period ends
|
||
|
|
}
|
||
|
|
|
||
|
|
FreeUser --> PrismSubscriber: Subscribe $4.99/mo
|
||
|
|
FreeUser --> PrismPlusSubscriber: Subscribe $9.99/mo
|
||
|
|
PrismSubscriber --> PrismPlusSubscriber: Upgrade
|
||
|
|
PrismPlusSubscriber --> PrismSubscriber: Downgrade
|
||
|
|
|
||
|
|
PrismSubscriber --> FreeUser: Cancel / Expired
|
||
|
|
PrismPlusSubscriber --> FreeUser: Cancel / PlusExpired
|
||
|
|
|
||
|
|
state EntitlementCheck {
|
||
|
|
[*] --> CheckPlan
|
||
|
|
CheckPlan --> FreeTier: No active subscription
|
||
|
|
CheckPlan --> PrismTier: Active Prism
|
||
|
|
CheckPlan --> PrismPlusTier: Active Prism+
|
||
|
|
FreeTier --> ApplyLimits: 3 Turns/day, 2 Mirror/week
|
||
|
|
PrismTier --> FullAccess: Unlimited Turns + Mirror
|
||
|
|
PrismPlusTier --> FullPlusAccess: Full + Spectrum + Insights
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## 9. Data Entity Relationship Model
|
||
|
|
|
||
|
|
All database domains showing how Users connect to every feature, commerce, and ops table.
|
||
|
|
|
||
|
|
```mermaid
|
||
|
|
flowchart LR
|
||
|
|
subgraph Identity["Identity Domain"]
|
||
|
|
USERS["USERS\nid, email, password_hash"]
|
||
|
|
PROFILES["PROFILES\nuser_id, display_name\nreframe_style, checkin_time"]
|
||
|
|
AUTH["AUTH_SESSIONS\nid, user_id, device_info"]
|
||
|
|
REFRESH["REFRESH_TOKENS\nid, user_id, token_hash"]
|
||
|
|
end
|
||
|
|
|
||
|
|
subgraph Mirror["Mirror Domain"]
|
||
|
|
M_SESS["MIRROR_SESSIONS\nid, user_id, started_at\nreflection_summary"]
|
||
|
|
M_MSG["MIRROR_MESSAGES\nid, session_id\ncontent (encrypted)"]
|
||
|
|
M_FRAG["MIRROR_FRAGMENTS\nid, message_id\ndistortion_type, confidence\nwas_tapped, reframe_text"]
|
||
|
|
end
|
||
|
|
|
||
|
|
subgraph Turn["Turn Domain"]
|
||
|
|
TURNS["TURNS\nid, user_id, input_text\nreframe_style, reframes\nmicro_action, is_saved"]
|
||
|
|
end
|
||
|
|
|
||
|
|
subgraph Lens["Lens Domain"]
|
||
|
|
GOALS["LENS_GOALS\nid, user_id, goal_text\nclarity_statement\nbelief_statement"]
|
||
|
|
ACTIONS["LENS_ACTIONS\nid, goal_id, action_text\nif_then_format, completed"]
|
||
|
|
end
|
||
|
|
|
||
|
|
subgraph Spectrum["Spectrum"]
|
||
|
|
S_WEEK["SPECTRUM_WEEKLY\nuser_id, week_start\naggregates, insight"]
|
||
|
|
S_MONTH["SPECTRUM_MONTHLY\nuser_id, month\ngrowth_trajectory"]
|
||
|
|
end
|
||
|
|
|
||
|
|
subgraph Commerce["Commerce"]
|
||
|
|
SUBS["SUBSCRIPTIONS\nid, user_id, plan\nstore, status, expires_at"]
|
||
|
|
end
|
||
|
|
|
||
|
|
subgraph Ops["Safety and Ops"]
|
||
|
|
SAFE["SAFETY_EVENTS\nid, user_id, trigger_text\ndetection_stage"]
|
||
|
|
AI_USE["AI_USAGE_EVENTS\nid, user_id, feature\nmodel, tokens, cost"]
|
||
|
|
end
|
||
|
|
|
||
|
|
USERS --> PROFILES
|
||
|
|
USERS --> AUTH
|
||
|
|
USERS --> REFRESH
|
||
|
|
USERS --> M_SESS
|
||
|
|
M_SESS --> M_MSG
|
||
|
|
M_MSG --> M_FRAG
|
||
|
|
USERS --> TURNS
|
||
|
|
USERS --> GOALS
|
||
|
|
GOALS --> ACTIONS
|
||
|
|
USERS --> S_WEEK
|
||
|
|
USERS --> S_MONTH
|
||
|
|
USERS --> SUBS
|
||
|
|
USERS --> SAFE
|
||
|
|
USERS --> AI_USE
|
||
|
|
```
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## 10. Deployment Topology & Scaling Path
|
||
|
|
|
||
|
|
How the infrastructure evolves from a single EUR 8.45/mo VPS to a multi-node architecture as DAU grows.
|
||
|
|
|
||
|
|
```mermaid
|
||
|
|
flowchart TB
|
||
|
|
subgraph Launch["Launch: Single VPS — 50 DAU — ~EUR 16/mo"]
|
||
|
|
P1_CF["Cloudflare (Free)"] --> P1_NGINX["Nginx"]
|
||
|
|
P1_NGINX --> P1_API["Node.js API + Workers"]
|
||
|
|
P1_API --> P1_PG["PostgreSQL 16"]
|
||
|
|
P1_API --> P1_REDIS["Redis"]
|
||
|
|
P1_API --> P1_AI["DeepSeek V3.2\nvia OpenRouter/DeepInfra"]
|
||
|
|
end
|
||
|
|
|
||
|
|
subgraph Traction["Traction: Split DB — 200 DAU — ~EUR 53/mo"]
|
||
|
|
P2_CF["Cloudflare"] --> P2_NGINX["Nginx"]
|
||
|
|
P2_NGINX --> P2_API["Node.js API + Workers"]
|
||
|
|
P2_API --> P2_PG["PostgreSQL (Separate VPS)"]
|
||
|
|
P2_API --> P2_REDIS["Redis"]
|
||
|
|
P2_API --> P2_AI["DeepSeek V3.2 via OpenRouter\n+ Claude Haiku fallback"]
|
||
|
|
end
|
||
|
|
|
||
|
|
subgraph Growth["Growth: Scale API — 1000 DAU — ~EUR 216/mo"]
|
||
|
|
P3_CF["Cloudflare"] --> P3_LB["Load Balancer"]
|
||
|
|
P3_LB --> P3_API1["API Replica 1"]
|
||
|
|
P3_LB --> P3_API2["API Replica 2"]
|
||
|
|
P3_API1 --> P3_PG["PostgreSQL (Dedicated)"]
|
||
|
|
P3_API2 --> P3_PG
|
||
|
|
P3_API1 --> P3_REDIS["Redis Cluster"]
|
||
|
|
P3_API2 --> P3_REDIS
|
||
|
|
P3_WORKER["Spectrum Workers"] --> P3_PG
|
||
|
|
P3_API1 --> P3_AI["OpenRouter AI Gateway\n(DeepSeek + Claude fallback)"]
|
||
|
|
P3_API2 --> P3_AI
|
||
|
|
end
|
||
|
|
|
||
|
|
Launch -->|"p95 latency > 120ms\nor storage > 70%"| Traction
|
||
|
|
Traction -->|"CPU > 70% sustained\nor p95 > SLO"| Growth
|
||
|
|
```
|