Automated monitoring of Codeur.com freelance project postings. Detects new projects via RSS, filters by budget, generates AI-personalized responses with GPT-4o-mini, and sends Discord notifications with ready-to-paste messages.
RSS Feed (30s polling)
→ Budget Filter (5 French formats)
→ Project Page Scraper (full description)
→ AI Response Generator (GPT-4o-mini)
→ Discord Notification with @mention ping
- RSS Monitoring — Polls
codeur.com/projects?format=rssevery 30 seconds - Budget Filtering — Parses French budget formats and filters by configurable minimum
- Deduplication — SQLite database prevents processing the same project twice
- Full Scraping — Fetches the complete project description via authenticated session
- AI Response — GPT-4o-mini generates a personalized paragraph citing relevant portfolio projects
- Discord Alert — Rich embed with project details + full response message ready to copy-paste, with optional @mention ping
cp .env.example .env
cp profile.example.py profile.py
# Edit .env with your credentials
# Edit profile.py with your name, portfolio, and prompts
docker compose up -dpython -m venv venv
source venv/bin/activate
pip install -r requirements.txt
cp .env.example .env
cp profile.example.py profile.py
# Edit .env with your credentials
# Edit profile.py with your name, portfolio, and prompts
python main.pyCopy .env.example to .env and fill in your credentials:
| Variable | Description | Required |
|---|---|---|
CODEUR_SESSION_COOKIE |
Session cookies from Codeur.com (browser DevTools) | Yes |
DISCORD_WEBHOOK_URL |
Discord webhook URL for notifications | Yes |
DISCORD_USER_ID |
Your Discord user ID for @mention pings | No |
OPENAI_API_KEY |
OpenAI API key for GPT-4o-mini | Yes |
MIN_BUDGET |
Minimum budget threshold in euros (default: 200) |
No |
ACCEPT_UNDER_500 |
Accept "Moins de 500 EUR" projects (default: true) |
No |
ACCEPT_QUOTE_REQUEST |
Accept "Demande de devis" projects (default: true) |
No |
CHECK_INTERVAL_SECONDS |
Polling interval in seconds (default: 30) |
No |
Copy profile.example.py to profile.py and customize with your:
- Name and title
- Portfolio projects (name, description, URL, stack, domains)
- AI system prompt (matching rules for your projects)
- Response template (the message you want to copy-paste)
This file is gitignored to keep your personal info private.
- Log into codeur.com
- Open browser DevTools (F12) → Application → Cookies
- Copy the values of
__codeur_session_production,remember_user_token, andoffer_user_token - Format:
__codeur_session_production=...; remember_user_token=...; offer_user_token=...
- Open Discord → Settings → Advanced → Enable Developer Mode
- Right-click your username → Copy User ID
| Format | Example | Behavior |
|---|---|---|
| Under | Moins de 500 € |
Configurable via ACCEPT_UNDER_500 |
| Range | 500 € à 1 000 € |
Always accepted |
| Range | 1 000 € à 10 000 € |
Always accepted |
| Above | 10 000 € et plus |
Always accepted |
| Quote | Demande de devis |
Configurable via ACCEPT_QUOTE_REQUEST |
French number formatting with non-breaking spaces (1 000) is handled automatically.
codeur-auto-responder/
├── main.py # Entry point + scheduler loop
├── config.py # Environment configuration loader
├── profile.example.py # Profile template (copy to profile.py)
├── models.py # Data models (Project, Budget, etc.)
├── database.py # SQLite deduplication + status tracking
├── rss_fetcher.py # RSS feed parsing
├── budget_filter.py # Budget format parsing + filtering
├── project_scraper.py # Authenticated project page scraper
├── ai_responder.py # GPT-4o-mini response generation
├── discord_notifier.py # Discord webhook notifications + @mention
├── Dockerfile
├── docker-compose.yml
├── requirements.txt
├── tests/ # 79 tests
│ ├── conftest.py
│ ├── test_budget_filter.py
│ ├── test_rss_fetcher.py
│ ├── test_discord_notifier.py
│ ├── test_project_scraper.py
│ ├── test_ai_responder.py
│ └── test_integration.py
└── fixtures/
└── sample_rss.xml
python -m pytest tests/ -vEach notification includes:
- @mention ping (if
DISCORD_USER_IDis configured) - Project title with link
- Budget, categories, and publication date
- Truncated description
- Full response message ready to copy-paste on Codeur.com
The generated response stays under 1000 characters and includes:
- Personalized AI paragraph citing the most relevant portfolio project
- Portfolio links
- Availability and accompaniment statement
- Python 3.12
- feedparser — RSS parsing
- httpx — HTTP client
- BeautifulSoup4 — HTML parsing
- OpenAI — GPT-4o-mini API
- schedule — Job scheduling
- SQLite — Project deduplication
- Docker — Containerized deployment
MIT