graph TB subgraph Binary ["Server (Composition Root)"] server["server
wires adapters, starts Axum"] end subgraph Application ["Application Layer"] AppState["AppState"] PlacePixel["canvas::place_pixel"] GetState["canvas::get_state"] SaveSnapshot["canvas::save_snapshot"] RestoreSnapshot["canvas::restore_snapshot"] Connect["soldiers::connect"] Disconnect["soldiers::disconnect"] InMemoryCanvas["InMemoryCanvasStore"] InProcessBroadcast["InProcessBroadcaster"] end subgraph Domain ["Domain Layer (0 infra deps)"] Canvas["Canvas"] ValueObjects["Color | Position | PixelUpdate"] BroadcastEvent["BroadcastEvent"] DomainError["DomainError"] subgraph Ports ["Port Traits"] CanvasStore["CanvasStore"] CanvasPersistence["CanvasPersistence"] EventBroadcaster["EventBroadcaster"] end end subgraph Shared ["Shared Types"] Config["config
AppConfig, ConfigSource trait"] ApiTypes["api-types
PixelUpdatePayload, event constants"] end subgraph Adapters ["Adapters"] subgraph Transport ["Transport (driving)"] SocketIO["socketio
Socket.IO protocol"] WebSocket["websocket
native WebSocket + JSON"] end subgraph Infrastructure ["Infrastructure (driven)"] ConfigEnv["config-env
env var loader"] CanvasFile["canvas-file
file snapshots"] HttpAxum["http-axum
HTTP routes, rate limit,
embedded static files
"] end end server --> Application server --> Transport server --> Infrastructure server --> Config PlacePixel --> CanvasStore PlacePixel --> EventBroadcaster SaveSnapshot --> CanvasStore SaveSnapshot --> CanvasPersistence RestoreSnapshot --> CanvasStore RestoreSnapshot --> CanvasPersistence Connect --> EventBroadcaster Disconnect --> EventBroadcaster InMemoryCanvas -.->|implements| CanvasStore InProcessBroadcast -.->|implements| EventBroadcaster CanvasFile -.->|implements| CanvasPersistence ConfigEnv -.->|implements| Config SocketIO --> Application WebSocket --> Application SocketIO --> ApiTypes HttpAxum --> Config classDef domain fill:#e8f5e9,stroke:#2e7d32 classDef app fill:#e3f2fd,stroke:#1565c0 classDef adapter fill:#fff3e0,stroke:#e65100 classDef shared fill:#f3e5f5,stroke:#6a1b9a classDef binary fill:#fce4ec,stroke:#c62828 class Canvas,ValueObjects,BroadcastEvent,DomainError,CanvasStore,CanvasPersistence,EventBroadcaster domain class AppState,PlacePixel,GetState,SaveSnapshot,RestoreSnapshot,Connect,Disconnect,InMemoryCanvas,InProcessBroadcast app class SocketIO,WebSocket,ConfigEnv,CanvasFile,HttpAxum adapter class Config,ApiTypes shared class server binary