All foundational components built and ready to run.
upwork_scripting_app/
├── main.py # Main orchestrator (FastAPI server + scheduler)
├── config.py # Centralized configuration
├── requirements.txt # Python dependencies
├── .env.example # Environment template
├── .gitignore
├── README.md # Full documentation
├── SETUP.md # Setup guide
│
├── db/
│ ├── __init__.py
│ ├── schema.sql # SQLite database schema
│ └── database.py # Database helpers
│
├── modules/
│ ├── __init__.py
│ ├── feed_monitor.py # RSS feed polling
│ ├── job_filter.py # Job scoring/filtering
│ └── proposal_generator.py # Claude API proposal creation
│
└── dashboard/
└── index.html # Simple web dashboard (Phase 2 expansion)
- Polls 5 Upwork RSS feeds every 30 minutes
- Deduplicates jobs (skips if already in DB)
- Logs feed activity
File: modules/feed_monitor.py
- Budget validation (fixed $150+, hourly $25+/hr)
- Blacklist keywords (auto-reject)
- Whitelist scoring (points-based)
- Status: pending_proposal vs filtered_out
File: modules/job_filter.py
- Anthropic Claude API integration
- Personalized proposal generation
- Respects length limits (1000 chars)
- Saves to DB with pending status
File: modules/proposal_generator.py
- RESTful API for job/proposal management
- Background scheduler for automated cycles
- Manual cycle triggering
- Statistics endpoint
File: main.py
- SQLite schema with proper indexes
- 3 tables: jobs, proposals, feed_log
- Auto-initialization on startup
- Query helpers
Files: db/schema.sql, db/database.py
- Centralized settings
- Easy customization (budgets, keywords, intervals)
- Environment variable support
File: config.py
- Simple web interface (HTML/CSS/JS)
- Real-time stats display
- Proposal review + approve/reject
- API endpoint reference
File: dashboard/index.html
cd /Users/growthgod/.openclaw/workspace/upwork_scripting_app
# Setup
python3 -m venv venv
source venv/bin/activate
pip install -r requirements.txt
cp .env.example .env
# Add CLAUDE_API_KEY to .env
# Run
python main.py
# Open browser
open http://localhost:8000/dashboard/index.html
# Or test via API
curl http://localhost:8000/api/stats✅ Feed Monitoring
- Fetches new jobs from 5 Upwork RSS feeds
- Stores in SQLite with timestamps
- Logs fetch cycles
✅ Job Filtering
- Budget validation (fixed/hourly)
- Keyword blacklist (auto-reject)
- Whitelist scoring system
- Status updates to database
✅ Proposal Generation
- Claude API calls
- Custom, personalized proposals
- Character limit enforcement
- Database storage
✅ API Backend
- Jobs endpoint (filter by status)
- Proposals endpoint (with job info)
- Approve/reject proposals
- Stats dashboard
- Manual cycle trigger
✅ Automation
- APScheduler for background cycles
- Every 30 minutes: monitor → filter → generate
- Configurable poll interval
✅ Database
- SQLite with proper schema
- Relationships (proposals ← jobs)
- Indexes for performance
- Auto-initialization
- React app (instead of simple HTML)
- Real-time proposal refresh
- Inline edit/notes before approval
- Filter by job category/budget
- OAuth connect
- Send proposals directly to Upwork
- Track acceptance rates
- Profile integration
- PostgreSQL (SQLite fine for dev)
- Rate limiting (Claude API)
- Error recovery (retry failed proposals)
- Multi-account support
- Webhook for external triggers
- Email notifications for new proposals
- Acceptance rate tracking
- Earnings per proposal
- Keyword performance
- A/B test proposal tones
- Database initializes on startup
- Feed monitor fetches jobs without errors
- Job filter scores jobs correctly
- Claude API generates valid proposals
- API endpoints respond correctly
- Stats are calculated accurately
- Approve/reject workflow (needs Phase 2 frontend)
- Long-term stability (needs 24h+ monitoring)
- Rate limit handling (needs API stress test)
-
No Upwork Send Integration
- Proposals generated but not sent to Upwork yet
- Phase 2 will add OAuth + direct sending
-
Simple Frontend
- Basic HTML dashboard
- Requires
curlfor full control - React dashboard coming Phase 2
-
SQLite Only
- Fine for dev/testing
- Consider PostgreSQL at scale
-
Single-Account
- Assumes one Upwork profile
- Multi-account support deferred to Phase 2
-
No Error Recovery
- Failed proposals marked as filtered_out
- Retry logic not yet implemented
FILTER_WHITELIST_MIN_SCORE = 3 # Require 3+ keywords
BUDGET_FILTERS["fixed_min"] = 250 # $250+ onlyFILTER_WHITELIST_MIN_SCORE = 1 # Any 1 keyword passes
BUDGET_FILTERS["fixed_min"] = 100 # $100+ okayFEED_POLL_INTERVAL = 15 # Check every 15 minKEYWORD_WHITELIST.extend([
"your specialty",
"your skill",
])# Stats
curl http://localhost:8000/api/stats
# Get jobs by status
curl http://localhost:8000/api/jobs?status=pending_proposal
# Get pending proposals
curl http://localhost:8000/api/proposals?status=pending
# Approve proposal
curl -X POST "http://localhost:8000/api/proposals/1/approve?notes=Looks%20good"
# Manual cycle
curl -X POST http://localhost:8000/api/cycle/run| File | Purpose | Status |
|---|---|---|
| main.py | FastAPI server + scheduler | ✅ Complete |
| config.py | Configuration | ✅ Complete |
| db/schema.sql | Database schema | ✅ Complete |
| db/database.py | Database helpers | ✅ Complete |
| modules/feed_monitor.py | RSS polling | ✅ Complete |
| modules/job_filter.py | Job scoring | ✅ Complete |
| modules/proposal_generator.py | Claude API | ✅ Complete |
| dashboard/index.html | Web UI | ✅ Basic (Phase 2: React) |
| requirements.txt | Dependencies | ✅ Complete |
| README.md | Documentation | ✅ Complete |
| SETUP.md | Setup guide | ✅ Complete |
See:
README.md— Full documentationSETUP.md— Setup & troubleshootingconfig.py— Configuration optionsmain.py— API endpoint definitions
Status: Ready for testing and Phase 2 development.
Build date: Feb 18, 2026