# Demo runbook The demo uses local PostgreSQL plus the same shared export contract as production. It never writes source prices, sellers, availability, or reviews to the public catalog. ## 1. Start local ingestion ```bash cp ingestion/.env.example ingestion/.env ``` Set real local passwords in `ingestion/.env`, then use five product requests per source for the demonstration: ```bash INGESTION_PRODUCT_DAILY_BUDGET=5 \ INGESTION_FETCH_DELAY_MIN_MS=5000 \ INGESTION_FETCH_DELAY_MAX_MS=5000 \ docker compose --env-file ingestion/.env -f ingestion/docker-compose.yml up -d --build ``` Follow the worker until the category and product jobs settle: ```bash docker compose --env-file ingestion/.env -f ingestion/docker-compose.yml logs -f ingestion-worker ``` For a five-card demo, the worker fetches five product cards and marks the rest of the discovered category candidates as `rate_limited` for that budget day. If MVideo is configured and replies with a CAPTCHA/403/429, it remains paused and visible in the queue; do not retry it through a browser or proxy. ## 2. Moderate and export Open `http://127.0.0.1:4101/admin`, authenticate with the values from `ingestion/.env`, choose **Products**, inspect the source URLs, raw technical characteristics, normalized values, and any conflicts. Edit the canonical model or canonical name where needed, approve the cards intended for the demo, then publish the approved export: ```bash docker compose --env-file ingestion/.env -f ingestion/docker-compose.yml run --rm ingestion-worker \ npm run ingestion:export-catalog ``` The artifacts appear under `data/catalog-exports/`: - `manifest.json` - `artifacts//catalog.json` ## 3. Start the web catalog ```bash DASHCAM_CATALOG_EXPORT_DIR="$PWD/data/catalog-exports" npm run dev ``` Open `http://localhost:3000`. The root page reads and validates the shared catalog at request time, displays approved cards, normalized specs, and links back to every source card. ## 4. Final checks ```bash npm test npm run typecheck npm run build curl -fsS http://localhost:3000/health/ready curl -u "$INGESTION_ADMIN_USERNAME:$INGESTION_ADMIN_PASSWORD" \ http://127.0.0.1:4101/admin/api/queue ```