Hunta — setup guide
zip → wired pipeline → first application, ~20 minutes

This guide is for the free demo: one candidate, the full pipeline, forever — 25 drafts + 5 sends per rolling 30 days, enforced in code, the identical wheel the paid tiers run. No card, no account, no telemetry: the download IS the product.

⬇ Download the demo (116 KB .zip) sha256 file

1 Download, then prove the bytes

Two files: the pack and its signature hash. Check the download matches the hash before installing — if it ever differs, you did not get our file:

# Linux / Mac — in the folder you downloaded to:
sha256sum -c hunta-demo-1.0.0.zip.sha256
hunta-demo-1.0.0.zip: OK

# Windows PowerShell:
(Get-FileHash hunta-demo-1.0.0.zip).Hash -eq (Get-Content hunta-demo-1.0.0.zip.sha256).Substring(0,64)
True

Expected digest: 1d61c7566916266b8db510333364b6d0cf8079c1cc7b62d5a7c6e178b404edeb

2 Install (Python 3.11+)

unzip hunta-demo-1.0.0.zip -d hunta-demo && cd hunta-demo
python3 -m venv .venv && source .venv/bin/activate      # Windows: .venv\Scripts\activate
pip install hunta-1.0.0-py3-none-any.whl

hunta doctor        # self-check: config, files, data dir, LLM key, Discord, SMTP
✔ flavour: demo (25 drafts / 5 sends / 30-day window)
✔ tenant demo: 2 candidates  …
✘ groq key missing            ← fix it next line, that's the only real requirement

The pack already contains a working tenant: config/tenants/demo/ with two synthetic candidates (Pat — ZA — and Lee — ZW). Doctor goes green when you give it a model key and a Discord webhook:

# any free tier works; groq needs no card → console.groq.com → API key
hunta encrypt "gsk_...your key..."        # prints an enc: blob — paste it as llm_api_key in tenant.yaml

3 Your candidate = one YAML file

Copy config/tenants/demo/candidates/demo01.yaml, rename, edit. That's the whole relationship — delete the file and your candidate's data is gone (right to erasure, not a promise):

candidate_id: Lerato01
full_name: Lerato Mokoena
email: lerato@example.com
phone: "+27 82 ..."
country: ZA                    # ZA | ZW | ZM
location: Johannesburg
cv_design: indigo              # ← your look: classic | indigo | emerald | sunset (§8)
summary: Sixth-year accounts professional, month-end in 4 days…
skills: [Sage, Xero, Advanced Excel, VAT201]
experience:
  - title: Senior Accounts Clerk
    company: Fake Corp (Pty) Ltd
    start: "2021-03"
    end: null
    bullets:
      - Month-end pack cut from 9 to 4 days
education:
  - qualification: B.Com Hons
    institution: UJ
    year: "2019"
# ZA extras (all optional, shown only if present):
id_number: "890412 …"    ee_status: SA Black Male    drivers_licence: C1

The criteria block in tenant.yaml (keywords / locations / exclusions) decides what gets hunted for this candidate. hunta hunt --dry previews without touching anything.

4 Discord: the card that runs your whole pipeline

  1. Your server → #hunta → Edit Channel → Integrations → Webhooks → New Webhook → copy URL.
  2. Paste it as discord_webhook: in tenant.yaml.
  3. Every hunt posts one card per match: title · company · match % · reason · link · both PDFs · ✅ / ❌.
The Hunta Discord card

the card — real product screenshot (demo persona)

Tap around a live one right here — approve/reject logic runs in this page, no backend:

interactive card — the actual approve experience

5 Gmail: sending comes out of the candidate's own mailbox

  1. Candidate's Google account → security → 2-Step Verification ON → App passwords → create → 16 chars.
  2. Put address: + app_password: in tenant.yaml under mailbox: (app password goes through hunta encrypt like the LLM key).
  3. hunta mailbox-test demo → green means the pipeline can deliver. No Google Cloud project, no OAuth consent screen, nothing to pay.
Why the candidate's own mailbox: employer reply-threads, ATS tracking and mailbox reputation all belong to the person applying. Hunta borrows it for the send — cap 20/day (demo: 5 per 30 days), reply-to set to the candidate — and nothing else.

6 First hunt

hunta hunt --dry         # previews; marks nothing, sends nothing
[hunter:careerjunction] 24 jobs
[hunter:pnet] 30 jobs
[pipeline:demo/lerato01] 32 pass rules, sending top 5 to LLM
[dry] Senior Accountant @ Meridian Logistics (pre 0.71 / llm 88%) -> Senior Accountant — Meridian…

hunta hunt               # real: drafts the PDFs, posts the cards, waits for your tap

18 board integrations across ZA · ZW · ZM + remote feeds, four times a day if you schedule it (§10). A dead board never kills a run — [hunter:x] 0 jobs and the rest deliver.

7 The tap is the product

✅ Approvesends from the candidate's Gmail within seconds; PDFs deleted, draft text wiped from the store
❌ RejectPNG… sorry — PDFs deleted on the spot, draft text wiped, job marked and never re-offered
Ignoredrafts self-destruct at 72 hours. Nothing you didn't act on survives a weekend

There is no auto-send mode. It does not exist in the code, so no setting can turn it on.

8 CV design — chosen per candidate, applied on every draft

Your clients don't all want the same document. Four designs ship in the demo; each candidate picks one — the cover letter stays business-plain no matter what. All four are real text PDFs: ATS-parseable, no graphics, no columns a parser can't read.

the previews above use the product's own CSS; the linked PDFs are real render output

Three ways to set it

hunta designs                          # list them
hunta design demo lerato01 emerald     # CLI — one line, done
# or the YAML field in §3, or the dropdown in the dashboard's candidate settings —
#   cv design: [ classic ▾ ]   (classic · indigo · emerald · sunset)

Set it per client (a corporate-career person gets classic; a marketing graduate gets sunset), per country habit, per whatever your client asks for. Takes effect on the next draft; pending cards keep their original render until re-rendered on approve.

9 Where your data actually lives

One SQLite file per tenant — state/<tenant>.sqlite — holding job metadata, status and the draft text only while it awaits your tap; the moment you approve or reject, the text is NULLed and the PDFs are unlinked, and settled rows expire after 60 days. PDFs are born in a temp folder and die at 72 h. Your Gmail app password and model key are Fernet-encrypted in the YAMLs. Nothing phones home: no accounts, no analytics, no server of ours in the data path — self-hosted demo means your laptop is the cloud.

10 Four times a day, if you want it

Demo mode: a scheduled hunta hunt via cron (Linux/Mac) or Task Scheduler (Windows):

# crontab -e — the 06:00/14:00 SAST rhythm (adjust TZ to yours)
0 4,12 * * 1-6  cd ~/hunta-demo && .venv/bin/hunta hunt >> hunt.log 2>&1

Paid hosted tier runs the same thing on GitHub Actions ($0 infra) for you — you never touch a scheduler.

11 When something looks wrong

SymptomWhat it is
[llm] groq: 429free-tier rate limit. Naps are capped at 30 s then failover; run hunta llm-chain demo after exporting 2–3 free keys (cerebras, gemini…) to spread load.
[pnet] detail path unhealthy — serving the rest from list databoard/DNS hiccup; the breaker keeps delivering ads from list data. No action; the next run retries normally.
a board logs 0 jobsthat board is blocked from your IP or empty today. Coverage degrades, the run completes — always.
DEMO limit: all 5 premium sends usedthe 30-day leash. Reset goodwill: delete data/.demo_usage.json — or upgrade (§12).
everything times out on first runfree Groq key on a shared quota: it warms up. Every fetch has a hard 45 s budget — a run can idle, never hang forever.

12 You're a coach and a client just said "I want this for everyone I have"

(For Hunta sellers: the same section in mirror — the bible's growth tab links here.)

  1. Take the order. Confirm: candidate count, countries, branding (Studio+). Solo $306/mo (about R4,999) = 3 candidates · 100 sends; Studio $613/mo (about R9,999) = 15 + white-label PDFs; Sovereign $920/mo (about R15,000) = self-hosted, unlimited. Annual prepay: $2,754 (Solo) / $5,517 (Studio) / $8,280 (Sovereign) — 25% off, one payment by bank wire. These are the actual prices everywhere: US dollars monthly, or pay in rands (R4,999 / R9,999 / R15,000 a month).
  2. Payment — Whop one-tap checkout is LIVE for every tier: in dollars (Solo whop.com/checkout/ch_abZZn55zTTq9VO0, Studio whop.com/checkout/ch_xXwDxquSJP2Ctwu, Sovereign whop.com/checkout/ch_cjiffJE23bpi6Zx), in rands (Solo ch_kx2q8S9aYZtNTbX, Studio ch_DevT4v0Yys7JPUX, Sovereign ch_kB1eviTd27jsJiv), and annual by bank wire (Solo ch_k0iLW2DxBwPn7Pb, Studio ch_2AqEEMTlrXveTzJ, Sovereign ch_4gPHCzpXHl3jk6y). Store whop.com/jacaranda-labs. Whop only takes cards up to $2,500, so annual is wire-only. Card payments run through Whop; every manual rail below is honoured in full too — Lightning to SharkSkin@coinos.io (LUD-16-verified 2026-09-19; payer puts name + tier in the payment note, receipt to WhatsApp), or Mukuru/EFT quoting their tenant id as the reference. Push annual prepay on every close ($2,754 Solo / $5,517 Studio / $8,280 Sovereign) — cash now beats MRR while the build is unfunded, and one payment removes a month of manual grant admin. Whop checkout for a new tenant: point them at the tier card on the store page. Never start the tenant until money landed (or the owner's manual-rail receipt came in).
  3. Provision the tenant in seconds: copy the tenant template, add their candidates, encrypt their Gmail app passwords + their own LLM key (their key = their bill = their privacy), start their pipeline. A new paying tenant is a directory, not a deploy.
  4. Remove the leash: their build runs without HUNTA_FLAVOUR=demo — that single env flip is the entire upgrade; queues, history and CV designs carry over untouched.
  5. Self-host (Sovereign) customers: nothing to do by hand. After a Whop purchase they run /claim in their own Discord; the bot opens a private #🔐-hunta-sovereign channel with their signed licence and the install steps below, and posts a fresh licence on every renewal. Manual-rail buyers: hunta licence-issue signs one by hand. Support is /help in that channel, WhatsApp as backup.
  6. Week-one check: after 3 days ask for a screenshot of their first approved card. That moment is the product working; it's also your referral ask, made warm.
Copy-paste acceptance message:
"Done — you're on [tier], [n] candidates live, sends start with your next hunt at [time]. Nothing about your demo changes: same pipeline, your keys, your mailbox, no leash. Your first CV designs are set per candidate — say the word if anyone wants a different look."

13 Sovereign: install Hunta on your own box

For Sovereign buyers. About 15 minutes on any Linux server, VPS or spare PC with Docker. Your licence is in your #🔐-hunta-sovereign Discord channel (it appears after you run /claim). Stuck? Type /help in that channel, or WhatsApp +263 78 460 0904.

  1. Get the image and the compose file.
    mkdir hunta && cd hunta
    docker pull ghcr.io/king-kunta-cpu/hunta:latest
    curl -fsSLO https://gethunta.pages.dev/downloads/docker-compose.sovereign.yml
  2. Make two keys (run each once and keep the output):
    docker run --rm ghcr.io/king-kunta-cpu/hunta:latest hunta keygen
    docker run --rm ghcr.io/king-kunta-cpu/hunta:latest hunta admin-token
  3. Create .env in the same folder:
    HUNTA_LICENCE_KEY=HLT1.paste-your-licence-here
    HUNTA_MASTER_KEY=the-keygen-output
    HUNTA_ADMIN_TOKEN=the-admin-token-output
  4. Start it and check the licence:
    docker compose -f docker-compose.sovereign.yml up -d
    docker compose -f docker-compose.sovereign.yml exec hunta hunta licence-status
    It should print your firm name, the expiry date and "seats: unlimited".
  5. Add your firm and candidates:
    docker compose -f docker-compose.sovereign.yml exec hunta hunta tenant add my-firm --name "My Firm"
    It prints the next steps (mailbox app password, AI key, candidates). Then run hunta doctor the same way to confirm everything is green. The dashboard is at http://your-box:8080; sign in with your admin token. Approvals go to Discord, the web dashboard, or Telegram (HUNTA_TELEGRAM_BOT_TOKEN in .env).
  6. Renewals: each payment posts a fresh licence in your Discord channel. Replace the HUNTA_LICENCE_KEY line and run docker compose -f docker-compose.sovereign.yml up -d. If a licence lapses, Hunta turns read-only (the dashboard still works; hunting and sending stop). It never deletes anything.