Skip to content

System architecture

Components and ownership

Component Owns Does not own
MongoDB Strategy and market-data deployments, versioned configuration, and provenance Live process state or market data
dyson-market-data Loading one feed bundle and supervising its publisher processes Venue parsing or strategy decisions
Imported venue publishers Venue connections, native feed handling, archival output, and optional live NATS publication Strategy lifecycle
NATS Live market data, strategy commands, status, and runtime events Durable strategy configuration or analytics
Strategy binary Concrete strategy bootstrap, subjects, Kuru connection, and post-trade wiring Shared lifecycle machinery
dyson-runtime Lifecycle, serialized dispatch, NATS transport, health, metrics, and shutdown Strategy policy or venue protocol details
Algo-trading submodule Signals, actors, strategy engine, canonical actions, and feed primitives Dyson process lifecycle or Kubernetes state
Venue adapters Packet normalization and venue execution (Kuru orderbook or vault, Lighter API/WS) Strategy policy
InfluxDB Structured strategy, order, fill, and health projections Runtime commands or configuration
Control panel One-deployment monitoring and the Start action Runtime truth or general lifecycle administration
Strategy API Liveness, MongoDB-backed readiness, and OpenAPI Strategy CRUD or lifecycle control at this revision
dyson-deployment Kubernetes and platform desired state Application behavior or image builds

Market-data flow

flowchart TD
    CFG["MongoDB<br/>feed deployment + version"]
    SUP["dyson-market-data supervisor"]
    PUB["Imported venue publisher processes<br/>one per venue"]
    ARC["Local archive"]
    NATS["NATS live publication<br/>(optional)"]

    CFG --> SUP --> PUB
    PUB --> ARC
    PUB --> NATS

    classDef store fill:#2e7d32,stroke:#1b5e20,color:#fff
    class CFG,ARC,NATS store
A feed bundle may contain multiple publishers, with one publisher per venue and multiple markets inside that publisher's native configuration. If one child publisher exits, the supervisor stops the bundle rather than leaving a partial feed set running.

Strategy flow

flowchart TD
    CFG["MongoDB<br/>strategy deployment + version"]
    BIN["Strategy binary"]
    RT["dyson-runtime<br/>serialized dispatch"]
    IN["NATS<br/>market data + commands"]
    ENG["Algo-trading engine<br/>or custom strategy backend"]
    ADP["Venue adapters"]
    VEN["Venues"]
    OUT["NATS<br/>status and events"]
    INF["InfluxDB<br/>strategy projections"]

    CFG --> BIN --> RT
    IN --> RT
    RT --> ENG --> ADP --> VEN
    RT --> OUT
    ENG --> INF

    classDef store fill:#2e7d32,stroke:#1b5e20,color:#fff
    class CFG,IN,OUT,INF store
Each strategy is a separate process. The runtime reconciles desired state, processes one input at a time, and keeps venue-specific translation outside the shared lifecycle core. A multi-venue strategy fans the adapter stage out across legs — see Multi-venue strategy.

Operator flow

flowchart LR
    BR["Browser"] --> CP["Control-panel server"]
    CP --> NATS["NATS"]
    CP --> INF["InfluxDB"]
    CP --> KWS["Kuru public WebSocket"]
    API["Strategy API"] --> MDB["MongoDB<br/>readiness check"]

    classDef store fill:#2e7d32,stroke:#1b5e20,color:#fff
    class NATS,INF,KWS,MDB store
The control panel does not call the Strategy API. The two are separate operator surfaces with different current responsibilities.

Current boundaries

  • Live execution covers Kuru and, for the multi-venue strategy, Lighter; market-data publishers cover additional venues.
  • The control panel publishes Start only, even though the runtime supports a wider lifecycle command set.
  • NATS is the live bus, not a replacement for MongoDB configuration or InfluxDB projections.
  • Application behavior changes in dyson; release and cluster state change in dyson-deployment.