3.7 KiB
3.7 KiB
Backlog
Epic: Automated Airbnb Event Pricing
Story 1: Event Data Ingestion
As a host, I want to fetch upcoming Toronto events from public APIs so I can identify dates with high accommodation demand.
| Task | Status | Notes |
|---|---|---|
| 1.1 Integrate Ticketmaster Discovery API | Done | src/providers/ticketmaster.py, major-venue filter |
| 1.2 Integrate SeatGeek API | Done | src/providers/seatgeek.py, score threshold |
| 1.3 Normalize events to common model | Done | NormalizedEvent in src/models.py |
| 1.4 Deduplicate events across providers | Done | src/dedup.py — date + fuzzy venue + fuzzy name |
Story 2: Telegram Notification System
As a host, I want to receive a Telegram message containing the flagged dates so I can review findings before automated pricing kicks in.
| Task | Status | Notes |
|---|---|---|
| 2.1 Build Telegram bot alerter | Done | src/notifications/telegram.py (httpx, Bot API) |
| 2.2 Format message with grouped dates | Done | MarkdownV2, grouped by date |
Story 3: Browser Automation (Playwright)
As a host, I want a script to log into Airbnb and change prices on specific dates so I don't have to do it manually.
| Task | Status | Notes |
|---|---|---|
| 3.1 Handle authentication & session state | Done | src/airbnb/auth.py, scripts/airbnb_login.py |
| 3.2 Automate calendar UI updates | Done | src/airbnb/calendar.py (selectors need live verification) |
| 3.3 Add retry/fallback on UI failure | Done | Retries in update_price; runner skips dates on failure |
Story 4: Scoring & Filtering
As a host, I want events scored by likely pricing impact so I only adjust prices for meaningful demand drivers.
| Task | Status | Notes |
|---|---|---|
| 4.1 Define venue size/type scoring rules | Done | src/scoring/impact.py (VENUE_CAPACITY) |
| 4.2 Filter by date window (lookahead) | Done | filter_by_window in src/main.py, lookahead_days in config |
Story 5: Orchestration & Deployment
As a developer, I want to orchestrate the pipeline and deploy via Docker on cron.
| Task | Status | Notes |
|---|---|---|
| 5.1 Main CLI runner with modes | Done | src/main.py — --dry-run, --alerts-only, full |
| 5.2 Dockerfile for Playwright | Done | Dockerfile (Chromium + deps) |
| 5.3 Cron configuration guide | Done | See README.md |
| 5.4 Deploy on automationlab | Done | /opt/atanyrate, ansible make deploy-atanyrate |
| 5.5 Secrets in Ansible vault | Done | vault_atanyrate_* keys |
Outstanding (continue here)
| Priority | Task | Status | Notes |
|---|---|---|---|
| P0 | Refresh Airbnb state.json |
Blocked (manual) | April session on server; price panel timed out — re-run airbnb_login.py on Mac |
| P1 | Verify calendar price update E2E | In progress | Calendar loads; PriceInput-basePrice not appearing — UI or stale session |
| P2 | Optional stealth browser | Done (code) | AIRBNB_STEALTH=1 + invisible_playwright; try if Airbnb blocks Chromium |
| P2 | Push repo changes to Gitea | Todo | calendar.py, auth, browser.py, main.py |
| P3 | SeatGeek client ID on server | Done | Both providers 200 OK |
| P3 | Beszel agent on automationlab | Todo | ansible beszel-install-agents.sh |
| P3 | Dedicated Docker LXC | Deferred | Only if isolation/disk allows |
| P3 | Tune MIN_ALERT_SCORE / scoring |
Todo | Observe real Telegram alerts first |
Future ideas (not scheduled)
- Eventbrite integration
- PredictHQ integration (paid, but powerful)
- Web scraping fallback for niche events
- Historical price tracking (SQLite)
- Multi-listing support
- Smarter pricing model (base + multiplier per event score)
- Slack/Discord notification channel
- Dashboard/web UI