Spaces:
Running
Running
| 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). | |
| 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. | |
| ## 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 **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: | |
| **[UpworkProposalStrategistGuide.pdf](UpworkProposalStrategistGuide.pdf)**. | |
| ## Running locally | |
| ```bash | |
| pip install -r requirements.txt | |
| streamlit run streamlit_app.py | |
| ``` | |