What I Applied
A personal applicant-tracking and AI-assisted career prep web app: one profile, one record per application, and grounded, job-description-specific drafts without replacing your judgment.
Pipeline chaos for one job seeker
Job seekers juggle many employers, different job descriptions, and interview stages across spreadsheets, notes, and email. That leads to:
- Lost context — weeks later it is hard to recall what you applied for or where the posting's JD lives.
- Weak reuse — each application restarts cover letter and prep instead of reusing a structured profile.
- Forgotten follow-ups — opportunities go cold without a simple signal to nudge a recruiter.
Corporate ATS products are built for hiring teams, not for a single candidate managing their own pipeline. I wanted a small, honest workspace: one profile, one place per application, and AI only where it speeds up grounded, JD-specific prep.
System of record + selective AI
Signed-in users can:
- Maintain a master profile — structured experience, education, skills, and an "About me" narrative; optional PDF-assisted extraction (text only — the file is not stored).
- Log each application — company (deduplicated by name), role, posting URL, full job description, and high-level status.
- Track a per-job pipeline — stages (type, format, schedule, notes, links, status) as a lightweight timeline.
- Generate tailored assets per job — one Gemini call produces a cover letter, elevator pitch, anticipated interview questions (with reasoning), and strategic focus points, validated against a strict schema and stored on the job.
- Get operational nudges — jobs with no activity for seven days surface a non-AI follow-up email template (copy to clipboard); terminal outcomes (offer, rejected, withdrawn) turn reminders off while still allowing copy-friendly outreach for active statuses.
Authentication is email and password (bcrypt, NextAuth JWT). Data is scoped per user in PostgreSQL.
Impact (qualitative)
This is a personal portfolio build rather than a shipped product with analytics. The value is in day-to-day clarity and discipline.
Clarity & velocity
One system of record for what you applied for and what each role asked. Parsing plus structured save reduces retyping; one-shot AI generation cuts time to a first draft of role-specific materials.
Discipline & cost awareness
Stale-job reminders and a static follow-up template encourage consistent outreach without building a mailer. The free-tier product choice limits successful AI regeneration to once per job in the UI so Gemini usage stays predictable; retry remains available when generation fails.
Features
Product surface
- Landing page for visitors; signed-in users land on the dashboard.
- Register and login with protected routes (Next.js proxy).
- Dashboard snapshot counts and shortcuts.
- Applications CRUD with company match-or-create by name.
- Job detail: inline edit of title, URL, description, status; pipeline stage CRUD; stage updates bump job
updatedAtfor reminder logic.
Profile, AI, and ops
- Resume editor: load and save profile; PDF upload to parse API, human-in-the-loop edit, transactional save.
- Personal information: read-only review of stored profile.
- AI career coach: generate policy (first successful generation per job on free tier), static cover-letter fallback when AI fails.
- Follow-up helper: template email text plus clipboard; terminal statuses suppress the 7-day reminder.
- Responsive UI: mobile-friendly navigation and layouts.
Engineering spotlight
01. Grounded AI with guardrails
Google Gemini is called server-side with a JSON MIME type and retries for transient errors. Outputs are validated with Zod against a strict schema before persistence so bad generations never corrupt the job record; the UI can fall back to a static template when the model path fails.
02. Privacy-minded resume intake
pdf-parse extracts text only for optional profile bootstrapping; the binary is not stored. Profile updates use a transactional replace of resume-related rows plus aboutMe so partial writes do not leave the profile half-migrated.
Tech stack
Full-stack TypeScript on Next.js App Router, with PostgreSQL as the source of truth and validation at API and AI boundaries.
Framework: Next.js (App Router), React · Language: TypeScript
Database: PostgreSQL (e.g. Neon) · ORM: Prisma 7 with Neon serverless adapter
Auth: NextAuth.js (credentials, JWT sessions, bcryptjs)
Validation: Zod (API bodies, AI JSON, resume shapes)
AI: Google Gemini (@google/genai)
PDF: pdf-parse (text extraction) · Styling: Tailwind CSS 4
Future roadmap
Server-enforced generation limits
Block duplicate successful POST /api/generate per job (today the UI hides regenerate; the API could return 409 when an asset already exists).
Paid tier
Regenerate assets, optional email send, or higher quotas.
Richer pipeline
Attachments, interviewer names, reminders (email or push) integrated with calendar.
OAuth and export
Google or LinkedIn sign-in alongside credentials; PDF or Markdown export of applications and AI assets.
Analytics, accessibility, i18n
Personal funnel stats (applied to interview to offer); deeper a11y audit and localized templates.