Tribu logo

Tribu

Self-hosted family organizer for calendar, tasks, shopping, and more

Alternative to: cozi, familywall, ourhome

Tribu screenshot

About Versions (29)

v1.1.0

2026-03-28

Tribu 1.1: Design Overhaul

Complete UI redesign across all views. Stripped AI-generated glassmorphism, extracted ~600 inline styles to CSS, added shared components, and improved accessibility throughout.


Highlights

Design System

  • Solid card backgrounds — Replaced glassmorphism (backdrop-filter blur) with solid --void-surface backgrounds across all views: dashboard, calendar, rewards, notifications, shopping, tasks, contacts, settings, admin
  • ~600 inline styles extracted — Every view now uses proper CSS classes instead of inline style objects
  • Consistent spacing — row-gap/column-gap differentiation, spacing scale enforced throughout
  • Light theme support — All new classes have proper [data-theme="light"] overrides

Shared Components

  • ConfirmDialog — Reusable confirmation dialog with focus trap, Escape handling, backdrop click, loading state to prevent double-submit. Replaces all browser confirm() calls
  • FormModal — Shared modal for contacts and birthdays with focus trap and a11y
  • CurrencyIcon — Lucide-based currency icons replacing emoji strings (full stack: frontend, backend schema, DB migration)
  • DayDetailPanel — Deduplicated mobile/desktop calendar day detail into single component
  • DeleteButton — Shared inline delete confirmation pattern

Dashboard (#118, #120)

  • Content-first layout — Welcome hero card removed, greeting moved to header
  • Events promoted — Events card is now the top row (what a parent checks at 7am)
  • Actionable empty states — CTAs that guide new users (gated for child accounts)
  • Proximity-based birthday colors — Red (<=3d), amber (<=7d), muted (>7d)
  • Birthday emoji replaced — Lucide Cake icon with colored backgrounds

Rewards (#119)

  • Visual section differentiation — Colored left borders: green (earn), amethyst (spend), warning (pending), blue (task)
  • Proper tab pattern — Segmented control matching calendar, not btn-ghost hack
  • Child progress bar — Shows progress toward next affordable reward
  • Empty states — For rules and catalog lists
  • Lucide currency icons — Full stack migration from emoji to icon names with DB migration (0019)
  • API validation — Currency icon restricted to known Lucide names via Pydantic regex

Calendar (#121)

  • Floating Action Button — Visible ”+” for event creation at all times
  • DayDetailPanel — Mobile now has feature parity with desktop (recurrence end-date, end-time)
  • Weekday grid fix — Removed ghost 40px column from CSS
  • Color swatches — 32px for proper touch targets
  • Onboarding CTA — Promoted calendar import for zero-event users

Notifications (#122)

  • Slide-in panel — Bell icon triggers right-side panel (380px desktop, bottom-sheet mobile) instead of full-page navigation
  • Time grouping — Heute/Gestern/Alter sections
  • Focus management — Focus trap, Escape, focus restoration to bell button
  • Keyboard accessible — Notification rows focusable and activatable

Shopping (#123)

  • Check animation — Scale bounce on item completion
  • List progress bars — Visual checked/total indicator on each list card
  • ConfirmDialog — For list deletion and clearing checked items

Tasks (#124)

  • Collapsible create form — Title-only by default, “More options” reveals fields
  • ConfirmDialog — For task deletion with task title in message

Contacts (#125)

  • Shared FormModal — 506 lines reduced to 208 (-59%)
  • Normalized tabs — Segmented control matching all other views

Settings (#126)

  • 125 inline styles extracted — Across all 6 settings tabs
  • Scoped settings-section:not(.glass) prevents override when combined with glass elsewhere

Admin (#127)

  • 77 inline styles extracted — Across all 4 admin files
  • ConfirmDialog loading state — Buttons disabled during async action, prevents double-submit
  • Time toggle normalized — Segmented control pattern

Accessibility

  • 44px touch targets — Enforced on all interactive elements across all views
  • Focus traps — On ConfirmDialog, FormModal, notification panel
  • Focus restoration — All dialogs/panels return focus to trigger element
  • aria-expanded — On collapsible form toggle
  • aria-describedby — On ConfirmDialog message text
  • sr-only labels — On CurrencyIcon for screen reader currency context
  • Keyboard navigation — Notification rows, Enter/Space activation

Testing

  • Unit tests — 71/71 passing, updated for new class names and ConfirmDialog
  • E2E tests — 44/44 passing, updated for new dialog patterns
  • Jest config — e2e/ excluded from Jest runs (pre-existing fix)