{"name":"teach-server","version":"0.1.0","public_base_url":"https://side.tmuh.ai","max_html_bytes":10485760,"slug_regex":"^[a-z0-9][a-z0-9-]{1,38}[a-z0-9]$","endpoints":{"salt":"/auth/salt?email=<email>","login":"/auth/login","upload":"/api/pages"},"upload_fields":{"slug":"required, ^[a-z0-9][a-z0-9-]{1,38}[a-z0-9]$","title":"required, <=200 chars","html":"required, single file <=10MB","category":"optional; one of categories[].key; omit to let the server auto-classify","thumbnail":"optional override; server auto-generates a screenshot thumbnail if omitted"},"categories":[{"key":"health-edu","label":"衛教"},{"key":"teaching","label":"教學・工作坊"},{"key":"schedule-form","label":"排班・表單"},{"key":"tool","label":"工具・儀表板"},{"key":"presentation","label":"簡報・作品"},{"key":"other","label":"其他"}],"realtime":{"transport":"socket.io","client_script":"/static/socket.io.js","helper_script":"/static/realtime.js","room_model":"u/<username>/<slug> with optional roomId sub-room","presence":"built-in nickname + cursor (0..1 document ratio)","relay":"format-agnostic; server does not parse message data","docs":"/llms.txt#realtime-multiplayer"},"upload_thumbnail":{"field":"thumbnail","auto_generated":true,"note":"Server screenshots the page automatically; you do not need to send one. The field is an optional override.","format":"base64 PNG (data URI or raw), <=500KB decoded","optional":true,"shown_on":"homepage and /demo cards"},"ai":{"endpoints":{"chat":"/api/ai/chat","stt":"/api/ai/stt","image":"/api/ai/image","tts":"/api/ai/tts","models":"/api/ai/models"},"models":{"chat":["gpt-4.1-mini","gemini-2.5-flash"],"stt":["whisper-1"],"image":["gpt-image-2","gemini-2.5-flash-image"],"tts":["gemini-2.5-flash-preview-tts"]},"tts_voices":["male","female"],"modes":{"bearer":"Authorization: Bearer <tk_ key>; full access incl. image + tts","embedded":"same-origin call from a hosted /u/<username>/<slug>/ page; no key needed; chat+stt only (image and tts are Bearer-only)"},"streaming":"POST /api/ai/chat with {stream:true} -> text/event-stream, data:{\"delta\":\"...\"} ... data:[DONE]","daily_limits":{"text":500,"image":20},"helper_script":"/static/ai.js","use_cases":{"slideshow_video":{"how":"Combine /api/ai/image + /api/ai/tts (+ /api/ai/stt captions) into one self-contained HTML slideshow; assets base64-embedded as data: URIs with <img> + <audio> playback.","recommended_format":"self-contained HTML slideshow (no external assets)","server_side_video_encoding":false,"mp4_note":"No mp4 endpoint. A real mp4 must be encoded by the agent (locally) and embedded via an https:// URL, or base64 data:video/mp4 for short clips only (counts toward the 10 MB page limit).","audio_baking":"TTS is Bearer-only — hosted pages cannot call it at runtime. Pre-generate narration with Bearer during the build, then bake it into the page as a base64 audio data: URI. Prefer compressed audio (mp3/aac) over the raw WAV the proxy returns, to fit the 10 MB budget; convert locally (e.g. ffmpeg -i in.wav -b:a 64k out.mp3) -> data:audio/mpeg;base64,...","layout":"Free aspect ratio — 16:9 landscape, 9:16 vertical, or long-form vertical-scroll all work. Choose to fit the content (e.g. /u/greenamon/inflation-for-teens/ is a long vertical layout).","asset_source_choice":"Agent should scan its own local environment for image/TTS/STT/video tooling and let the user choose, per asset (images/narration/captions), between local tools and this proxy before generating.","guide":"/docs/agent-guide.md#slideshow-video"}}},"page_styles":{"optional":true,"note":"Reference only — hosted HTML is always the author's own design and is never constrained by the site.","how":"Fetch a guide and inline its CSS into your self-contained HTML; do not <link> to it. Fonts must be https self-hosted (no data: fonts).","presets":[{"name":"minimalist-executive","url":"/docs/styles/minimalist-executive","intent":"Quiet, spacious boardroom: hairline rules, whitespace, one accent."},{"name":"editorial-report","url":"/docs/styles/editorial-report","intent":"Magazine/report: strong type hierarchy, pull-quotes, source-grounded."},{"name":"data-heavy-finance","url":"/docs/styles/data-heavy-finance","intent":"KPI/chart-led: stat cards, aligned numeric tables, explicit units."}]},"agent_visible_features":{"github_trend_prompt_lab":{"agent_name":"zodiac","demo_page":"/demo","prompt_page":"/prompt-lab","spec":"/docs/github-trend-prompts.md","purpose":"Track fast-growing licensed GitHub repositories and publish rebuild prompt packs for agents.","automation":"local-cron-codex-cli","analysis_policy":"static-only-no-candidate-code-execution","output_format":"single-html-with-trend-report-application-report-rebuild-prompt","public_user":"github_trend_lab","public_dashboard":"/u/github_trend_lab/","citation_required":true}}}