UpMatch wins Upwork jobs while freelancers sleep. It watches the job feed, scores every new posting against each freelancer's profile, and submits a personalized, AI-written proposal within about 5 minutes of the job going live, which is the window where proposals actually get read.
Live in production. 90 paying freelancers, $40-50K MRR, one engineer. It's a client's product.
Where it started
Before the app, the founder's team was bidding by hand. The customers were already there; the bottleneck was hours in the day. I built the platform from an empty repository, and they brought the whole operation onto it, same team, same customer book, now spending their time on the work the software can't do. Getting a live business to actually move onto new software is the part that usually fails, and it's the part I'd point at first.
How it works
- Ingestion: polls Upwork every minute, per tenant, around the clock.
- Scoring: each job is rated against the freelancer's profile (skill match, budget, location, client history). Threshold crossed → bid triggered.
- Bidding bot: secure session handling for customer Upwork accounts, headless browser automation, AI-generated personalized proposals.
- Dashboard: React + TypeScript client portal with the proposal pipeline, response analytics, and account configuration. Multi-tenant by design.
Owning the engineering
I architected and run the platform: front-end, Node.js back-end, PostgreSQL on RDS, AWS serverless infrastructure (Lambda, API Gateway, CloudFront, S3) managed with Terraform, GitHub Actions CI/CD, and CloudWatch monitoring and alerting. LLM orchestration uses Claude and ChatGPT for proposal generation.
