Job Application Assistant
Keeps each job posting, draft, cover letter, PDF, and application record connected from review through submission.

Project overview · 41 seconds
From scattered application pieces to one local workflow
Job Application Assistant is a local tool for drafting and tracking job applications.
It combines a Chrome extension, a FastAPI backend, SQLite, local portfolio context, Codex draft generation, and cover-letter PDF export. The draft, source job, chosen project evidence, and application ledger stay connected.
The missing link between a role and a submission
The application workflow had too many loose pieces.
The job board had the posting. Local files had positioning and project examples. Drafts lived in a chat or text box. Cover letters had to become PDFs somewhere else. Application history was another habit to maintain. It was too easy to lose the link between the role, the claim used, the final PDF, and whether the application was already logged.
State stays local; judgment stays reviewable
Keep sensitive state local.
The extension keeps browser state in Chrome. The backend stores draft jobs and application records in SQLite. Generated PDFs live under the configured runtime directory, and generated context stays in a local cache. The README is explicit that drafting uses the locally configured Codex/OpenAI account. The app does not add analytics or job-board API calls.
Treat extraction as a contract.
Supported job pages become an OpportunitySnapshot with fields like source URL, title, company, location, description, responsibilities, requirements, skills, questions, company context, recruiter context, and extraction warnings. Missing data stays missing.
Make the draft inspectable.
The backend builds one prompt from the job snapshot plus local profile, resume, offers, and project evidence. The model has to return strict JSON, including the draft and the audit fields needed to check why a claim was used.
The side panel keeps the application in view
The main product surface is the extension side panel. The local dashboard sits behind it for the application ledger.

The contracts behind a trustworthy draft
Extension adapters for real job pages.
The extension supports Upwork, Dice, Indeed, ZipRecruiter, Robert Half, and LinkedIn page shapes. It uses platform adapters, structured selectors, Dice JobPosting JSON-LD when available, and reviewable side-panel fields before a draft starts.
A local context and drafting backend.
The backend indexes profile Markdown, offer JSON, project evidence JSON, and resume text into a ContextBundle. Draft jobs run asynchronously, persist request and result JSON, expose polling status, and record stage and Codex subprocess timing metadata.
Application tracking in the same workflow.
Application records are stored in SQLite and deduplicated by normalized source URL. The extension can check whether the current source URL already exists, and the local dashboard supports search, filters, date views, sorting, pagination, and draft links.
Cover-letter PDFs as saved artifacts.
The PDF exporter renders the saved draft text without rewriting it, derives a restrained letterhead from the configured resume PDF, omits phone-like contact items, names files by company, reveals generated files in Finder, and archives submitted cover letters when an application is logged.
Apply automation with review points.
The result-page side panel can list apply-enabled postings and open selected Dice, Indeed, and LinkedIn flows. Platform helpers can attach generated cover-letter PDFs and record confirmed applications. Unfamiliar application questions stay manual.
What shipped
Job Application Assistant connects extraction, context, drafting, artifact generation, and ledger state. It is not a black-box application agent.
The side panel handles review, drafting, PDFs, and application status.
It shows the current job snapshot, source URL, role fields, notes, draft controls, PDF actions, already-applied status, and apply-enabled posting lists.
FastAPI owns the durable parts of the workflow.
The backend provides health checks, context reindexing, draft jobs, draft lookup, application lookup, dashboard, and PDF endpoints. SQLite stores jobs, drafts, timing metadata, and application records.
Drafts come back with reasons attached.
Each Codex response includes the applicant-facing answer plus the angle, role classification, strategy, selected and rejected projects, decisions, claims, caused_by references, and warnings.
The prompt gets structured fields instead of page-wide guesses.
The opportunity model rejects unknown fields and removes obsolete freeform fields before prompt construction. Extraction tests also block broad weak-inference patterns.
The repo checks both Python and extension code.
The check script runs mypy, pytest, JavaScript syntax checks for extension files, JSON validation for the manifest and response schema, and git whitespace checks.
A draft that remains tied to its evidence
The useful part is not that the system can write a cover letter.
Every draft stays tied to the job snapshot and allowed portfolio evidence. Each application can be checked against the ledger, and each generated PDF remains part of the same local workflow.
Public repo
The project is open source, including the Chrome extension, FastAPI backend, SQLite stores, response schema, and Python and extension tests.
View GitHub repo →
Tell me what your team needs to ship.
Start with the feature, integration, or system that's stuck. We'll work out whether a project or a monthly contract fits.