Register drizzle journal entries for 0022/0023 so prod migrations apply.
Key edit-mode widget previews by index so bangs.stats shows live data.
Add comments to notes detail pages.
Calendar events support multiple reminder offsets with presets and per-user defaults.
Lists index adds inline task entry and list property editing.
Generic entity comments on list detail. New bangs.stats dashboard widget.
Closes Gitea #28, #29, #30, #31. Migrations 0022 and 0023.
- Fix ShareButton silently swallowing errors from createShareLink; now
shows inline error text so failures are visible to the user
- Add getShareLinksForEntity server action and EntityShareLink type to
_core/share.ts
- Add ShareLinkList component — renders active share links per entity
with per-row Revoke; renders nothing when empty
- Wire ShareLinkList into plant and container detail pages (loaded
server-side in parallel with the entity fetch)
- Add images jsonb column to garden_containers schema + migration 0018
- Add addContainerImage / removeContainerImage / setContainerPrimaryImage
server actions mirroring the plant image pattern (10-image cap, first
upload auto-sets cover)
- Update ContainerDetailDto, listContainers, getContainer to include images
- Rewrite ContainerDetail with Info/Gallery tabs; Gallery tab mirrors
plant gallery (3-col grid, star/X overlays, upload button, counter)
- Update ContainerShareData and container renderSharedView to show cover
image hero and secondary image grid on public share pages
Adds a new "bangs" module with a dashboard widget that tracks household
bang events. The widget shows the total count, a configurable recent-bang
list, and an "Add Bang" button that accepts a backdatable date.
On submission, a full celebration sequence fires: screen flash, widget
shake, count pop animation, synthesized firework sound (Web Audio API),
50 full-screen emoji particles via portal, canvas-confetti star bursts,
side cannons, and a timed sequence of 7 firework bursts.
- New bang_events table (migration 0017)
- canvas-confetti dependency for fireworks/confetti effects
- CSS keyframe animations: shake, countPop, emojiFloat
- Fixes pre-existing Drizzle snapshot chain collision (0007/0008)
- Adds OpenPlantBook env vars to compose.yaml
- care reminders now fire with plant-specific body ("Time to water Pothos")
via title/body columns on the reminders table (migration 0016)
- bi-directional task sync: checking off a garden-linked task list item
creates a care log; logging care from garden marks the linked task done
(list_items.metadata stores gardenPlantId + gardenCareType linkage)
- upload error response no longer leaks debug detail; error message
corrected from "5 MB" to "100 MB"
Replaces the generic shadcn/ui gray theme + horizontal top-bar shell with
the paper-and-ink language from the Claude Design handoff bundle: warm
off-white paper, near-black ink, Source Serif 4 + Inter, hairline borders,
muted ink accents (clay/indigo/sage/plum/ochre) used functionally for
calendars and share scopes.
Theme switcher expanded from 2 dimensions (theme × mode) to 7: palette ×
mode × fontPair × density × dashLayout × calView × navStyle. All exposed
in Settings → Appearance and persisted on the users row. Pre-paint script
applies all four data-* attributes from localStorage so reload doesn't
flash.
App shell restructured to a CSS-grid driven by data-nav on <html>: sidebar
on desktop, bottom-nav + FAB under 760px. Four desktop nav modes wired
(sidebar/rail/top/fab-only). Topbar gets a search-→-CommandPalette button,
notification bell, "+ New" quick-add, avatar.
Dashboard, calendar, lists, notes, settings, login, public share viewer,
and quick-add sheet all reskinned. Dashboard editor gains a Preset menu
(classic/split/glance) that fills the layout from the registered widgets.
FullCalendar wrapped in .fc-skin and inherits all paper-and-ink tokens via
CSS variable overrides. Public share viewer (/s/<token>) rebuilt around
ShareFrame: expiration banner, brand strip, eyebrow chip, 38px serif
title, mini-day + mini-map cards, share-rows.
Schema: drops users.theme; adds theme_palette, theme_font_pair,
theme_density, theme_dash_layout, theme_cal_view, theme_nav_style with
defaults that match the design (clay / serif-sans / regular / classic /
month / rail-desktop). Migration 0014_paper_ink_theme.
Middleware sets x-pathname so the AppShell server component can render
bare for /s/* and /login without a route-group refactor.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
drizzle/meta/ was gitignored, so GitHub Actions had no _journal.json to
copy into the image. The migrator requires this file to know which SQL
files to apply. Unblock by committing the meta directory.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Makes actorId nullable in activity_log (migration 0010) with onDelete:
set null so audit history survives user deletion; adds logShareActivity
for anonymous mutations
- Adds resolveShareToken return of householdId for downstream validation
- Adds renderSharedView to EntityTypeRegistration; each module implements
loadForShare (no-session bare queries) and renderSharedView
- Calendar: CalendarSharedView (upcoming 90-day events) and
EventSharedView (title/time/location/notes)
- Lists: ListSharedView (client component with optimistic toggles via
toggleShareListItem server action in lists/server/share-actions.ts)
- Notes: NoteSharedView (title + body + updated date)
- /app/s/[token]/page.tsx: resolves token, dispatches to loadForShare +
renderSharedView, friendly error for invalid/expired tokens, noindex
- Middleware /s/* exemption confirmed present (no change needed)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- activity_log table in _core/schema.ts with household+created_at index;
migration 0008_activity_log.sql applied
- logActivity() in _core/activity.ts reads current session and inserts a row
- ActivityLogEntry type + renderActivity?(entry): string added to
EntityTypeRegistration so modules declare human-readable labels without
any if/else branches in the widget
- core.activity widget replaced with a real async server component that
queries the last 20 rows and renders via the registry
- logActivity wired into every create/update/delete in calendar, lists,
and notes server actions; getAuthorizedItem also returns text so
toggle/delete can include item text in the payload
- pnpm typecheck, lint, build, and all 4 E2E specs pass
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>