Skip to content

Features & Modules

The authenticated landing area is the dashboard, not a thin redirect page.

Current dashboard behavior:

  • aggregates stats through useDashboardStats() from @life-manager/shared/hooks
  • shows active timers, agenda, work stats, finance stats, and quick actions
  • opens creation modals for time entries, appointments, and cashflows directly from the dashboard
  • can trigger an in-app tutorial based on profile onboarding flags

Key path:

  • src/components/Dashboard/

The work module is currently centered around projects, not a /work route.

Main characteristics:

  • overview page initializes the module or shows all projects
  • detail page is driven by the projectId search param
  • project and folder hierarchy is handled in the work UI layer
  • manual time entries and timer-created entries both end up in the same shared work entry data model
  • project detail and project navbar are separate surfaces
  • if no work projects exist, WorkInitializer becomes the entry experience

Key paths:

  • Routes: src/routes/_app/project/overview.tsx, src/routes/_app/project/detail.tsx
  • Components: src/components/Work/
  • Local state: src/stores/workManagerStore.ts
  • Calendar integration: shared work entries also surface inside WorkCalendar

The time tracker is a cross-module feature mounted in the shell rather than owned by one page.

Current behavior:

  • multiple timers backed by the shared timeTrackers collection
  • add, start, stop, and reorder timers from the shell UI
  • compute active display data in a local runtime store
  • support Pomodoro, memo, appointment linkage, and per-project rounding logic
  • submit stopped timers into persisted work time entries

See the dedicated Time Tracker page for the deeper architecture.

Finance is tab-driven and depends on an initialized bank-account context.

Current module split:

  • single cashflows
  • recurring cashflows
  • finance projects
  • payouts

Notable runtime behavior:

  • FinanceTabs switches by financeStore.activeTab
  • if no bank accounts exist yet, FinanceInitializer is shown instead of the tab content
  • recurring cashflows are processed automatically at app level by useProcessRecurringCashflows()
  • the module includes contacts, tags, bank accounts, project adjustments, and payout conversion flows

Key paths:

  • Route: src/routes/_app/finance.tsx
  • Components: src/components/Finances/
  • Local state: src/stores/financeStore.ts
  • Finance-wide automation: src/hooks/financeHooks/useProcessRecurringCashflows.ts

The calendar merges two different persisted sources into one UI:

  • work time entries
  • appointments

Important behaviors:

  • supports day, week, and month views
  • computes visible calendar days from view-specific local state
  • merges entries and appointments into unified day buckets
  • opens separate drawers for time entries and appointments
  • supports quick appointment creation and calendar legend controls
  • uses local zoom and selection state from calendarStore

Key paths:

  • Route: src/routes/_app/calendar.tsx
  • UI: src/components/WorkCalendar/
  • Orchestration: src/hooks/workHooks/useWorkCalendar.ts
  • Local state: src/stores/calendarStore.ts

Profile And Settings (/profile, /settings)

Section titled “Profile And Settings (/profile, /settings)”

These are operational modules, not just utility pages.

  • /profile handles editable profile fields, locale/theme settings, and logout cleanup
  • /settings provides the full settings content surface, especially important on mobile where settings open as a route instead of a modal
  • desktop feature code should usually open settings through useOpenSettings()

Notifications are handled centrally in the shell, not per feature page.

Current architecture:

  • notifications are read from the shared data layer
  • useNotificationHandler() polls due notifications and displays Mantine toasts
  • browser notifications are optionally shown when permissions and settings allow it
  • handlers are registered in a small registry by resource_type
  • appointment notifications can deep-link back into calendar and work behavior, including starting timers

Key paths:

  • src/hooks/notificationHooks/useNotificationHandler.tsx
  • src/hooks/notificationHooks/handlers/
  • src/hooks/notificationHooks/useAppointmentNotifications.tsx
  • src/components/Notification/

Two cross-module behaviors shape the real user experience:

  • offline-first data access via PowerSync and PWA route and asset caching
  • build refresh detection via useCheckNewVersion()

These matter as much as the visible modules because they affect how the whole web app behaves after first load.

This route currently remains a placeholder and should not be documented as a completed feature yet.