UpworkAutomation / README.md
ananyajoshi's picture
Refine proposals with natural structure and grounded concise writing
fcde103
|
Raw History Blame Contribute Delete
4.13 kB
metadata
title: Upwork Proposal Strategist
emoji: 🧭
colorFrom: indigo
colorTo: purple
sdk: docker
app_port: 8501
tags:
  - streamlit
pinned: false
short_description: Analyze Upwork job fit and draft grounded proposals.

Upwork Proposal Strategist

A web app that helps you write better Upwork proposals, faster.

It looks at an Upwork job, compares it to your own work files, tells you whether it's worth applying, and writes a first draft of your proposal — using only true facts from your files.

How it works

The app walks you through five steps in the left sidebar:

  1. Setup — choose your AI provider and paste your API key.
  2. Dossier — upload your work files (portfolio, résumé, testimonials, past proposals). No files? Choose Interview me instead and answer guided questions about your work. Your answers are saved exactly as you type them and become the same profile evidence a folder would give.
  3. Job Screenshot — upload or paste a picture of the Upwork job.
  4. Analysis — see the verdict (🟢 Apply / 🟡 Caution / 🔴 Do Not Proceed), strengths, and concerns.
  5. Proposal — get a ready-to-copy proposal draft.

Proposal writing and refinement

The writer now uses a flexible, job-specific structure instead of mandatory pain paragraphs, numbered steps and promised metrics. It revises for factual support, relevance and natural voice before the separate fact-check. Small jobs target 150-250 words, standard jobs 250-400 and complex jobs 350-550; shorter complete answers are allowed when there is less to say. Screening answers stay separate and are checked individually.

Timelines, prices, availability and measured results must be supported by the freelancer's facts. The verifier preserves the voice and repairs wording around removed claims instead of adding vague achievement language. Final cleanup also applies to the checked text used for copy and download. Review the final draft and any verification warnings before sending.

These writing rules supersede the older length bands and fixed five-part structure in the PDF handoff. See the refinement notes for validation and maintenance details.

Your API key & privacy

  • Bring your own key. Each visitor enters their own provider API key (OpenAI, Anthropic, Gemini, or Groq) on the Setup page.
  • Your key is stored encrypted, remembered on your device. So you don't re-enter it each visit, the key is saved encrypted (Fernet) using a secret derived from a random, invisible per-browser tag. The storage backend (Supabase) only ever holds ciphertext; the tag is never sent to it, so one visitor's key can't be read with another's tag, and the key is never put in the server environment. Use Clear Credentials to remove it. If key storage isn't configured, the app falls back to session-only (re-enter each visit).
  • Your files are session-only. Uploaded dossier files are processed in a temporary, per-session location and are not persisted on the server.
  • Only a small, relevance-filtered slice of your text is ever sent to the AI provider you chose.
  • The guided interview uses the same API by default. The AI checks that each answer fits its question and asks a follow-up when a detail is missing. To keep those calls off your main API, add an optional free Groq key (on the Setup page, or on the interview screen itself). If no API works, the interview still runs with basic checks.

⚠️ The Job Screenshot step needs a vision-capable provider — use OpenAI, Anthropic, or Gemini. Groq cannot read images.

Step-by-step user guide

A complete, click-by-click walkthrough is included in this repo: UpworkAutomation_ProposalRules_Handoff.pdf.

Running locally

pip install -r requirements.txt
streamlit run streamlit_app.py

Optional, in a local .env file (never committed): GROQ_API_KEY gives the interview its own Groq key, and INTERVIEW_MODEL overrides its Groq model (default openai/gpt-oss-120b).