A job application tracker for Indonesian job seekers. Free, no ads, self-hosted, built for the reality of juggling 30–80 live applications at once.

Timeline: July – August 2026
Tracking Lamaran (Job Tracker) is a job application tracker built for Indonesian job seekers who are juggling dozens of applications at once. An active job seeker can have 30–80 live applications, each with its own stage, schedule, contacts, and CV version. A spreadsheet holds some of that, but it doesn't remind you, doesn't store your documents, and doesn't calculate anything.
Live in production at trackinglamaran.site. Google sign-in, MySQL/MariaDB storage, document uploads via Cloudflare R2, and email delivery via Resend are all shipped and in active use, not a demo with sample data.

Job hunting is a long process with many branches, and without a system, specific things go wrong in predictable ways:
A spreadsheet solves part of this. It does not remind, does not store documents, and does not compute anything on its own.
North star metric: the number of users who mark one application as "Accepted," not signups, not applications logged. If nobody gets hired, this is just a polished notebook.

| Layer | Choice |
|---|---|
| Frontend | TypeScript, React 19, Vite, Tailwind CSS |
| Backend | Node.js + Express 5, one process serving /api/* and the built frontend |
| Database | MySQL or MariaDB via Drizzle ORM |
| Auth | Google Identity Services → signed session cookie |
| Files | Cloudflare R2 via presigned URLs |
| Resend |
Six server runtime dependencies in total: express, cookie-parser, drizzle-orm, mysql2, aws4fetch, zod. No framework beyond React, no Docker, no queue.
Development runs against MySQL 8; the deployed instance runs MariaDB 11.8, since that's what shared hosting provides, and the schema and every migration apply unchanged on both. The server runs TypeScript through Node's own type stripping rather than a build step, which sets the real floor at Node 22.6+.
Rather than a wall of counters, the statistics view is built around one question a job seeker actually asks: where in the funnel am I losing?

It breaks the funnel down stage by stage (applied → screening → HR interview → user interview → technical test → offer → accepted), tracks average response time from application to first reply, and surfaces which companies and job sources actually respond: the exact data a spreadsheet never computes on its own.
The contents of this app are a list of companies someone is applying to, often while still employed elsewhere. That makes it sensitive personal data by default: