{
  "schema_version": 1,
  "diagram_type": "architecture",
  "meta": {
    "title": "Kontra \u2014 GOTH News-Opinion Site",
    "output": "kontra-architecture-map.html",
    "quality_profile": "showcase",
    "views": [
      {
        "id": "publish-path",
        "label": "Content publish path",
        "focus": [
          "editors",
          "git",
          "pull",
          "bin",
          "caddy",
          "users"
        ],
        "note": "Editors push markdown to Gitea; production pulls and serves it automatically."
      },
      {
        "id": "auth-and-media",
        "label": "Auth and media",
        "focus": [
          "auth",
          "admin",
          "bin",
          "garage"
        ],
        "note": "Decap logs in via Gitea OAuth; site media resolves from Garage S3 shortcodes."
      }
    ]
  },
  "components": [
    {
      "id": "editors",
      "type": "external",
      "label": "Editors",
      "sublabel": "Obsidian \u00b7 Neovim \u00b7 CLI",
      "pos": [
        40,
        300
      ],
      "size": [
        130,
        64
      ]
    },
    {
      "id": "admin",
      "type": "frontend",
      "label": "Decap CMS",
      "sublabel": "admin.kontra.lab",
      "pos": [
        40,
        160
      ],
      "size": [
        130,
        64
      ]
    },
    {
      "id": "auth",
      "type": "security",
      "label": "Gitea OAuth",
      "sublabel": "PKCE",
      "pos": [
        250,
        110
      ],
      "size": [
        130,
        56
      ],
      "tag": "non-confidential"
    },
    {
      "id": "git",
      "type": "cloud",
      "label": "Gitea",
      "sublabel": "sam/kontra-content",
      "pos": [
        250,
        300
      ],
      "size": [
        150,
        64
      ],
      "tag": "origin of truth"
    },
    {
      "id": "pull",
      "type": "backend",
      "label": "Pull loop",
      "sublabel": "git pull \u00b7 30s",
      "pos": [
        470,
        300
      ],
      "size": [
        140,
        64
      ]
    },
    {
      "id": "bin",
      "type": "backend",
      "label": "Go binary",
      "sublabel": "templ + htmx + Goldmark",
      "pos": [
        680,
        300
      ],
      "size": [
        160,
        68
      ],
      "tag": ":8600 Docker"
    },
    {
      "id": "garage",
      "type": "cloud",
      "label": "Git media",
      "sublabel": "images beside articles",
      "pos": [
        680,
        160
      ],
      "size": [
        150,
        64
      ]
    },
    {
      "id": "caddy",
      "type": "cloud",
      "label": "Caddy master",
      "sublabel": ":80/:443 reverse proxy",
      "pos": [
        900,
        300
      ],
      "size": [
        150,
        64
      ]
    },
    {
      "id": "users",
      "type": "external",
      "label": "Readers",
      "sublabel": "public web",
      "pos": [
        1120,
        300
      ],
      "size": [
        130,
        64
      ]
    }
  ],
  "boundaries": [
    {
      "kind": "region",
      "label": "Editors (dev box .27)",
      "wraps": [
        "editors",
        "admin"
      ]
    },
    {
      "kind": "region",
      "label": "Gitea Docker (.35)",
      "wraps": [
        "auth",
        "git"
      ]
    },
    {
      "kind": "region",
      "label": "Kontra container (.13 :8600)",
      "wraps": [
        "pull",
        "bin",
        "garage"
      ]
    },
    {
      "kind": "region",
      "label": "Edge (Caddy .35)",
      "wraps": [
        "caddy",
        "users"
      ]
    }
  ],
  "connections": [
    {
      "id": "editors-git",
      "from": "editors",
      "to": "git",
      "label": "git push",
      "variant": "emphasis"
    },
    {
      "id": "admin-git",
      "from": "admin",
      "to": "git",
      "label": "commit",
      "fromSide": "bottom",
      "toSide": "top",
      "variant": "dashed"
    },
    {
      "id": "auth-login",
      "from": "admin",
      "to": "auth",
      "label": "Login with Gitea",
      "variant": "security",
      "fromSide": "right",
      "toSide": "bottom",
      "labelAt": [
        308,
        180
      ]
    },
    {
      "id": "auth-git",
      "from": "auth",
      "to": "git",
      "label": "authorize",
      "variant": "security",
      "fromSide": "bottom",
      "toSide": "left"
    },
    {
      "id": "git-pull",
      "from": "git",
      "to": "pull",
      "label": "SSH",
      "variant": "emphasis"
    },
    {
      "id": "pull-bin",
      "from": "pull",
      "to": "bin",
      "label": "restart on change",
      "labelAt": [
        645,
        378
      ]
    },
    {
      "id": "bin-garage",
      "from": "bin",
      "to": "garage",
      "label": "media shortcode",
      "variant": "dashed",
      "fromSide": "top",
      "toSide": "bottom",
      "labelDy": -58,
      "labelAt": [
        768,
        238
      ]
    },
    {
      "id": "bin-caddy",
      "from": "bin",
      "to": "caddy",
      "label": "reverse_proxy :8600",
      "labelAt": [
        870,
        378
      ]
    },
    {
      "id": "caddy-users",
      "from": "caddy",
      "to": "users",
      "label": "HTTPS",
      "variant": "emphasis"
    }
  ],
  "cards": [
    {
      "dot": "emerald",
      "title": "Publish path",
      "items": [
        "Editors write markdown + front-matter in Obsidian/Neovim/CLI",
        "All commits land on Gitea sam/kontra-content (origin)",
        "Production container pulls every 30s and restarts on change"
      ]
    },
    {
      "dot": "cyan",
      "title": "Serving",
      "items": [
        "Single static Go binary (templ + htmx + Tailwind tokens)",
        "Goldmark renders markdown per request; SEO-friendly",
        "Caddy master terminates HTTPS and proxies :8600"
      ]
    },
    {
      "dot": "rose",
      "title": "Auth & media",
      "items": [
        "Decap CMS logs in with Gitea OAuth (PKCE)",
        "Media = git files beside articles; {{media:slug/file}}"
      ]
    }
  ]
}