{
  "issue": 261,
  "version": 3,
  "status": "beta UI — no generation, scheduling or delivery yet",
  "taxonomy": {
    "categories": [
      "sports",
      "tech",
      "news",
      "business",
      "health",
      "culture",
      "travel",
      "science",
      "auto",
      "hobbies"
    ],
    "topic_count": 93,
    "group_count": 27,
    "id_format": "category.group.topic",
    "languages": [
      "en",
      "uk",
      "ru"
    ]
  },
  "rules": {
    "min_selections": 2,
    "own_entries_per_row": 5,
    "own_entry_max_len": 40,
    "free_text_max": 120,
    "custom_sources": "https only",
    "scopes": [
      "ukraine",
      "world",
      "custom"
    ],
    "frequencies": [
      "daily",
      "days"
    ],
    "weekdays": [
      "mon",
      "tue",
      "wed",
      "thu",
      "fri",
      "sat",
      "sun"
    ],
    "days_rule": "\"days\" needs at least one weekday; \"daily\" ignores days",
    "durations_min": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30],
    "voice_languages": [
      "uk",
      "ru",
      "en"
    ],
    "voices": [
      "narrator",
      "two_hosts"
    ],
    "follows": {
      "platforms": [
        "youtube",
        "x",
        "telegram",
        "instagram",
        "tiktok",
        "facebook",
        "web"
      ],
      "max": 20,
      "value": "@handle, name, or an https link on the platform domain",
      "quick_picks": [
        "@ZelenskyyUa",
        "@realDonaldTrump",
        "@EmmanuelMacron",
        "@elonmusk",
        "@BillGates"
      ]
    }
  },
  "states": [
    "draft",
    "preview_ready",
    "reviewed",
    "approved"
  ],
  "state_rules": [
    "any edit returns the profile to draft and drops preview/approval",
    "approve needs preview + review + explicit confirmation",
    "approved never sets active=true"
  ],
  "share": {
    "link": "#p=<base64url> with topic positions in TOPIC_IDS; carries settings only, never state/preview/approval",
    "import": "banner asks before replacing the visitor draft; JSON import validated through the same functions"
  },
  "preview": {
    "local_file": "real audio file only (download allowed)",
    "browser_tts_demo": "two hosts take turns (host B lower pitch); labelled demo_not_ai_episode; no download",
    "none": "audio_unavailable"
  },
  "channels": {
    "telegram": "primary; selectable; not_connected; sign-in coming",
    "download": "usable only with a real file",
    "viber": "planned",
    "whatsapp": "planned",
    "email": "planned"
  }
}
