“Talk trash about your trash, then talk trash about their trash. Talk trash about trash.”

Changelog

Public beta

Everything that ships lands here. Newest first. Built from the repo CHANGELOG.md so marketing and the app stay in sync.

Unreleased

No bullets in this section yet.

2026-08-04

Added

  • Capture module split (`static/js/capture/camera.js`, `photo.js`) with **in-app camera only**, snap → confirm → upload.
  • Capture busy state **uploading** (before photo) separate from grading.
  • Run detail returns short-lived **before_url / after_url** for resume thumbs.
  • Product score = **quality% × chore max points** (API: `score`, `max_points`, `quality_pct`).

Changed

  • Beta welcome manifesto: dorm competition line now mentions **$10 team fee** and real cash incentive next season. *(Superseded 2026-08-18 — the real figure has always been $20; see that section.)*
  • **Sentry** fully configured from `SENTRY_DSN` (errors, traces, logging integration); optional `/api/sentry-debug` behind `ENABLE_SENTRY_DEBUG`.
  • Finalise awards **proportional** points (not always full chore value on pass).
  • Gemini multimodal timeout raised; offline fallback says Coach Jordan; client shows degraded banner.
  • Photo library / stock upload path **removed** from capture UI (in-app only).

Fixed

  • Anti-cheat no longer flags the same run’s before vs after (exclude `run_id` from house scan).
  • **Camera blocked live:** reverse proxy had `Permissions-Policy: camera=()`; app host now allows `camera=(self)`. Capture boot/camera failures surface in-page (not silent).

2026-08-18

Added

  • Public **`/pricing`** page — free during the public beta, then $5/person/month plus an optional $20/house/season competition entry, split 50/50 with the prize pool.
  • **"What ChorHaus Actually Is"** section on the marketing home page — plain explanation of the product plus the roadmap (cross-house/cross-school leagues, prize pool), clearly framed as the plan rather than a live feature.
  • Site-wide rotating tagline strip on every marketing page (server-side random pick each request; the marketing site carries no client JS by design).
  • Two new approved taglines: **"Even our trash talk is clean."** and **"You clean. I clean. Everybody cleans."**
  • **Stripe subscription billing**: checkout, webhook, and per-house subscription status (`House.stripe_customer_id`, `stripe_subscription_id`, `subscription_status`), priced per person via Checkout `quantity` = live house member count.
  • Billing is **admin-gated** (`House.billing_beta_access`, default off; `POST /admin/houses/{id}/billing-access` to grant) — every billing route 404s for a house without it, whether or not Stripe is even configured.
  • Billing status + **Upgrade** control in the house settings panel (hidden entirely unless the house has beta access).

Changed

  • Monthly subscription price **decided: $5/person/month, flat** (was an undecided $5–10 range).
  • Competition entry fee confirmed at $20/house/season, still 50/50 split with the prize pool.

Fixed

  • Stripe checkout/webhook success and cancel URLs pointed at `chorhaus.com`, a domain nobody owns — now the real app host.
  • Webhook handler crashed on `client_reference_id` (a plain string from Stripe) before it could persist anything, since `House.id` needs a real `uuid.UUID` — every webhook would have 500'd against a live account.
  • Corrected a stale **"$10 fee"** in the beta-welcome text; the real competition entry has always been $20/house/season.

2026-08-02

Added

  • Public **changelog** page (`/changelog`) linked from marketing nav/footer and the app arena; rendered from root `CHANGELOG.md` (agents append every change).
  • Marketing **trash-talk wall** with all approved catchphrases from brand voice.
  • Free public **beta manifesto** on marketing home and app welcome banner.
  • Contact email **nemo@justadestination.com** on public surfaces.
  • **v1 colour skins** (Slate, Nordic Forest, Cyber, Barbie Pink, Baby Blue) as app themes.
  • Welcome banner, SMS/join invite links (`/?join=`), add EXTRA chore to the wheel.
  • Live **camera capture** dialog (getUserMedia) with library fallback.
  • Coach Jordan naming (UI + prompts); still SpaceXAI-backed when key present.
  • Inter-house **trash talk** + rivals API/UI; SQL `009_trash_talk.sql`.
  • EPL-style **league table** centered on your house with level colour skins.
  • House settings behind ⚙️; pets/kids removed from UI.
  • Custom chore add form under the weekly rota.

Changed

  • Contact email → **nemo@justadestination.com** on marketing surfaces.
  • Rules page: human review / bank / retry wording (no longer “not appealable”).
  • Campus create flow: searchable campus datalist to reduce league splintering.

Fixed

  • Capture resume: `GET /api/chores/runs/{id}` + real points from ledger.
  • Steal flow ownership and `?steal=1` UI path.
  • Review escalate enum `PENDING_REVIEW`; admin resolve queue.
  • Week roll cron + Scheduler (Sunday 00:05 UTC).

2026-08-01

Added

  • Foundation ops checklist; Cloud Scheduler week-roll job.
  • Admin human review resolve (uphold / override).
  • Settings + injured reserve (bench) API and UI.

Fixed

  • `ChoreStatus.PENDING_REVIEW` in Python enum.
  • Logo path for marketing banner.
  • Rota/steal CSS on live dashboard.
  • Service worker stale cache issues (static-only precache).

2026-07

Added

  • ChorHaus v2 rebuild: FastAPI + Jinja, own Google OAuth, schema `chorhaus_v2`.
  • Chore wheel, Gemini grading, dHash anti-cheat, scoring ledger, marketing/app hosts.
  • Mechanics as single source of truth (`content/mechanics.toml`).
  • 2026-08-04: [RESOLVED G1] Python 3.10 tomllib compatibility fallback in backend/content.py and backend/services/wheel.py
  • 2026-08-04: [RESOLVED G2] SQLite local dev database fallback and HTTP 200 health check readiness probe
  • 2026-08-04: [RESOLVED G3] Standardized naive utcnow() to timezone-aware UTC datetime across ORM models and services
  • 2026-08-04: [RESOLVED G4] Epoch-based week_index calculation for continuous parity monotonicity across year boundaries
  • 2026-08-04: [RESOLVED G5] Standardized stealing_open and week boundaries to explicit UTC today in backend/services/rota.py
  • 2026-08-04: [RESOLVED G6] Weekly chronicle generation with ChoreAttempt join, GET /api/house/chronicle route, and week roll cron hook
  • 2026-08-04: [RESOLVED G7] Implemented POST /api/social/dataset/contribute endpoint with automatic 50pt DATASET_BOUNTY point awards
  • 2026-08-04: [RESOLVED G8] Dynamic Gemini AI valuation (20-150 pts) for custom user-added chores
  • 2026-08-04: [RESOLVED G9] Added Stripe billing router with checkout-session and webhook verification
  • 2026-08-04: [RESOLVED G10] Created seed locations.toml catalog and exposed GET /api/locations/search endpoint
  • 2026-08-04: [RESOLVED G11] Added theme column to User model, PATCH /api/house/me/theme route, and server-rendered data-theme
  • 2026-08-04: [RESOLVED G12] Created shared conftest.py fixtures and test_chores_flow.py HTTP integration tests
  • 2026-08-04: [RESOLVED G13] Rule A15 lifespan startup hook for Fleet Command registration and brdkst service.up event
  • 2026-08-04: [RESOLVED G14] Created scripts/check_migrations.py database verifier and tests/test_migration_schema.py
  • 2026-08-04: [RESOLVED G15] Created scripts/verify.sh automated smoke runner and updated DEPLOY.md