# dutyfreeprofessor — brief

> Project genesis: what this is, who it is for, why it exists. Tier 1, always loaded; kept
> under forty lines. The NOW block is the only part that changes, and `/checkpoint` rewrites it.

## NOW
<!-- rewritten by /checkpoint -->
- **Phase:** brand pass two (coral default with the accent picker, small flags, eight switchable sponsor placements, skincare and confectionery hidden) live on production 2026-09-11 night; the first production collection ran that night; production is live: dutyfreeprofessor.com serves 0.35.0 from the droplet `bwlive` since 2026-09-11, behind the app's own sign-in (members-only); staging on demoing.info is now the dev copy. Stream E's E1 to E6 done; E7's second pass waits for the flip to public (`.logs/planning/streams/E-infrastructure.md`, `main/docs/RUNBOOK.md` Production).
- **Accepted scope:** the launch quote Adam approved on 2026-09-03; the lines are on `/quote`.
- **Deadline:** soft launch 2026-09-18, one week before Cannes (2026-09-27).
- **Live version:** 0.46.0 on staging (the department menu, the header, search, the trip savings, the articles section, the sponsor placements, airports in two places, the launch footer, the airport guide and template); production serves 0.35.0 until its next deploy
- **Public airports:** the nineteen (ATH BCN BOG CDG DUB DXB EZE HKG ICN JFK LHR MAD MEX PTY SAL SIN YUL YYZ ZRH; `python -m app.cli locations`), switched on 2026-09-11 behind the sign-in; KEF, SYD and the two catalogues stay hidden.
- **Crawl window on production (11 Sep):** while `.logs/runs/window-2026-09-11-night-refresh.md` is open, NO production deploy and NO schema migration; staging work is free. `deploy/production.sh` refuses while a collection runs.
- **Next milestone:** rian away: Stream R2 is complete on the worktree branch `claude/stream-r2-fca074` (discussions on the Interaction Standard, the staging refresh, the page consolidation, the running list's archive, the bell, attachments, mail wired and inert), waiting on rian's merge, deploy and `backfill threads` (`.logs/handoff.md`); `/stream-m` and `/stream-g` in wave one, then wave two (R3, A after M, W), all staging only, per `.logs/planning/streams/AWAY-PLAN.md`; on return, the review item on the running list; on go-live day, E7's second pass.

## What
**Duty Free Professor (DFP)**: a duty-free price comparison site for travellers. Collectors
read airport retailers' public listing pages and store timestamped price observations;
the site compares them across the shopper's chosen airports and badges products with
competition medals from Adam's award network. Legal posture and collector rules:
`main/docs/COLLECTORS.md`. Decisions: build plan §9. Open questions and issues: the running list (`main/scripts/items.py list`; `/plan` → Issues and to-dos).

## Who
- Owner and builder: rian. Client: Adam Levy, who also owns the competition multisite
  (`/srv/apps/apnetwork/`) and the Professor publishing network on WordPress.
- Reviewer for site structure and SEO: Mark (comments on `/structure`).

## Why
The AI-first custom-app work rian wants to be doing, with a differentiator nobody else
has: a decade of Adam's competition data (winners, medals) to join onto live prices. The
long game is folding the publishing and competition networks into this app ecosystem.

## Domain and stack
- Dev: <https://dutyfreeprofessor.demoing.info> (shared-password gate). Production host: build plan §10.
- React SPA + FastAPI + Postgres (`/srv/projects/standards/react.md`). One Python process
  serves the API and the built SPA; collectors are plain Python behind a swappable fetch
  port. Dev loop and deploy: `main/docs/RUNBOOK.md`.

## Not doing
- WordPress theme redesigns or new WordPress features for Adam's networks (support only).
- Anything that logs in to a retailer, accepts its terms, or rehosts its imagery or copy.
