Skip to Content
Start hereYour first pass

Your first pass

The daily loop is six commands, and the first two are the whole pipeline. Here they are in the order you would actually type them, with what each one costs.

1. Fetch and filter, for free

karani run

Nine sources, fetched concurrently with a per-host limit and retries, then classified, filtered, de-duplicated across sources, stored, and swept for postings that have gone quiet.

karani run
karani run
hunting 9 sources
fetchedgreenhouse, lever, ashby, workable612
fetchedremoteok, himalayas, wwr, remotive, aijobs1,044
droppedrole not engineering-adjacent898
droppedseniority below the floor311
droppedregion-locked, no relocation offered274
droppedcomp below $160k where disclosed63
droppedno skill overlap with the profile51
skippedalready seen this week (canonical hash)32
flagged1 source returned 0 rows: workable--
pass complete: 1,656 fetched, 27 pending, 0 model calls, $0.00

Read the dropped lines. They are the pre-filter telling you what your rules did, and they are the best feedback on a config you have just written: if role not engineering-adjacent ate half the pass, your [profile] roles is narrower than you meant.

No model is called, so run this as often as you like. The flagged line about a source returning zero rows is worth noticing — a slug that changed ATS 404s quietly, and karani reports it per source rather than failing the pass.

2. Judge what survived

karani qualify --limit 20
karani qualify
karani qualify --limit 20
qualifying 20 pending rows on qwen3:4b
qualifiedStaff Backend Engineer, Platform91
qualifiedSenior Research Engineer83
flaggedMachine Learning Engineer, Ranking64
skippedSenior Software Engineer (Hybrid)21
skipped16 rows below the verdict threshold--
pass complete: 20 judged, 2 qualified, 1 for review, $0.00 (local)

On the reference configuration this is free: [llm.qualify] points at a local model. On a hosted model it is roughly a cent a row.

It is idempotent per resume hash. Run it twice and the second run costs nothing; edit your resume and the next run re-judges everything, because the thing it was judging against changed.

3. See what it found

karani actions # the prioritized worklist karani shortlist # just the ranked roles karani digest --format html --output data/digest.html

karani actions is the one to reach for. It is not a list of jobs, it is a list of moves: what to review, what to draft, what to send, what to follow up. Fast-lane roles — high fit, posted in the last three days — are flagged, because applying on day one is measurably different from applying on day nine.

4. Argue with it

karani verdict 1482 apply karani verdict 1544 skip

This is the part people skip and should not. Every verdict does three things at once: records your reaction, becomes a few-shot [posting → reaction] example in the next qualify prompt, and writes a distilled fact to the memory ledger. karani’s judgement converges on yours without any retraining, and karani funnel tells you whether it is working.

The disagreements carry most of the signal. A skip on something karani scored 82 teaches it more than ten agreements.

5. Build the pack

karani draft 1482

A tailored resume, a cover letter in your voice, and answers to the application’s questions. Billed, and the one step worth paying for.

Every claim about you is a selection over your own records with the citation verified before it ships. A rewrite that loses a figure the source had falls back to the original; a claim karani cannot trace is dropped rather than repaired.

6. Send it yourself

karani console open data/submission_console.html
karani console
karani console
reading 3 packs in drafting or ready
fetchedapplication questions from greenhouse1
fetchedapplication questions from lever1
flaggedashby exposes no form; using the standard field set
delivereddata/submission_console.html 3 jobs
pass complete: 0 model calls, $0.00
Open it, send each one, then run:
karani submitted 1482 1511 1523

One HTML file, no server, works on a phone. Per job: the apply link, presigned links to the rendered documents, and the job’s real questions with an answer and a copy button on each.

Then you open each portal, paste, and press submit. karani does not, and will not (ADR 0012).

7. Record what you sent

karani submitted 1482 1511 --cold

The console prints this line for you with the ids you ticked. Running it writes the status, the timestamp, and a snapshot of the artifact version that went out.

Skipping it does not cost you bookkeeping, it costs you the measurement: that write-back is what arms the follow-up logic and gives the conversion funnel its labels. An application karani does not know you sent is an application it can never learn from.

--warm and --cold say how you applied. The warm-versus-cold split is one of the few comparisons in the funnel with a large enough effect to show up quickly.

8. Track it

karani status 1511 screen karani stage 1511 recruiter_screen --notes "30-min chat" karani asked 1511 "How do you decide what not to build?" karani outcome 1544 rejection

Moving an application to screen or interview does something on its own: it builds an interview prep pack, unattended. A refreshed company dossier, likely questions derived from the gap analysis, STAR stories mined from your own records with every citation verified, comp research derived from the posted band, and questions to ask — as markdown, .docx and PDF, with a Slack card ahead of the date (ADR 0024).

It is billed, so it has a switch within reach: KARANI_AUTO_PREP=off.

9. Let it run

karani hourly # one full pass: ingest, qualify, draft, deliver karani hunt # schedule that hourly, plus twice-daily summaries
karani hourly
karani hourly
hunting 9 sources
fetchedall sources1,656
droppedpre-filter1,597
qualified3 new rows above the fit floor--
draftedStaff Backend Engineer, Platform at Northwind Robotics
delivered1 review card to Slack
skipped2 rows: per-run draft cap reached--
pass complete in 11m42s: 1 pack drafted, $0.31 of $15.00 this month

Quiet by design: an hour with nothing new posts nothing. Spending is triple-bounded — a fit floor, a per-run draft cap, and one shared daily budget across all 24 runs.

See Scheduling before you turn this on. There is one real trap in it, and it is about which binary the scheduler runs.

The whole loop

karani run # free karani qualify --limit 20 # free on local, ~$0.01/row hosted karani actions # free karani verdict 1482 apply # free karani draft 1482 # billed, and worth it karani console # free karani submitted 1482 --cold # free

Next

Last updated on