| name | freelance-search |
| description | Search freelance platforms and score jobs against portfolio with automated extraction, LLM scoring, and proposal drafting |
Freelance Job Search Skill
When to Use
- User mentions: "search jobs", "find gigs", "look for work", "freelance opportunities"
- Keywords: upwork, freelancer, guru, peopleperhour, twine
- User wants to discover and evaluate job opportunities
Quick Start
freelance-ops search "python django" --min-score 70
curl -X POST <http://localhost:8000/api/pipeline/run> \
-H "Content-Type: application/json" \
-d '{"query": "python django", "platforms": ["upwork", "freelancer"]}'
Workflow
1. Load Portfolio
Read portfolio from data/settings.json or prompt user to run freelance-ops init:
import json
from pathlib import Path
settings_path = Path("data/settings.json")
if settings_path.exists():
settings = json.loads(settings_path.read_text())
portfolio = settings.get("portfolio", {})
else:
print("Run: freelance-ops init")
exit(1)
2. Extract Jobs Concurrently
Use platform extractors defined in freelance_ops/extractors/:
- Upwork: API-based (
upwork_extractor.py) - requires UPWORK_API_KEY
- Freelancer: Scraping with StealthyFetcher (
freelancer_extractor.py)
- Guru: Scraping with session handling (
guru_extractor.py)
- PeoplePerHour: Pagination support (
peopleperhour_extractor.py)
- Twine: Minimal API for creative gigs (
twine_extractor.py)
3. Score with LLM
Pipeline uses FreelanceScorer from freelance_ops/pipeline/scorer.py:
- 80-100: Strong match (>70% skills overlap, relevant past projects)
- 50-79: Moderate match (transferable skills, some gaps)
- 0-49: Weak match (significant skill gaps)
Scoring prompt includes:
- Portfolio skills and past projects
- Budget compatibility
- Client rating threshold
- Job description relevance
4. Present Results
Format output as Rich table (CLI) or JSON (API):
Rank | Platform | Score | Title | Missing Skills | Rationale
─────|──────────|───────|──────────|──────────────|──────────────
1 | Upwork | 87 | Python Developer | Docker | Strong Django experience...
2 | Guru | 82 | Django Expert | React | Past project match...
Platform Quirks
See resources/platform-quirks.json for extractor-specific tips and rate limits.
Proposal Drafting
For jobs scoring >80, automatically draft proposals using:
- 2-3 most relevant past projects from portfolio
- Address missing skills with learning timeline
- Second-person language ("You/Your")
- 150-250 words in markdown format
Use the freelance-proposal skill for detailed proposal guidance.
Example Conversations
User: "Search for Python Django jobs on Upwork and Freelancer"
Assistant:
- Loads portfolio from settings
- Runs extractors concurrently for both platforms
- Scores jobs using LLM with portfolio context
- Presents top 5 results in table format
- Offers to draft proposals for scores >80
User: "Find gigs related to API development"
Assistant:
- Searches all 5 platforms simultaneously
- Deduplicates by (platform, job_id)
- Scores against portfolio
- Filters by min_score (default 50)
- Saves results to
data/results_YYYYMMDD.json
Configuration
- Min Score: Change with
--min-score flag (default: 50)
- Platforms: Modify in
data/settings.json or use --platforms flag
- Max Results: Adjust with
--max-results flag (default: 20 per platform)
Files Referenced
freelance_ops/cli.py - CLI entry point
freelance_ops/pipeline/orchestrator.py - Pipeline coordinator
freelance_ops/pipeline/scorer.py - LLM scoring logic
freelance_ops/extractors/*.py - Platform-specific extractors
data/settings.json - Portfolio and schedule config