Repository navigation
Releases: e2sy/leadhound
Release list
v1.3.0 β the wide net
Three more sources joined the hunt, and the same gig stopped wearing five hats.
- π½ Reddit connector β [Hiring] posts from your subreddits (public JSON, honest UA, 5-min floor). [For Hire] ads skipped by design; per-sub source tagging feeds the funnel.
- π Guru.com + PeoplePerHour β public job RSS via shared board plumbing; bot-wall responses surface as honest, actionable errors.
- β§ Cross-source dedup β normalized title Γ money bucket fingerprint; second sightings bump the original and remember the board instead of cloning rows or re-buzzing your pocket.
Full notes in CHANGELOG.md.
v1.2.0 β the closer's copilot
The chase stopped being manual.
- π Follow-up bumps β every shot auto-schedules a +3-day nudge; one click generates 3 honest sentences and copies them for you to paste. Any verdict cancels the chase.
- π€ Interview kit β gig gaps become your questions, the money frame anchors above your floor, talking points tie skills to YOUR highlights, red flags become named red lines.
- πΌ Money ledger β record what you quoted; the ledger values pipeline and wins at YOUR number, with monthly bars.
/moneyin the pocket.
Full notes in CHANGELOG.md.
v1.1.0 β the learner
The learner release. The scope stopped guessing.
- π§ Win-memory β won/lost outcomes snapshot into memory; lookalike gigs get a capped Β±10 nudge (rapidfuzz, difflib fallback)
- π‘ Price guard β EUR/GBP β USD normalization, half-your-floor lowballs take β5 and get named, money reads carry a confidence
- β
Qualification checklist β six honest yes/no/unknown lines before you approve (one tap on the board, or
GET /api/jobs/{id}/checklist) - β Queue ranking v2 β rank = score Γ freshness Γ source trust; the pending column orders by urgency,
/api/queueserves it
Full notes in CHANGELOG.md.
v1.0.0 β the machine gun
leadhound is now working as it was meant to work: the gig drops, your phone buzzes, you fire. 1.0 because the missing pieces were speed and survival, not features.
π‘ Freelancer webhook β seconds, not polls
Register the receiver URL + signing secret in the developer portal and new projects flow straight into the pipeline: scored, drafted, pushed, per user. HMAC-SHA256 verified against the raw body (constant-time, all common header variants), guid dedupe so the poller never double-pushes. One-click secret rotation β the old secret dies instantly, the new one is shown exactly once. Live event counters on the π‘ card and in /api/radar.
β° Downtime catch-up
Sleep 8 hours and the hound wakes up and catches up: if the last sweep is over an hour old at boot, the first sweep backfills the blackout and flags everything you missed with an amber β° late chip. Timezone-aware comparison β no format lies.
π Radar heartbeat + π watchdog
The poller lands a heartbeat after every sweep; thread_alive checks the actual thread, and stalled fires when the heartbeat goes quiet for 3x the interval. /api/health is real vitals now (db, uptime, poller, listeners β aggregate only). A watchdog supervisor relaunches dead poller threads with exponential backoff (15-min cap), respawns dead pocket bots from the db arm-state, and respects shutdown above all.
β‘ Polite fast lane
RemoteOK / Remotive / WWR / HN / custom RSS now poll on a 2-minute floor, paying their way with ETag + Last-Modified conditional GET β an unchanged feed costs a 304 and nothing else. Keys/cookie/search connectors keep their 5-minute floor (Connector.min_poll is the per-source truth), and Β±20% jitter keeps a fleet of hounds from stamping a source in unison.
π€« /ping heartbeat board
One command, all of ops: β healthy sources with cadence + tick age, π‘ overdue or never swept, β erroring with the reason, the radar thread's own pulse, and the webhook armed state with rejected-signature warnings.
Install: pipx install leadhound or docker compose up β then leadhound web, connect sources, arm the pocket sniper.
5 assets: wheel, sdist, Windows / macOS / Linux binaries. 380+ tests, ruff clean, CI green on every commit.
v0.9.1 β the routine
v0.9.1 the routine β v0.9.0 put the sniper in your pocket; v0.9.1 makes the daily grind disappear.
Added
- π Dark/light theme β the console adapts to daylight; choice persists, no flash on reload
- π² Installable pocket console β PWA manifest + shell-caching service worker + sniper-scope icon; live API data is never cached. Installs to your phone's home screen
- β‘ Auto-snipe rules β min score (60β99) + keywords + source + budget caps auto-approve matching gigs with an β‘ auto badge. Guardrail honest: rules never auto-bid β firing stays behind a human click
- β¨ improve-draft β one-click rewrite: LLM in your voice, or zero-config template sharpening (closing question, concrete plan, budget ack β keeps every custom line)
- π¦ Starter packs β six one-click niche bundles (dev / design / marketing / support / product / firehose) on verified WWR + Remotive feed channels; your existing settings are kept
- π€ Pocket bot /digest + /ping β the whole board (counts, rates, top 3 gigs) and a liveness probe, from your chat
- πΎ Saved views β filter bar with source picker + score bar; name a view, one click back to it
- π³ One-container self-host β
docker compose up; data on the/datavolume, first boot auto-inits - π©Ί Update checker in doctor β warns (never fails) when a newer release ships
Changed
- 40+ new network-free tests; full suite well past 350
Install: pip install leadhound Β· Self-host: docker compose up Β· full notes in CHANGELOG.md
v0.9.0 β the pocket sniper
π± the pocket sniper release
The board lives on your phone now. Arm the listener, and your Telegram chat becomes the sniper's cockpit.
The two-way bot
/queue [n]β best pending gigs, score first/gig <id>β full card + the drafted proposal/approve <id>β move it up the pipeline/snipe <id> [amount]β arms a real Freelancer.com bid, shows the plan, waits for your π₯ Fire tap. Kit-mode sources answer honestly instead. Confirm state is memory-only with a 5-minute TTL β a restart can never leave a half-armed bid./statsβ your scoreboard, pocket-sized
Safety rails, honestly built
- chat-gated: a stray
/queuefrom any other chat gets silence, never your data - sends serialized ~1/s per chat, 429s honor
retry_after - one long-poll bot per account (cap 8), restart-clean, auto-armed on boot
- source breaks (expired cookie, dead token) β the bot tells you once per new failure, never spam
Under the hood
- per-account notify settings (per-user bot tokens replace global config; pre-0.9 config seeds silently)
- per-account push with its own score bar β account A's gigs never buzz account B
- per-source radar cadence (5β120 min clamp) via
POST /api/notify/cadence - dashboard: π± telegram card β token, chat id, test message (Telegram's verdict verbatim), arm/disarm
- 30 new network-free tests; 316 total, CI green on every commit in the chain
Full changelog: CHANGELOG.md
built by Mayank Bhaskar β github.com/e2sy
leadhound v0.8.0 β the closer's release
Sniping was v0.7.0. v0.8.0 teaches the sniper to count kills β and to learn which ammo wins. π₯π―π
π The scoreboard
A new stats tab turns your pipeline into honest numbers, backed by a new account-scoped GET /api/stats:
- Funnel cards β shots fired, reply rate, win rate (of resolved gigs β the honest kind), won value, in-play value, interviews
- Per-source conversion β a bar + reply rate per source. Feed the green rows, prune the dead ones
- π₯ live-fire vs π― kit β do real API bids reply more than copy-paste kits? Now you know
- π§ Scope calibration β winners vs losers by average score, with tightening hints
π€ Outcomes grow a stage
The funnel is now sent β replied β interview β won/lost. Interviews count as replies everywhere β chips, stats, calibration hints.
β Proposal A/B testing
- Every draft editor has A/B tabs β "β add B" clones your draft in one click
- The snipe dialog grows a version picker; the fired variant is recorded on every sniped card (
kit Β· B/live-fire Β· B) - The scoreboard grows a proposal duel panel with a verdict line once both sides have shots
GET/POST /api/jobs/{id}/variants+ per-variant stats
β¨ Keyboard cockpit
j/k aim through the board (wrap-around), a approve, x/r reject, s snipe, o open gig, c copy proposal, d edit draft. Acting auto-aims the next gig so the queue flows. ? shows the shortcut card; keys pause while you type.
π§ Email + π browser alerts
- Email notifications: plain-SMTP gig cards (score, money, matched skills, red flags, gig link + draft) via the new
[email]config section β stdlib only, Gmail app passwords work,leadhound doctorchecks the credentials - Browser bell: opt-in toggle β new gigs raise a native notification (top score + title) while the dashboard is open; click it to jump to the board
Also
db.stats()/db.calibration()are now account-scoped β accounts no longer see each other's countsleadhound stats(CLI) prints a sniper line with reply/win rates- 265 tests (59 new), ruff clean, CI green on every commit
Install: pip install leadhound Β· or grab a native binary below (Windows .exe shows a SmartScreen note on unsigned builds β More info β Run anyway)
Full changelog: https://github.com/e2sy/leadhound/blob/main/CHANGELOG.md
designed & built by Mayank Bhaskar
v0.7.0 β the sniper release
π― The loop is closed
leadhound no longer stops at find β score β draft. v0.7.0 fires with your account β and tracks every shot.
π― Snipe mode
Every pending/approved gig card has a snipe button with a fire dialog:
- π₯ live-fire (Freelancer.com, linked account) β a real bid is placed on Freelancer.com through their official API with your own token. You set the amount + delivery period, hit fire, the platform bid id lands in your board's audit trail. Your account, your trigger, on the books.
- π― snipe kit (every other source) β your proposal in an editable textarea; one click copies it and opens the gig page in your own logged-in session; an honest "β sent it" step records the shot. No fake buttons.
π Freelancer.com account link
New card in the accounts hub: official OAuth2 (free dev app β paste keys β π connect), auto-refreshing token, linked as @you badge. Same two-minute flow as Upwork.
π Sniper stats + audit trail
- jobs record
sniped_at, method (freelancer-apibid id /kit) and a note β the π₯ Sniped column shows badges with receipts - chips for sniped-in-7d and reply rate; outcomes (replied/won/lost) still calibrate the scope
- new API:
GET /api/jobs/{id}/snipe-planΒ·POST /api/jobs/{id}/snipeΒ·POST /api/jobs/{id}/snipe-confirm+ Freelancer OAuth flow
π‘οΈ Still ToS-safe
Bids go through official APIs with your own credentials, only when you click fire β nothing bids in the background. Kit sends happen in your own browser session.
206 tests green Β· ruff clean Β· CI/Release/Binaries all passing Β· verified in-browser with 50 live Freelancer.com gigs
full changelog: CHANGELOG.md
leadhound v0.6.0 β the real-accounts release
v0.6.0 kills the demo-mode feel for good: the app now opens by connecting your job sites, and the landing page itself shows 50 real Freelancer.com gigs fetched live through the new flow.
π Accounts hub (replaces the sources drawer)
A full accounts tab β one card per job site with:
- an honest connection state badge:
β connectedΒ·β errorΒ·π‘ on β not tested yetΒ·β setup neededΒ·β« off - last sweep line: +N new gigs or the actual error text, no pretending
- inline settings, switch on/off, and β‘ save & test β a real probe that tells you your keys/cookie work before you rely on them
π§ Setup wizards
- Upwork: step-by-step β create the free dev app β copy the redirect URI (one click) β paste keys β π connect (official OAuth2, token auto-refreshes forever)
- Fiverr (beta): exact steps to pull your session cookie from DevTools, with the honest warning that Fiverr has no public API
π‘ Radar visibility
New GET /api/radar exposes the sniping radar's real state β running, sweep interval, armed sources β and the accounts page shows it as a live heartbeat (π‘ radar live Β· sweeps every 15 min).
β First-run connect checklist
The empty board is now a 3-step list β connect a source β fetch real gigs β approve & send β that ticks itself green as you go. The π² sample-data button is demoted to a tiny "just exploring?" link.
β¬οΈ Downloads
Same zero-setup promise: double-click the binary for your OS β create your account β open π accounts β switch on Freelancer.com β β‘ fetch. Real gigs in under a minute, radar keeps hunting while you sleep.
179 tests green Β· ruff clean Β· CI verified on Windows/macOS/Linux.
leadhound v0.5.0 β the real-backend release
leadhound just went from a demo prototype to a working prototype: a real backend, a login system, and connectors that let you plug in the work sites you already use β then snipe the gigs from one board.
π Login system
- Register / sign in from the dashboard β scrypt password hashing, HttpOnly session cookies, 30-day sessions.
- Every job board, queue and connector run is account-scoped β your data stays yours.
π Source connectors (the "connect the work sites" part)
| Source | How it connects | Status |
|---|---|---|
| Freelancer.com | public search API β zero config, works instantly | β live (50 real gigs verified in testing) |
| Upwork | official OAuth2 authorization flow + auto token refresh, GraphQL job search | β needs your Upwork API keys |
| Fiverr | buyer-requests session connector | |
| RemoteOK / Remotive / WWR / Hacker News | RSS/JSON watchers (already in 0.4) | β live |
| Any custom feed | point it at any RSS URL | β |
Secrets are stored locally, masked (β’β’β’β’β’β’) in the UI and API, and never echoed back once saved.
βοΈ Real backend
- The stdlib demo server is gone β FastAPI + uvicorn now serves a proper REST API (
/api/auth/*,/api/state,/api/connectors/*,/api/fetch, interactive docs at/docs). - One ingest pipeline for everything: connectors β dedupe β scoring β drafts β queue/notifications. The CLI and the dashboard share the exact same path.
- Sniping radar: a background thread re-polls your enabled connectors on a schedule (configurable, min 5 min) so new gigs land in your queue without you asking.
π₯οΈ Dashboard v2
- Login gate, honest onboarding (no fake data unless you click the demo button).
- New Sources drawer: add connectors, see masked credentials, run any source on demand, one-click Upwork OAuth connect.
β¬οΈ Downloads
Double-click the binary for your OS β it sets up, opens your browser, and asks you to create the first account. No Python needed.
β οΈ Upwork/Fiverr integrations use their official/semi-official interfaces and are for personal use β read each platform's ToS before automating anything.
176 tests green Β· ruff clean Β· CI verified on Windows/macOS/Linux, including a live Freelancer.com fetch from the frozen Windows binary.