Local-first LinkedIn intent-signal lead-finder with a local web app — real signals, not stored databases.
Project description
teft
teft (Norwegian: the instinctive nose for a lead — a scent for who's in-market right now). Repo slug is still
linkedin-lead-finder; the tool is namedteft.
A personal, local-first tool that turns a freeform brief into a ranked, explained shortlist of high-intent LinkedIn prospects — "real signals, not stored databases."
For colleagues — try it in 2 minutes
Nothing to clone. It runs entirely on your own machine (the web app is 127.0.0.1-only).
- Install uv:
curl -LsSf https://astral.sh/uv/install.sh | sh(Windows: see docs.astral.sh/uv) - Run:
uvx teft-leads serve— your browser opens the app. (PyPI name isteft-leads; the command you type once installed is stillteft.) - In the app: Settings → paste your keys → Search → run it.
That's it. The rest of this page is for people building on teft.
About / planning
Planned with the wayfinder workflow; the plan lives as GitHub Issues. Two maps:
- Planning map (#1) — complete. Destination reached: the locked v0 definition.
- Build plan (#6) — stack, LLM, architecture, name, milestones.
- Implementation map (#7) — active. v0 as five
wayfinder:taskmilestones (M0→M4); the frontier (open, unblocked, unassigned) is the work takeable now — currently M0 (#8).
See CONCEPT.md for the original seed brief.
v0 at a glance
Python CLI on your Mac, over your own logged-in LinkedIn session (Patchright, li_at cookie reuse).
Guided: teft run — one command walks you through config (prompts + saves any missing key/cookie),
then product → brief → buyer-intent phrases (or reuse the last campaign), scrapes, ranks, and opens the
results UI. Defaults to headless/fast.
Or step by step:
teft scrape -p "phrase" …— content-search → per-candidate activity/profile →candidates.json.teft rank --brief brief.txt— each candidate → the "why now" prompt, SKIP filter → rankedshortlist-<date>.{md,json}.teft view— a local, zero-dependency results UI: lead cards, expandable post, Open profile / Open post / copy email, and contacted + notes saved to~/.teft/actions.json.
No Fit %, no monitoring, no outreach, no external services. .env is auto-loaded (no manual source).
Speed/stealth knobs: TEFT_HEADLESS=1, TEFT_MIN_DELAY / TEFT_MAX_DELAY, TEFT_MAX_CANDIDATES (cap per query, default 25).
LLM provider
rank is provider-pluggable. Default is claude-opus-4-8 (the tier the "why now" prompt's SKIP-rule
calibration was validated on). To use GPT-5.6 instead, set TEFT_LLM=openai (defaults to gpt-5.6-terra;
override with TEFT_MODEL, e.g. gpt-5.6-sol / gpt-5.6-luna) and OPENAI_API_KEY. The SKIP calibration
is only proven on Claude — re-run the fixtures on a new provider before trusting it (see VALIDATE.md).
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file teft_leads-0.5.0.tar.gz.
File metadata
- Download URL: teft_leads-0.5.0.tar.gz
- Upload date:
- Size: 192.8 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.11.29 {"installer":{"name":"uv","version":"0.11.29","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
a57a276da6b18cd39c2ff8ba4bba21d2d25e6c96e466463f71862d2c75aba8c0
|
|
| MD5 |
b32ceeaa5c0c4ff29d68a7d0596635e1
|
|
| BLAKE2b-256 |
9c710a88d48d9ef39ac7b4b5bbae7db2cae0bec1687b65a6ddb896e25e21d0a0
|
File details
Details for the file teft_leads-0.5.0-py3-none-any.whl.
File metadata
- Download URL: teft_leads-0.5.0-py3-none-any.whl
- Upload date:
- Size: 98.9 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.11.29 {"installer":{"name":"uv","version":"0.11.29","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
550607ea4cdff9fc2c619b458df1b6510522485bf1aa6f4a785b4fe98671d264
|
|
| MD5 |
c8f52d6e39a7075f75b1c60335aa6cab
|
|
| BLAKE2b-256 |
89ae04cd2827f71b2f9ba26703f2f6b7fb48bdf74994e0e57ec4e8890e9af454
|