Auto-extracts job data · Scores your profile · Writes proposals · Coaches your replies
Bring your own API key — developer hosts nothing, pays nothing.
| 🔍 Profile Analysis | 💼 Job Evaluation | 📝 Auto Proposals | 💬 Reply Coaching |
|---|---|---|---|
| Score title & bio | Apply or Skip | Generated on high score | Sales tactics for clients |
| Feature | Where it runs | What it gives you |
|---|---|---|
| Profile Optimizer | upwork.com/freelancers/* |
Scores title & bio, finds issues, suggests rewrites |
| Job Evaluator | upwork.com/jobs/* |
Apply / Skip decision with score, green/red flags, proposal tips |
| Auto Proposal | upwork.com/jobs/* |
Generates a tailored proposal when job score is high enough |
| Conversion Coach | upwork.com/messages/* |
Suggests replies to client messages with tactics |
| Title Generator | Extension popup | 5 AI-optimized profile title variants |
| Job Evaluation — Panel | Job Evaluation — Results |
![]() |
![]() |
| Job — Score & Flags | Profile Evaluation — Open |
![]() |
![]() |
| Profile — Scores | Profile — Suggestions |
![]() |
![]() |
| Profile — Titles | Extension Icon |
![]() |
Chrome Extension (MV3)
│
├── content/profile.js ← runs on upwork.com/freelancers/*
├── content/job.js ← runs on upwork.com/jobs/*
├── content/messages.js ← runs on upwork.com/messages/*
└── background.js ← service worker, routes API calls
│
│ HTTPS (BYOK: X-API-Key header)
▼
FastAPI Backend (HuggingFace Spaces — Docker)
│
├── /profile/analyze
├── /job/evaluate
├── /proposal/generate
├── /tools/generate-titles
└── /tools/conversion-coach
│
├── Groq (free) — llama-3.3-70b-versatile
├── Mistral — mistral-small-latest
└── Claude — claude-haiku-4-5
The backend is a Docker app. HuggingFace Spaces hosts it for free — no credit card needed.
- Go to huggingface.co and sign in (or create a free account)
- Click New Space
- Fill in:
- Space name:
upwork-optimizer-api(or any name you want) - SDK:
Docker - Visibility:
Public
- Space name:
- Click Create Space
- Go to Settings → Access Tokens
- Click New Token → choose Write permission
- Copy the token — you'll need it next
# Clone the repo
git clone https://github.com/YOUR_USERNAME/upwork-optimizer.git
cd upwork-optimizer
# Add HuggingFace as a remote
git remote add hf https://YOUR_HF_USERNAME:YOUR_HF_TOKEN@huggingface.co/spaces/YOUR_HF_USERNAME/upwork-optimizer-api
# Push
git push hf mainReplace
YOUR_HF_USERNAMEandYOUR_HF_TOKENwith your actual values.
- Go to your Space page on HuggingFace
- Click the Logs tab and watch the Docker build
- When it shows Running, your API is live at:
https://YOUR_HF_USERNAME-upwork-optimizer-api.hf.space
Open extension/background.js and change line 1:
// Before
const API_BASE = "https://hizardev-upwork-optimizer-api.hf.space";
// After
const API_BASE = "https://YOUR_HF_USERNAME-upwork-optimizer-api.hf.space";Note: HuggingFace free Spaces sleep after ~15 minutes of inactivity. The first request after sleep takes ~20-30 seconds to wake up — this is normal.
Pick one provider and get a free or paid key:
| Provider | Cost | Get Key |
|---|---|---|
| Groq | Free | console.groq.com/keys |
| Mistral | Paid | console.mistral.ai/api-keys |
| Claude | Paid | console.anthropic.com/settings/keys |
Groq is recommended for free usage — it's fast and the quota is generous.
- Open Chrome and go to
chrome://extensions - Enable Developer mode (toggle in top-right)
- Click Load unpacked
- Select the
extension/folder from this repo - The ⚡ icon will appear in your Chrome toolbar
- Click the ⚡ icon in the toolbar
- Select your provider (Groq / Mistral / Claude)
- Paste your API key
- Click Save
- Click Test Connection to verify it works
- Open any Upwork job listing
- Click the ⚡ EVALUATE button (bottom-right of the page)
- The panel opens and auto-fills the job title and description
- If auto-fill fails, paste manually into the text fields
- Click Evaluate This Job
- You'll get:
- APPLY / SKIP recommendation with a score out of 10
- Green flags (good signs) and red flags (risks)
- Proposal writing tips
- If the job scores high enough — a full proposal is auto-generated
- Open your Upwork profile
- Click the ⚡ OPTIMIZE button
- The panel auto-fills your title and bio
- Click Analyze My Profile
- You'll get:
- Scores for Title Clarity, Bio Hook, Positioning, Simplicity, and Overall
- Specific issues found
- Actionable improvement steps
- A rewritten title suggestion
- A stronger bio opening
- 5 alternative title variants with explanations
- Open any Upwork conversation
- Click the ⚡ REPLY button
- The panel tries to auto-detect the last client message
- If not detected, paste the message manually
- Optionally add context about the job
- Click Get Reply Suggestion
- You'll get a suggested reply + the sales tactic used + what to avoid
All endpoints accept POST requests with Content-Type: application/json and require the X-API-Key header.
{
"title": "Your Upwork profile title",
"bio": "Your full bio/overview text",
"model": "groq"
}{
"job_title": "Job title",
"job_description": "Full job description",
"client_rating": 4.9,
"client_country": "United States",
"hire_rate": 80,
"total_spent": "$10K",
"proposals_count": 15,
"model": "groq"
}{
"job_title": "Job title",
"job_description": "Full job description",
"freelancer_niche": "Flutter developer specializing in AI apps",
"model": "groq"
}{
"skills": "Flutter, Firebase, AI integration",
"target_clients": "startups and product companies",
"current_title": "Flutter Developer",
"model": "groq"
}{
"client_message": "What's your rate for this?",
"context": "Mobile app project, 3 months timeline",
"model": "groq"
}| Model | Provider | model value |
Notes |
|---|---|---|---|
| LLaMA 3.3 70B | Groq | groq |
Free tier available |
| Mistral Small | Mistral | mistral |
Fast, affordable |
| Claude Haiku | Anthropic | claude |
High quality |
# Clone and install
git clone https://github.com/YOUR_USERNAME/upwork-optimizer.git
cd upwork-optimizer
pip install -r requirements.txt
# Create .env with your keys (optional — extension sends keys via header)
cp .env.example .env
# Run
uvicorn app.main:app --reload --port 8000API docs available at http://localhost:8000/docs
upwork-optimizer/
├── app/
│ ├── main.py
│ ├── core/
│ │ ├── config.py # Settings / env vars
│ │ ├── dependencies.py # BYOK header dependency
│ │ └── parsing.py # LLM JSON parser
│ ├── models/
│ │ └── schemas.py # Pydantic request/response models
│ ├── routers/
│ │ ├── profile.py
│ │ ├── job.py
│ │ ├── proposal.py
│ │ └── tools.py
│ └── services/
│ ├── llm_router.py # Claude / Mistral / Groq routing
│ ├── document_loader.py # Playbook chapter loader
│ ├── profile_service.py
│ ├── job_service.py
│ ├── proposal_service.py
│ └── tools_service.py
├── extension/
│ ├── manifest.json
│ ├── background.js
│ ├── content/
│ │ ├── profile.js
│ │ ├── job.js
│ │ └── messages.js
│ ├── popup/
│ │ ├── settings.html
│ │ ├── settings.css
│ │ └── settings.js
│ └── sidebar/
│ └── sidebar.css
├── Docs/
│ └── upwork_complete_playbook.docx
├── screenshot/
├── Dockerfile
├── requirements.txt
└── README.md
Chrome extensions aren't installable from a
.exe— users load a ZIP. Here's how to create and share a proper release on GitHub.
Windows (PowerShell):
Compress-Archive -Path "extension\*" -DestinationPath "upwork-optimizer-extension-v1.0.0.zip"Mac / Linux:
cd extension
zip -r ../upwork-optimizer-extension-v1.0.0.zip . -x "*.DS_Store"- Push your latest code to GitHub
- Go to your repo → Releases → Draft a new release
- Click Choose a tag → type
v1.0.0→ Create new tag - Set title:
v1.0.0 — Initial Release - Write release notes (what it does, what's new)
- Under Assets, drag and drop the
.zipfile you created - Click Publish release
Share the GitHub release link. Users do:
- Download
upwork-optimizer-extension-v1.0.0.zipfrom the release - Unzip it to a folder on their computer
- Open Chrome →
chrome://extensions - Enable Developer mode (top-right toggle)
- Click Load unpacked → select the unzipped folder
- Done — extension is installed






