Job Ad Ingestion & Resume Builder
A multistage workflow that takes browser-captured job adverts through validated intake, a PostgreSQL queue, evidence-grounded generation, and private Word-document storage.
View on GitHubProblem & context
Tailoring a resume requires moving job-ad data through several stages without losing the source, changing career facts, or repeating expensive work after a failure.
My contribution
I built the Python ingestion API, JSON importer, durable job queue, generation worker, and document-rendering pipeline. Browser capture is a separate stage; this service starts at structured job intake.
Workflow
Capture job advert
Separate Chrome extension
Validate and import JSON
HTTP inbox or watched directory
Queue job in PostgreSQL
Deduplication and input revisions
Generate tailored content
Career evidence and structured output
Save generation checkpoint
Resume work after interruption
Render Word documents
Resume and cover letter, in memory
Upload private artifacts
Supabase Storage
Technology
- Python
- FastAPI
- PostgreSQL
- Pydantic
- OpenAI-compatible API
- Word document templates
- Supabase Storage
- Docker Compose
- GitHub Actions
Key design decisions
Separate capture from processing
The browser extension owns job-ad capture. The builder accepts schema-version-2 JSON through HTTP or a watched directory, validates each record, and preserves source snapshots separately from normalised deduplication hashes.
Generate prose, not career facts
Version-controlled career evidence anchors the generation step. The model produces tailored variable content with source citations, while fixed facts and document layout remain controlled by the application.
Checkpoint before rendering and upload
PostgreSQL stores job state and generated JSON. Execution leases, bounded attempts, and durable checkpoints let workers resume rendering or uploading without automatically repeating a completed generation step.
Keep workflow state and artifacts separate
PostgreSQL is the workflow database; Supabase is private artifact storage. Resume and cover-letter documents are rendered in memory and uploaded rather than saved to a local final-output folder.
Capabilities & limitations
Implemented
- Validated JSON intake with idempotent imports and changed-content revisions
- Durable PostgreSQL jobs with execution leases and bounded retry attempts
- Evidence-grounded structured generation with a mock provider for testing
- Resumable Word-document rendering and private Supabase uploads
- Authenticated operator APIs, including regeneration requests
Limitations
- No PDF export, browser review UI, or signed download links yet
- CSV ingestion is not implemented; browser JSON exports are the supported handoff
- Example career evidence is fictional; live use requires verified evidence and provider configuration
- Generated documents need human review before submission
Have a workflow worth automating?
I'm interested in AI-focused roles and conversations about building useful, practical agentic AI systems.