{
  "schema_version": 1,
  "diagram_type": "architecture",
  "meta": {
    "title": "Jervis Voice Assistant \u2014 System Map",
    "quality_profile": "showcase"
  },
  "components": [
    {
      "id": "esp32",
      "type": "frontend",
      "label": "ESP32-S3",
      "sublabel": "wake word \u00b7 mic \u00b7 LED",
      "pos": [
        40,
        300
      ],
      "size": [
        126,
        62
      ]
    },
    {
      "id": "mqtt",
      "type": "messagebus",
      "label": "MQTT",
      "sublabel": "mosquitto :1883",
      "pos": [
        240,
        300
      ],
      "size": [
        124,
        60
      ]
    },
    {
      "id": "whisper",
      "type": "backend",
      "label": "Whisper STT",
      "sublabel": "faster-whisper",
      "pos": [
        440,
        300
      ],
      "size": [
        126,
        60
      ]
    },
    {
      "id": "agent",
      "type": "backend",
      "label": "Jervis Agent",
      "sublabel": "FastAPI :8501",
      "pos": [
        645,
        300
      ],
      "size": [
        130,
        62
      ]
    },
    {
      "id": "ha",
      "type": "external",
      "label": "Home Assistant",
      "sublabel": ".30 :8123",
      "pos": [
        645,
        95
      ],
      "size": [
        142,
        62
      ]
    },
    {
      "id": "omniroute",
      "type": "cloud",
      "label": "OmniRoute",
      "sublabel": "LLM gateway :20129",
      "pos": [
        890,
        95
      ],
      "size": [
        136,
        62
      ]
    },
    {
      "id": "mopidy",
      "type": "external",
      "label": "Mopidy \u00b7 Spotify",
      "sublabel": "music :6600",
      "pos": [
        890,
        300
      ],
      "size": [
        140,
        60
      ]
    },
    {
      "id": "apprise",
      "type": "external",
      "label": "Apprise",
      "sublabel": "notifications .35",
      "pos": [
        890,
        505
      ],
      "size": [
        126,
        60
      ]
    },
    {
      "id": "piper",
      "type": "backend",
      "label": "Piper TTS",
      "sublabel": ":10200",
      "pos": [
        890,
        610
      ],
      "size": [
        118,
        60
      ]
    },
    {
      "id": "snapcast",
      "type": "messagebus",
      "label": "Snapcast",
      "sublabel": "multi-room :1780",
      "pos": [
        645,
        560
      ],
      "size": [
        130,
        62
      ]
    },
    {
      "id": "speakers",
      "type": "external",
      "label": "House Speakers",
      "sublabel": "whole home",
      "pos": [
        1100,
        610
      ],
      "size": [
        124,
        60
      ]
    }
  ],
  "boundaries": [
    {
      "kind": "region",
      "label": "On-device",
      "wraps": [
        "esp32"
      ]
    },
    {
      "kind": "region",
      "label": "Home lab (.13 \u00b7 .30 \u00b7 .35)",
      "wraps": [
        "mqtt",
        "whisper",
        "agent",
        "ha",
        "omniroute",
        "mopidy",
        "apprise",
        "piper",
        "snapcast",
        "speakers"
      ]
    }
  ],
  "connections": [
    {
      "id": "esp32-mqtt",
      "from": "esp32",
      "to": "mqtt",
      "label": "audio stream",
      "variant": "emphasis"
    },
    {
      "id": "mqtt-whisper",
      "from": "mqtt",
      "to": "whisper",
      "label": "speech frames",
      "variant": "dashed"
    },
    {
      "id": "whisper-agent",
      "from": "whisper",
      "to": "agent",
      "label": "transcript"
    },
    {
      "id": "agent-ha",
      "from": "agent",
      "to": "ha",
      "label": "control \u00b7 todo \u00b7 timers",
      "fromSide": "top",
      "toSide": "bottom",
      "labelDx": -55
    },
    {
      "id": "agent-omni",
      "from": "agent",
      "to": "omniroute",
      "label": "intent / Q&A",
      "fromSide": "top",
      "toSide": "bottom"
    },
    {
      "id": "agent-mopidy",
      "from": "agent",
      "to": "mopidy",
      "label": "play \u00b7 pause \u00b7 volume",
      "variant": "dashed"
    },
    {
      "id": "agent-apprise",
      "from": "agent",
      "to": "apprise",
      "label": "family messages",
      "variant": "dashed",
      "fromSide": "bottom",
      "toSide": "top"
    },
    {
      "id": "agent-snap",
      "from": "agent",
      "to": "snapcast",
      "label": "reply text",
      "fromSide": "bottom",
      "toSide": "top",
      "labelDy": 40,
      "labelDx": -55
    },
    {
      "id": "snap-piper",
      "from": "snapcast",
      "to": "piper",
      "label": "synthesize speech",
      "variant": "dashed",
      "labelAt": [
        920,
        684
      ]
    },
    {
      "id": "piper-snap",
      "from": "piper",
      "to": "snapcast",
      "label": "speech wav",
      "labelDy": -25
    },
    {
      "id": "snap-speakers",
      "from": "snapcast",
      "to": "speakers",
      "label": "audio out",
      "variant": "emphasis",
      "labelAt": [
        1020,
        693
      ]
    }
  ]
}