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.