a peer support platform for the hard days. not therapy, not a wellness app. just a place to be heard.
nook is a small platform for young adults going through hard moments β anxiety, overwhelm, loneliness, the kind of bad day where talking to a therapist feels like too much but scrolling Instagram feels like too little.
it's built around the idea that being heard is enough sometimes. you check in with how you feel, and from there you can vent, listen to someone else, write privately in a journal nobody reads, or just sit quiet in a small group of people having the same kind of day.
no streaks. no mood graphs from 1 to 10. no coach voice telling you to "elevate your journey". just a space.
- not a therapy replacement β if you're in crisis, please reach out to CVV (188) or a mental health professional.
- not a meditation app β no breathing exercises with whale sounds.
- not a social network β no feed, no likes, no follower count.
- not a diary app β diary is one feature, not the whole product.
- not for sale β see the License section.
frontend Next.js 15 Β· React 19 Β· TypeScript 5.9 Β· Tailwind CSS
backend NestJS 10 Β· Prisma 6 Β· Zod 4 Β· Node 22
data & infra Supabase (Postgres + Auth + Realtime + Storage) Β· Redis Β· BullMQ (background jobs)
tooling pnpm workspaces Β· Turborepo Β· ESLint 9 (flat config) Β· Prettier 3
monorepo organized by responsibility:
nook/
βββ apps/
β βββ api/ # NestJS backend (REST API)
β βββ web/ # Next.js frontend (App Router) β coming soon
βββ packages/
β βββ config/ # shared tsconfig, eslint, prettier
β βββ database/ # Prisma schema + generated client
β βββ shared/ # cross-app types and Zod schemas
βββ pnpm-workspace.yaml
βββ turbo.json
a few decisions worth mentioning:
- Supabase Auth owns
auth.users. NestJS syncs topublic.userson first login (explicit, not a hidden trigger). - RLS everywhere β Postgres Row Level Security on every table. backend
connects with a limited role (
nook_app) and setsapp.current_user_idper transaction. - diary stays private β strict RLS, never logged, admin access requires a documented reason and is audited.
- realtime via Supabase β frontend subscribes directly to channels with a JWT, no need to push everything through the backend.
this is a personal project, very much in progress. building in the open because i learn better that way.
- database schema (29 tables, 18 enums, RLS, seeds)
- monorepo setup (pnpm + Turbo + TS strict)
- shared types and Zod schemas
- API scaffolding (NestJS, health check)
- linting & formatting (ESLint 9 flat + Prettier)
- Prisma client generation
- typed config layer (Zod-validated env vars, fail-fast on boot)
- Prisma wired into NestJS (lifecycle hooks, DB-aware health check)
- auth module (Supabase JWT verification + user sync)
- check-in flow (the entry point of the product)
- vent / listen module
- private diary
- small circles
- moderation tools
- frontend (Next.js)
β οΈ not ready yet. when it is, this section will tell you how.
requirements (for when the time comes):
- Node.js 22+
- pnpm 10+
- a Supabase project (free tier works)
- Redis (local or Upstash)
short version: you can read the code, learn from it, fork it, contribute, run it for personal/educational use. you cannot use it commercially or build a paid product on top of it. this is a personal non-profit project and i'd like to keep it that way.
built by Gabriel β 16, full-stack dev at PicPay, learning in public.
if you want to talk about the project, mental health tech in general, or anything really, my contacts are on my profile.