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.
Shared shopping list app
Translation pending
ProductivityJavaScript · CSSGitHub @g59dtjys8y-cmdOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
No updates detected yet. GitHub releases will appear here.
Owners of public repositories under a personal GitHub account can sign in to verify ownership and manage the introduction themselves. No administrator approval is needed.
Sign in, generate a verification file, and commit it to this repository’s default branch within 30 minutes. Files on other branches or forks do not count. Then check the file below to manage the project without administrator approval. Keep the file to retain your access.
If needed, you will go to sign-in. After signing in, return here and press your chosen verification button again.
Run /nomorevibe verify in your project folder to verify ownership and manage the introduction yourself.
Verify in one minuteAsk about other verification options
Loading the full README. The saved excerpt is shown below.
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.Read the full 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.