TreeMap
A free, open-source disk-space visualizer. Squarified treemap, duplicate hunting, disk-full forecasting, and cleanup that only ever moves files to the Trash.
翻譯準備中
尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證miftahulmahfuzh/fast-order
翻譯準備中
取自儲存庫 README
正在載入完整 README。 以下為已儲存的摘錄。
Paste the warung menu, paste what your colleagues already ordered, press ENTER.
An LLM picks your lunch, appends it as the next numbered line, and the whole list is
on your clipboard before you've reached for the mouse — ready to paste back into the
WhatsApp group.
Stateless. No account, no database, nothing to remember. · v0.2.0
…and you get the same six lines back, verbatim, with line 7 added and copied:
Real capture: one real gemini-3.1-flash-lite round trip — 777 ms of LLM time — against the running app. Not a mockup.檢視完整 README ↗Paste the warung menu, paste what your colleagues already ordered, press ENTER.
An LLM picks your lunch, appends it as the next numbered line, and the whole list is
on your clipboard before you've reached for the mouse — ready to paste back into the
WhatsApp group.
Stateless. No account, no database, nothing to remember. · v0.2.0
menu + current orders ──► POST /api/generate-order ──► Go assembles the list
(two textareas) (LLM picks the dishes) │
▼
printed ticket + clipboard.writeText()
Paste this into menu:
Menu Redi now 🥰🥰
*ADA NASI MERAH Y GUYS*
Cah kacang pjg tempe
Cah pare
…
Udang crispy telur asin
Beef Sukiyaki oseng paprika cabe iris
Ayam goreng cabe ijo
…and this into orders:
19/8
1.Ariki : Nasi, Cabe Ijo, Rolade Ayam, Nugget, Tahu Isi
…
6.kenji: Nasi 1/2 + rolade ayam+ cah kacang pjg tempe + kentang ayam cincang
…and you get the same six lines back, verbatim, with line 7 added and copied:
7. miftah : nasi 1, udang crispy telur asin, ayam goreng cabe ijo
Everything below comes out of frontend/scripts/capture-media.mjs, driving the app in
a real browser against a real backend. Three modes, one keystroke each.
The mode is inferred from which boxes have content — there is no mode switch to click.
| Mode | When | Menu | Orders | Key |
|---|---|---|---|---|
| First-touch | You're the first to order | ✅ | — | ⇧ENTER in menu |
| Normal | Others have already ordered | ✅ | ✅ | ENTER in orders |
| Nitro | No menu was shared | — | ✅ | ENTER in orders |
The station label in the header (ready → first-touch / normal / nitro) always
tells you which one is armed before you commit.
| Key | Action |
|---|---|
ENTER (in orders) | print — normal or nitro |
⇧ENTER (in menu) | print — first-touch |
Ctrl+Shift+C | print, whatever the mode, from anywhere |
ESC | clear both boxes and the ticket |
The result is written to the clipboard by the app itself, so the whole loop is
paste → ENTER → ⌘V back into WhatsApp, without a single click.
backend/internal/llm/assemble.go). Existing lines come back byte-for-byte —
the model cannot renumber, reword or drop someone's order — and the prompt stays
short enough to answer in well under a second.durationMs (server-side LLM
time). backend/e2e/ hits a running instance and prints both that and the full
client round trip.gobreaker), so a flapping LLM
endpoint fails fast instead of hanging the textarea.| Layer | Choice |
|---|---|
| Backend | Go 1.24, gorilla/mux, langchaingo, sony/gobreaker |
| Frontend | React 18, Vite 6, TypeScript 5 |
| Type | Space Grotesk + IBM Plex Mono, self-hosted via @fontsource |
| LLM | Any OpenAI-compatible endpoint — DeepSeek, OpenAI, or Gemini through Google's OpenAI-compatible URL |
| Tests | Go testing (+ e2e build tag), Playwright |
| Deploy | Vercel (two services, one project), Docker Compose, or Render |
cp .env.example .env # then fill in the LLM credentials
docker compose up -d --build
open http://localhost:5173 # backend on :8089
# backend
cd backend && cp .env.example .env && go run main.go
# frontend
cd frontend && npm install && npm run dev
vite.config.ts proxies /api to the backend; the nginx image does the same in
production via BACKEND_URL. The frontend never needs to know a backend hostname.
| Variable | Description | Default |
|---|---|---|
LLM_TYPE | Active provider: DEEPSEEK (default) or GEMINI | DEEPSEEK |
LLM_API_KEY | DeepSeek/OpenAI-compatible API key | — |
LLM_BASE_URL | DeepSeek/OpenAI-compatible base URL | — |
LLM_MODEL | DeepSeek/OpenAI model name | — |
GEMINI_LLM_API_KEY | Google AI API key (used when LLM_TYPE=GEMINI) | — |
GEMINI_MODEL | Gemini model name, e.g. gemini-3.1-flash-lite | — |
PORT | Backend port | 8080 (compose and Render set 8089) |
Set LLM_TYPE=GEMINI to route generation through Gemini — Flash Lite is noticeably
faster. It is called via Google's OpenAI-compatible endpoint, so it reuses the same
client path, the same prompt and the same circuit breaker; the base URL is a constant
in internal/config, not a variable you set.
vercel.json declares both halves of the app as services in one project — the Vite
frontend and the Go backend — pinned to sin1, with /api/* and /health rewritten
to the backend and everything else to the frontend.
vercel env pull # or push the vars for Preview + Production
vercel deploy # preview
vercel deploy --prod # production
Preview deployments inherit the Preview-scoped env vars, so a preview is a full
working app, LLM included. Verify one with vercel curl <url>/health (preview URLs
sit behind deployment protection, which vercel curl handles for you).
docker compose up -d --build # 5173 → nginx → 8089
docker compose logs -f
docker compose down
render.yaml deploys the same two units: the Go service and the nginx-served static
build, with BACKEND_URL pointing the frontend at the backend service.
cd backend && go test ./... # unit: config, prompt assembly, LLM client
./test-integration.sh # Playwright against a local dev stack
./test-docker-integration.sh # Playwright against the Docker stack
Both scripts run Playwright; they differ only in what they point at. Use the first while iterating, the second before a deploy — it validates container health and the nginx → backend hop, which local dev never exercises.
The Go e2e test hits a live /api/generate-order in nitro mode and reports both the
server-reported durationMs and the client round trip. It is behind the e2e build
tag, so go test ./... never touches the network or spends tokens.
docker compose up -d --build
cd backend
BASE_URL=http://localhost:8089 go test -tags e2e -v -count=1 ./e2e/...
-count=1 defeats Go's test cache, so each run is a fresh measurement.
Every image and GIF above is captured from the running app — real keystrokes, a real LLM round trip, no mockups. To refresh them after a UI change:
docker compose up -d --build # or npm run dev, with /api reachable
cd frontend && npm run media # BASE_URL=http://localhost:5173 by default
The script drives Playwright at 560×880, writes the five PNGs at 2× and records the
three clips, then converts them with ffmpeg (palettegen/paletteuse, so the flat
paper/ink/ember palette survives quantisation). Inputs live in
frontend/scripts/fixtures/ — swap those to re-shoot with a different menu.
Requires ffmpeg on PATH.
MIT