AIHawk

Give it your resume, get the jobs that fit, select them and apply. Runs in your terminal, with a browser you can watch. Needs Python 3.11 or newer.

pipx install git+https://github.com/feder-cr/Jobs_Applier_AI_Agent_AIHawk

Or uv tool install git+https://github.com/feder-cr/Jobs_Applier_AI_Agent_AIHawk; uv leaves aihawk off your PATH until you run uv tool update-shell and open a new terminal. Or, in a virtual environment (on Windows, aihawk-env\Scripts\pip and aihawk-env\Scripts\aihawk):

python -m venv aihawk-env
aihawk-env/bin/pip install git+https://github.com/feder-cr/Jobs_Applier_AI_Agent_AIHawk
aihawk-env/bin/aihawk resume.pdf

The resume can be anywhere on your disk: a PDF, a .docx or a text file. A scanned PDF has no text to read; export it with text, or save it as .docx.

 AIHawk  Ada Rossi · Python Engineer, Backend Developer · Milano, Italy      [scoring 12/40]
 ┌───┬───────┬───────┬──────────┬─────────────────────────┬──────────┬────────┐
 │   │ Score │ Apply │ Company  │ Role                    │ Location │ Status │
 │ ● │ 4.8   │ auto  │ Acme     │ Senior Python Engineer  │ Milan    │        │
 │   │ 4.5   │ auto  │ Beta     │ Backend Developer       │ Remote   │ sent   │
 │   │ 4.1   │ link  │ Gamma    │ Python Developer        │ Rome     │        │
 └───┴───────┴───────┴──────────┴─────────────────────────┴──────────┴────────┘

The first time, AIHawk asks for an OrcaRouter key and keeps it in ~/.aihawk/key; after that, aihawk alone reopens your list. To change the key, edit or delete that file, or set ORCAROUTER_API_KEY, which wins over the file. If OrcaRouter refuses a key from the file, AIHawk forgets it and asks again.

The first start downloads the job index, 672 MB, once per database, into ~/.aihawk/data/index. A search reads it on your computer; the descriptions of the jobs AIHawk judges are read from the release over the internet.

Keys

Key What it does
space select a job
enter the score, the gaps and the reasons
a send the selected jobs, or the current one, after one yes
s the jobs sent, and what each page said
o open the posting in your browser
m score more jobs
r give a new resume
l open the browser to sign in; press Enter in the terminal when done
q quit (Ctrl+C quits too)

What it does

  • Reads your resume, writes a search plan from it, and takes your contact details from it.
  • Finds the postings whose titles fit the plan, in a job database published as a release: 10,223,753 postings in the manifest of 2026-11-04. Postings older than 60 days are left out by default. The daily refresh is jobs-database.yml: it is on main and has not run yet.
  • Shortlists the best 100 by title: Jev, the decision model, answers six questions about each, and the best 25 are kept.
  • Scores each shortlisted job from 1 to 5 against your resume, with its gaps.
  • Applies: writes a CV for the job and fills the form in a visible browser through invisible-playwright-mcp. What a form asks and your files do not say, it asks you, and remembers.

Sending

The model fills the form and names the submit button; it is told not to send, and clicks that would send are refused. Your a and Enter is the one yes: AIHawk clicks the control the model named. As a last resort the model can run a script, which could send a form without asking; see SECURITY.md. Each send keeps what the page said in applied.csv and data/proofs/; s lists them.

Sites

Sites vary a lot: Greenhouse and Ashby have one confirmed real send each, the others fill forms without sending, stop at a captcha or at questions, or need an account. docs/sites.md gives each site's status and what stops it. Other postings are listed for applying by hand. The Gmail and Outlook plugins take a code or a link from your mailbox, read only; they have not been tried on a real mailbox yet.

A plugin is a Markdown file in src/aihawk/plugins/ that explains one site's form to the model. Add a site with a file and no code: see docs/plugins.md. Your own go in ~/.aihawk/plugins/.

Plan and models

The search plan is an editable graph in filters.plan of ~/.aihawk/aihawk.yaml; restart aihawk after editing it. Models go through OrcaRouter: model (default deepseek/deepseek-v4.1-flash) writes the CV and fills forms; quick_model (default google/gemini-3.5-flash) writes the plan; decision_model (default typesafe/jev-1.14, which is Jev) shortlists the jobs; judge_model (default deepseek/deepseek-v4.1-flash) scores them. base_url can name another gateway, which must serve OpenAI's chat API and also the decision model's /systemone call.

More: the wiki, CONTRIBUTING.md, SECURITY.md, CHANGELOG.md. The job database merges public sources, whose licences and posting links are in NOTICE; each posting belongs to its employer. The report's shape is adapted from career-ops (MIT).

MIT. The former Dots project is at feder-cr/invisible_dots.

2026-11-06 17:13:04 -10:00
Languages
Python 99.8%
Shell 0.1%
PowerShell 0.1%