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
- Add — paste a job link on its own, or enter the company and role manually
- Work the pipeline — three independent steps per job: get a referral, tailor your resume, apply
- Track — a Kanban board (To Apply → In Progress → Applied) keeps every opportunity in view
- Today — one prioritized nudge per day so you always know what to work on next
- 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
| 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.
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| 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) |
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)/
├── 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