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.
Manage tasks and plans with Google sign-in. Set urgency, due dates, and export to Google Calendar.
ProductivityTypeScript · JavaScriptGitHub @danfour649OnlineOwner 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
Full-stack planning app — Next.js + PostgreSQL/Prisma, Google OAuth, EN/FR/Nigerian Pidgin locales. Live at plan2026.ca
Translation pending
Taken from the repository README
Loading the full README.
Read the full README ↗Personal full-stack portfolio app: Next.js App Router task and plan management with Google sign-in, PostgreSQL/Prisma data modeling, JSON export APIs, server actions, optional rich task notes, urgency levels, due dates, and Google Calendar event creation.
Production: https://plan2026.ca
/actions, a page showing urgent and upcoming tasks (urgency 6+ or due within the next three days). Overdue tasks show an alarm icon; you can edit, mark done, or add to calendar from the list./tasks page for day-to-day work:
POST /api/list-prefs, not the URL)/plans area to group tasks and track progress:
POST /api/list-prefs persistence as tasks); each row has an Edit link and a status dropdown/plans/new and edit at /plans/[id] (no modals)prisma.config.ts)packageManager in package.json; with Corepack: corepack enable)Set these in .env for local development:
DATABASE_URL - PostgreSQL connection stringAUTH_SECRET - NextAuth secret (required in production; see DEPLOY.md for secret rotation)GOOGLE_CLIENT_ID - Google OAuth client idGOOGLE_CLIENT_SECRET - Google OAuth client secretNEXTAUTH_URL - usually http://localhost:3000 locallyBLOB_READ_WRITE_TOKEN - (optional) Vercel Blob token for task file attachments; create a Blob store in the Vercel project and pull env with vercel env pullAUTH_FACEBOOK_ID - (optional) Facebook app client ID for Facebook loginAUTH_FACEBOOK_SECRET - (optional) Facebook app client secretAUTH_FACEBOOK_ENABLED - (optional) Set to true to show Facebook login (requires ID + secret). Production already has this set.This app uses PostgreSQL in every environment, including local development, local testing, and production.
pnpm install
Configure the environment variables listed above in .env, pointing DATABASE_URL at your local development or test Postgres database.
Run Prisma migrations against your local Postgres database:
pnpm exec prisma migrate dev
pnpm run dev
http://localhost:3000.The project uses Vitest for unit and integration tests. Run tests with:
pnpm test – run tests oncepnpm run test:watch – run tests in watch modepnpm run test:coverage – run tests with coverage reportpnpm run bulk:next -- <PR_NUMBER> – merge that PR, update main, check out the next open PR’s branch and merge main into it; prints what to test (see danf-skills bulk-task-pr skill and AGENTS.md).Tests live next to source files (e.g. src/lib/export.test.ts). Good candidates for unit tests:
src/lib/* – export helpers, sanitize, validations, rate limiter (no DB)src/lib/validations/task.ts and plan.tsFor React components, add @vitest-environment jsdom at the top of the test file and use React Testing Library (already installed). For API routes or server actions that hit the database, use a test database or mock Prisma. Optional: Playwright for end-to-end flows (e.g. login, create task).
A pre-push Git hook (via Husky) runs pnpm run prepush, which runs lint and typecheck only so pushes stay fast. Full pnpm run build (Prisma generate + Next.js build) runs in CI and will catch build failures. To run the same checks manually: pnpm run prepush. For a full build: pnpm run build.
If you see "Port 3000 is in use" or "Unable to acquire lock at .next/dev/lock", a previous dev server is still running. On Windows this often happens when the terminal is closed without stopping the server, or when the process doesn’t receive a shutdown signal.
pnpm run dev is running instead of closing the window.pnpm run dev:kill to kill the process on port 3000, then run pnpm run dev again.netstat -ano | findstr :3000, then taskkill /PID <pid> /F. Or use Task Manager → Details → end the node.exe process (or "End process tree" on the pnpm parent).The root route redirects to /tasks. The app shell includes Tasks, Plans, Help, and About nav links; Plans lists your plans and links to Add plan (/plans/new) and to each plan’s detail/edit page (/plans/[id]). Help (/help) shows how to use tasks and plans plus recent updates; About (/about) shows app version and contributor info.
In Google Cloud Console:
http://localhost:3000http://localhost:3000/api/auth/callback/googleThe app requests these Google scopes during sign-in:
openidemailprofilehttps://www.googleapis.com/auth/calendar.eventsGoogle sign-in forces a fresh Google consent step so revoked Calendar permissions can be granted again on reconnect.
To enable "Continue with Facebook" on the login page:
https://<your-domain>/api/auth/callback/facebook. Production lists only https://plan2026.ca/api/auth/callback/facebook (localhost is not listed; Strict mode is on).AUTH_FACEBOOK_ID, AUTH_FACEBOOK_SECRET, and AUTH_FACEBOOK_ENABLED=true in your environment. Vercel Production already has all three.public_profile and email. As of 18 October 2026, public_profile has Advanced access and email is Standard access with Verification required. The business Anthony & Omolola Enterprises is Verified.The OAuth endpoints pin Graph API v26.0 (FACEBOOK_GRAPH_VERSION in src/lib/facebook-login.ts; NextAuth v4's default still points at the retired v11.0). Data deletion instructions are at /privacy#data-deletion. An optional Data Deletion Callback is implemented at POST /api/facebook/data-deletion, with a status page at /privacy/deletion-status. Meta calls it only if that URL is set instead of the instructions URL.
Production go-live: follow GO-LIVE-FACEBOOK.md.
All API routes require an authenticated session. Responses use JSON; errors return { error: "message" } with an appropriate status code (401 Unauthorized, 400 Bad Request, 404 Not Found, 429 Too Many Requests). Rate limiting applies per user (in-memory; see TECH-1005 for production notes).
GET /api/tasks — List all tasks for the signed-in user. No pagination (returns full list). Order: completedAt desc, then createdAt desc. Response: { tasks }. Each task includes plan: { id, name } and attachments when present.POST /api/tasks — Create a task. Body: see below. Response: { task }, 201.PATCH /api/tasks/:id — Update completion. Body: { "completed": true | false }. Sets completedAt to now or null.DELETE /api/tasks/:id — Delete a task (owner only).POST /api/tasks/:id/calendar — Create a Google Calendar event for the task.POST /api/list-prefs — Persist list UI preferences for the signed-in user. JSON body: optional tasksShowCompleted and/or plansShowArchived (booleans). Sets first-party cookies used by /tasks and /plans (not server actions, to avoid an RSC refresh on every toggle).GET /api/plans — List plans (owned + shared). Paginated. Query: page (default 1), limit (default 20, max 100), showArchived=1 to include completed/abandoned. Order: priority desc, then createdAt desc. Response: { plans, total, page, limit, totalPages }. Each plan includes tasks: { id, completedAt }.POST /api/plans/cleanup-invites — Delete expired plan invites (e.g. for cron). Requires auth.POST /api/tasks body{
"title": "Book flights",
"content": "<p>Use the points portal first.</p>",
"dueAt": "2026-03-10T14:30",
"urgency": 4,
"planId": "c..."
}
Notes:
title is requiredcontent is optional rich text HTML and is sanitized before storing/renderingdueAt is optional; when present it is converted to a dateurgency is optional and defaults to 4 (1–7)planId is optional; when present the plan must exist and be owned by the userPATCH /api/tasks/:id body{
"completed": true
}
public/plan2026-logo-c.png — trimmed in GIMP to remove transparent padding (TECH-0033). If you replace it, crop tight to the artwork or the header may show extra space.Deployment instructions live in DEPLOY.md.
In short:
https://plan2026.ca/api/auth/callback/google) and Calendar API access. Before advertising a public demo, follow GO-LIVE.md (privacy URL, Vercel env, Google verification).prisma migrate deploy (using DATABASE_URL), then prisma generate and next build. Preview builds, GitHub Actions, and local pnpm run build do not migrate. See DEPLOY.md for the one-shot command that applies a pending migration to the live database.The database story is intentionally the same in every environment: PostgreSQL for local work and PostgreSQL in production.