Skip to content

Releases: e2sy/leadhound

v1.3.0 β€” the wide net

Choose a tag to compare

@e2sy e2sy released this 06 Oct 07:07

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

Choose a tag to compare

@e2sy e2sy released this 06 Oct 06:55

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. /money in the pocket.

Full notes in CHANGELOG.md.

v1.1.0 β€” the learner

Choose a tag to compare

@e2sy e2sy released this 06 Oct 06:35

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/queue serves it

Full notes in CHANGELOG.md.

v1.0.0 β€” the machine gun

Choose a tag to compare

@github-actions github-actions released this 06 Oct 03:59

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

Choose a tag to compare

@github-actions github-actions released this 05 Oct 17:44

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 /data volume, 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

Choose a tag to compare

@github-actions github-actions released this 05 Oct 16:35

πŸ“± 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 /queue from 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

Choose a tag to compare

@github-actions github-actions released this 05 Oct 14:02

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 doctor checks 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 counts
  • leadhound 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

Choose a tag to compare

@github-actions github-actions released this 04 Oct 14:43

🎯 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-api bid 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

Choose a tag to compare

@github-actions github-actions released this 04 Oct 09:46

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

Choose a tag to compare

@github-actions github-actions released this 04 Oct 08:39

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 ⚠️ beta, session-cookie based, may break β€” no official API
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.