# C4 Model Reference ## Overview The C4 model provides a way to visualize software architecture at four levels of abstraction: 1. **Context** - System landscape 2. **Container** - Applications and data stores 3. **Component** - Internal structure 4. **Code** - Class/module detail (optional) ## Level 1: System Context Diagram Shows the system under design and its relationships with users and external systems. ### PlantUML Template ```plantuml @startuml C4_Context !include https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/C4_Context.puml LAYOUT_WITH_LEGEND() title System Context Diagram - ISA Frontend Person(user, "Store Employee", "Uses the ISA application") Person(admin, "Administrator", "Manages system configuration") System(isa, "ISA Frontend", "Angular application for in-store operations") System_Ext(backend, "ISA Backend", "REST API services") System_Ext(auth, "Auth Provider", "Authentication service") System_Ext(printer, "Printer Service", "Receipt/label printing") Rel(user, isa, "Uses", "Browser") Rel(admin, isa, "Configures", "Browser") Rel(isa, backend, "API calls", "HTTPS/JSON") Rel(isa, auth, "Authenticates", "OAuth2") Rel(isa, printer, "Prints", "WebSocket") @enduml ``` ### Key Elements - **Person**: Human users of the system - **System**: The system being documented (highlighted) - **System_Ext**: External systems the system depends on - **Rel**: Relationships between elements ## Level 2: Container Diagram Shows the high-level technology choices and how containers communicate. ### PlantUML Template ```plantuml @startuml C4_Container !include https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/C4_Container.puml LAYOUT_WITH_LEGEND() title Container Diagram - ISA Frontend Person(user, "Store Employee") System_Boundary(isa, "ISA Frontend") { Container(spa, "SPA", "Angular 20", "Single-page application") Container(pwa, "Service Worker", "Workbox", "Offline capability") ContainerDb(storage, "Local Storage", "IndexedDB", "Offline data cache") } System_Ext(api, "ISA API Gateway") System_Ext(cdn, "CDN", "Static assets") Rel(user, spa, "Uses", "Browser") Rel(spa, pwa, "Registers") Rel(pwa, storage, "Caches data") Rel(spa, api, "API calls", "REST/JSON") Rel(spa, cdn, "Loads assets", "HTTPS") @enduml ``` ### Container Types - **Container**: Application or service - **ContainerDb**: Database or data store - **ContainerQueue**: Message queue ## Level 3: Component Diagram Shows the internal structure of a container. ### PlantUML Template ```plantuml @startuml C4_Component !include https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/C4_Component.puml LAYOUT_WITH_LEGEND() title Component Diagram - OMS Feature Module Container_Boundary(oms, "OMS Feature") { Component(list, "Order List", "Angular Component", "Displays orders") Component(detail, "Order Detail", "Angular Component", "Order management") Component(store, "Order Store", "NgRx Signal Store", "State management") Component(api, "Order API Service", "Angular Service", "API communication") } ContainerDb_Ext(backend, "OMS Backend API") Rel(list, store, "Reads state") Rel(detail, store, "Reads/writes state") Rel(store, api, "Fetches data") Rel(api, backend, "HTTP requests") @enduml ``` ## ISA-Frontend Domain Components ### Suggested Component Structure ``` libs/[domain]/ ├── feature/ → Component diagrams │ └── [feature]/ ├── data-access/ → Store/API components │ └── [store]/ ├── ui/ → Presentational components │ └── [component]/ └── util/ → Utility components └── [util]/ ``` ### Domain Boundaries - **CRM**: Customer management, loyalty - **OMS**: Order management, returns - **Checkout**: Payment, transactions - **Remission**: Product returns processing - **Catalogue**: Product information ## Mermaid Alternative ```mermaid C4Context title System Context - ISA Frontend Person(user, "Store Employee", "Daily operations") System(isa, "ISA Frontend", "Angular SPA") System_Ext(backend, "Backend Services") System_Ext(auth, "Auth Service") Rel(user, isa, "Uses") Rel(isa, backend, "API calls") Rel(isa, auth, "Authenticates") ``` ## Best Practices 1. **One diagram per level** - Don't mix abstraction levels 2. **Consistent naming** - Use same names across diagrams 3. **Show key relationships** - Not every possible connection 4. **Include legends** - Explain notation 5. **Keep it simple** - 5-20 elements per diagram max