An AI-assisted opportunity pipeline for solo developers to discover freelance leads, score them against their skill set, and draft responses faster—with manual review always in control.
What it does: Discovers opportunities from job boards and Freelancer, scores them against your profile, extracts deal signals, stores everything in SQLite, generates AI drafts, and provides a dashboard to manage the workflow.
What it doesn't do: Auto-submit bids, auto-send proposals, or authenticate without explicit setup.
| Feature | Details |
|---|---|
| Discovery | ATS sources, Freelancer marketplace, public search (Google, Tavily, etc.) |
| Scoring | Services match, preferred stack, budget floor, source quality |
| Signals | Listing type, bid counts, budget text, client quality hints |
| Storage | SQLite: opportunities, drafts, feedback, runs, source-quality stats |
| Drafting | Claude (Anthropic), OpenAI, templates, or custom CLI/MCP commands |
| Dashboard | Filter, score, bookmark, regenerate drafts, assign feedback labels |
uv sync # or: pip install -r requirements.txt
python main.py profile init # creates skill_profile.jsonEdit these key sections:
target_services– your offeringspreferred_stack– tech preferencesmin_budget_usd– minimum budgetexcluded_keywords– reject termssource_settings.freelance– Freelancer-specific filtersdrafting.provider–template,anthropic,openai, ormcp_command
# Search providers (pick what you need)
export GOOGLE_CSE_API_KEY=your_key
export GOOGLE_CSE_ID=your_id
export TAVILY_API_KEY=your_key
export OPENAI_API_KEY=your_key
export ANTHROPIC_API_KEY=your_keypython main.py discover run-once --provider google
python main.py dashboard # opens UI at localhostpython main.py discover run-once [--provider google] # one-shot discovery
python main.py discover watch --interval-minutes 30 # continuous watch
python main.py discover smoke-test --provider google # validate setup
python main.py profile init/show # manage profile
python main.py draft generate --opportunity-id 1 # regenerate draft
python main.py feedback labels/set # track outcomes
python main.py dashboard # operator UITemplate (no API needed):
{"drafting": {"provider": "template"}}Claude or OpenAI:
{"drafting": {"provider": "anthropic"}} // or "openai"Custom CLI/MCP:
{
"drafting": {
"provider": "mcp_command",
"providers": {
"mcp_command": {
"type": "command",
"command": ["your-cli-here"],
"payload_mode": "json-stdin"
}
}
}
}External commands receive JSON on stdin (prompt, opportunity, skill profile) and can return raw text or {"content": "...", "rationale": "..."}.
{
"target_services": ["Python automation", "API development"],
"preferred_stack": ["Python", "FastAPI"],
"min_budget_usd": 500,
"excluded_keywords": ["contest", "logo design"],
"source_settings": {
"freelance": {
"focus_sources": ["freelancer", "upwork"],
"preferred_listing_types": ["project", "fixed"],
"max_bid_count": 20,
"auth_mode": "public"
}
},
"feedback": {
"allowed_labels": ["won", "lost", "ignored", "applied"],
"positive_labels": ["won"],
"negative_labels": ["lost"]
},
"drafting": {"provider": "anthropic"}
}SQLite stores: opportunities, drafts, runs, skill_profile_versions, opportunity_feedback, source_quality_stats
Key modules:
src/source_adapters.py– discovery from ATS and Freelancersrc/discovery_service.py– orchestration, deduping, scoringsrc/opportunity_store.py– SQLite persistencesrc/opportunity_scorer.py– skill-fit and source-quality scoringsrc/ai_drafting.py– provider integrationsdashboard.py– Flask operator UI
Benefits: Idempotent rediscovery, draft history, feedback-driven learning, quality tracking per provider/platform.
Run tests:
pytest -qProvider APIs:
- OpenAI: Responses API
- Claude: Anthropic Messages API
- Tavily: Semantic search
- Google CSE: Custom search engine
For issues, see /help or report at https://github.com/anthropics/claude-code/issues