内容
# Upwork job monitor — routine template
A [Claude Code routine](https://claude.ai/code/routines) (a scheduled cloud agent) that checks
Upwork for new postings matching your profile every hour, scores each one for fit, drafts a
proposal opening, and sends you a Telegram message. It never submits anything to Upwork or Claude
Cloud — proposals are always sent by you, manually.
This is a **template**: fork it, connect your own Upwork account and Telegram bot, and run your
own copy. Everyone runs it on their own Claude subscription and their own Upwork connector —
there's no shared server or account involved.
**Setup guide:** [docs/SETUP.md](docs/SETUP.md) (English) · [docs/SETUP.ru.md](docs/SETUP.ru.md)
(Русский)
## Files
- `ROUTINE_PROMPT.md` — the exact prompt to paste into your routine. Generic on purpose — no
names, search terms, or credentials — so you can use it unmodified.
- `profile.md` — preferences Upwork's API has no way of knowing (what to avoid, tone, overrides).
Skills, rate, and portfolio are pulled live from your Upwork profile via the connector on every
run, so you don't duplicate them here. Edit this to change what the routine looks for and how
it writes.
There's no app code here on purpose — the routine's logic lives in `ROUTINE_PROMPT.md`, configured
via the Claude Code routines UI/API on your own account. This repo exists so your routine has
somewhere to read `profile.md` from.
Job IDs already alerted on are tracked in a **pinned Telegram message** in your bot chat, not in
this repo — see "How it works" below. Earlier versions of this template used a `seen_jobs.json`
file committed back to `main` on every run, but overlapping runs racing to commit that file could
cause the same job to be alerted on twice; a single pinned message removes that race.
## How it works
1. Routine fires hourly → clones your fork fresh from `main`
2. Reads `profile.md`
3. Reads the pinned "SEEN_JOBS_STATE" message in your Telegram chat for job IDs already alerted on
4. Uses your Upwork MCP connector to fetch matching postings
5. Filters out anything already in that pinned message
6. For each genuinely new job: scores fit (0-100) and drafts a proposal opening
7. Sends you a Telegram message per new job
8. Edits the pinned state message with the new job IDs appended (creating and pinning it on the
very first run)
## Requirements
- A Claude subscription with [Routines](https://claude.ai/code/routines) access.
- An Upwork account (freelancer profile), connected via Claude's Upwork MCP connector.
- A Telegram bot and chat ID to receive alerts.
See the setup guide for step-by-step instructions.