Adds repo-root CHANGELOG.md in Keep-a-Changelog format with a single [v0.0.0-beta] section that catalogues every shipped feature across Fases 0–16 (58 bullets, [new]/[fix]/[tweak] prefixes, grouped by area). The companion linter at scripts/check-changelog.mjs enforces (a) the Keep-a-Changelog header, (b) the `## [vX.Y.Z] — YYYY-MM-DD` heading shape on every release, and (c) the three-prefix rule on every bullet. Wired into `just check` so a malformed CHANGELOG fails the check gate without blocking commit hooks. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
11 KiB
Changelog
All notable changes are documented here. Format: Keep a Changelog. Versions follow Semantic Versioning.
Each bullet is prefixed with [new] (added capability), [fix] (resolved
defect) or [tweak] (behaviour or implementation change with no new
surface). Areas group related entries; section bullets ending in : are
labels for the area, not log entries.
[Unreleased]
[v0.0.0-beta] — 2026-05-19 — MVP + MVP2 (Fases 0–16)
Single rollup for everything shipped before tagging started. Covers the
entire MVP cycle (Fases 0–7) plus the prod auth hardening pass (Fase 8)
and the eight MVP2 fases (9–16). Reads as a feature catalogue, not a
day-by-day diff — the per-fase docs in docs/history/ and the per-fase
plans in plan/ are the source of record.
-
Auth + identity:
-
[new] Keycloak → GoTrue → Supabase OIDC integration (PKCE), with
auth.userspre-seed for the 5 dev users (Fase 1). -
[new] Self-registration via Keycloak; invitations are link-only (no email), generated on
/collective/manage(Fase 1). -
[new] Multi-collective per user with sidebar switcher; active collective persisted to
localStorage(Fase 1). -
[new] Atomic
create_collective(name, emoji)RPC so onboarding works in a single round-trip without trippingis_admin/is_memberpolicies (migration 012, Fase 7). -
[new] Public
/logged-outroute + RP-initiated Keycloak end-session on logout, so the SSO cookie is actually cleared and the next login re-prompts (Fase 8). -
[new] Account hard-delete (
delete_account()RPC) with sole-admin auto-promote and a Danger-zone modal (migration 021, Fase 10.5). -
[fix]
auth.users.role/auddefault-fill trigger so PostgREST routing survives the Keycloak provisioning path; INSERT + UPDATE both covered to defeat GoTrue's pop-ORM re-clobber (migrations 013–014, Fases 7–8). -
[fix]
isLoggingOutguard in(app)/+layout.svelteto suppress the auth-gate$effectduring the logout navigation, closing a "PKCE code verifier not found in storage" race on prod (Fase 8). -
[fix]
pendingInvitationTokenrestored fromsessionStorageafter login so the user lands on/invitation/<token>instead of/onboardingor/lists(Fase 7). -
Shopping lists + items:
-
[new] Lists overview (featured + grid + completed + trash) and detail view with checkbox toggle, qty stepper, inline edit, drag-reorder (Fase 2a).
-
[new] Frequency-driven suggestion chips on the add-item form, backed by the
item_frequencytable + trigger (Fase 2a; migration 006). -
[new] Realtime "Modo Compra" full-screen session view with 56 px toggles, flip animation, complete-list → redirect; postgres_changes subscription per list with echo-deduplication (Fase 2b; migration 007).
-
[new] Offline-first sync queue (
SyncQueueIDB-backed, FIFO flush, PK-conflict-as-success) withonline-event auto-flush; offline/syncing banner mounted in detail + session views (Fase 2b). -
[new] Selection mode with bulk delete / move / mark-checked, long-press entry on mobile + desktop toggle button (Fase 5.11).
-
[new] Reset-from-detail button on completed lists; "Crear nuevo colectivo" entry in sidebar + drawer (Fase 10).
-
[new] Trash drawer restore + hard-delete via
restore_list()/hard_delete_list()RPCs (migration 020, Fase 10.4). -
[new] Collective-scoped item tags (chips + picker + filter bar + realtime resort) backed by
item_tags+shopping_item_tags(migration 022, Fase 11). -
[new] Common-items management on
/collective/manage— 3-way Hide / Normal / Boost segmented control writingweightvia admin-only RPCs; suggestion strip reorders by weight + use_count + last_used_at (migration 026, Fase 15). -
[new] Suggestion dropdown excludes names already on the active list (
excludeNamescapped at 200 to respect Kong URI limits) (Fase 15). -
[tweak] Item row redesigned to
drag-handle | name-button | qty stepperwith swipe-to-(un)check; double-tap opens an edit overlay;unitcolumn dropped because it became unreachable (migration 011, Fase 5.10). -
[tweak] Add-form moved inline as the last child of the unchecked section; sticky bottom bars retired (Fase 5.14).
-
[tweak] List rename inline at the top of the detail view with 500 ms debounced autosave; "New list" button moved to the masthead (Fase 5.8).
-
Tasks + notes:
-
[new] Task lists + tasks with completion-consistency CHECK (
is_completed ⇔ completed_by ⇔ completed_at) and drag-reorder (migration 008, Fase 3). -
[new] Notes with 8-colour palette, pinned + archived (mutually exclusive), 7-day trash window enforced via RLS +
pg_cronpurge; editor with 500 ms debounced autosave (migration 009, Fase 3). -
[new] Sync-conflicts review route at
/settings/sync-conflicts, paginated, side-by-side local vs remote payloads, per-device dismissal vialocalStorage(Fase 14.2). -
Search:
-
[new] Cross-section search via
search_in_collective()SECURITY INVOKER RPC over generatedtsvectorcolumns on items/tasks/notes; debounced input, filter chips, deep-link per result type (migration 010, Fase 4). -
Mobile UX + accessibility:
-
[new] Mobile shell — top bar with hamburger + collective name + avatar, slide-in drawer, bottom tab bar with safe-area inset, sticky contextual headers on detail routes (Fase 5).
-
[new]
UndoToastfor destructive actions (4 s TTL, auto-commit, mounted globally), withscheduleUndoable()queue (Fase 5). -
[new] Spinner component (
sm/md/lg,currentColor,motion-reduce:animate-none, sr-only label) integrated at 7 loading sites (Fase 16). -
[tweak] Desktop reading width capped at
max-w-2xlfor content detail routes; mobile and/lists/[id]/sessionexcluded (Fase 9.2). -
PWA + offline:
-
[new] Installable PWA — Workbox precaching via
@vite-pwa/sveltekit, manifest, iOS meta tags + apple-touch icons, placeholder slate-and-"C" icons (Fase 6.2). -
[new] Service-worker auto-registration via
useRegisterSW+ 15 minreg.updatepoll;UpdateToastwith "Reload" action when a new build is available; "Ready to use offline" auto-dismiss toast (Fase 14.1). -
[new]
OfflineChipinMobileTopBar+DesktopSidebarwith a pending-ops badge when the queue is non-empty (Fase 14.2). -
[new] Build-time version constants (
__APP_VERSION__/__APP_COMMIT__/__BUILD_TIME__) exposed via$lib/version; "Acerca de" chip on/settings;GIT_SHAbaked through the Dockerfile build arg by the deploy script (Fase 14.3). -
[tweak] PWA strategy on prod switched to
generateSWbecause@vite-pwa/sveltekit0.6.8 hardcodes the source SW filename underinjectManifest(Fase 6 → revisit in Fase 14). -
[fix]
<link rel="manifest">added toapp.htmlso Android Chrome surfaces the install prompt (Fase 14 follow-up). -
Collective management:
-
[new] Rename collective + change emoji (CU-H07) on
/collective/manage(Fase 10.2). -
[new] Leave-collective flow (CU-H06) with sole-admin auto-promote via
leave_collective()RPC; sole-member rejected with P0001 (migration 017, Fase 10.1). -
[new] Dissolve-collective flow (CU-H08) with type-the-name confirmation, via
dissolve_collective()RPC (migration 018, Fase 10.3). -
[new] Section visibility — per-user + per-collective
feature_flags jsonb+section_enabled()STABLE SQL helper using COALESCE precedence (migration 023, Fase 12). -
[new] Auto-detect language on first sign-in from
navigator.languages, gated to fresh accounts (<60 s old+language = 'en') (Fase 10.6). -
[tweak] Every
created_by/updated_byFK relaxed fromNOT NULL RESTRICTtoNULL SET NULLso a user delete cascades cleanly (migration 019, Fase 10.5). -
Server admin:
-
[new] Global
server_adminrole (server_adminstable) orthogonal tocollective_members;is_server_admin()SECURITY DEFINER gate; bootstrap fromSERVER_ADMIN_EMAILon first DB init (migration 024, Fase 13). -
[new]
/adminroute group with 9 SECURITY DEFINER RPCs (collective lifecycle, member removal, server-level section defaults) + append-onlyadmin_actionsaudit log + last-admin guard (migration 025, Fase 13). -
[new]
section_enabled()extended with a server layer prepended to the user/collective precedence chain (Fase 13.2). -
i18n:
-
[new] Paraglide JS messages for
en+es, compiled at build time;setLanguageTag()flips the active locale without reload; selector on/settingswrites topublic.users.language(Fase 0). -
[new] Search + collective-management + PWA copy fully localised in both languages across every fase that added user-facing strings (Fases 4, 10, 14).
-
Infra + deploy:
-
[new] Local dev stack — Docker compose with Postgres / GoTrue / PostgREST / Realtime / Storage / Kong / Keycloak;
setup.shfor idempotent first-time bring-up;Justfiletask runner (Fase 0). -
[new] Production stack on ambrosio (OVH VPS) at https://erosi.limonia.net —
infra/scripts/deploy-erosi.sh(rsync + first-deploy secret generation + every-deploy migration apply + pre-deploy backup +.deploys.logappend) andinfra/scripts/rollback-erosi.sh(paired code + DB rollback) (Fase 6 + later iterations). -
[new] Kong rate-limit on
/rest/v1/collective_invitations(20/hour per Authorization header) withrequest-transformerURI rewrite (Fase 6.3). -
[new] JWT rotation script (
infra/scripts/rotate-jwt.sh) + production env template +rls-audit.shcurl sweep +just lighthousebuild-and-score recipe (Fase 6.4 + 6.5). -
[new] Internal Caddy on
:3000fans/rest|/auth|/realtime|/storage|/graphql|/pg→ Kong, everything else → app; external TLS terminator (off-stack) forwards plain HTTP to ambrosio:3000 (Fase 6 → revision after prod cutover). -
[new] Theme tokens stored as RGB triplets so
dark:variants resolve consistently; three-mode preference (light/dark/system) persisted tousers.theme+ mirrored tolocalStoragewith inline anti-FOUC script (migration 015, Fase 9.1). -
[new]
sync_conflictsappend-only log + queue-side divergence detection so last-write-wins conflicts are auditable (migration 016, Fase 9.3). -
[new] Pre-deploy
pg_dumpallsnapshot kept inbackups/predeploy-*.sql.gz(newest 10) with paired code/DB rollback viarollback-erosi.sh --previous/--to=<sha>/--code-only(Fase 14 deploy work). -
[fix]
docker compose exec -Tcalls inside SSH heredoc deploys now redirect stdin per call so the surrounding heredoc isn't drained — silently skipped migrations no longer happen (Fase 8 deploy hardening). -
[fix] PostgREST schema cache reload (
NOTIFY pgrst, 'reload schema') appended after every deploy and rollback so freshly-added RPCs are visible without a container restart (Fase 15 deploy work). -
[fix] WebKit Playwright project gated behind
RUN_WEBKIT=1so hosts without the GTK libs (libicu74, libwoff1, …) keepjust test-allgreen;*.webkit.test.tsfiles excluded from the chromium project (Fase 9.4).