Rework the client's look and several flows around the "Confetti" design
direction:
- Themes are now palette x mode (Confetti / Meadow in Auto, Light, Dark),
with six semantic party hues, Bricolage Grotesque / Figtree / JetBrains
Mono, rounder radii and card/pop shadows. Legacy theme ids are normalized.
- Floating sidebar with colored section tiles and a theme toggle; floating
pill bottom nav on phones.
- Dashboard: today-led hero, colored stat tiles, a derived "Coming up"
schedule (palpate, nest box, due, wean, birthdays), gestation tracker,
recent litters with kit dots and a for-sale strip.
- Coat-colored lop placeholders for rabbits without photos.
- Bracket pedigrees (sire side blue, dam side pink) on rabbit detail and in
Add Rabbit, plus one-tap "Quick pick" suggested parents.
- Rabbit detail hero with fact tiles; litter milestone strip; restyled
herd, litters, settings, auth screens and shared controls.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Replaces the optional shared-password auth (AUTH_PASSWORD env var,
in-memory sessions) with account-based auth: a users table (scrypt
password hashes via node:crypto — no native dep), SQLite-backed sessions
that survive restarts, a one-time setup screen that creates the first
account, and a Settings → Users card for adding/removing users and
resetting passwords (everyone equal, shared herd — no roles).
Theme and weight-unit become per-user preferences behind the unchanged
/api/settings shape (NULL inherits the global value); rabbitry name, kit
prefix, and default breed stay shared. Failed logins get a flat 350 ms
delay and timing-safe comparison. MYKINDLEBOX_PASSWORD is retired —
upgrading deployments see the setup screen once, data untouched.
Also: configurable host port (MYKINDLEBOX_PORT), compose healthcheck
gating nginx on API readiness, nginx body-size headroom for 10 MB
imports, server .dockerignore hardening, ESLint ignore for vendored
tesseract assets, react-hooks rule fixes, exact tesseract.js pin with SW
cache-upgrade contract and failure-isolated precache, and OCR date
parsing fixes (2-digit-year pivot, impossible-date rejection).
Design doc: memory-bank/FEATURE_User_Accounts.md
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Adds a self-hosted Shows section that scrapes the ARBA show-search
listing and lets the user build show events, enter herd rabbits, and
track judges and placements.
Server:
- lib/arba.ts: Cloudflare-aware scraper + normalizer (cheerio), US-only,
cavy-excluded; cached in arba_shows_cache (re-scrape when >24h stale or
on demand). Rows are read from server-rendered Ninja Tables cells.
- routes/shows.ts: cached ARBA listing + force refresh.
- routes/showEvents.ts: event CRUD, ARBA-show snapshots, entries, judges,
placements (PUT upsert), and the plain-text entries report.
- schema: show_events, show_event_shows, show_event_entries,
show_event_judges, show_event_placements; breed column on rabbits.
- migrations 0007-0010.
Client:
- /shows browser with filters + 'Add to Event'.
- /shows/events list + detail with Shows / Entries / Results tabs,
rabbit picker, inline class/notes, placement entry, and report modal.
- breed surfaced in add/edit/detail/review.
Also folds in two previously-uncommitted bodies of work that share
schema.ts / index.ts / api.js with the above and can't be split out
cleanly: the rabbit timeline (rabbit_events, migrations 0004-0006,
routes/events.ts, RabbitTimeline) and the breed-select / default-breed
herd work (BreedSelect, lib/breeds.js, settings default_breed).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>