{
  "status": "ok",
  "state": {
    "schema": "moshpit.public_origin.v1",
    "updated_utc": "2026-09-21T06:52:00Z",
    "title": "Public origin — single source of truth for forever URL + storefront",
    "note": "Edit this file to change domain/platform. Do not hardcode forever URLs in bots or pages. Never put tokens here. Origin runs on Cursor VM (not José PC). Keepalive: tools/ensure_play_origin.sh. server.py binds dual-stack so CF localhost→[::1] works.",
    "apex_domain": "sinmuela.org",
    "subdomain": "play",
    "forever_host": "play.sinmuela.org",
    "forever_url": "https://play.sinmuela.org/",
    "origin_service": "http://localhost:8000",
    "origin_service_preferred": "http://127.0.0.1:8000",
    "local_url": "http://127.0.0.1:8000/",
    "platform": "itch.io",
    "platform_note": "itch.io = public beta + download + tip jar. Twitch = stream audience only (overlay later).",
    "tunnel": {
      "provider": "cloudflare",
      "name": "play.sinmuela.org",
      "id": "d6400ae3-fc64-4250-92f8-9eb82562b7a9",
      "id_hint": "d6400ae3",
      "public_hostname": {
        "subdomain": "play",
        "domain": "sinmuela.org",
        "type": "HTTP",
        "service": "localhost:8000"
      },
      "status": "LIVE",
      "status_note": "DigitalOcean VPS 159.223.113.94 active origin under systemd (moshpit-server). Verified HTTP 200 on /hub, /api/status, and /api/public-health. Cloudflare Named Tunnel d6400ae3 connected via QUIC."
    },
    "change_domain_later": {
      "summary": "Domain change = edit this file + Cloudflare Public Hostname/DNS. Bots must not hardcode forever_url.",
      "steps": [
        "1. Edit coordination/PUBLIC_ORIGIN.json: apex_domain, subdomain, forever_host, forever_url, tunnel.public_hostname, origin_service if needed.",
        "2. Cloudflare Zero Trust → Healthy tunnel → Public Hostname: set subdomain + apex domain → Type HTTP → URL from origin_service (host:port, no scheme) OR run tools/cf_add_public_hostname.py after updating its defaults to read this file.",
        "3. DNS: ensure the hostname CNAME points at the Healthy tunnel (CF usually does this when you Save Public Hostname).",
        "4. Verify: GET /api/public-origin (local) shows new forever_url; pages that fetch the API update; curl https://<forever_host>/ should hit origin (not invent a different domain in chat).",
        "5. Bots cite forever_url from PUBLIC_ORIGIN.json or GET /api/public-origin only — never invent a sibling domain."
      ]
    },
    "itch_url": "https://itch.io/TODO-sin-muela-moshpit-elite",
    "itch_url_status": "placeholder",
    "twitch_url": "",
    "twitch_url_status": "unused_for_beta_gate",
    "beta_page": "/beta",
    "hub_page": "/hub",
    "hosting_page": "/hosting",
    "hosting": {
      "current": "digitalocean_vps_systemd_live",
      "vps_ip": "159.223.113.94",
      "vps_hostname": "ubuntu-s-2vcpu-2gb-nyc1",
      "vps_service": "moshpit-server.service",
      "cloudflared_service": "cloudflared.service",
      "status": "LIVE_AND_PERMANENT",
      "guide": "coordination/HOSTING_EXTERNAL.md",
      "todo_ids": [],
      "note": "Game server verified LIVE on DigitalOcean VPS (159.223.113.94) via systemd (port 8000). Cloudflare cutover COMPLETE: Cursor's cloudflared connector stopped 2026-09-22T05:00Z, VPS is sole origin. Verified by Claude directly (Chrome, not claim): /hub and /api/status HTTP 200, origin_operator:cursor-cloud field gone.",
      "completed": "2026-09-22T05:15:00Z by Claude"
    },
    "docs": {
      "beta_goal": "coordination/PUBLIC_BETA_GOAL.md",
      "url_fijo": "coordination/URL_FIJO_HANDHOLD.md",
      "tunnel_live": "coordination/PUBLIC_TUNNEL_LIVE.md",
      "cf_training": "coordination/CLOUDFLARE_TRAINING.md"
    }
  }
}