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). |

← Release notes