@startuml !include https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/C4_Container.puml LAYOUT_LEFT_RIGHT() title LOTTY - C4 Container Person(product_client, "Product Client", "Web/Mobile app") Person(ops_user, "Experimenter/Approver/Admin/Viewer") System_Boundary(lotty_boundary, "LOTTY Backend") { Container(api, "Backend API", "Django + Ninja", "REST endpoints: flags, experiments, decide, events, reports, guardrails, notifications, conflicts, metrics, learnings, reviews, users, auth") ContainerDb(db, "PostgreSQL / SQLite", "Relational DB", "Experiments, variants, decisions, events, exposures, outcomes, guardrails, notifications, conflicts, logs") Container(cache, "Valkey / Redis / LocMem Cache", "Cache + Celery broker", "Flag/experiment/decide-result cache, Celery task broker") Container(worker, "Celery Worker / Beat", "Background worker", "Periodic jobs + async decision persistence") } System_Ext(notifications, "Notification Channels", "Telegram / SMTP") Rel(product_client, api, "Gets flag decisions, sends events", "HTTP/JSON") Rel(ops_user, api, "Admin/experiment/review calls", "HTTP/JSON") Rel(api, db, "Read/write application state", "SQL") Rel(api, cache, "Read/write cache, enqueue async tasks", "Redis protocol") Rel(worker, db, "Read/write application state", "SQL") Rel(worker, cache, "Consumes tasks, reads cached state", "Redis protocol") Rel(worker, notifications, "Delivers queued notifications", "HTTP / SMTP") @enduml