NodeDesk planning and issue tracking
Find a file
Mark Whaite 3e136a31a4
All checks were successful
CI / Lint (push) Successful in 2m12s
CI / Type check (push) Successful in 1m26s
CI / Unit tests (Node 20) (push) Successful in 2m1s
CI / Unit tests (Node 22) (push) Successful in 1m26s
E2E / e2e (push) Successful in 5m2s
CI / Integration (push) Successful in 1m32s
CI / Coverage (push) Successful in 2m7s
CI / Build (push) Successful in 1m44s
test(#60): un-quarantine attachments.spec.ts after #51 wiring landed
NoteAttachments is now imported and rendered by both /app/notes/[id]
(commit d55868c fix(#61)) and /app/notes/[id]/edit (commit 9cc0c75 fix(#51)),
so the heading 'Attachments' and the file input asserted by this spec
actually render on the edit page. Closes Mark/nodedesk#60.
2026-09-18 16:04:09 -07:00
.forgejo/workflows fix(#55): bump e2e container to playwright:v1.60.0-jammy to match @playwright/test 2026-08-14 09:30:34 -07:00
.gitea Merge pull request 'ci(#58): verify green workflows, add CI-green item to PR template' (#59) from ci/verify-green-workflows into main 2026-08-14 00:00:11 +00:00
.github/workflows ci(#58): drop dummy STRIPE_* env from workflows — breaks isStripeConfigured unit test 2026-08-10 21:50:39 -07:00
.sisyphus gsd: pre-implementation lint/format cleanup 2026-05-15 23:52:12 -07:00
bench fix(#57): CLI --mode wins over SEARCH_MODE env; reject conflicting modes 2026-08-12 19:42:22 -07:00
docs fix(#55): cap e2e job timeout, document post-merge run evidence 2026-08-13 20:53:03 -07:00
init-db chore: CI workflow updates, docker improvements, search fix, add init-db 2026-05-10 07:08:43 -07:00
prisma fix(#56): FTS migration fresh-DB abort; legacy .gitea workflow SHAs; drop .eslintignore 2026-08-10 22:15:24 -07:00
public/screens Initial commit: NodeDesk codebase 2026-03-03 15:59:42 -08:00
screenshots Initial commit: NodeDesk codebase 2026-03-03 15:59:42 -08:00
scripts test(#37): ci smoke runs on its own port and owns Next lifecycle 2026-07-30 23:20:40 -07:00
src fix(#61): wire NoteAttachments into note view page (#51 acceptance criteria) 2026-09-18 16:04:09 -07:00
tests test(#60): un-quarantine attachments.spec.ts after #51 wiring landed 2026-09-18 16:04:09 -07:00
.dockerignore chore: CI workflow updates, docker improvements, search fix, add init-db 2026-05-10 07:08:43 -07:00
.env.example fix #1 #5 #6 #7: EPIC A platform hardening — ND-001/002/003 2026-07-14 18:36:17 -07:00
.gitignore ci(#38): matrix quality-gate workflow with npm caching, junit + build artifacts 2026-07-30 23:31:04 -07:00
.semgrepignore gsd: pre-implementation lint/format cleanup 2026-05-16 18:36:39 -07:00
AGENT_QUICKSTART.md gsd: pre-implementation lint/format cleanup 2026-05-15 23:52:12 -07:00
CHANGELOG.md gsd: pre-implementation lint/format cleanup 2026-05-15 23:52:12 -07:00
CONTRIBUTING.md gsd: pre-implementation lint/format cleanup 2026-05-15 23:52:12 -07:00
docker-compose.yml gsd: pre-implementation lint/format cleanup 2026-05-15 23:52:12 -07:00
Dockerfile chore: CI workflow updates, docker improvements, search fix, add init-db 2026-05-10 07:08:43 -07:00
eslint.config.mjs test(#38): backfill unit tests for attachment routes, guard, and env modules 2026-08-04 19:36:49 -07:00
lefthook.yml test(#38): broaden skip-hook wrappers to accept vitest's (name, fn) signature 2026-07-30 23:03:09 -07:00
next-env.d.ts gsd: pre-implementation lint/format cleanup 2026-05-16 19:43:08 -07:00
next.config.mjs fix #26: [Security] HIGH: 9 critical/high dependency vulns 2026-05-19 01:39:00 -07:00
package-lock.json test(#38): backfill unit tests for attachment routes, guard, and env modules 2026-07-31 12:49:41 -07:00
package.json fix(#52): un-quarantine settings e2e — 30s redirect budget, explicit waits, server warmup 2026-08-09 11:15:46 -07:00
playwright.config.ts ci(#37): add test metadata and reporting config 2026-07-30 23:06:48 -07:00
postcss.config.mjs fix #26: [Security] HIGH: 9 critical/high dependency vulns 2026-05-19 01:39:00 -07:00
README.md ND-007: Three-tier FTS search strategy with tests and docs 2026-07-16 08:28:22 -07:00
SECURITY.md gsd: pre-implementation lint/format cleanup 2026-05-15 23:52:12 -07:00
start.sh Initial commit: NodeDesk codebase 2026-03-03 15:59:42 -08:00
tailwind.config.ts Initial commit: NodeDesk codebase 2026-03-03 15:59:42 -08:00
TESTING.md docs(testing): document pre-push e2e prerequisite that blocks git push (#55) 2026-08-13 21:03:17 -07:00
tsconfig.json gsd: pre-implementation lint/format cleanup 2026-05-16 19:43:08 -07:00
vercel.json gsd: pre-implementation lint/format cleanup 2026-05-15 23:52:12 -07:00
vitest.config.ts ci(#50): wire coverage reporting and threshold gate 2026-08-04 19:36:49 -07:00
wait-for-it.sh Initial commit: NodeDesk codebase 2026-03-03 15:59:42 -08:00

NodeDesk (MVP v0.1)

NodeDesk is a single-user "solo tech operating system" for tracking clients, systems, notes, and lightweight work logs (for billing summaries — not invoicing).

Stack

  • Next.js (App Router) + TypeScript
  • TailwindCSS
  • Postgres + Prisma
  • Auth: email/password (cookie session)
  • Email (optional magic link): Resend
  • Email verification (optional feature flag)
  • Payments: Stripe Checkout + Customer Portal + Webhooks

Local setup (Docker)

1) Requirements

  • Docker
  • Docker Compose

2) Configure env

Copy .env.example to .env and fill values. At minimum:

  • APP_URL=http://localhost:3000
  • AUTH_SECRET (min 32 chars)

3) Run

docker compose up -d

This starts:

  • db: Postgres on port 5432
  • minio: S3-compatible storage on port 9000 (console on 9001)
  • app: Next.js on port 3000

4) Stripe webhooks (local)

Use the Stripe CLI:

stripe login
stripe listen --forward-to http://localhost:3000/api/stripe/webhook

Copy the printed signing secret into STRIPE_WEBHOOK_SECRET.

Scripts

  • npm run dev – dev server
  • npm run build – production build
  • npm run start – production server
  • npm run lint – lint
  • npm run prisma:migrate – run migrations
  • npm run seed – seed demo data (customizable via SEED_EMAIL, SEED_PASSWORD env vars)
  • npm run reset – reset all user data (optionally scoped to one user via --email)
  • npm run demo-seed – seed demo data using default demo credentials
  • npm run demo-reset – reset demo user data to baseline
  • npm run test:e2e – Playwright tests

Demo Mode

The demo workflow is designed for onboarding and sales scenarios. It creates a rich, realistic dataset covering multiple clients, locations, systems, contacts, notes, work logs, and tags — all linked to a single demo user.

Quick start

# Reset demo user (clears all data for demo@nodedesk.local)
npm run demo-reset

# Seed fresh demo data
npm run demo-seed

Full workflow (any user)

# Reset data for a specific user, then re-seed
npm run reset -- --email user@example.com
npm run seed

Demo credentials

Env var Default Description
SEED_EMAIL demo@nodedesk.local Demo user email
SEED_PASSWORD password123! Demo user password

What gets created

The seed script provisions a full demo environment:

Resource Count Details
Users 1 demo@nodedesk.local with active subscription
Tags 5 critical, monthly-maintenance, vip-client, compliance, hipaa
Clients 3 Acme Corp (active), Smith & Associates Law (active), Greenfield Medical (active)
Locations 4 Across all clients (Main Office + Warehouse for Acme, one each for others)
Systems 17 Servers, workstations, network switches, printers, kiosks — with real hostnames and IPs
Contacts 5 IT directors, office managers, practice owners with email/phone
Notes 7 Infrastructure docs, compliance notes, backup schedules
Work logs 12 Realistic billable and non-billable entries with durations

Each system has realistic attributes (hostnames, IPs, OS versions, models, serials). Critical infrastructure (servers) is tagged. Work logs include detailed descriptions of completed work.

Documentation