Product backlog
Ideas we have agreed to explore but have not shipped yet. When work starts it moves to our dev changelog; when it ships it appears in release notes.
Account & engagement
- User accounts — Optional login to persist saved events, home town / radius, and hearts across devices. On first sign-in, merge the anonymous `the860_harted` cookie into the account. Scope auth provider (magic link vs OAuth) when there is enough traction to justify it. *(Hearts ship cookie-only today.)*
---
Site / public
- Venue image gallery (curated hero + logo) — Today `Location` only stores `logoUrl`; `/venues` card photos are borrowed from the best upcoming event image. Add first-class venue assets: `Location.imageUrl` (listing hero), optional gallery, admin upload; prefer stored hero in `publicLocationImage` / venue cards.
- Event detail ↔ curated Location — When a `Location` exists for the venue, detail pages should use curated logo/links (not scrape-only venue box). Align “More at this venue” copy with “More in Town” pattern. *(Webster / PRADABAG triage Jun 2026.)*
- Listing vs detail hero consistency — When detail fetch has real art but listing card used a placeholder, prefer detail image on publish and on cards after recrawl.
- Homepage events SSR — Initial preset carousel is SSR (`HomeDateFiltersSection`, `the860_home_loc` cookie). Remaining gap: filter changes on home still client-fetch to `/api/events`.
- SEO landing pages (phase 2) — More towns (Enfield, Torrington, Meriden, Simsbury, Wethersfield, Mystic/Essex) and seasonal copy; Search Console after index. *(Trivia Near Me v1 + filter UI shipped.)*
- Release note visitor-copy lint — Checklist in team-norms so “For visitors” passes [vision-and-brand.md](./vision-and-brand.md) before promote.
- Security doc — Admin secret model and `/api/event-image` SSRF notes (held per owner request).
---
Scrape / data
- Per-publisher crawl session — Site profiles (not global env) for market cookies (AXS Hartford zip today), logged-in Facebook/Eventbrite as the860life, etc. AXS default zip lives in `SCRAPE_PIPELINE.axsDefaultZip` until profiles own it.
- Facebook event sources — Many Facebook listing URLs return 0 extracted in production; need Playwright strategy, API, or deprioritize. *(Jun 2026 overnight triage.)*
- Crawl queue overlap / auto-cancel — Sources like Middlesex Chamber sometimes get overlapping RUNNING crawls or “no progress” auto-cancel; dedupe enqueue by `targetId` or tune stale thresholds.
- Generalized co-production venue rules — Hartford.com events co-presented at Hartford Stage (TheaterWorks host) beyond `known-scrape-draft-overrides.ts` pattern matching.
- OpenAI pipeline ordering UX — Long recrawls can show publish progress then “spacing OpenAI calls”; clarify or reorder so Jobs progress matches operator mental model. *(Bulk 860 Take throttle for >12 events ships.)*
- Admin: unmerge / split Locations — Undo bad auto-merges (e.g. multiple Max’s in different towns): split rows, reassign events, default `preventAutoMerge` on affected locations.
- Admin: location merge audit trail — Log when/why auto-merge ran (reasons, before/after) for support.
- Staged-event auto-merge rules — *(Priority)* Auto-merge same `externalId`, same slot, or high-confidence title match; admin only for ambiguous rows.
- Alfred ingest API (optional) — If the browser worker splits off the HP machine, a small authenticated ingest endpoint for rendered HTML instead of shared DB queue drain only. ADR: [0007](./decisions/0007-playwright-oracle-vm.md); ops: [alfred-setup.md](./alfred-setup.md).
- Accessibility-tree crawl extraction — After a listing loads in Playwright on Alfred, try accessibility snapshot (ARIA roles, labels, landmarks) alongside stripped HTML and JSON-LD. Use when `isRenderedListingHtmlUsable` fails or extracted count is zero despite HTML.
- Adaptive ingestion (profile learning) — Structured feeds, JSON-LD time cross-check, ICS past filter, Eventbrite detail preference, and publisher `defaultCategory` ship on `dev`. Remaining: optional profile learning from crawl patterns / admin “structured profile” flag.
- Structured site profiles (expand) — Side Door + BLOX (`ctinsider`, `courant`) ship as `browserListing`. Extend registry to repeat publishers; Elicit/Webflow remains the reference ([sources/elicit.md](./sources/elicit.md)).
- Recrawl on empty-but-valid feeds — Signal when a feed is valid but returns zero events (stale rows risk — see [known-issues.md](./known-issues.md)). ICS all-past warning is a partial step.
- RSS / feed auto-registration — Detect new CivicLift, ICS, and Tribe feeds during crawl and surface “add as source” in admin (detection on page load already exists for CivicLift embeds). CivicLift/CitySpark ingestion lock for existing sources ships in `structured-feed-lock.ts`.
- E2E smoke — One Preview crawl test against fixture HTML in CI.
- Mobile event-page screenshot — Playwright phone-width capture when listing + `og:image` fail.
- Refresh compact occurrence titles — Re-crawl recurring series for `Sun 5/8`-style titles (Tribe occurrence URLs help HJS but not all publishers).
- Trivia image from social — Facebook/Instagram art before generated trivia cards.
- Crawl cost dashboard — Per-source Alfred time + AI tokens tied to `ScrapeRun` (ScrapingAnt retired).
- Missing-category crawl audit — Report which events sources drop for `missing or invalid category`; surface in admin or script after `defaultCategory` backfill.
---
Ops
- ~~Remove Event.locationId backfill from deploy~~ — Done 2026-06-23 after prod backfill; manual `npm run db:backfill:location-ids` only.
- Automate release note draft — Script: changelog-dev Unreleased → `releases/YYYY-MM-DD.md` skeleton.
- Neon restore runbook — Step-by-step from `prod-backup-*` branch.
---
Deployment / platform health
Baseline on `main`: [smoke-test.md](./smoke-test.md) (`verify:deployed:dev` / `:prod` / `verify:promote`), CI after prod→dev copy, [database-release-workflow.md](./database-release-workflow.md).
- Public deployment status page — e.g. `/status` from `/api/health` (no secrets in UI).
- Admin deployment status — e.g. `/admin/status` with schema parity, event counts, Actions links.
- `GET /api/deploy-health` — One JSON payload for monitors and status UI.
- External uptime monitoring — Document Better Stack / UptimeRobot polling www + dev health.
- Scheduled verify workflow — Daily Verify deployed environments on `main`.
---
Suggested next
| Idea | Why | | --- | --- | | Preview recrawl pass (Jun 2026 sprint) | Unreleased crawl fixes need `ScrapeRun` + event spot-checks on dev before prod. [current-state.md](./current-state.md) | | Staged-event auto-merge rules | Reduce admin triage on duplicate staged rows after time quality improves. | | Admin: flag source for structured profile | Mark `ScrapeTarget` rows that deserve a registry entry (next Webflow/BrowserListing site). | | Venue create guard | Block duplicate `Location` rows at insert (slug / `venueName` + town). | | Smoke test in CI | Hit Preview `/api/health` + `/` after deploy (lightweight). |
