AI proposal copilot for Upwork. Scores job fit, researches the client, flags risks, and drafts personalized proposals in the freelancer's voice.
Upwork freelancers spend hours reading jobs, evaluating fit, researching clients, and writing proposals — most of which never convert. Existing tools either auto-spam (which violates Upwork ToS and erodes profile quality) or do basic templating that does not match how good freelancers actually write. The brief was a copilot that respects platform rules and helps freelancers ship better proposals, faster.
Next.js 15
FastAPI
Postgres
pgvector
Anthropic Claude
Stripe
proposalforge
P
What I owned
Designing and building the entire stack: Next.js 15 App Router frontend with shadcn-style UI, FastAPI Python backend with SQLAlchemy 2.0 and Pydantic v2, Postgres 16 with pgvector for semantic search across job and proposal history, Anthropic Claude (Sonnet 4.6 default, Opus 4.7 for hard scoring) for fit scoring and proposal drafting, OpenAI embeddings for vector search. Stripe Checkout and Customer Portal for billing. Sentry and structlog for observability. Slowapi for per-user rate limits.
Constraints
Compliance-first — no scraping, no auto-submit, no client-impersonation messaging
Voice-matching must learn from user-supplied past proposals
Fit scoring must explain its reasoning, not just produce a number
Claude scores fit against the freelancer's profile and historical conversion data, with explanation.
03
Client research
Public-signal research (no scraping) summarized into actionable risk flags.
04
Voice-aligned drafting
Proposal drafted in the freelancer's voice using their past-proposal corpus as in-context examples.
05
Manual review
User reviews, edits, and submits on the source platform manually.
Approach
Compliance was the architectural constraint that drove everything else: no scraping forced public-signal research only; no auto-submit kept the freelancer in the loop; no impersonation forced voice-alignment to be a feature, not a workaround. The technical decisions (Claude for reasoning, embeddings for similarity, Postgres + pgvector for storage) came after.
Deliverables
Next.js 15 frontend with shadcn-style UI
FastAPI Python backend with SQLAlchemy 2.0
Postgres + pgvector for semantic proposal search
Anthropic Claude integration for scoring and drafting
Stripe Checkout, Customer Portal, and webhooks
Per-user rate limiting and cost control
Sentry observability and structured logging
Outcomes
Active development in private alpha
Compliance-first architecture documented and enforced
Multi-model routing (Sonnet default, Opus for hard scoring) controls cost
Voice-alignment quality validated against held-out proposals