Idea review · web MVP點子審查 · 網頁 MVP

Let five models question your idea.

讓五個模型輪流質疑你的點子。

Claude, Gemini, Grok, ChatGPT, and DeepSeek answer side by side for 5, 12, or 16 rounds: a thesis first, then a clash, then convergence. You get a resume link right away and the full transcript as Markdown at the end.

Claude、Gemini、Grok、ChatGPT 和 DeepSeek 同時作答,跑 5、12 或 16 輪:先立論,再攻防,最後收斂。送出後馬上拿到接續連結,跑完再拿到 Markdown 格式的完整紀錄。

Hono + React + SQLiteOpenRouterNo accounts, resume by link不用帳號,靠連結接續
Current round目前輪次Clash互相攻防
R3 / 5
Round 3 of 5 · all five seats answer in parallel第 3 / 5 輪 · 五個席位同時作答
✓Claudeanthropic/claude-sonnet-4done
✓Geminigoogle/gemini-2.5-prodone
…Grokx-ai/grok-4working
✓ChatGPTopenai/gpt-4odone
…DeepSeekdeepseek/deepseek-r1working
5Model seats per round每輪的模型席位
5 / 12 / 16Round options可選的輪數
3Phases: thesis, clash, converge階段:立論、攻防、收斂
30 minDefault time limit per run每次執行的預設上限
How it works運作方式

One form, several rounds, one transcript.

一張表單,
幾輪討論,一份紀錄。

The page starts the run as soon as the session exists. Everything after that is kept on the server, so closing the tab does not lose the review.

Session 一建立,頁面就自動開始執行。之後的一切都留在伺服器上,關掉分頁也不會弄丟這次審查。

01

Submit once

送出一次

Leave an email and an idea of 10 to 12,000 characters, and pick 5, 12, or 16 rounds. The session goes into SQLite and the page URL becomes the resume link, which is also emailed when SMTP is set.

留下 email 和一段 10 到 12,000 字的點子,選 5、12 或 16 輪。Session 存進 SQLite,頁面網址就是接續連結;有設定 SMTP 時也會寄到信箱。

02

Look for evidence, or say there is none

先找資料,找不到就明說

With SEARXNG_URL set, three searches (the idea, its market risk, its competitors) put up to nine results into every prompt as weak context. Without it, the models are told to treat every claim as a hypothesis.

設定 SEARXNG_URL 後,會用三組查詢(點子本身、市場風險、競品)找最多九筆結果,當作參考價值有限的背景放進每個 prompt。沒有設定時,會告訴模型所有說法都只是假設。

03

Five seats, round by round

五個席位,一輪一輪來

Each round, all five seats answer in parallel in Traditional Chinese, 350 to 650 characters each, with the last ten answers in view. The phases run thesis, clash, converge.

每一輪五個席位同時作答,用繁體中文寫 350 到 650 字,並看得到最近十則回答。階段依序是立論、攻防、收斂。

04

Read it, download it, or get it by email

線上看、下載,或收信

The finished transcript renders on the page and downloads as idea-review.md. With SMTP configured, the same Markdown arrives by email as HTML, with the file attached.

跑完的紀錄直接顯示在頁面上,也能下載成 idea-review.md。有設定 SMTP 的話,同一份內容會以 HTML 寄到信箱,並附上 .md 檔。

Send it and it runs

送出就開始跑

The page opens the run by itself once the row exists. SQLite is what keeps the record.

資料列一出現,頁面自己把執行打開。紀錄留在 SQLite。

  1. Submit form

    You send the idea and an email. The idea has to be 10 to 12,000 characters.

  2. Store row

    A session is saved, and it comes with a resume token.

  3. Stream run

    The answers stream in while it runs, with a keep-alive every 15 seconds.

  4. Save result

    The transcript is saved. The email goes out only when mail is set up.

  • the row is written
  • the stream stays open
  • mail needs all three SMTP fields
The idea is stored as the message you sent.
  1. 送出表單

    你送出點子和 email。點子要 10 到 12,000 字。

  2. 寫進一列

    會存下一份 session,附上一組接續用的 token。

  3. 邊跑邊推

    跑的時候回答會一路送過來,keep-alive 每 15 秒送一次。

  4. 存下逐字稿

    逐字稿會存下來。郵件沒設定,信就不寄。

  • 資料列寫好了
  • 串流會一直開著
  • 寄信要 SMTP 三項都有
點子會留成你送出的那則訊息。

Five is the default

預設就是五輪

The form offers three lengths. You can leave the field blank.

表單給三種長度。輪數可以不填。

  1. Pick length

    Blank becomes 5. A number other than the three lengths is rejected.

  2. Split phases

    Every length splits into three parts, and the middle one, the clash, is the longest.

  • the page selects 5
  • opening, clash, then close
The prompt calls them a thesis search, a mutual challenge, and a gradual convergence.
  1. 選幾輪

    沒填就當成 5。三種長度以外的數字會退回。

  2. 拆成三段

    每種長度都分成三段,中間的攻防最長。

  • 頁面選中的是 5
  • 先立論,再攻防,再收斂
Prompt 把這三段叫做搜尋立論、互相攻防和漸進收斂。
What you get你會得到什麼

Small, but built for public use.

規模不大,標準不低。

One Hono server, one React page, one SQLite file. The parts that face strangers on the internet have limits; the parts that are nice to have can be switched off.

一個 Hono 伺服器、一個 React 頁面、一個 SQLite 檔。會面對陌生使用者的部分都有限制,錦上添花的部分可以關掉。

01

Five seats, one key

五個席位,一把金鑰

Claude, Gemini, Grok, ChatGPT, and DeepSeek all go through OpenRouter's chat completions API with one OPENROUTER_API_KEY. Each seat's model ID can be swapped with MODEL_CLAUDE, MODEL_GEMINI, and the rest.

Claude、Gemini、Grok、ChatGPT、DeepSeek 都透過 OpenRouter 的 chat completions API 呼叫,只需要一組 OPENROUTER_API_KEY。每個席位的模型 ID 都能用 MODEL_CLAUDE、MODEL_GEMINI 等變數替換。

server/src/models.ts
02

Round plans that end in a call

最後要給結論的輪次安排

5 rounds run 1 thesis, 3 clash, 1 converge. 12 rounds run 2, 8, 2, and 16 rounds run 3, 10, 3. The prompt asks for clear trade-offs instead of a polite list of things to validate.

5 輪是 1 輪立論、3 輪攻防、1 輪收斂;12 輪是 2、8、2;16 輪是 3、10、3。Prompt 要求給出明確取捨,而不是一串客氣的「建議再驗證」。

schedule()
03

Resume without accounts

不用帳號也能接續

The resume link carries a 24-byte random token. Come back later and the page reloads the session from SQLite, polling every 5 seconds while the run is still going.

接續連結帶著一組 24 位元組的隨機 token。之後再回來,頁面會從 SQLite 讀回 session;如果還在跑,每 5 秒同步一次。

/idea?s=<token>
04

Live progress, durable results

即時進度,結果留存

The run streams server-sent events: each round starting, each seat finishing, and a ping every 15 seconds. The stream is best effort; SQLite and the result email are the record.

執行過程用 server-sent events 推送:每輪開始、每個席位完成,以及每 15 秒一次的 ping。串流只是盡力而為,真正的紀錄在 SQLite 和結果信裡。

POST /api/idea/run/:token
05

Markdown out, by download or email

Markdown 輸出,下載或寄信

The export returns the original idea and every round, seat by seat. nodemailer sends a resume email at the start and the result at the end; without SMTP settings, email is skipped and nothing else breaks.

匯出內容包含原始點子,以及每一輪、每個席位的回答。nodemailer 在開始時寄出接續信,結束時寄出結果信;沒有設定 SMTP 就略過寄信,其他功能照常。

GET /api/idea/export/:token.md
06

Limits for a public form

公開表單該有的限制

Per hour: 12 starts per IP, 4 per email, 8 runs per IP, plus global caps. At most 3 runs at once, each with a 30-minute timeout. Behind a trusted proxy, TRUST_PROXY_HEADERS lets the per-IP limits see the real client.

每小時每個 IP 最多建立 12 次、每個 email 4 次,每個 IP 最多執行 8 次,另有全站上限。同時最多 3 個執行,每個執行 30 分鐘逾時。放在可信任的反向代理後面時,TRUST_PROXY_HEADERS 讓每 IP 的限制以真正的來源為準。

server/src/index.ts

What goes into one call

一個席位拿到什麼

Every seat gets the same shape of prompt. Answers from the current round are not in it.

每個席位拿到的稿子形狀相同。這一輪其他人的回答不會放進去。

  1. Full idea

    The idea is copied in as it was written.

  2. Evidence

    SEARXNG_URL allows three searches and at most 9 hits. Otherwise claims stay hypotheses.

  3. Earlier answers

    Only the last 10 from earlier rounds are included, each cut at 1,200 characters.

  4. Call model

    One user message goes to OpenRouter at temperature 0.75, with at most 1,800 tokens.

  5. Drop lines

    A paragraph that talks about the prompt or the workflow itself is cut.

  • same round stays hidden
  • one call for each seat
  • keeps the text if filtering empties it
Each answer is asked to be Traditional Chinese, from 350 to 650 characters.
  1. 點子全文

    點子照你寫的放進去,不改字。

  2. 外來資料

    有 SEARXNG_URL 才搜三次,最多 9 筆。不然就把說法當假設。

  3. 更早的回答

    只放更早輪次的最後 10 則,每則截到 1,200 字。

  4. 呼叫模型

    一則 user 訊息送到 OpenRouter,temperature 是 0.75,最多 1,800 token。

  5. 拿掉段落

    講到提示詞或這套流程本身,那一段就拿掉。

  • 同一輪彼此看不到
  • 每個席位呼叫一次
  • 濾光了就留原文
每一則回答要用繁體中文,寫 350 到 650 字。

Only three at once

三場滿了就等

The counters sit in memory on one process. Restart that process and they go back to zero.

計數放在同一個行程的記憶體裡。行程一重啟就歸零。

  1. Count the hour

    There is an hourly cap per IP, and another one per email.

  2. Let one in

    Three runs can go at once.

  3. Turn extras away

    A fourth is told the server is busy.

  • a start has its own cap
  • over the cap, try later
  • each run stops at 30 minutes
A session that is still running has no retry button.
  1. 算這一小時

    每個 IP 每小時有上限,每個 email 也有。

  2. 放一場進來

    同時可以跑三場。

  3. 多的擋下來

    伺服器會跟第四場說現在正忙。

  • 光是建立也有上限
  • 超過了就晚點再試
  • 每一場 30 分鐘會停
還在跑的 session 沒有重跑按鈕。
Design decisions設計取捨

Trade-offs taken on purpose.

刻意做出的取捨。

01

A link instead of an account

用連結取代帳號

No sign-up keeps the MVP small, but the token is the only lock: anyone holding the link can read the idea and the email on the session. Treat resume links like passwords.

不用註冊讓 MVP 保持精簡,但 token 就是唯一的鎖:拿到連結的人都看得到點子和 session 上的 email。接續連結要當成密碼看待。

02

One failed seat is not a failed run

一席失敗,不等於整場失敗

When a model call errors, that seat records 這一席暫時失敗 with the reason and the round goes on. Only a timeout or an unexpected error fails the run, and a retry starts again from round 1.

某個模型呼叫出錯時,該席位記下「這一席暫時失敗」和原因,這一輪照常進行。只有逾時或意外錯誤會讓整場失敗,重新執行時從第 1 輪開始。

03

One gateway for five vendors

五家模型,一個入口

Routing every seat through OpenRouter means one key, one bill, and one request format. The cost is a hard dependency: the endpoint is fixed in server/src/llm.ts, not a setting.

每個席位都走 OpenRouter,就只要一把金鑰、一份帳單、一種請求格式。代價是綁定這個服務:端點直接寫在 server/src/llm.ts,不是可以調整的設定。

A miss is still saved

沒叫到也先記

The round waits for every seat to finish. It does not wait for every seat to succeed.

這一輪等每個席位結束,不等每個席位都成功。

  1. Call a seat

    Each seat is a separate request to OpenRouter.

  2. Save the miss

    The seat is saved as failed for now, with the reason.

  3. Run it again

    When status is failed, the button deletes AI messages and starts at round 1.

  • the other seats still count
  • retry is the button
  • it starts at round 1
Only a timeout or another whole-run error marks the session failed. The loop you see is that button, not an automatic restart.
  1. 各叫各的

    每個席位各自向 OpenRouter 送一次請求。

  2. 失敗寫進去

    呼叫丟出錯誤時,存成「這一席暫時失敗」再接上原因。

  3. 整場再跑

    狀態是 failed 時,按鈕會刪掉 AI 訊息,從第 1 輪再開始。

  • 其他席位照樣算
  • 重跑靠那顆按鈕
  • 從第 1 輪再來
只有逾時或其他整場錯誤,才會把 session 標成 failed。圖上的回圈是那顆按鈕,不是自動重跑。
Start here從這裡開始

One build, one process.

一次建置,一個程式。

You need Node.js 22 and an OpenRouter API key. Vite 8 accepts 20.19+ or 22.12+, but avoid Node 24 for now (see the limits below). SearXNG and SMTP are optional. There is no hosted demo.

需要 Node.js 22 和一組 OpenRouter API key。Vite 8 接受 20.19+ 或 22.12+,但目前請避開 Node 24(原因見下方限制)。SearXNG 與 SMTP 可有可無。目前沒有公開的線上版本。

Install and build

安裝並建置

In a clone of this repository, install and build both server/ and web/.

在 clone 下來的 repo 裡,一次安裝並建置 server/ 與 web/。

npm run install:all
npm run build

Configure

填寫設定

npm start runs inside server/, so the .env file goes there, and the database lands in server/data/ by default. Set OPENROUTER_API_KEY and PUBLIC_URL; add SMTP_* for email.

npm start 會在 server/ 裡執行,所以 .env 要放在那裡,資料庫預設也會建在 server/data/。填入 OPENROUTER_API_KEY 和 PUBLIC_URL;要寄信再加上 SMTP_* 設定。

cp .env.example server/.env
$EDITOR server/.env

Start

啟動

One process serves the built page and the API on 127.0.0.1:3001; open http://localhost:3001/idea. For public use, put a reverse proxy in front and set PUBLIC_URL to the public origin.

同一個程式在 127.0.0.1:3001 提供建置好的網頁與 API,打開 http://localhost:3001/idea 即可。要對外開放,請在前面加一層反向代理,並把 PUBLIC_URL 設成對外網址。

npm start
Honest status誠實的現況

Where it stands.

目前的樣子。

The app was written in one commit in June 2026; since then only docs, a license, dependency updates, and one streaming fix have landed. package.json says 0.1.0, and there are no releases, tests, or CI yet.

程式本體是 2026 年 6 月一次寫成的 MVP,之後只加了文件、授權檔、相依套件更新和一個串流修正。package.json 標示 0.1.0,目前還沒有正式版本、測試或 CI。

Works today

目前可用

  • Start, resume, run, and export endpoints backed by SQLite in WAL mode
  • 建立、接續、執行、匯出四組 API,資料存在 WAL 模式的 SQLite
  • Five seats per round through OpenRouter, each with its own model override
  • 每輪五個席位透過 OpenRouter 作答,每個席位都能替換模型
  • Live progress over server-sent events, and polling when you return through the resume link
  • 用 server-sent events 即時顯示進度,從接續連結回來時改為輪詢
  • Markdown export, plus resume and result emails when SMTP is set
  • Markdown 匯出;設定 SMTP 後會寄出接續信與結果信
  • Rate limits per IP, per email, and site-wide, with at most 3 runs at once
  • 每 IP、每 email 與全站的頻率限制,同時最多 3 個執行

Limits and not yet

限制與尚未完成

  • Every seat is told to answer in Traditional Chinese, and the page copy is mostly Chinese
  • 每個席位都被要求用繁體中文回答,頁面文字也以中文為主
  • Anyone with a resume link can read that session, email included, and there is no delete endpoint
  • 拿到接續連結就能讀取該 session,包含 email,也沒有刪除用的 API
  • Rate limits live in memory. A restart during a run leaves the session marked running, with no retry button
  • 頻率限制存在記憶體裡。執行到一半重啟伺服器,該 session 會停在執行中,也不會出現重新執行的按鈕
  • On Node 24.21, the locked better-sqlite3 11.10.0 aborted at startup in about half of the test runs; Node 22 started cleanly every time
  • 在 Node 24.21 上,lockfile 鎖定的 better-sqlite3 11.10.0 約有一半的啟動會中止;Node 22 每次都正常啟動
  • An output filter drops any paragraph that mentions workflow or system prompt, which can clip real content when the idea is about workflows
  • 輸出過濾會刪掉提到 workflow 或 system prompt 的段落,點子本身和 workflow 有關時,可能誤刪正常內容
Version版本
0.1.0, no releases0.1.0,尚無正式版本
License授權
MIT
Stack技術
Hono · React · SQLite
Requires需求
Node.js 22 + OpenRouter keyNode.js 22 + OpenRouter 金鑰
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 →全部專案 →