Skip to content

Repository files navigation

Nudge

A personal job-application tracker for people who struggle to act on opportunities. Add a job with the company, role, and a link, and Nudge tracks it through three steps — get a referral, tailor your resume, apply — so you always know what's left to do and what's still pending. A daily push notification nudges you back to whatever needs action today, so nothing quietly dies in a forgotten tab.

This is one shared job-search workspace — it's not built for signups. There's no login: anyone with the deployed URL sees and updates the same progress.

Live at nudge.reetbatra.com


What it does

  1. Add — paste a job link on its own, or enter the company and role manually
  2. Work the pipeline — three independent steps per job: get a referral, tailor your resume, apply
  3. Track — a Kanban board (To Apply → In Progress → Applied) keeps every opportunity in view
  4. Today — one prioritized nudge per day so you always know what to work on next
  5. Daily nudge — a Vercel Cron job sends a push notification with today's nudge and any overdue follow-ups every morning, so you don't have to remember to check the board

Stack

Layer Tech
Frontend React 19 + Vite 7 + Tailwind CSS v4
Backend Express 5 (Node.js 20)
Database PostgreSQL via Neon + Drizzle ORM
Notifications Web Push (VAPID) for the daily nudge
Deployment Vercel (frontend static + API serverless + cron)

Monorepo managed with pnpm workspaces.

Local development

Prerequisites: Node.js 20+, pnpm

# Install
pnpm install

# Set up env (fill in the blanks)
cp .env.example .env

# Start API server (port 5000)
pnpm --filter @workspace/api-server run dev

# Start frontend (port from .env)
pnpm --filter @workspace/nudge run dev

Environment variables

Variable Description
PORT API server port (default 5000)
BASE_PATH Vite base URL (default /)
DATABASE_URL Neon Postgres connection string
VAPID_PUBLIC_KEY / VAPID_PRIVATE_KEY / VAPID_SUBJECT Web Push credentials for the daily nudge notification
CRON_SECRET Shared secret Vercel Cron sends as Authorization: Bearer — required for /api/cron/daily-nudge to run
NUDGE_SESSION_ID Optional — pins the daily nudge to one browser session's jobs instead of all non-demo jobs
NUDGE_APP_URL Optional — base URL used for links in the daily nudge notification (default https://nudge.reetbatra.com)
LOG_LEVEL Pino log level (default info)

Useful commands

pnpm run typecheck                          # Full TypeScript check across all packages
pnpm run build                              # Typecheck + build all packages
pnpm --filter @workspace/db run push        # Push DB schema changes (dev only)

Architecture

/
├── api/                    # Vercel serverless entry point
├── artifacts/
│   ├── api-server/         # Express API (jobs, sessions, daily nudge cron)
│   └── nudge/              # React frontend
└── lib/
    ├── api-client-react/   # Auto-generated React Query hooks
    ├── api-spec/           # OpenAPI spec (source of truth)
    ├── api-zod/            # Auto-generated Zod schemas
    └── db/                 # Drizzle schema + migrations

Built by Reet Batra

About

Job-application tracker for people who struggle to act on opportunities. Three-step pipeline per role (referral, tailor resume, apply), a Kanban board, and one prioritized push nudge every morning. Single-user by design, no signup.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages