Ian Greenough

Founding Product Engineer
← Back to projects

Job Tracker AI

API Usage

Terminal — API Usage
POST /auth/registerRegister a new user account
$curl -X POST http://localhost:3000/auth/register -H "Content-Type: application/json" -H "X-Requested-With: curl" -d '{"email":"user@example.com","password":"securepass123"}'
POST /auth/loginLog in and receive session cookie
$curl -X POST http://localhost:3000/auth/login -H "Content-Type: application/json" -H "X-Requested-With: curl" -c cookies.txt -d '{"email":"user@example.com","password":"securepass123"}'
POST /jobsAdd a job with raw description for AI extraction
$curl -X POST http://localhost:3000/jobs -H "Content-Type: application/json" -H "X-Requested-With: curl" -b cookies.txt -d '{"rawDescription":"Senior React Engineer at Acme Corp. NYC. $180-220k. Requirements: 5+ years React, TypeScript, GraphQL."}'
GET /jobsList all tracked jobs with AI-extracted data and fit scores
$curl http://localhost:3000/jobs -H "X-Requested-With: curl" -b cookies.txt
GET /healthCheck API and database health
$curl http://localhost:3000/health

I built this as an API-first job application management system that leverages Claude to automatically extract structured data from raw job descriptions. Paste in a job posting and the AI extracts the title, company, location, requirements, tech stack, and salary range, validated against a Zod schema with automatic retry logic.

The system also scores how well each job fits against a stored resume profile, producing a 0 to 100 fit score with an explanation. Analyzed descriptions are cached in-memory using SHA-256 hashing to avoid reprocessing duplicates.

As an API-only project, it demonstrates backend architecture patterns: Express 5 with TypeScript, PostgreSQL with node-pg-migrate, cookie-based session auth with bcrypt, CSRF protection, rate limiting, structured logging with Pino, and comprehensive integration tests with Vitest.

Technologies Used

TypeScriptExpressPostgreSQLClaude APIZodVitestPinobcrypt