DATA FLOW - nself-org/nchat GitHub Wiki

nself-chat Data Flow Diagrams

Version: 1.0.0 Date: 2026-02-08 Status: Active


Table of Contents

  1. Overview
  2. System Context
  3. Trust Boundaries
  4. Data Flow Diagrams
  5. Data Classifications
  6. Data Stores
  7. External Entities

Overview

This document provides data flow diagrams (DFDs) for the nself-chat platform, identifying trust boundaries, data stores, and external entities for security analysis.


System Context

                                    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
                                    β”‚                    EXTERNAL ENTITIES                          β”‚
                                    β”‚                                                               β”‚
                                    β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚
                                    β”‚  β”‚  OAuth  β”‚  β”‚ Payment β”‚  β”‚   AI    β”‚  β”‚   CDN/Storage   β”‚ β”‚
                                    β”‚  β”‚Providersβ”‚  β”‚Providersβ”‚  β”‚Services β”‚  β”‚   Providers     β”‚ β”‚
                                    β”‚  β””β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”˜  β””β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”˜  β””β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”˜  β””β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚
                                    β””β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                                            β”‚            β”‚            β”‚                β”‚
                                            β”‚            β”‚            β”‚                β”‚
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                                           β–Ό            β–Ό            β–Ό                β–Ό           β”‚
β”‚                            β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”   β”‚
β”‚                            β”‚                     NSELF-CHAT PLATFORM                          β”‚   β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”     β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”‚   β”‚
β”‚  β”‚                   β”‚     β”‚  β”‚   Next.js   β”‚  β”‚   Hasura    β”‚  β”‚      Backend Services   β”‚  β”‚   β”‚
β”‚  β”‚   Web Browser     │◄───►│  β”‚  Frontend   │◄──  GraphQL    │◄──  (Auth, Storage, etc.)  β”‚  β”‚   β”‚
β”‚  β”‚   (PWA)           β”‚     β”‚  β”‚  + API      β”‚  β”‚   Engine    β”‚  β”‚                         β”‚  β”‚   β”‚
β”‚  β”‚                   β”‚     β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β””β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”˜  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β”‚   β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜     β”‚                          β”‚                      β”‚               β”‚   β”‚
β”‚                            β”‚                          β–Ό                      β”‚               β”‚   β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”     β”‚              β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”              β”‚               β”‚   β”‚
β”‚  β”‚   Mobile Apps     │◄───►│              β”‚    PostgreSQL     β”‚β—„β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜               β”‚   β”‚
β”‚  β”‚  (iOS/Android)    β”‚     β”‚              β”‚     Database      β”‚                              β”‚   β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜     β”‚              β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜                              β”‚   β”‚
β”‚                            β”‚                                                                  β”‚   β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”     β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”‚   β”‚
β”‚  β”‚   Desktop Apps    │◄───►│  β”‚   Redis     β”‚  β”‚ MeiliSearch β”‚  β”‚       MinIO            β”‚  β”‚   β”‚
β”‚  β”‚ (Electron/Tauri)  β”‚     β”‚  β”‚   Cache     β”‚  β”‚   Search    β”‚  β”‚   Object Storage       β”‚  β”‚   β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜     β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β”‚   β”‚
β”‚                            β”‚                                                                  β”‚   β”‚
β”‚                            β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜   β”‚
β”‚                                                                                                   β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                                                   β”‚
                                                   β”‚
                                    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
                                    β”‚              β”‚              β”‚
                                    β–Ό              β–Ό              β–Ό
                            β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
                            β”‚ Monitoringβ”‚  β”‚  Logging  β”‚  β”‚  Backup   β”‚
                            β”‚  (Sentry) β”‚  β”‚ (Grafana) β”‚  β”‚  Systems  β”‚
                            β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Trust Boundaries

TB1: Public Internet Boundary

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                              UNTRUSTED ZONE                                  β”‚
β”‚                           (Public Internet)                                  β”‚
β”‚                                                                              β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”β”‚
β”‚  β”‚   Attacker  β”‚  β”‚   Bot Net   β”‚  β”‚   Scrapers  β”‚  β”‚   Legitimate Users  β”‚β”‚
β”‚  β”‚             β”‚  β”‚             β”‚  β”‚             β”‚  β”‚                     β”‚β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”˜  β””β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”˜  β””β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”˜  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜β”‚
β”‚         β”‚                β”‚                β”‚                     β”‚           β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
          β”‚                β”‚                β”‚                     β”‚
          β”‚                β”‚                β”‚                     β”‚
══════════β•ͺ════════════════β•ͺ════════════════β•ͺ═════════════════════β•ͺ═══════════
          β”‚   TRUST BOUNDARY 1 (TB1)        β”‚                     β”‚
          β”‚   - TLS termination             β”‚                     β”‚
          β”‚   - Rate limiting               β”‚                     β”‚
          β”‚   - WAF (optional)              β”‚                     β”‚
══════════β•ͺ════════════════β•ͺ════════════════β•ͺ═════════════════════β•ͺ═══════════
          β”‚                β”‚                β”‚                     β”‚
          β–Ό                β–Ό                β–Ό                     β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                              DMZ / EDGE ZONE                                 β”‚
β”‚                                                                              β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚
β”‚  β”‚                         Load Balancer / Reverse Proxy                   β”‚ β”‚
β”‚  β”‚                                   (Nginx)                               β”‚ β”‚
β”‚  β”‚  - TLS termination                                                      β”‚ β”‚
β”‚  β”‚  - Request routing                                                      β”‚ β”‚
β”‚  β”‚  - Rate limiting                                                        β”‚ β”‚
β”‚  β”‚  - Security headers injection                                           β”‚ β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚
β”‚                                        β”‚                                     β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                                         β”‚

TB2: Application Boundary

══════════════════════════════════════════β•ͺ═══════════════════════════════════
                                          β”‚
          TRUST BOUNDARY 2 (TB2)          β”‚
          - Authentication required       β”‚
          - CSRF validation               β”‚
          - Input validation              β”‚
                                          β”‚
══════════════════════════════════════════β•ͺ═══════════════════════════════════
                                          β”‚
                                          β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                            APPLICATION ZONE                                  β”‚
β”‚                                                                              β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”β”‚
β”‚  β”‚                         Next.js Application                              β”‚β”‚
β”‚  β”‚                                                                          β”‚β”‚
β”‚  β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”‚β”‚
β”‚  β”‚  β”‚   Frontend      β”‚  β”‚   API Routes    β”‚  β”‚   Middleware            β”‚  β”‚β”‚
β”‚  β”‚  β”‚   (React)       β”‚  β”‚   (Server)      β”‚  β”‚   (Auth, CSRF, etc.)    β”‚  β”‚β”‚
β”‚  β”‚  β”‚                 β”‚  β”‚                 β”‚  β”‚                         β”‚  β”‚β”‚
β”‚  β”‚  β”‚ - CSP enforced  β”‚  β”‚ - Input valid.  β”‚  β”‚ - JWT verification      β”‚  β”‚β”‚
β”‚  β”‚  β”‚ - XSS sanitized β”‚  β”‚ - Auth checks   β”‚  β”‚ - Rate limiting         β”‚  β”‚β”‚
β”‚  β”‚  β”‚ - CSRF tokens   β”‚  β”‚ - RBAC enforce  β”‚  β”‚ - Security headers      β”‚  β”‚β”‚
β”‚  β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β”‚β”‚
β”‚  β”‚                                                                          β”‚β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜β”‚
β”‚                                                                              β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                                          β”‚

TB3: Data Layer Boundary

══════════════════════════════════════════β•ͺ═══════════════════════════════════
                                          β”‚
          TRUST BOUNDARY 3 (TB3)          β”‚
          - Hasura permissions            β”‚
          - Row-level security            β”‚
          - Parameterized queries         β”‚
                                          β”‚
══════════════════════════════════════════β•ͺ═══════════════════════════════════
                                          β”‚
                                          β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                              DATA ZONE                                       β”‚
β”‚                                                                              β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚
β”‚  β”‚     Hasura GraphQL     β”‚  β”‚              PostgreSQL                     β”‚ β”‚
β”‚  β”‚                        β”‚  β”‚                                             β”‚ β”‚
β”‚  β”‚ - Permission rules     β”‚  β”‚  - Encrypted at rest                       β”‚ β”‚
β”‚  β”‚ - Row-level security   β”‚  β”‚  - TLS connections                         β”‚ β”‚
β”‚  β”‚ - Query validation     β”‚  β”‚  - Parameterized queries                   β”‚ β”‚
β”‚  β”‚ - Rate limiting        β”‚  β”‚  - Audit logging                           β”‚ β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚
β”‚                                                                              β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚
β”‚  β”‚       Redis            β”‚  β”‚              MinIO Storage                  β”‚ β”‚
β”‚  β”‚                        β”‚  β”‚                                             β”‚ β”‚
β”‚  β”‚ - Session storage      β”‚  β”‚  - Signed URLs                             β”‚ β”‚
β”‚  β”‚ - Cache (ephemeral)    β”‚  β”‚  - Access policies                         β”‚ β”‚
β”‚  β”‚ - Rate limit counters  β”‚  β”‚  - Encryption at rest                      β”‚ β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚
β”‚                                                                              β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

TB4: Client Device Boundary

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                           CLIENT DEVICE ZONE                                  β”‚
β”‚                           (User's Device)                                     β”‚
β”‚                                                                               β”‚
β”‚  ═══════════════════════════════════════════════════════════════════════════ β”‚
β”‚              TRUST BOUNDARY 4 (TB4) - Device Security                         β”‚
β”‚              - Device lock (PIN/biometric)                                    β”‚
β”‚              - Encrypted storage                                              β”‚
β”‚              - Memory protection                                              β”‚
β”‚  ═══════════════════════════════════════════════════════════════════════════ β”‚
β”‚                                                                               β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚
β”‚  β”‚                        E2EE Protected Zone                               β”‚ β”‚
β”‚  β”‚                                                                          β”‚ β”‚
β”‚  β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ β”‚
β”‚  β”‚  β”‚  Master Key      β”‚  β”‚  Private Keys    β”‚  β”‚  Decrypted Messages    β”‚ β”‚ β”‚
β”‚  β”‚  β”‚  (Memory Only)   β”‚  β”‚  (Encrypted DB)  β”‚  β”‚  (Memory Only)         β”‚ β”‚ β”‚
β”‚  β”‚  β”‚                  β”‚  β”‚                  β”‚  β”‚                        β”‚ β”‚ β”‚
β”‚  β”‚  β”‚  NEVER persisted β”‚  β”‚  AES-256-GCM     β”‚  β”‚  Rendered in DOM       β”‚ β”‚ β”‚
β”‚  β”‚  β”‚  to storage      β”‚  β”‚  encrypted       β”‚  β”‚  Never stored          β”‚ β”‚ β”‚
β”‚  β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β”‚
β”‚  β”‚                                                                          β”‚ β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚
β”‚                                                                               β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚
β”‚  β”‚                        Encrypted Storage                                 β”‚ β”‚
β”‚  β”‚                                                                          β”‚ β”‚
β”‚  β”‚  IndexedDB with encrypted keys:                                          β”‚ β”‚
β”‚  β”‚  - Identity keys (encrypted)                                             β”‚ β”‚
β”‚  β”‚  - Session keys (encrypted)                                              β”‚ β”‚
β”‚  β”‚  - Prekeys (encrypted)                                                   β”‚ β”‚
β”‚  β”‚  - Cached encrypted messages                                             β”‚ β”‚
β”‚  β”‚                                                                          β”‚ β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚
β”‚                                                                               β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Data Flow Diagrams

DFD Level 0: System Context

                                        β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
                                        β”‚  End Users    β”‚
                                        β”‚  (Browsers,   β”‚
                                        β”‚   Mobile,     β”‚
                                        β”‚   Desktop)    β”‚
                                        β””β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”˜
                                                β”‚
                                                β”‚ HTTPS/WSS
                                                β”‚ (Encrypted)
                                                β”‚
                                                β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”      β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”      β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚               β”‚      β”‚                                       β”‚      β”‚               β”‚
β”‚    OAuth      │◄────►│           nself-chat                  │◄────►│   Payment     β”‚
β”‚   Providers   β”‚      β”‚           Platform                    β”‚      β”‚   Providers   β”‚
β”‚               β”‚ OAuthβ”‚                                       β”‚ Stripeβ”‚               β”‚
β”‚   (Google,    β”‚ 2.0  β”‚   - Messaging                         β”‚ API  β”‚   (Stripe,    β”‚
β”‚    GitHub,    β”‚      β”‚   - Voice/Video                       β”‚      β”‚    Crypto)    β”‚
β”‚    etc.)      β”‚      β”‚   - File Sharing                      β”‚      β”‚               β”‚
β”‚               β”‚      β”‚   - Authentication                    β”‚      β”‚               β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜      β”‚   - Authorization                     β”‚      β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                       β”‚                                       β”‚
                       β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                                           β”‚
                       β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
                       β”‚                   β”‚                   β”‚
                       β–Ό                   β–Ό                   β–Ό
               β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”   β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”   β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
               β”‚     AI        β”‚   β”‚   Storage     β”‚   β”‚   Email       β”‚
               β”‚   Services    β”‚   β”‚  (S3/MinIO)   β”‚   β”‚   Provider    β”‚
               β”‚               β”‚   β”‚               β”‚   β”‚               β”‚
               β”‚  (OpenAI,     β”‚   β”‚  Files,       β”‚   β”‚  (Resend,     β”‚
               β”‚   Anthropic)  β”‚   β”‚  Media        β”‚   β”‚   SendGrid)   β”‚
               β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜   β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜   β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

DFD Level 1: Core Application

                                    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
                                    β”‚    User        β”‚
                                    β””β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                                            β”‚
            β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
            β”‚                               β”‚                               β”‚
            β–Ό                               β–Ό                               β–Ό
    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”              β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”              β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
    β”‚   [1.0]       β”‚              β”‚   [2.0]       β”‚              β”‚   [3.0]       β”‚
    β”‚ Authenticationβ”‚              β”‚  Messaging    β”‚              β”‚  Media        β”‚
    β”‚   Process     β”‚              β”‚   Process     β”‚              β”‚   Process     β”‚
    β”‚               β”‚              β”‚               β”‚              β”‚               β”‚
    β”‚ - Login       β”‚              β”‚ - Send/Recv   β”‚              β”‚ - Upload      β”‚
    β”‚ - Register    β”‚              β”‚ - E2EE        β”‚              β”‚ - Download    β”‚
    β”‚ - 2FA         β”‚              β”‚ - Threads     β”‚              β”‚ - Stream      β”‚
    β”‚ - OAuth       β”‚              β”‚ - Reactions   β”‚              β”‚ - Transcode   β”‚
    β””β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”˜              β””β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”˜              β””β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”˜
            β”‚                               β”‚                               β”‚
            β”‚                               β”‚                               β”‚
            β–Ό                               β–Ό                               β–Ό
    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
    β”‚                               [DB]                                         β”‚
    β”‚                           PostgreSQL                                       β”‚
    β”‚                                                                            β”‚
    β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚
    β”‚  β”‚ Users   β”‚  β”‚Messages β”‚  β”‚Channels β”‚  β”‚ Files   β”‚  β”‚ Audit Logs      β”‚ β”‚
    β”‚  β”‚         β”‚  β”‚(E2EE)   β”‚  β”‚         β”‚  β”‚ Meta    β”‚  β”‚                 β”‚ β”‚
    β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚
    β”‚                                                                            β”‚
    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Legend:
    [X.0] = Process
    [DB]  = Data Store
    ───►  = Data Flow

DFD Level 2: Authentication Flow

                            β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
                            β”‚     User       β”‚
                            β””β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                                    β”‚
          β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
          β”‚ Credentials             β”‚ OAuth Token             β”‚
          β–Ό                         β–Ό                         β–Ό
  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”        β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”        β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
  β”‚   [1.1]       β”‚        β”‚   [1.2]       β”‚        β”‚   [1.3]       β”‚
  β”‚   Login       β”‚        β”‚   OAuth       β”‚        β”‚   2FA         β”‚
  β”‚   Handler     β”‚        β”‚   Handler     β”‚        β”‚   Handler     β”‚
  β”‚               β”‚        β”‚               β”‚        β”‚               β”‚
  β”‚ - Validate    β”‚        β”‚ - Redirect    β”‚        β”‚ - TOTP verify β”‚
  β”‚ - Rate limit  β”‚        β”‚ - Callback    β”‚        β”‚ - Backup code β”‚
  β”‚ - Bcrypt      β”‚        β”‚ - Token       β”‚        β”‚ - Biometric   β”‚
  β””β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”˜        β””β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”˜        β””β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”˜
          β”‚                        β”‚                        β”‚
          β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                                   β”‚
                                   β–Ό
                          β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
                          β”‚   [1.4]       β”‚
                          β”‚   Session     β”‚
                          β”‚   Manager     β”‚
                          β”‚               β”‚
                          β”‚ - JWT issue   β”‚
                          β”‚ - Refresh     β”‚
                          β”‚ - Revoke      β”‚
                          β””β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”˜
                                  β”‚
          β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
          β”‚                       β”‚                       β”‚
          β–Ό                       β–Ό                       β–Ό
  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”      β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”      β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
  β”‚  [Users DB]   β”‚      β”‚ [Sessions     β”‚      β”‚ [Audit Log]   β”‚
  β”‚               β”‚      β”‚  Store]       β”‚      β”‚               β”‚
  β”‚ - Credentials β”‚      β”‚ - Redis       β”‚      β”‚ - Login eventsβ”‚
  β”‚ - 2FA secrets β”‚      β”‚ - JWT tokens  β”‚      β”‚ - Failed auth β”‚
  β”‚ - Preferences β”‚      β”‚ - Sessions    β”‚      β”‚ - IP tracking β”‚
  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜      β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜      β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Data Flow Security:
  - All connections use TLS
  - Passwords: bcrypt hashed (never stored plaintext)
  - 2FA secrets: AES-256 encrypted at rest
  - JWTs: Short-lived (15min), signed with RS256
  - Refresh tokens: HTTP-only, secure cookies

DFD Level 2: E2EE Message Flow

                β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”                    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
                β”‚   Sender       β”‚                    β”‚   Recipient    β”‚
                β”‚   Device       β”‚                    β”‚   Device       β”‚
                β””β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”˜                    β””β”€β”€β”€β”€β”€β”€β”€β–²β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                        β”‚                                     β”‚
                        β”‚ Plaintext                           β”‚ Plaintext
                        β”‚ Message                             β”‚ Message
                        β”‚                                     β”‚
                        β–Ό                                     β”‚
                β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”                     β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
                β”‚   [2.1]       β”‚                     β”‚   [2.4]       β”‚
                β”‚   Encrypt     β”‚                     β”‚   Decrypt     β”‚
                β”‚   (Client)    β”‚                     β”‚   (Client)    β”‚
                β”‚               β”‚                     β”‚               β”‚
                β”‚ - X3DH/Ratchetβ”‚                     β”‚ - X3DH/Ratchetβ”‚
                β”‚ - AES-GCM     β”‚                     β”‚ - AES-GCM     β”‚
                β”‚ - Message key β”‚                     β”‚ - Message key β”‚
                β””β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”˜                     β””β”€β”€β”€β”€β”€β”€β”€β–²β”€β”€β”€β”€β”€β”€β”€β”˜
                        β”‚                                     β”‚
                        β”‚ Ciphertext                          β”‚ Ciphertext
                        β”‚ + Envelope                          β”‚ + Envelope
                        β”‚                                     β”‚
                        β–Ό                                     β”‚
                β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”                     β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
                β”‚   [2.2]       β”‚                     β”‚   [2.3]       β”‚
                β”‚   Send        │────────────────────►│   Receive     β”‚
                β”‚   (Server)    β”‚    Encrypted        β”‚   (Server)    β”‚
                β”‚               β”‚    Message          β”‚               β”‚
                β”‚ - Store       β”‚    (Opaque)         β”‚ - Deliver     β”‚
                β”‚ - Route       β”‚                     β”‚ - Queue       β”‚
                β”‚ - Log meta    β”‚                     β”‚ - Notify      β”‚
                β””β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”˜                     β””β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”˜
                        β”‚                                     β”‚
                        β”‚                                     β”‚
                        β–Ό                                     β–Ό
                β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
                β”‚                [Messages DB]                     β”‚
                β”‚                                                  β”‚
                β”‚   β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚
                β”‚   β”‚  Encrypted  β”‚  β”‚  Metadata (NOT encrypted)β”‚ β”‚
                β”‚   β”‚  Content    β”‚  β”‚  - Sender ID             β”‚ β”‚
                β”‚   β”‚  (Opaque)   β”‚  β”‚  - Recipient ID          β”‚ β”‚
                β”‚   β”‚             β”‚  β”‚  - Timestamp             β”‚ β”‚
                β”‚   β”‚  Server     β”‚  β”‚  - Channel ID            β”‚ β”‚
                β”‚   β”‚  cannot     β”‚  β”‚  - Message ID            β”‚ β”‚
                β”‚   β”‚  decrypt    β”‚  β”‚                          β”‚ β”‚
                β”‚   β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚
                β”‚                                                  β”‚
                β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Trust Boundaries:
  ════════════════════════════════════════════════════════════════
  β”‚ CLIENT TRUST ZONE β”‚                        β”‚ CLIENT TRUST ZONE β”‚
  β”‚                   β”‚ ◄── Untrusted Server ──► β”‚                   β”‚
  β”‚  - Plaintext      β”‚    (Cannot access       β”‚  - Plaintext      β”‚
  β”‚  - Private keys   β”‚     content)            β”‚  - Private keys   β”‚
  β”‚  - Session keys   β”‚                         β”‚  - Session keys   β”‚
  ════════════════════════════════════════════════════════════════

DFD Level 2: File Upload Flow

                            β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
                            β”‚     User       β”‚
                            β””β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                                    β”‚
                                    β”‚ File
                                    β”‚
                                    β–Ό
                           β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
                           β”‚   [3.1]       β”‚
                           β”‚   Validate    β”‚
                           β”‚               β”‚
                           β”‚ - Type check  β”‚
                           β”‚ - Size check  β”‚
                           β”‚ - Malware scanβ”‚
                           β”‚ - Sanitize    β”‚
                           β””β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”˜
                                   β”‚
                                   β”‚ Validated
                                   β”‚ File
                                   β–Ό
                           β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
                           β”‚   [3.2]       β”‚
                           β”‚   Process     β”‚
                           β”‚               β”‚
                           β”‚ - Thumbnail   β”‚
                           β”‚ - Transcode   β”‚
                           β”‚ - Optimize    β”‚
                           β”‚ - Strip EXIF  β”‚
                           β””β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”˜
                                   β”‚
                                   β”‚ Processed
                                   β”‚ File
                                   β–Ό
                           β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
                           β”‚   [3.3]       β”‚
                           β”‚   Encrypt     β”‚
                           β”‚   (Optional)  β”‚
                           β”‚               β”‚
                           β”‚ - E2EE key    β”‚
                           β”‚ - AES-256     β”‚
                           β””β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”˜
                                   β”‚
          β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
          β”‚                        β”‚                        β”‚
          β–Ό                        β–Ό                        β–Ό
  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”       β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”       β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
  β”‚  [MinIO]      β”‚       β”‚  [Files DB]   β”‚       β”‚  [Audit Log]  β”‚
  β”‚               β”‚       β”‚               β”‚       β”‚               β”‚
  β”‚ - Blob store  β”‚       β”‚ - Metadata    β”‚       β”‚ - Upload eventβ”‚
  β”‚ - Encryption  β”‚       β”‚ - User ID     β”‚       β”‚ - File ID     β”‚
  β”‚ - Signed URLs β”‚       β”‚ - Permissions β”‚       β”‚ - Timestamp   β”‚
  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜       β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜       β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Security Controls:
  - File type whitelist (images, docs, media)
  - Maximum file size enforced
  - EXIF metadata stripped (privacy)
  - Signed URLs with expiry
  - Virus scanning (ClamAV)
  - Content-Type validation

Data Classifications

Classification Levels

Level Name Description Examples
L1 Restricted Most sensitive, E2EE protected Plaintext messages, private keys
L2 Confidential User PII, requires authentication Passwords, 2FA secrets, profiles
L3 Internal Business data, limited access Audit logs, analytics, config
L4 Public No sensitivity Public channels, app branding

Data Classification Matrix

Data Type Classification Encryption Access Control Retention
E2EE Private Keys L1 AES-256 (client) Device owner only User-controlled
Message Plaintext L1 Memory only E2EE protected Never stored
User Passwords L2 Bcrypt hash System only Account lifetime
2FA Secrets L2 AES-256 User + system Account lifetime
Session Tokens L2 Memory/Cookie User session 7 days
User Profiles L2 TLS in transit RBAC Account lifetime
Encrypted Messages L3 E2EE ciphertext Sender/recipient Configurable
Audit Logs L3 Encryption at rest Admin only 90 days
Analytics L3 Encryption at rest Admin only 1 year
Channel Config L3 Encryption at rest RBAC Permanent
Public Keys L4 None Public Account lifetime
App Branding L4 None Public Permanent

Data Stores

DS1: PostgreSQL (Primary Database)

Table Data Classification Encryption Backup
nchat_users L2 At rest Daily
nchat_messages L3 (E2EE ciphertext) At rest + E2EE Daily
nchat_channels L3 At rest Daily
nchat_files L3 At rest Daily
nchat_audit_logs L3 At rest Daily
nchat_sessions L2 At rest None
app_configuration L3 At rest Daily

DS2: Redis (Cache/Sessions)

Key Pattern Data Classification TTL Purpose
session:* L2 7 days User sessions
rate:* L4 1 minute Rate limiting
presence:* L4 5 minutes User presence
cache:* L3-L4 Variable Application cache

DS3: MinIO (Object Storage)

Bucket Data Classification Access Encryption
uploads L3 Signed URLs Server-side
avatars L4 Public (with CDN) Server-side
attachments L3 Signed URLs Server-side + E2EE
exports L2 User-specific Server-side

DS4: Client Storage (IndexedDB)

Store Data Classification Encryption Sync
identity_keys L1 AES-256 (master key) Never
session_keys L1 AES-256 (master key) Never
prekeys L1 AES-256 (master key) Partial
messages_cache L1 (ciphertext) E2EE On demand
settings L3 None On demand

External Entities

EE1: OAuth Providers

Provider Data Received Data Sent Security
Google User ID, email, name OAuth code OAuth 2.0, TLS
GitHub User ID, email OAuth code OAuth 2.0, TLS
Microsoft User ID, email OAuth code OAuth 2.0, TLS
Apple User ID OAuth code Sign in with Apple
ID.me User ID, verification OAuth code OAuth 2.0, verified identity

EE2: Payment Providers

Provider Data Received Data Sent Security
Stripe Payment status Customer ID, Plan PCI DSS, TLS
Crypto (ETH) Transaction hash Wallet address Blockchain

EE3: AI Services

Provider Data Received Data Sent Security
OpenAI AI response User prompt TLS, API key
Anthropic AI response User prompt TLS, API key

Note: AI services receive user-provided prompts which may contain sensitive content. E2EE messages are NOT sent to AI services without explicit user action.

EE4: Infrastructure Providers

Provider Purpose Data Access Security
Vercel/Netlify Hosting Application code TLS, SOC 2
AWS/GCP Infrastructure All (encrypted) SOC 2, ISO 27001
Cloudflare CDN/WAF Traffic metadata SOC 2
Sentry Error tracking Errors, sanitized TLS, data scrubbing

Document Control

Version Date Author Changes
1.0.0 2026-02-08 Security Team Initial data flow documentation

Classification: Internal Related Documents: THREAT-MODEL.md, SECURITY-CONTROLS.md

⚠️ **GitHub.com Fallback** ⚠️