Upwork Automation
A private Upwork automation system that finds jobs, verifies clients, scores fit, writes and improves proposals, and tracks everything on a read-only dashboard. Every client-facing action waits for a typed human approval.

01 — The Problem
The Problem
Winning work on Upwork meant reading hundreds of listings, checking whether each client was real, and writing a tailored proposal by hand. Full automation was not an option: a bad send wastes Connects and can put the account at risk.
02 — The Solution
The Solution
Built a three-layer system. A rules layer gives the LLM agents written doctrine for job gates, fit scoring, the proposal writer and humanizer, and the approval grammar. An enforcement layer of 14 stdlib-only Python guards runs scoring, injection and scam scanning, a contact-info firewall, a Connects budget, a letter-overlap check and a hash-chained ledger. A Next.js 15 + React 19 dashboard reads a Neon mirror and cannot submit proposals or spend Connects; client-facing writes need a typed approval such as APPROVE <preview_id>.
03 — Tech Stack
Tech Stack
- Python
- LLM agents
- Next.js 15
- React 19
- Neon Postgres
04 — Results & Impact
Results & Impact
Turns job discovery, client verification and proposal drafting into a reviewed queue while keeping a human on every outbound message.
My role Architecture and engineering of the agents, guard layer and dashboard. Private client work: no public link or source.