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,即可驗證所有權並自行管理介紹。
一分鐘完成驗證正在載入完整 README。 以下為已儲存的摘錄。
A shared household shopping list. No accounts, no sign-up — one person creates a list, everyone else opens the link and lands straight on the live, shared list.檢視完整 README ↗A shared household shopping list. No accounts, no sign-up — one person creates a list, everyone else opens the link and lands straight on the live, shared list.
Anyone who joins via a share link and uses the list is offered a one-tap "start your own house's list", seeded with the aisle order they just learned.
Recipe apps can add ingredients straight onto a list, given its share link — see External API below.
node:sqlite module, which needs it)npm install (see Architecture notes for what actually gets installed)cd client && npm install
cd ../server && npm install # no-op today — the server has zero npm dependencies
cd ..
node dev.js
Then open http://localhost:8787.
Want your family actually using it? See DEPLOY.md for how to put it on a real URL.
node dev.js runs two things together: an esbuild watcher that rebuilds the client bundle on save, and the Node server (REST + WebSocket + static file serving) on port 8787. Open the same URL in a second tab (or a private window, to get a separate identity) to see the live sync in action.
client/build.js) instead of Vite, and a small hand-rolled pushState router (client/src/router.jsx) instead of react-router-dom. Plain CSS custom properties for design tokens (client/src/styles/tokens.css) — no CSS framework, the palette is small and exact.node:http for the server, node:sqlite (DatabaseSync) for storage, and a small hand-rolled WebSocket implementation (server/wsServer.js) instead of Express/ws. Zero npm dependencies.client/src/lib/qrcode.js, ISO/IEC 18004, versions 1–6, level M) instead of the qrcode package.@dnd-kit.These were built as hand-rolled equivalents to the originally specified stack (Vite, Express, ws, better-sqlite3, react-router-dom, @dnd-kit/core, qrcode, vite-plugin-pwa) because the environment this app was first built in had no npm registry access. They're tested and working as they are — there's no requirement to change them. If you'd rather use the original packages, it's a mechanical swap: the component and route logic doesn't depend on which implementation sits underneath.
Each list is a "room" identified by a short slug in its URL (e.g. /r/8fk3q2) — the slug is the only thing gating access, there's no login. Joining asks for a display name only, stored per device in localStorage, and assigns a colour (starting from the app's two base person colours, extending by rotating hue for a third or later person). Room state — items, people, and saved aisle layouts — lives server-side in SQLite and is broadcast to everyone connected to that room over WebSocket.
POST /api/rooms/:slug/items lets an external app add items to a list without an open WebSocket connection — this is what Posh Nosh (a recipe app by the same author) uses for its "add ingredients to shopping list" feature, given a room's share link.
POST /api/rooms/8fk3q2/items
Content-Type: application/json
{ "items": [{ "name": "2 cups flour" }, { "name": "200g chicken breast" }], "source": "Posh Nosh" }
items — required, up to 100 per call. Each needs name (a free-text string, used as-is); qty (integer, defaults to 1) and aisleKey (one of the seven keys in server/aisles.js) are optional — an omitted or invalid aisleKey is guessed from the item name via a keyword heuristic (guessAisleKey), falling back to cupboard.source — optional, up to 40 characters, shown in the "X added Y" toast to everyone with the list open (defaults to "Posh Nosh" since that's the only caller today).201 with { "added": [{ id, name, qty, aisleKey }, ...] } (empty items are silently dropped, so this can be shorter than the request).add_item message, so anyone with the list open sees them appear immediately — no polling needed on the caller's end.Access-Control-Allow-Origin: *) on all /api/* routes — a room's slug is its only access control (same trust model as the share link itself), and there's no auth token to leak.Accounts and profiles, prices or spend tracking, meal planning, chores, calendars, and any advertising beyond the one designed offer banner.