MyGo 云音乐
Go와 MyGo로 만든 서드파티 네이버 클라우드 뮤직 데스크톱 클라이언트
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기README 전체를 불러오는 중입니다. 아래는 저장된 발췌입니다.
Bonbon & 馬米親子 Podcast《車車遊樂園》的官方 看圖聽故事 網站。 面向 學齡前~低年級 親子:每集音檔 + 黏土風插圖翻頁 + 逐字字幕 + 網頁小遊戲(純 Podcast 做不到的互動層)。產品路線見 TODOS.md — 產品路線圖。 public/stories/、public/characters/ 內音訊與插圖禁止再散布(見授權與免責)。 • Next.js 16 App Router、React 19.2 stable、TypeScript strict、CSS Modules(無 Tailwind) • 以 SSG 預渲染 為主;少數 Route Handler(許願/email 訂閱 API,可選 Neon Postgres) • Vitest 單元測試 + Playwright E2E • 部署:Vercel(@vercel/analytics)README 전문 보기 ↗
Bonbon & 馬米親子 Podcast《車車遊樂園》的官方 看圖聽故事 網站。
面向 學齡前~低年級 親子:每集音檔 + 黏土風插圖翻頁 + 逐字字幕 + 網頁小遊戲(純 Podcast 做不到的互動層)。產品路線見 TODOS.md — 產品路線圖。
| 正式站 | podcast-website-mu.vercel.app |
| 版本 | 1.3.0 |
| 待辦 | TODOS.md |
| 設計 | DESIGN.md · RESEARCH.md |
| 儲存庫 | GitHub(程式碼 MIT) |
| 授權 | MIT · /legal · DISCLAIMER.md |
public/stories/、public/characters/內音訊與插圖禁止再散布(見授權與免責)。
@vercel/analytics)| 區塊 | 路由 | 說明 |
|---|---|---|
| Landing Hub | / | Storyline 式四段 scroll-snap 入口(故事/睡前/黏土/衛教) |
| 全部故事頁 | /stories | 靜態殼+client 篩選 island;最新集 Hero、收藏區、車種/主題篩選(?vehicle=、?tag=,可分享) |
| 故事詳情 | /story/[slug] | SEO 落地頁、分享、收藏、訂閱收聽 CTA、ShowNotes、親子延伸、完播反思、地圖島徽章 |
| 播放器 | /story/[slug]/play | 全螢幕翻頁、逐字字幕、進度條、字幕字級;插圖 AVIF → WebP → JPG;音訊 preload="none"(Range 隨播) |
| 逐字稿 | /story/[slug]/transcript.vtt | 完整音檔逐字稿 WebVTT(來自 data/subtitles/,非翻頁場景字幕;無障礙/GEO) |
| 新集通知名單 | /subscribe | 家長 Email 登記(目前只收名單、不寄新集上線信;未設 DB/寄信時引導至收聽平台) |
| 主題 | /topic、/topic/[tag] | 主題索引與分類頁(SSG + FAQ schema) |
| 車種 | /vehicles/[vehicle] | 車種分類頁(SSG + GEO FAQ) |
| 宇宙地圖 | /adventures | 五島滿版海洋、pan/zoom/fly-to(點島飛抵島心、再點同島回全景)、島上探索點 /adventures/[zone]/[hotspot]、漫遊 NPC、?zone= deep link |
| 角色圖鑑 | /characters | data/characters.json 定裝照與出場故事 |
| 親子遊樂地圖 | /for-parents/play-map | 靜態殼+PlayMapClient island;主瀏覽為 22 縣市磚牆+分組名單(首屏不掛 Leaflet),地圖為已選縣市/附近後的 view=map 次要分頁;15 縣市景點、可分享篩選 URL、SSR 全台名單+ItemList |
| 家庭儀表板 | /for-parents/dashboard | 本機 localStorage 收聽/遊戲摘要(不上傳) |
| 小遊戲 | /games | 著色本為第一站,與街機兩款同園;遊戲資產按需預載 |
| 節目數據 | /studio | 製作團隊專用(noindex、不在 sitemap);含待生圖佇列 |
| 關於/法律 | /about、/legal | 關於我們+給家長的常見問題(FAQPage、代表性集數)、使用條款;舊 /for-parents 永久轉址到 /about |
| RSS | /feed.xml | Podcast feed(含 Podcasting 2.0 擴充) |
| PWA | 、 |
data/games.ts)| 路由 | 名稱 | 備註 |
|---|---|---|
/games/block-drop | 繽紛樂園 | 落下方塊消除(GameKit) |
/games/candy-match | 繽紛消消樂 | 關卡地圖 + 消除棋盤(GameKit) |
/games/coloring-book | 繪本著色 | 定裝/場景線稿著色(不掛 GameKit);線稿:npm run generate:coloring-lineart;封面:npm run generate:coloring-cover |
GameKit 跨遊戲進度(星星、獎牌、車庫)見 GAMEKIT-ARCHITECTURE.md。
npm install
npm run dev
| 指令 | 用途 |
|---|---|
npm run dev | 開發伺服器 |
npm run build | 正式建置(prebuild 自動跑 generate:llms-full) |
npm run start | 執行建置結果 |
npm run lint | ESLint(零 warnings) |
npm run typecheck | TypeScript strict 型別檢查 |
npm test | Vitest 單元測試 |
npm run test:e2e | Playwright E2E(自動 build/啟動 production server;不要先用 next dev 佔用 3000) |
npm run test:e2e:public | 上線 gate:public smoke + public axe(CI build-and-public-e2e) |
npm run test:e2e:ci | 兒童主路徑 e2e(smoke/a11y/地圖/遊戲/訂閱/UX-P1-5 觸控;CI e2e-child-path;不含 visual) |
npm run test:visual | D2 視覺回歸(預設 skip;本機 pre-push 工具,刻意不進 CI。見 test:visual:trusted) |
npm run test:visual:trusted | 設 VISUAL_BASELINE_TRUSTED=1+VISUAL_FIXTURE=1 後跑 visual spec:用凍結資料(固定 6 集、12 個景點,見 lib/visual-fixture.ts)另外 build 到 .next-visual、跑在 3200 埠,上新集不會讓基準失效;伺服器不是 fixture build 時會直接停(<html data-visual-fixture>)。CI/Vercel 上開這個旗標會 build 失敗。基準於 2026-08-30 全面重錄(59 張;前一次 2026-08-24)。重產再加 -- --update-snapshots,並逐張人工目檢後才提交。有 pre-push 閘門(VIS-DEBT-3):動到 components//app/ 的 tsx/css 但零 baseline 變更會擋下 push;確認視覺真的沒動時用 SKIP_VISUAL_GATE=1 git push。npm install 會經由 prepare 自動把 core.hooksPath 指到 .githooks |
npm run check | 品質閘門:test + verify:episodes + verify:zone-art + verify:map-art + build |
npm run font:subset | 重新子集化中文字型(新增文案後) |
test:e2e 預設使用自己的 production server;若要重用已啟動的 production server,才明確設定 PW_REUSE_SERVER=1。
| 指令 | 用途 |
|---|---|
npm run sync:apple | 從 Apple Podcasts RSS 同步新集(見下方) |
npm run transcribe | whisper.cpp 本機轉錄字幕 → data/subtitles/<slug>.json |
npm run proofread:subtitles | 字幕 lint/fix/--mark(illustrate 前必做) |
npm run illustrate | OpenAI 切場景 + 生圖(需 OPENAI_API_KEY,CI 不生圖) |
npm run export:video | 靜圖匯出 1920×1080 mp4(docs/VIDEO-EXPORT.md)。會動的流程見 docs/VIDEO-GENERATE.md,片段 CLI 尚未落地 |
npm run verify:episodes | 對照 ep-9/ep-10 標準驗證集數接線 |
npm run verify:browse-index | 驗證 browse-index.json 與故事資料一致 |
npm run generate:story-blurs | 故事圖 blur placeholder |
npm run optimize:lcp-images | 預生成 landing/hero-home/故事全幕 WebP/AVIF(--verify 只檢查不寫檔) |
npm run generate:coloring-lineart | 由定裝/場景 JPG 產生著色線稿 PNG(演算法版;--only <id>/--kind/--verify) |
npm run generate:coloring-cover | 繪本著色 hero cover(黏土風 1448×1086 webp;寫入 public/.games-staging/<run>/,人工審後 --approve;需 OPENAI_API_KEY,CI 不跑) |
npm run generate:orange-express-art | 小橘特快車黏土封面(1536×1024)與小橘透明貼紙(另做 sm/);寫入 public/.games-staging/orange-express/<run>/ 並出併排審稿圖與封面裁切審稿圖,人工審後 --approve(一併改 data/games.ts 封面、art.ts 貼紙路徑、寫 SOURCES.md);--only cover|sticker 只生一張、--dry-run 只印 prompt;需 OPENAI_API_KEY,CI 不跑 |
npm run generate:coloring-ai-lineart | AI 重生著色線稿(images.edit+定裝 ref;character/scene 分流 prompt;gate 含構圖 edgeIou;寫入 public/.coloring-staging/<run>/,人工審 contact sheet+清單後 --approve <id> 才上線;硬閘 16 calls/run,需 OPENAI_API_KEY,CI 不跑) |
| 指令 | 用途 |
|---|---|
npm run verify:zone-art / verify:map-art | 驗證島嶼/地圖美術資產契約 |
npm run generate:map-art / generate:forest-zone | AI 生地圖/森林島美術 |
npm run generate:roamer-assets | 漫遊 NPC 精靈 |
npm run generate:llms-full | 手動重生 public/llms-full.txt |
npm run migrate | 執行 DB migration(scripts/migrations/) |
本 repo 用 Meta + Domain 兩層規範 AI agent 分工。一般 chat 不會自動派子 agent;只有打出 slash command 才進入編排模式。
| 指令 | 用途 | 指令檔 |
|---|---|---|
/agent-plan | 依 L2/L3 風險分級規劃;必要時安排工程、設計或對抗審 → Approved Plan(預設不實作) | .cursor/commands/agent-plan.md · .claude/commands/agent-plan.md |
/agent-action | 依 Plan Task 派工 → 整合 → Verify →(可選)Ship | .cursor/commands/agent-action.md · .claude/commands/agent-action.md |
收尾依風險列出 Agent 執行分配表: L0/L1 可省略;L2/L3 列實際 agent、model slug、產出與狀態。
| 文件 | 內容 |
|---|---|
| docs/AGENT-WORKFLOW.md | Meta:模型分工、L0–L3、Plan 模板 |
| docs/AGENT-DOMAIN.md | Domain:紅線、驗證矩陣、Protected paths |
| docs/AGENT-FAILURES.md | 目前模型呼叫協議與未解除記錄;歷史案例見 docs/archive/AGENT-FAILURES-2026.md |
適合 Vercel、Netlify 等靜態/Edge 平台。
Production 請設定:
NEXT_PUBLIC_SITE_URL=https://你的網域
用於 Open Graph、RSS、canonical 與站內絕對連結。未設時 production fallback 到 lib/site-url.ts 的 CANONICAL_SITE_URL。
| 變數 | 用途 |
|---|---|
NEXT_PUBLIC_SITE_URL | 站點 canonical URL(必填於 production) |
NEXT_PUBLIC_AUDIO_BASE_URL | 可選的公開音檔 CDN/物件儲存 origin;未設定時 fallback 至 /stories/。外部 origin 須支援音檔 Range request;跨網域播放請允許本站來源(會員私有音檔不在本輪) |
DATABASE_URL | 樂園許願 + email 訂閱 + 站內留言牆(Neon);未設則許願→mailto、訂閱→#connect;/feedback 仍 200 且表單可填,送出失敗才顯示 mailto 備援 |
FEEDBACK_MODERATION_SECRET | /studio/feedback 審核密語(server-only)。未設則後台顯示提示、審核 API 503。不要加 NEXT_PUBLIC_ |
UPSTASH_REDIS_REST_URL / UPSTASH_REDIS_REST_TOKEN | 公開表單與審核登入的分散式節流;production 未設時 POST/登入 fail-closed 503,GET 牆仍可空狀態 |
RESEND_API_KEY / SUBSCRIBE_FROM_EMAIL | 名單確認信(只用來驗證信箱;目前不寄新集上線信);任一未設時訂閱 API 安全降級為不可用 |
OPENAI_API_KEY | 僅本機 illustrate/地圖資產生成;CI 不放 |
SENTRY_DSN / NEXT_PUBLIC_SENTRY_DSN | 可選錯誤上報。瀏覽器走 @sentry/browser(無 BrowserTracing);未設則不上報 |
SYNC_ISSUE_* | GHA 同步後 GitHub Issue 通知(見 .env.example) |
完整說明見 .env.example。
Neon/DATABASE_URL 為選配。未設定時不需要執行 migration;許願與 Email 訂閱維持降級,/feedback 表單仍可填(送出失敗時才出現 mailto 備援)。啟用資料庫時依序跑:
npm run migrate -- 005_legal_consent_audit.sql(家長同意政策版本)npm run migrate -- 006_feedback_messages.sql(留言牆)舊資料不回填、不推定同意版本。審核後台另需 FEEDBACK_MODERATION_SECRET。
SoundOn 新集: 多數由 Apple Podcasts 自動同步 每日上架(
ep-Nslug、pageCount: 1)。以下為手動在manualStories新增完整繪本時使用。
public/stories/<slug>/(slug 英文小寫,與網址一致;現階段同步/轉錄仍以此為 staging source)audio.mp3、01.jpg(多頁:02.jpg…);公開音檔上線後可由 NEXT_PUBLIC_AUDIO_BASE_URL 將瀏覽器/RSS 指向外部 origindata/stories.ts — 在 manualStories 加一筆(pageCount 與插圖張數一致)npm run optimize:lcp-images(為每張 NN.jpg 產同名 .avif/.webp;播放頁 <picture> 依序採用)npm run font:subsetnpm test && npm run buildslug 與資料夾名稱一致audio.mp3 可播放、01.jpg 存在NN.jpg 有同名 .avif/.webp(npm run optimize:lcp-images -- --verify)ep 為目前最大集數 + 1pageCount 與插圖張數一致/feed.xml 含新集/studio)製作團隊專用,不在首頁曝光;頁尾極小字「節目數據」或書籤 /studio。noindex,不在 sitemap。
| 檔案 | 用途 |
|---|---|
app/studio/page.tsx | 節目數據中心 |
lib/studio/platforms.ts | 各平台後台 URL(含 SoundOn,不進公開 ConnectHub) |
components/studio/EngagementMetricsPanel.tsx | 本機 localStorage 互動驗收 |
components/studio/IllustrationQueuePanel.tsx | 待生圖佇列(catalog pageCount=1) |
data/illustration-queue.json | 生圖佇列 overlay(本機 notify/--approve 寫入) |
官網與 SoundOn 不會自動連動;管線只讀 Apple Podcasts 公開 RSS(iTunes Lookup,無需 API key)。
| 檔案 | 用途 |
|---|---|
data/apple-synced.json | sync 腳本追加的新集 metadata |
data/apple-sync-state.json | 已處理 RSS guid,以及每一集的 metadata/封面/blur/字幕進度 |
data/apple-sync.defaults.json | 新集預設;overrides.<slug> 可覆寫單集 |
data/browse-index.json | 車種/主題關鍵字推斷(CI 會 commit) |
每日 GHA 上架框架:
public/stories/ep-N/audio.mp3 + Apple 封面 01.jpgpageCount: 1(單圖 MVP);摘要自動去 SoundOn 尾註transcribe-backfill workflow 之後補,同一集失敗 3 次才開 issuestory-zones、reflection-prompts、story-dates、episode-faqs 四個 sidecar 一起補齊;封面 blur 與音檔長度在驗證前寫入。FAQ 先產生可驗證的 MVP stub,之後由人工依劇情改寫npm run sync:validate、再推上固定分支 sync/apple。驗證只查同步產物,不跑全站 npm test 或 npm run build。同一類失敗連續兩次才開一張 Issue。job 不等 CI;看門狗盯還沒合入的 PR,以及 RSS 有、站上還沒有的集數npm run sync:apple -- --dry-run # 預覽不寫檔
npm run sync:apple # 實際同步
Workflow: .github/workflows/sync-apple-podcast.yml(repository_dispatch 準時觸發 + cron 後備)、.github/workflows/sync-watchdog.yml(RSS 逾時告警)。
GitHub 內建
schedule為 best-effort,常延遲。要準時請用外部 cron 打repository_dispatch(sync-now/watchdog-now),設定見下方舊版說明或 workflow 註解。
| 情況 | 行為 | Issue label |
|---|---|---|
| GHA 同步新集並 push 成功 | 開「待生圖」Issue;若看門狗已開 RSS stale,改那張單、不另開第二張 | illustration |
本機 npm run sync:apple 繞過 Actions 直接 push | 不會自動開單,push 後須另跑 npm run sync:notify(同上,會升級已開的 stale) | illustration |
RSS 有新集、仍在等第一次 sync/合入(預設 ≥8h;yaml STALE_HOURS=3 不提早開單) | 看門狗靜默 | — |
| RSS 逾時仍未上站(超過等待窗,且 sync 沒在跑) | 看門狗開告警;上站後由 notify-live 改成待生圖 | sync-alert + sync-stale-rss |
| 單次 CI 失敗 | 細節在 Actions logs;workflow 失敗另開 sync-job-failure(與待生圖分開) | sync-job-failure |
本機務必先 git push 成功,再跑通知(走與 GHA 相同的 notify-live 路徑,去重不重開)。
Issue 文案會寫「MVP 已上線」——若尚未 push 就 sync:notify,會開出站上還沒有的假「已上站」單。
git push # 必須先成功
npm run sync:notify # 讀本次 sync report,為新 ep-N 開/去重「待生圖」Issue
npm run sync:notify:reconcile # 可選:另掃現有 catalog 補漏(最多 3 筆,跳過已存在 open/closed 同標題單)
SYNC_ALERT_DRY_RUN=1 npm run sync:notify # 只印出將執行的 gh 動作,不實際開單(可先預覽)
gh auth login;未登入或 API 失敗時 fail-soft(不會讓指令當掉,只印警告與提示),可加 --strict(如 tsx scripts/sync-alert.ts notify-live --strict)讓有待生圖卻全數失敗時 exit 非 0,方便腳本化檢查。npm run sync:apple 偵測到新集時,收尾會印出「push 後請跑 npm run sync:notify」的提醒(--dry-run 不會印此區塊)。SYNC_REPORT_PATH 未設時本機預設寫入 .cache/sync-run-report.json(已 .gitignore);GHA 設定 SYNC_REPORT_PATH 時優先採用,workflow 不受影響。請在 repo 根目錄執行 npm run sync:notify(與 sync:apple 相同 cwd)。report.dryRun === true、report 已超過 24 小時(stale)、或 report 的 gitHead 不是目前 HEAD 的近期祖先時,sync:notify 會拒絕開單。GHA/本機都是先寫 report 再 commit,因此 gitHead 會是 parent——這算合法,避免用過期/錯分支的結果誤發通知。app/
page.tsx Landing Hub(四段 scroll-snap)
stories/page.tsx 全部故事頁
story/[slug]/ 故事詳情 + play 播放器 + transcript.vtt
adventures/page.tsx 車車宇宙地圖
characters/page.tsx 角色圖鑑
for-parents/ dashboard + play-map + articles(親子指南已併進 about)
subscribe/page.tsx 新集 email 訂閱
games/ 街機兩款 + 繪本著色
topic/、vehicles/ 主題/車種索引
studio/、about/、legal/ 數據中心、關於、條款
api/zone-wish/ 許願 API(可選 Neon)
api/subscribe/ email 訂閱 API(可選 Neon)
feed.xml/、robots.ts、sitemap.ts
components/
landing/ Landing Hub、頂欄、嘟嘟吉祥物
universe/ 地圖、島嶼、ZoneSheet、漫遊者
games/ 遊戲 shell、canvas 與共用 GameKit 元件
story/ ShowNotes、反思提問、親子延伸、島徽章
home/ /stories 區塊渲染
studio/、for-parents/、decor/
data/
content.ts Story 查詢 API(合併手動 + Apple + sidecar)
stories.ts 手動維護集(完整繪本)
apple-synced.json GHA 同步集
characters.json、scenes/、subtitles/
playgrounds.ts 親子景點(Zod 契約在 playgrounds.schema.ts,僅測試/CI)
universe.ts、universe-zones.ts 地圖五島(Zod 契約在 universe.schema.ts,僅測試/CI)
reflection-prompts.ts、family-activities.ts、parent-guides.ts
hooks/ 遊戲、地圖、無障礙、家長儀表板 hooks
lib/
gamekit/ 遊戲 runtime、進度、React hooks
universe/ 地圖美術、deep link、OG
story-geo.ts、for-parents.ts GEO/家長端 resolver
story-play-image.ts 播放頁插圖 AVIF/WebP 路徑與 CACHE_STORY idle 清單
sentry-client.ts 瀏覽器 Sentry 輕量 init
progress-store.ts localStorage 收藏、繼續收聽、遊戲進度
platform-utm.ts 收聽平台外連 UTM 歸因
zone-wish-*.ts 許願 schema/DB/rate limit
subscribe-*.ts 訂閱 schema/DB/rate limit
scripts/
sync-apple-podcast.ts Apple RSS 同步
transcribe.ts、illustrate.ts
generate-llms-full.ts GEO llms-full 生成
verify-*.ts 集數/索引/地圖資產驗證
lib/ apple-rss、illustrate-core、subtitle-proofread 等
docs/ 見下方「文件索引」
public/
stories/<slug>/ 每集音檔與插圖
adventures/ 地圖/島嶼/漫遊者資產
characters/、landing/、games/
llms.txt、llms-full.txt
.cursor/、.claude/ Agent slash commands 與規則
架構分層慣例:data/*.ts(型別+常數+*.test.ts)→ lib/*-query.ts(resolver)→ components/<area>/ + CSS Modules。
npm run transcribe)逐字字幕在側車檔 data/subtitles/<slug>.json,由 whisper.cpp 本機轉錄(音檔不外送)。播放器有側車檔即自動套用;否則回退 captions/captionTimes。
brew install whisper-cpp
mkdir -p models && curl -L -o models/ggml-large-v3.bin \
https://huggingface.co/ggerganov/whisper.cpp/resolve/main/ggml-large-v3.bin
npm run transcribe -- ep-7 # 指定集
npm run transcribe -- --all # 全部有 audio.mp3 的集
草稿必校對(illustrate 前必做):docs/SUBTITLE-PROOFREAD.md
npm run proofread:subtitles -- ep-N --mark
字幕轉錄在 transcribe-backfill workflow。本機 npm run sync:apple 仍可在有 whisper 時順便轉錄;SKIP_TRANSCRIBE=1 會跳過、不中斷。
npm run illustrate)讓 pageCount:1 的集數依台詞自動產生黏土風插圖系列。播放器依 captionTimes + pageCount 換圖,不改播放器。
唯一需 OpenAI API 的付費功能;本機手動、人工審圖後才上線。
標準範本: ep-9、ep-10。驗證:npm run verify:episodes。
OPENAI_API_KEY=sk-... npm run illustrate -- ep-9 --segment-only # 只切場景
OPENAI_API_KEY=sk-... npm run illustrate -- ep-9 # 生圖到暫存
open public/.illustrate-staging/ep-9/contact.html # 審圖
npm run illustrate -- ep-9 --approve # 上線
npm run optimize:lcp-images # 為新 JPG 補 AVIF/WebP
| 旗標 | 作用 |
|---|---|
--segment-only | 只產 data/scenes/<slug>.json |
--scene N | 重抽第 N 幕(付費;agent 須先列幕號等人確認,禁止自行連抽) |
--approve | 暫存 → public/ + 寫接線 |
角色名冊 data/characters.json、定裝照 public/characters/、跨集一致性見 README 舊節或 EPISODE-WORKFLOW.md。
中文內文用自託管 jf-open 粉圓(huninn) 子集(app/fonts/huninn-subset.woff2),中文標題用 源泉圓體 TW Bold 子集(app/fonts/gensen-rounded-tw-bold-subset.woff2)。新增文案後:
curl -sL https://github.com/justfont/open-huninn-font/releases/download/v2.1/jf-openhuninn-2.1.ttf -o /tmp/huninn.ttf
curl -sL https://raw.githubusercontent.com/ButTaiwan/gensen-font/master/otf/TW/GenSenRounded2TW-B.otf -o /tmp/GenSenRounded2TW-B.otf
npm run font:subset
| 階段 | 重點 |
|---|---|
| STEM-P1 互動故事 | 完播反思提問、重訪量測(當務之急) |
| STEM-P2 實驗室 | 組裝車、斜坡物理、開放式探索 |
| STEM-P3 家長端 | /for-parents、家庭儀表板、共讀指引 |
| STEM-P4 商業化 | freemium + 家長訂閱 |
原則:玩不像作業 · 幼兒不競賽計時 · 家長信任與透明付費。完整條目見 TODOS.md。
| 文件 | 說明 |
|---|---|
| EPISODE-WORKFLOW.md | 單集全幕插圖標準流程 |
| SUBTITLE-PROOFREAD.md | 字幕校對 SOP |
| VIDEO-EXPORT.md | YouTube 整集影片匯出 |
| GAMEKIT-ARCHITECTURE.md | GameKit 分層與新增遊戲 |
| GAME-PERFORMANCE.md | 遊戲載入策略 |
| UNIVERSE-ART-BIBLE.md | 樂園地圖美術聖經 |
| FOR-PARENTS-DATA.md | 家長端資料盤點 |
| GEO-CONTENT-CONTRACT.md | GEO 內容欄位契約 |
| geo-checklist.md | GEO 上線後人工檢查 |
| metrics/README.md | 成長量測週報模板與 UTM 對照 |
| AGENT-WORKFLOW.md | Agent 編排 Meta |
| AGENT-DOMAIN.md |
| 文件 | 說明 |
|---|---|
| LICENSE | 網站程式碼 MIT |
| DISCLAIMER.md | 節目內容版權、禁止散布、建議年齡 |
| THIRD_PARTY_NOTICES.md | 字型與商標摘要 |
| /legal | 對外使用條款 |
Podcast 音檔、插圖、字幕與品牌內容屬 Bonbon & 馬米;未經書面同意禁止轉載、下載或散布。AI 插圖須人工審圖後才 --approve 上線。
manifest.jsonsw.js主畫面圖示;收藏、繼續收聽、遊戲進度、主題偏好(cheche:progress localStorage)。CACHE_STORY 只排 current±1 以外的 AVIF idle、不預抓整集 MP3;只快取完整 200(Range 206 不入庫,避免 Landing autoplay 壞掉)。維持 v6 |
| GEO | public/llms.txt、llms-full.txt | AI 引用語料(build 前 prebuild 自動生成 llms-full);robots.ts 分流檢索/訓練爬蟲 |
| Agent Domain 紅線 |
| proposals/ | 每週設計評審週報 |