Claude Code harness · PythonClaude Code 工具組 · Python

A memory and a reviewer for Claude Code.

給 Claude Code 一份記憶,
再加一位審查者。

Each workspace gets its own SQLite memory over MCP. Before any code is written, an Architect session drafts a spec and a separate Reviewer session challenges it. Scheduled jobs carry what was learned to your other machines through git.

每個工作區都有自己的 SQLite 記憶,透過 MCP 存取。動手寫程式之前,Architect session 先起草規格,再由另一個獨立的 Reviewer session 挑毛病。排程工作再透過 git,把累積的知識帶到你的其他機器。

MITPython 3.10+Experimental · last commit April 2026實驗性質 · 最後提交於 2026 年 4 月
Spec Squad · terminal modeSpec Squad · 終端機模式Waiting for you等你決定
clawd-lobster squad start -w ~/work/todo-apiclawd-lobster squad v0.6.0Describe your project (press Enter twice to finish):A to-do REST API for a small team. FastAPI, SQLite, token auth.給小團隊用的待辦事項 REST API,FastAPI 加 SQLite,要有 token 驗證。Phase 1: Generating spec...>> [SPEC] Architect is writing the spec...>> [REVIEW] Review loop starting...Spec complete: 4 turns, 2 review rounds, approved=TrueFiles in: /home/you/work/todo-api/openspecBuild now? (y/n):
v0.6.0Package version, April 2026套件版本,2026 年 4 月
27MCP tools in the memory server記憶伺服器的 MCP 工具
11Skill manifests in four kindsskill 資訊清單,分成四類
4Spec Squad roles, a fresh session per turnSpec Squad 角色,每一輪都是新的 session
The problem問題在哪裡

Context gets lost between sessions and machines.

換了對話、換了機器,
脈絡就斷了。

Decisions, open TODOs, and lessons from failed attempts end up scattered across chat logs and one long CLAUDE.md, and each machine keeps its own copy. A spec written and approved by the same session carries its gaps straight into the code. Clawd-Lobster gives each workspace a structured memory, syncs it through git, and puts a separate reviewer between the spec and the build.

決策、還沒做完的 TODO、失敗過的嘗試,最後散落在對話紀錄和一份越寫越長的 CLAUDE.md 裡,每台機器還各有一份。由同一個 session 撰寫又自己核准的規格,會把漏洞原封不動帶進程式碼。Clawd-Lobster 讓每個工作區有結構化的記憶,透過 git 同步,並在規格與實作之間安排一位獨立的審查者。

The Reviewer never sees the Architect's instructions. It gets the spec files and read-only tools, and its only job is to find what is wrong.
Reviewer 看不到 Architect 的指示,
只有規格和唯讀工具,
它的工作就是找出問題。
How it works運作方式

Set up once. Then every project runs the same loop.

設定一次,
之後照流程走。

The browser and the terminal drive the same engine, and every step leaves files in the workspace that you can open and read.

瀏覽器和終端機驅動的是同一套引擎,每一步都會在工作區留下檔案,隨時可以打開來看。

01

Onboard

完成設定

clawd-lobster serve opens a setup wizard on localhost:3333: language, Claude sign-in, a private GitHub Hub, the workspace root, then each required skill. The install scripts cover similar ground from a terminal.

clawd-lobster serve 會在 localhost:3333 打開設定精靈:語言、Claude 登入、私人的 GitHub Hub、工作區根目錄,接著逐一設定必要的 skill。安裝腳本則在終端機完成類似的設定。

02

Describe the project

描述專案

In the browser, a discovery chat asks follow-up questions until it has enough to start. In the terminal you type the description and press Enter twice.

在瀏覽器裡,探索對話會一直追問,直到資訊足夠才開始。在終端機則是直接輸入描述,按兩次 Enter 結束。

03

Spec, review, build

規格、審查、實作

The Architect writes OpenSpec files with SHALL/MUST requirements and Gherkin scenarios. The Reviewer challenges them for up to five rounds, the Coder builds from tasks.md, and the Tester checks each requirement. Terminal mode asks before building.

Architect 寫出 OpenSpec 檔案,需求用 SHALL/MUST 描述並附上 Gherkin 情境。Reviewer 最多挑戰五輪,接著 Coder 依 tasks.md 實作,Tester 逐條檢查需求。終端機模式在開始實作前會先問你。

04

Remember and sync

記住並同步

Decisions, TODOs, and an action log go into a SQLite file in each workspace. With the install scripts, a job every 30 minutes pulls, commits, and pushes the repositories under the workspace root.

決策、TODO 與操作紀錄寫進各工作區自己的 SQLite 檔。用安裝腳本安裝的話,排程工作每 30 分鐘會對工作區根目錄底下的 repo 執行 pull、commit 與 push。

Nobody reviews their own spec

自己寫的,不自己審

The Reviewer is a separate session. It sees the spec files, not the Architect's instructions.

Reviewer 是另一個 session,只看得到規格檔,看不到 Architect 收到的指示。

  1. Write the spec

    The Architect writes OpenSpec files with SHALL and MUST lines and Gherkin scenarios.

  2. Find problems

    The Reviewer gets Read, Glob, and Grep. It can look, but not edit.

  3. Record who approved

    Reviewer approval is saved as reviewer. Five rounds without it are saved as round_limit.

  • spec written
  • the reviewer only reads
  • not approved, back to the Architect
Every round is a fresh session, which costs time and tokens, so it stops at five. In the terminal, it asks you before writing any code.
  1. 寫規格

    Architect 寫 OpenSpec 檔,需求用 SHALL 和 MUST,附上 Gherkin 情境。

  2. 挑毛病

    Reviewer 只有 Read、Glob 和 Grep,看得到,改不了。

  3. 記下誰放行

    Reviewer 核准,就記成 reviewer;五輪還沒過,就記成 round_limit。

  • 規格寫好了
  • Reviewer 只讀不改
  • 沒過就退回重寫
每一輪都是全新的 session,很花時間和 token,所以最多五輪。終端機模式在寫程式之前,會先問你要不要開始。
What you get你會得到什麼

Plain parts around Claude Code.

Claude Code 不動,
只在外圍加零件。

Each piece is a Python module, a script, or a folder of Markdown and JSON. Claude Code itself is never patched.

每個零件都是一個 Python 模組、一支腳本,或是一個裝著 Markdown 與 JSON 的資料夾。Claude Code 本身完全不動。

01

A four-role Spec Squad

四個角色的 Spec Squad

Architect, Reviewer, Coder, and Tester each run as fresh Claude Agent SDK sessions with their own prompts and tool lists. The Reviewer can only read, and only the Coder and Tester can run shell commands.

Architect、Reviewer、Coder、Tester 每一輪都在全新的 Claude Agent SDK session 裡執行,各有自己的 prompt 與可用工具。Reviewer 只能讀檔,只有 Coder 和 Tester 能執行 shell 指令。

clawd_lobster/squad.py
02

Memory over MCP

MCP 記憶伺服器

A FastMCP server with 27 tools for decisions, knowledge, TODOs, learned skills, and an audit trail, stored in SQLite per workspace. Salience rises when an item is used and decays when it is not, and search ranks by it. It grew out of mcp-memory-server.

以 FastMCP 寫成,提供 27 個工具,記錄決策、知識、TODO、學到的 skill 與稽核軌跡,每個工作區各存一份 SQLite。項目被用到時 salience 上升,閒置時衰減,搜尋結果依此排序。前身是 mcp-memory-server。

skills/memory-server/
03

A local dashboard

本機儀表板

clawd-lobster serve runs a standard-library HTTP server on 127.0.0.1 with pages for setup, workspaces, skills, credentials, and a live Squad view. The browser and a Claude Code session share one controller lease, so only one of them drives setup at a time. Every POST needs the token from that run, a local Host header, and a matching Origin.

clawd-lobster serve 用 Python 標準函式庫在 127.0.0.1 啟動 HTTP 伺服器,提供設定、工作區、skill、憑證與即時 Squad 畫面。瀏覽器和 Claude Code session 共用一份控制權租約,同一時間只有一方能操作設定。每個 POST 都要帶這次啟動產生的 token,Host 必須是本機,Origin 也要相符。

clawd_lobster/server.py
04

Skills with manifests

附資訊清單的 skill

Eleven skills in four kinds: MCP server, prompt pattern, cron job, and poller. Each skill.json declares credentials, a health check, and dependencies, plus setup steps for the six required ones; prompt patterns ship a SKILL.md for Claude to follow.

11 個 skill 分成四類:MCP 伺服器、prompt 模式、cron 排程與輪詢器。每個 skill.json 都寫明所需憑證、健康檢查與相依項目,六個必要的 skill 另外寫好設定步驟;prompt 模式則附一份 SKILL.md 讓 Claude 照著做。

skills/*/skill.json
05

A Hub across machines

跨機器的 Hub

Setup creates or joins a private GitHub repository as the Hub. The install scripts also schedule a job that pulls, commits, and pushes every repository under the workspace root every 30 minutes, so the next machine sees the same knowledge files.

設定流程會建立或加入一個私人 GitHub repo 當作 Hub。安裝腳本另外排了一個工作,每 30 分鐘對工作區根目錄底下的每個 repo 執行 pull、commit 與 push,另一台機器就能看到同樣的知識檔案。

scripts/sync-all.sh
06

Review on a timer

定時回顧

Every two hours, evolve-tick asks Claude to look over finished TODOs and recent actions, stores reusable patterns as learned skills, decays stale salience, and lints the knowledge wiki. Improvement ideas are committed as proposal files for a person to review.

evolve-tick 每兩小時請 Claude 檢視完成的 TODO 與最近的操作,把可重複使用的做法存成 learned skill,讓久未使用的項目 salience 衰減,並檢查知識 wiki。改進想法會寫成提案檔 commit 進去,等人審查。

scripts/evolve-tick.py

Four kinds of skill

skill 分成四種

Every skill has a skill.json that names its kind, credentials, health check, and dependencies.

每個 skill 都有一份 skill.json,寫明類型、憑證、健康檢查和相依項目。

  1. Manifest

    The repo ships 11 of them, and setup requires 6.

  2. Kind

    The kind decides how a skill runs. Setup can't find the entrypoint of connect-odoo, the only poller.

  • 11 manifests
  • four kinds
  • the poller can't be scheduled yet
Seven of the eleven are prompt patterns, each with a SKILL.md. The two cron skills, heartbeat and evolve, register their own schedule.
  1. 技能清單

    repo 裡有 11 份,設定時有 6 個是必裝。

  2. 類型

    類型決定 skill 怎麼跑。唯一的 poller 是 connect-odoo,設定時找不到它的進入點。

  • 11 份清單
  • 四種類型
  • poller 還不能排程
11 個裡有 7 個是 prompt-pattern,各附一份 SKILL.md。兩個 cron 類的 heartbeat 和 evolve,會自己註冊排程。

One driver at a time

一次只能一邊改設定

Both the browser and Claude Code can change setup, so each has to hold the same lease first.

瀏覽器和 Claude Code 都能改設定,所以要先拿到同一份租約。

  1. Browser

    The setup page takes the lease under the name web.

  2. Claude

    A Claude Code session can take it too, as claude.

  3. Lease

    It lasts 90 seconds, and the page renews it every 25. The other side is refused.

  • one holder at a time
  • lease lasts 90 seconds
  • renewed every 25 seconds
While one side is halfway through, the other can't step in. It gets the lease only after it is released or runs out.
  1. 瀏覽器

    設定頁拿租約時,名字是 web。

  2. Claude

    Claude Code session 也能拿,名字是 claude。

  3. 租約

    有效 90 秒,設定頁每 25 秒續一次,另一邊會被擋下。

  • 一次一邊
  • 租約有效 90 秒
  • 每 25 秒續約
一邊改到一半,另一邊插不了手,要等租約放掉或過期才拿得到。

Look back every two hours

每兩小時回頭看一次

What finished work teaches is kept, and ideas for improvement are written down for a person.

做完的事,學到的要留下來,想改進的先寫下來等人看。

  1. Every 2 hours

    cron, launchd, or Windows Task Scheduler starts evolve-tick, which exits when done.

  2. Ask Claude

    Claude reads the recently finished TODOs and actions.

  3. Save a skill

    A pattern worth reusing becomes a learned skill.

  4. Write a proposal

    An improvement idea becomes a Markdown file in openspec/proposals, for a person to read.

  • the timer job exits
  • patterns saved
  • proposals wait for a person
A proposal is only a Markdown file and never changes the code by itself. Memories older than 30 days that were never used lose 5% of their score each run, but nothing is deleted.
  1. 每兩小時

    cron、launchd 或 Windows 工作排程器叫起 evolve-tick,跑完就退出。

  2. 問 Claude

    Claude 讀最近做完的 TODO 和操作紀錄。

  3. 存成技能

    值得重複用的做法,存成 learned skill。

  4. 寫成提案

    改進想法寫成 openspec/proposals 裡的 Markdown,等人來看。

  • 排程跑完就退出
  • 做法存起來了
  • 提案等人來看
提案只是一個 Markdown 檔,不會自己去改程式。建立超過 30 天、從沒用過的記憶,每次分數打 95 折,但不會被刪掉。
Screens畫面

The setup wizard, April 2026.

設定精靈,
2026 年 4 月擷取。

Crops of a real capture in docs/screenshots. Setup is one page: four foundation checks, then each required skill with its own steps. The wizard also comes in Traditional and Simplified Chinese, Japanese, and Korean.

裁切自 docs/screenshots 裡的實際畫面。設定精靈只有一頁:先完成四項基礎設定,再逐一設定每個必要的 skill。介面另有繁體中文、簡體中文、日文與韓文版本。

Clawd-Lobster setup wizard, Foundations section: language picker, Claude Code sign-in check, GitHub Hub, and workspace root
Foundations: language chosen, the Claude sign-in and workspace root checks not yet passing, the Hub still pending.基礎設定:語言已選好,Claude 登入與工作區根目錄的檢查尚未通過,Hub 還沒設定。
Required skills section listing the memory server, spec, and absorb skills with their setup steps
Required skills: each card lists its steps and stays locked until what it depends on has passed. The memory server waits for the workspace root.必要的 skill:每張卡片列出自己的設定步驟,相依項目完成前維持鎖定。記憶伺服器要等工作區根目錄設好。
Architecture系統架構

Three add-ons, one unmodified CLI.

三個外掛元件,
CLI 原封不動。

Claude Code stays the engine. The harness talks to it through MCP, CLAUDE.md, settings.json, and the Agent SDK, and keeps its own state in files.

Claude Code 仍然是引擎。這套工具組透過 MCP、CLAUDE.md、settings.json 與 Agent SDK 和它溝通,自己的狀態則存在檔案裡。

Web UI → Squad → memory → Claude Code儀表板 → Squad → 記憶 → Claude Code
Web UI儀表板clawd-lobster127.0.0.1:3333Setup, lease設定、租約
Spec SquadAgent SDK4 roles4 個角色openspec/
Memory記憶FastMCP27 tools27 個工具SQLite fileSQLite 檔案
Claude CodeYour CLI你的 CLICLAUDE.mdUnmodified不做修改
workspaces.json · .claude-memory/memory.db · cron, launchd, Task Scheduler

Who may run a shell

誰可以跑 shell

The Reviewer only reads. Bash goes only to the Coder and the Tester.

Reviewer 只能讀檔,Bash 只交給 Coder 和 Tester。

  1. Spec files

    The requirements in openspec, which the Reviewer may read.

  2. Reviewer

    Its tools are Read, Glob, and Grep.

  3. Coder

    Adds Write, Edit, and Bash, and builds from tasks.md.

  4. Tester

    Runs Bash for tests, but has no Write or Edit.

  • the reviewer can't edit
  • the coder may run Bash
  • the tester can't edit
  • Spec
  • Read only
  • Shell
Each role runs in a fresh session. Its tools are set in code, not left to the prompt.
  1. 規格檔

    openspec 裡的需求,Reviewer 可以讀。

  2. 審查者

    工具只有 Read、Glob 和 Grep。

  3. 實作者

    多了 Write、Edit 和 Bash,照 tasks.md 實作。

  4. 測試者

    可以跑 Bash 測試,但沒有 Write 和 Edit。

  • Reviewer 改不了檔
  • Coder 可以跑 Bash
  • Tester 不能改檔
  • 規格
  • 只能讀
  • 可跑指令
每個角色都是新的 session,能用哪些工具寫在程式裡,不是在 prompt 裡拜託它。
Design decisions設計取捨

Why it is shaped
this way.

為什麼長這個樣子。

01

Wrap Claude Code, do not replace it

包住 Claude Code,而不是取代它

Agent loops, model calls, and tool use stay inside Claude Code and the Agent SDK. This repository only adds memory, specs, scheduling, and setup around them, so most Claude Code updates need no changes here.

agent 迴圈、模型呼叫與工具使用都留在 Claude Code 和 Agent SDK 裡。這個 repo 只在外圍加上記憶、規格、排程與設定,所以 Claude Code 大部分的更新都不需要這裡跟著改。

02

Separate sessions for writing and reviewing

撰寫和審查分成不同的 session

The Reviewer gets its own prompt and read-only tools and never sees the Architect's instructions. The cost is time and tokens: every review round is a full session, which is why the loop stops after five rounds.

Reviewer 有自己的 prompt 和唯讀工具,看不到 Architect 收到的指示。代價是時間與 token:每一輪審查都是一個完整的 session,所以迴圈最多只跑五輪。

03

Git as the sync protocol

用 git 當同步協定

Machines share knowledge through a private GitHub repository instead of a shared database. No server is needed, but sync means scheduled commits and pushes, and a merge conflict stalls that repository until someone resolves it.

機器之間透過私人 GitHub repo 分享知識,而不是共用資料庫。不需要另外架伺服器,代價是排程會自動 commit 與 push;遇到合併衝突時,那個 repo 的同步就會卡住,直到有人處理。

04

SQLite first, Oracle optional

先用 SQLite,Oracle 可選

Every workspace works with a local SQLite file and plain text search. Vector search, cross-machine recall, and the Vault turn on only when you connect an Oracle database and an embedding endpoint.

每個工作區只要本機的 SQLite 檔案與一般文字搜尋就能運作。向量搜尋、跨機器回想與 Vault,要接上 Oracle 資料庫和 embedding 端點才會啟用。

Sync through git

每台機器靠 git 同步

No server is needed. The cost: a merge conflict stops that repo until a person fixes it.

不用另外架伺服器。代價是遇到合併衝突時,那個 repo 會停下來等人處理。

  1. Every 30 min

    A job the install scripts schedule. It runs on time and exits when done.

  2. Pull updates

    Every git repo under the workspace root is pulled.

  3. Commit and push

    If anything changed, it commits and pushes. New files are added only for a few text types, such as Markdown, JSON, and scripts.

  • every 30 minutes
  • every repo pulled
  • a conflict stops that repo
Ignored files, and new files outside that list, are never pushed.
  1. 每 30 分鐘

    安裝腳本排好的工作,時間到就跑,跑完就結束。

  2. 拉下更新

    工作區根目錄下的每個 git repo 都會 pull。

  3. 提交推送

    有變更就 commit 再 push。新檔只收幾種文字檔,像 Markdown、JSON 和腳本。

  • 每 30 分鐘一次
  • 每個 repo 都 pull 過
  • 有衝突就停在那個 repo
.gitignore 擋掉的檔和清單以外的新檔,都不會推上去。
Start here從這裡開始

Install, then open the dashboard.

裝好之後,
打開儀表板。

You need Python 3.10 or newer (3.11 for the memory server), Git, and a signed-in Claude Code CLI. A GitHub account and the gh CLI matter only for the Hub. There is no PyPI package.

需要 Python 3.10 以上(記憶伺服器要 3.11)、Git,以及已登入的 Claude Code CLI。只有要用 Hub 時才需要 GitHub 帳號與 gh CLI。目前沒有 PyPI 套件。

Clone and install

Clone 並安裝

Clone github.com/teddashh/clawd-lobster, then install it with the agent extra. Spec Squad needs claude-agent-sdk, which a plain pip install -e . leaves out.

先 clone github.com/teddashh/clawd-lobster,再連同 agent 這組選用相依套件一起安裝。Spec Squad 需要 claude-agent-sdk,單純 pip install -e . 不會裝。

cd clawd-lobster
pip install -e ".[agent]"

Open the dashboard

打開儀表板

Starts on 127.0.0.1:3333 and opens your browser at the setup wizard.

在 127.0.0.1:3333 啟動,並自動用瀏覽器打開設定精靈。

clawd-lobster serve

Or stay in the terminal

或者留在終端機

setup checks prerequisites, sets the workspace root, and creates a first workspace. squad start writes and reviews a spec in the current folder, then asks before building.

setup 會檢查必要工具、設定工作區根目錄,並建立第一個工作區。squad start 在目前的資料夾撰寫並審查規格,開始實作前會先問你。

clawd-lobster setup
clawd-lobster squad start
Honest status誠實的現況

Where it stands.

目前的樣子。

Experimental. 136 commits between April 1 and April 9, 2026, then October 2026 fixes: the local web server was locked down, scheduling was fixed, host names are no longer written out, and the Linux sync no longer stops when a file pattern matches nothing. No tagged releases; the changelog now covers 0.6.0.

實驗性質。2026 年 4 月 1 日到 9 日之間有 136 個 commit,2026 年 10 月又做了修正:鎖住本機網頁伺服器、修好排程、不再寫入主機名稱,Linux 的同步也不會再因為某種檔案類型比對不到就中止。沒有正式的 release;CHANGELOG 已補上 0.6.0。

Works today

目前可用

  • pip install -e . gives a clawd-lobster command with serve, setup, workspace create, squad start, and status
  • pip install -e . 之後就有 clawd-lobster 指令,包含 serve、setup、workspace create、squad start 與 status
  • 89 tests pass on Python 3.14 (onboarding, scheduling, server security, Spec Squad approval, the sync script, and PowerShell encoding), plus a scripted end-to-end run through the HTTP API
  • 89 個測試在 Python 3.14 上通過(設定流程、排程、伺服器安全、Spec Squad 核准、同步腳本與 PowerShell 編碼),另有一支透過 HTTP API 跑完整流程的端對端腳本
  • The memory server runs on SQLite alone, with text search ranked by salience
  • 記憶伺服器只靠 SQLite 就能運作,文字搜尋依 salience 排序
  • Install scripts for Windows (PowerShell), macOS, and Linux
  • 提供 Windows(PowerShell)、macOS 與 Linux 的安裝腳本
  • Spec Squad in the terminal stops after the spec and asks before any code is written
  • 終端機版的 Spec Squad 寫完規格會停下來,問過你才開始寫程式

Limits and not yet

限制與尚未完成

  • No feature work since April 9, 2026, and not checked against later Claude Code or Agent SDK releases
  • 2026 年 4 月 9 日之後沒有新功能,也沒有針對之後的 Claude Code 或 Agent SDK 版本驗證過
  • If the Reviewer has not approved after five rounds, the spec still counts as approved, marked as forced by the round limit, and the web flow goes on to build
  • 審查五輪後若 Reviewer 仍未核准,規格還是會被當成已核准,只是標記為回合上限強制通過,網頁流程也會直接進入實作
  • The 30-minute sync, which only the install scripts schedule, commits and pushes each git repository under the workspace root when the index has changes. It stages tracked updates and new Markdown, JSON, YAML, HTML, and script files. Other new files stay untracked, and ignored files stay ignored. Keep anything you do not want pushed outside that folder
  • 每 30 分鐘的同步(只有安裝腳本會排程)會在索引裡有變更時,對工作區根目錄底下的每個 git repo 自動 commit 並 push。已追蹤檔案的更新,以及新的 Markdown、JSON、YAML、HTML 與腳本檔會被加進去;其他新檔案維持未追蹤,被忽略的檔案也不會加進去。不想被推上去的東西請放在這個資料夾以外
  • The connect-odoo poller cannot be scheduled yet: setup reports that its entrypoint is missing
  • connect-odoo 的輪詢器還不能排程,設定時會回報找不到進入點
  • Heartbeat treats a session as alive when a process name matches, and revives with a plain claude --resume, which opens the session picker instead of a specific session
  • Heartbeat 只用程式名稱判斷 session 是否還在執行,重新開啟時也只是執行單純的 claude --resume,會開出 session 選單,而不是接回特定的 session
  • Spec Squad needs the [agent] extra; vector search and the Vault need an Oracle database; the memory server needs Python 3.11 or newer
  • Spec Squad 需要 [agent] 選用相依套件;向量搜尋與 Vault 需要 Oracle 資料庫;記憶伺服器需要 Python 3.11 以上
Version版本
0.6.0
License授權
MIT
Stack技術
Python, Claude Agent SDK, FastMCP, SQLitePython、Claude Agent SDK、FastMCP 與 SQLite
Platforms平台
Windows, macOS, LinuxWindows、macOS、Linux
Last commit最後提交
2026-10-06
Verified查核日期
2026-10-06

More from Ted Huang. Every public project has a page like this one, in English and Traditional Chinese.

Ted Huang 的其他作品。每個公開專案都有一頁像這樣的中英雙語介紹。

All projects →全部專案 →