File size: 2,350 Bytes
78536a8
6303ae6
 
 
 
78536a8
 
 
1feecbf
78536a8
6303ae6
78536a8
 
6303ae6
78536a8
6303ae6
78536a8
6303ae6
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
be469a4
 
 
 
 
 
 
 
6303ae6
 
 
 
 
 
 
 
607beb5
 
 
b352c26
6303ae6
607beb5
6303ae6
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
---
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
```