- Rust 56.2%
- TypeScript 40.7%
- CSS 2.5%
- Dockerfile 0.3%
- JavaScript 0.2%
| Filename | Latest commit message | Latest commit date |
|---|---|---|
Public repo had no README at all. This covers the stack, the module layout, and the four decisions in docs/adr that actually shaped the schema: multi-tenancy from migration 0001, best-effort ATS ingestion with a manual fallback, per-user analytics only, and the shareable resume link as the single cross-boundary surface. |
||
| backend | ||
| docs | ||
| frontend | ||
| .gitignore | ||
| AGENTS.md | ||
| CONTACTS_FEATURE.md | ||
| CONTEXT.md | ||
| docker-compose.yml | ||
| FAVICON_FEATURE.md | ||
| FEATURES_STATUS.md | ||
| IMPLEMENTATION_COMPLETE.md | ||
| IMPLEMENTATION_SUMMARY.md | ||
| LICENSE | ||
| POSTINGS_REMOVAL.md | ||
| README.md | ||
JobApp
A multi-user job-application tracker. Track postings, companies, contacts, and applications in one place; generate versioned résumés; ingest postings from ATS URLs; and see where each application stands.
The problem it exists to solve is that a job search is a pipeline, and most tools treat it as a list. Every posting is a different company, the résumé changes between them, and six weeks later nobody can remember which version was sent where.
Stack
- Backend — Rust with Axum, PostgreSQL through SQLx
- Frontend — React + TypeScript SPA, built with Vite
- Packaging — Docker Compose for Postgres, backend, and the dev server
Layout
backend/
migrations/ ten SQLx migrations, from tenants through attachments
src/
applications/ the core pipeline
ats/ pluggable adapters for ingesting posting URLs
resume/ generation, versioning, rendering
sharing/ shareable résumé links
analytics/ per-user statistics
contacts/ company contacts and their link to an application
attachments/ file upload, archive, and retrieval
search/ search across the user's data
nudges/ follow-up reminders
backend/src/auth/ authentication
frontend/ React SPA
docs/adr/ architecture decision records
Decisions worth reading about
docs/adr/ records the reasoning, and these are the ones that shaped the
schema:
- Multi-tenant by design, single-instance deployable. Every entity is tenant-scoped from migration 0001 rather than added later, so there is no table where a missing scope filter leaks one user's data into another's.
- Pluggable ATS adapters, best-effort parsing with manual fallback. Every job board structures postings differently and will change without warning, so ingestion is explicitly allowed to fail into a manual-entry path rather than being the only route in.
- Per-user analytics only. Cross-user insight is deferred until there is a reason for it, which is also the reason the tables are not built for it yet.
- The shareable résumé link is the only cross-boundary surface. Sharing is a deliberate, narrow, read-only exposure rather than a general sharing mechanism, which keeps the auth model simple.
Résumés and ATS grading
Résumés are versioned per application rather than stored as one current document, so a submission can be reconstructed exactly as it was sent. The ATS grader scores a résumé against a posting so the mismatch is visible before sending, not after an automated screen rejects it.
Status
Actively developed. The backend is implemented and tested; the frontend is
being built out alongside it. FEATURES_STATUS.md tracks what is done and
CONTEXT.md is the domain glossary.
docker compose up
The product spec is in docs/prd/jobapp-prd.md.