An AI copilot for freelance proposals — on Upwork & Freelancer, powered by your local Claude CLI.
Drafts tailored cover letters, suggests a bid amount and delivery time in the project's own currency, and fills the form for you to review. It never submits.
Writing a strong, tailored proposal for every job is slow. Bid Pilot reads the job post, drafts a proposal in your voice, and one-click fills the form — while keeping you in control of every word and the submit button.
It runs entirely through your Claude Code CLI, so there is no API key and no per-token billing — generations are covered by your existing Claude subscription.
- Auto-detects Upwork & Freelancer job/bid pages and shows a floating action button
- One-click draft in three styles — Short, Professional, Persuasive
- Currency-aware bidding — suggests a bid + delivery time in the project's currency, within the client's budget
- Your voice — feed a profile, custom standing instructions, and past winning proposals
- Edit-then-insert — review and tweak in an editable panel; fills the form, never submits
- Zero secrets — auth lives in your local
claudelogin; the extension stores no keys and makes no network calls
- A content script detects a job page and injects the Generate Proposal button.
- On click it scrapes the title, description, skills, budget and currency — only on demand.
- The background worker builds a prompt (profile, style, custom instructions, currency rules).
- A Native Messaging host runs
claude -p --output-format jsonlocally and returns the draft. - You review/edit the proposal + bid + days in the panel, then Insert to fill the form.
- Google Chrome, Chromium, or Brave (Linux)
- Node.js on your
PATH - Claude Code CLI installed and logged in
(
echo hi | claude -pshould print a reply)
- Open
chrome://extensions(orbrave://extensions) - Enable Developer mode
- Load unpacked → select the
extension/folder
A setup page opens automatically on install (or reopen it from the popup → "Setup / fix connection"). It:
- Download installer — one file, pre-filled with this extension's ID
- Run it once — paste
bash ~/Downloads/bidpilot-install.shinto a terminal - The page turns green automatically when connected
Browsers don't allow an extension to install a native-messaging bridge itself (security), so that single downloaded command is the one unavoidable step. It drops a small Node host into
~/.bidpilotand registers it with every Chromium-based browser it finds — no repo, no manual IDs, safe to re-run.
Advanced / scripted: the repo also ships native-host/install.sh <EXTENSION_ID> [chrome|chromium|brave] if you prefer to install from the source tree directly.
Open the toolbar icon → fill in your profile, pick a default style and model, add any custom instructions → Test connection should report the host is reachable.
- Open an Upwork or Freelancer job / bid page
- Click the floating ✦ Generate Proposal button
- Switch styles, Regenerate, or edit the draft directly; adjust the bid / days
- Click Insert into form — then review and submit it yourself
| Setting | Purpose |
|---|---|
| Profile | Name, title, skills, experience — grounds the proposal |
| Default style | Short / Professional / Persuasive |
| Model | claude model (or CLI default) |
| Tone | Optional tone hint |
| Custom instructions | Standing rules applied to every proposal |
| Past winning proposals | Few-shot examples to match your voice |
extension/
manifest.json
assets/ icons + logo
src/
content/ page detect, scrape, insert, floating UI
platforms/ per-site adapters (Upwork, Freelancer)
ui/ button + proposal panel
background/ service worker + native messaging client
popup/ settings UI
shared/ storage + prompt building
setup/ in-browser guided installer (auto-opens on install)
native-host/
host.js reads stdin frames, runs the claude CLI
com.bidpilot.host.json native messaging manifest (template)
install.sh registers the host for a browser
integration-test.mjs end-to-end smoke test (no browser)
Run the end-to-end pipeline test (prompt → native host → real claude → parse) with
no browser:
node native-host/integration-test.mjsContributions are welcome — fixing platform selectors when Upwork/Freelancer change their markup, adding new platforms, or improving the prompt. The extension loads unpacked with no build step. See CONTRIBUTING.md for setup, architecture, and how to add a platform adapter.
- No auto-submit — Bid Pilot only fills fields; you click submit.
- No background scraping — the page is read only when you click Generate.
- No bulk / automation — one job, one proposal, one click.
- No secrets stored — authentication is your local
claudelogin.
- Platform DOM selectors are best-effort and may need patching when Upwork/Freelancer
change their markup — they are isolated in
extension/src/content/platforms/. - Per-machine setup: requires the
claudeCLI installed and logged in locally. - Each generation spawns the CLI (a few seconds of latency).
MIT