Skip to content
Reference

CLI

Every command in scripts/run.py.

Everything the dashboard does, and more, is a command in scripts/run.py — a Typer app with eighteen command groups. Run any command with --help for its full options.

usage
python scripts/run.py <command> [options]
python scripts/run.py <group> <command> [options]
python scripts/run.py actor people --help
Tip
Inside the repo's virtualenv, use .venv/bin/python scripts/run.py … so the right Python and packages are used.

Core#

The pipeline, one stage at a time.

CommandDoesKey options
doctorCheck every external dependency and say how to fix it—
profileParse the resume into profile/profile.json--path
scrapeRun the scraper fleet and store new roles--sources greenhouse,hn_hiring · --verbose
scoreLexical gate on unscored roles, then rubric-score the best--limit 40 · --salaries 0
find-contactsFind people at high-match companies--company ID · --limit 5
draftQueue referral drafts for review--contact · --job · --limit 5 · --per-company 2
approve EMAIL_IDApprove one draft from the terminal—
sendSend approved drafts inside the cap and window--email-id · --limit · --ignore-window
pollRead Gmail for replies and classify them--followups/--no-followups
dailyOne full ingestion: scrape, salaries, score, notify—
discoverProbe YC companies for new public ATS boards--limit 60
add-company NAMEFind one company’s board, seed it, pull its roles--website · --ats · --slug
serveStart the API and the in-process scheduler--host 127.0.0.1 · --port 8000 · --reload
fit-explain JOB_IDShow why the lexical gate scored a role as it did—
gmail-verify / gmail-authTest the app password / run the one-time OAuth consent—

tick — the unattended pipeline#

What launchd runs. Each run takes a lock and skips if another is busy.

CommandDoesKey options
tick runOne bounded slice of work--kind free | paid | send | apify | all
tick installWrite and load the LaunchAgents (send, apify, shortlist; free, paid and audit unless tick.scrapers_frozen; the free referral job only with tick.free_referral_job)—
shortlist next · company · progressComplete the next shortlisted company, a named one, or show progress per pool--limit
tick uninstallUnload and remove them—
tick statusLoaded? Last run? What did it do?—

decide — the decision brain#

Which companies to spend the days on: chance of an offer, the shortlists, one company a day.

CommandDoesKey options
decide runDecide every Bengaluru / Hyderabad / Remote company and re-rank the shortlists—
decide topThe ranked shortlist, or the companies parked under one verdict--pool Bengaluru|Hyderabad|Remote|all · --verdict after_dsa|skip|target|fill_first
decide show COMPANY_IDEvery question, its chance and the evidence behind it--json
decide todayToday’s company — fill it or ask its referrer--asked · --skip "reason"
decide fillFill one company completely, then decide it again--company-id (default: today’s)
decide outcome COMPANY_ID STAGERecord what happened: replied | referred | interview | offer | rejected | no_response--note
decide calibrateBrier score and log loss of what the brain said against what happened—

mixer — decide, then buy#

Apify job ads only for companies that pass the free layers and still lack data. Never scheduled.

CommandDoesKey options
mixer planThe free funnel, layer by layer, and who would be bought next — spends nothing--limit
mixer runBuy the next companies’ ads (cheapest source first), re-score, decide again--limit · --company ID (repeatable)
mixer historyEvery paid lookup: found, matched, saved, cost--limit 20

upskill — the learning plan#

What your shortlisted companies ask for that your resume doesn’t show.

CommandDoesKey options
upskill gapsThe gaps, best payoff first, and what DSA practice is worth--limit 25
upskill mark SKILL STATUStodo | learning | done — done needs a proof link and your own line--proof-url · --note
upskill add SKILLPut a done skill into profile.json (backed up first), then re-score everything—

referrals — people and addresses#

The referral-only cycle and its parts.

CommandDoesKey options
referrals runOne cycle: Bengaluru (★ first), Hyderabad, other India, remote--budget 1200 · --limit · --exclude
referrals peopleThe people step: GitHub, team pages, web, public LinkedIn--limit 50 · --list · --budget 3600
referrals patternsLearn each company’s address format (2+ agree)--apply (default: dry run)
referrals reverifyRe-confirm referrers whose evidence is 90+ days old--limit 150
referrals revalidateRe-check companies’ site, description and careers page--limit 30
referrals measureReady referrers per company, the ★ list, complete companies—

actor — LinkedIn guest pages and Apify#

Our own Apify-style actors: cached, paced, breaker-guarded, never logged in.

CommandDoesKey options
actor people [COMPANY_ID]A company’s People tab, assembled from public sources and verified; city-locked--linkedin · --source … · --title · --max 100 · --apify-max 50 · --save (on)
actor jobs KEYWORDSLinkedIn job search via the logged-out endpoint--location · --remote · --days · --experience · --max 25
actor company / profilePublic company pages / public profiles--fresh
actor employees COMPANY_IDWho works there now, verified on each public profile--linkedin · --max 15 · --save (on)
actor fillFill companies that have no current referrer--limit 5 · --apify · --apify-max 25
actor apifyToken present? Today’s spend against the cap—
actor runs / show RUN_IDThe run ledger / one run’s dataset--limit
actor status / reset ROUTECircuit-breaker state per route / clear a cooldown—

outreach — drafting and sending#

Everything between a lead and a sent email.

CommandDoesKey options
outreach batchBuild the week’s drafts (★ India first)--n · --dry-run · --no-research · --no-model
outreach betsOne gated draft per ready-to-ask company--limit 10
outreach proposalShow how it would write — sends nothing--n 10 · --no-model · --show
outreach polishModel rewrite of template drafts--limit 10
outreach preflightLive-send readiness, red / amber / green, with fixes--json · --no-sign-in
outreach send / send-dueSend approved mail / the send job’s 5-minute action--limit · --ignore-window
outreach ledger / weekToday’s cap and use / the week’s quotas--start
outreach followupsOne follow-up draft per silent thread--after-days
outreach track / learnEvery email’s status / reply rates by lever--status · --sentiment · --days
outreach reply / events / confirmRecord a reply by hand / list events / confirm a time—
outreach rehearse-weekSimulate a week on a copy of the database--start · --days 9
outreach unsuppressClear an opt-out--company · --contact

harvest — discovery and enrichment#

Finding companies and the facts about them.

CommandDoesKey options
harvest runThe whole scrape end to end--target 500 · --exa/--no-exa
harvest yc / exa / xAdmit companies from YC, Exa’s index, or hiring posts on X-q · --per-query
harvest probe / roles / careersFind ATS boards / pull open roles / find careers pages--limit · --concurrency
harvest facts / websites / storyFunding and HQ / sites for name-only rows / home and About pages--limit · --keyless
harvest verifyHiring verification--limit 60 · --fresh
harvest people / linkedinThe free referrer waterfall / public LinkedIn leads--limit
harvest india-jobsBengaluru / Hyderabad companies via their postings-s linkedin|jobfound|instahyre · --city
harvest priority / scrape-firstRegrade overrated + priority / flag companies we know nothing about--dry-run
harvest statusCounts and progress—

targets, india, selection#

Grading companies and ranking roles.

CommandDoesKey options
targets gradeGrade every company: hyped → reject, then funding, stipend, tiers--pay/--no-pay · --limit
targets listThe graded registry--tier · --limit 25 · --json
targets enrich / verifyRead a company’s site and regrade / check a hiring claim--company-id · --fresh
india discoverAdmit new Bengaluru / Hyderabad startups--limit 30 · --sources …
india pay-floorHide or restore India companies by the pay floor--dry-run
selection recompute / topRe-score changed roles / best bets per market--market india|remote|abroad
selection brief JOB_ID / briefsOne role’s breakdown / needs briefs for the top roles--top 50

lists, people#

Hand-picked lists and per-person tools.

CommandDoesKey options
lists ls / show / syncLists on disk / one list in order / attach to the database[key] · --no-verify
lists peopleBoards, roles and referrers for every list company[key] · --linkedin-only · --emails-only
lists auditRe-verify GitHub orgs (a wrong org loses its contacts)--dry
people classifyLabel contacts by role class--all · --model
people emails COMPANY_IDReal addresses from the web, then fill by pattern—
people queueThe referral queue--company-id · --limit 25

kg — the knowledge graph#

Search and record the project’s memory.

CommandDoesKey options
kg buildReload context, mirror data, write BRIEF.md and the viewer--no-viewer
kg search QUERYFull-text search across both layers--kind · --limit 15
kg show NODEA node and everything it links to--depth 1 · --json
kg path A BShortest path between two nodes--max-depth 6
kg note TEXTRecord what changed, linked to nodes--about … · --tag …
kg why COMPANYShould we write to them, to whom, and what we know--json
kg shortlist / expand / guardRank targets / co-funded companies / cooldown check—
kg hubs / compose / audit / exportCentrality / best design per stage / contradictions / HTML-JSON-GraphML—

audit, models, research, notify#

Operating and inspecting.

CommandDoesKey options
audit run / show / statusOne audit now / last report / agent state--quiet · --json
models status / check / costsOpenRouter key, aliases, caps / verify model ids / spend--live · --days · --month
research doctor / web / read / companyResearch channels: health, search, read a page, research a company--depth · --fresh
notify test / digest / watchdogNotification bot and the watchdog report--dry/--send