Self-hosted job search infrastructure: AI triages thousands of listings down to a handful, generates tailored materials for the ones worth applying to, and learns from every rejection.
Notice (October 2026). findajob is in a top-to-bottom audit while its maintenance moves to an automated work queue. Until the audit completes, documentation and behaviour may change or break between releases. Issues and pull requests are still welcome; see CONTRIBUTING.md.
The modern job search grinds people down — hundreds of listings per day, most irrelevant; the same cover letter rewritten at midnight; black-hole rejections that tell you nothing about whether you targeted wrong, wrote wrong, or got unlucky. findajob absorbs the triage, the tailoring, and the tracking so your attention goes to the few applications actually worth sending.
Pre-1.0 means active development.
Who this is for. findajob is maintained for operators who are comfortable with Docker, a terminal, git and SQLite, and who run it for themselves or on behalf of other people. It is not optimized for a non-technical job seeker installing it alone, and the documentation assumes those skills (Decision 37). Where the project stands, what is next and the rules every change follows: docs/status.md.
Fictional demo data — a cross-discipline candidate's program, operations, and customer-facing roles. The same pipeline works for every field; only your candidate profile changes.
- Cuts the noise so you can focus. Every morning it pulls hundreds of fresh listings, scores each one against your background, and surfaces only the handful worth your attention. Most job tools track what you applied to; this one finds the few worth applying to.
- Writes the application for you to finish. Flag a job and findajob researches the company and drafts a briefing; approve it and a second pass produces the full package — a tailored resume, a cover letter, and outreach drafts that name real contacts from your network.
- Learns from every rejection. Each job that doesn't pan out gets tagged with a reason — Skills Mismatch, Geography, Compensation — and those reasons train the next day's scoring. No other job tool closes that loop.
- Works for any field. It works for a social worker, teacher, accountant, software engineer, or trades professional alike. Only your profile changes.
Example: thirty days on one instance:
Listings ingested 8,393 ── 30-day window
Worth a look (AI-scored) 187 2.2%
Entered the prep pipeline 93 50% of those
Applications submitted 59 63% of prepped
Interviews from those 59 apps 13 22%
8,393 listings narrowed to 59 applications — and 13 interviews — in a month. Interview rates are unpredictable; what the system does is shrink the application volume you need to get them.
- An OpenRouter account (required) — funds every AI call findajob makes. Pay-as-you-go, starting from $0. Add at least $10 of credit before you begin (that covers the onboarding interview); $20–30 covers a typical first month.
- A RapidAPI account (optional) — adds LinkedIn and Indeed listings to the mix. Free tier, no credit card. Skip it and findajob still pulls from company career pages and your Gmail job alerts — but most people want LinkedIn too.
- A Gmail account (optional) — lets findajob read your LinkedIn job alerts and notice rejection emails automatically.
Sign-up walkthroughs for both keys: docs/getting-started/api-keys.md. You paste them into the app once during setup.
Real per-call rates from the operator's instance (last 30 days):
| Item | Typical |
|---|---|
| Daily scoring (~100 listings) | $0.10–$0.40 |
| Per fully-prepped job | ~$1.10 |
| Per interview-prep run | ~$0.30 |
Most people: ~$20–50/month in AI spend, plus ~$5/month if you host on Fly.io. Full breakdown across usage levels: docs/getting-started/cost.md.
- Self-host with Docker — the path the maintainer runs and verifies. Runs on a box you operate, with no hosting cost beyond the machine. You handle backups, TLS, and updates. → Docker install guide
- Fly.io — runs under your own Fly account, about $5/month. The maintainer does not verify this on-ramp, and its documentation is being retired (#1092). → Fly guide
Both paths run the same image and reach the same dashboard. Once it's live, a one-time onboarding interview — a roughly hour-long chat inside the app about your background and target role — teaches findajob who you are. The next morning's triage then delivers your first scored shortlist.
- Getting started — sequenced setup guide
- Daily workflow — what to do each day, tab by tab
- Troubleshooting — symptom index and log reading
findajob is a real, daily-driven system, and the codebase is a worked example of how a multi-stage LLM pipeline holds together in production.
- Architecture — system design, the prep pipeline's stage-by-stage data flow, and the per-stage model choices
- CONTRIBUTING.md — dev setup, commit conventions, and the architectural invariants the code enforces
- Project board — the single source of truth for active work
The repo contains no personal data. Candidate content lives in the stack's own state/ directory, which is gitignored. Some of it comes from .example templates, such as candidate_context/profile.md.example. Onboarding writes the rest, such as the master resume. The pre-commit hook that blocks PII is an opt-in install for each clone; see CONTRIBUTING.md.
An instance calls only the services you configure: the AI provider through OpenRouter, RapidAPI for job search, Gmail over IMAP if you connect it, ntfy.sh for push notifications, and Google Gemini for podcast audio if you set a key. If you run an instance for someone else, read Data handling for operator-run instances.
- Issues — file a bug, request a feature, or ask a question
- Security — please don't file public issues for security bugs; see
SECURITY.md
MIT.
