# 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](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](https://github.com/feder-cr/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