Reminders Spec
Purpose
Reminders are the org surface for time-bound personal follow-through and targeted internal team communication. They are durable organization records, not browser-local calendar events, project tasks, notes, or client-visible portal content.
Product Decisions
- Reminders are a shell utility beside Calendar and Notes, with a dedicated
/remindersworkspace. - A reminder is visible to its creator and assigned team members. Personal reminders assign the creator automatically.
- Reminders may link to client-root records without taking ownership of those records. Supported links include clients, projects, time entries, contracts, quotes, invoices, catalog products, notes, files, and resource links.
- The reminder stores a stable link snapshot (
type,id,title,href) plus optional client/project context. The linked feature remains the source of truth. - Client and project are the reminder's primary structured context. Project choices are scoped to the selected client, and changing client clears incompatible project context.
- New reminders inherit an explicit client/project entry-point context first, then the active client focus when no explicit context was supplied. A persisted dirty draft wins when a user resumes it.
- Other linked records remain optional related items behind a secondary picker.
- Due reminders create in-app notification-inbox entries for the creator and assignees. Scheduled delivery is revision-guarded so an obsolete job cannot fire after an edit, completion, reopen, or snooze.
- Active reminders project into Today and Calendar. Completing a reminder removes it from active projections while preserving it in Completed.
- The topbar uses a compact, non-blocking reminder quick view. Selecting a
reminder only opens that quick view; it does not create a working tab.
Pinning is the explicit action that adds a reminder to Working, while
Open reminderopens the full reminder drawer in the/remindersworkspace through the query-backedreminderIdroute state. - Editing remains a deliberate dialog action from either the quick view or detail drawer. Delete is reserved for the detail drawer.
V1 Lifecycle
- Create a personal or team reminder.
- Choose date, optional time/all-day behavior, priority, details, and assignees.
- Optionally choose client then project context. Client/project detail actions prefill their owning context, and client focus supplies the default for a generic create action.
- Optionally add notes, files, time entries, commercial records, or resources as related items.
- Receive an in-app due notification.
- Inspect and complete/reopen from the shell, or open the full reminder drawer for context, snooze, editing, and deletion without leaving the workspace.
Boundaries
- Reminders are internal-only in v1.
- Recurrence and outbound email delivery are later extensions; neither should be simulated with duplicate records or billing-notification preferences.
- Reminder links do not create new ownership relationships between business records.
- Reminder writes re-authorize and canonicalize client/project context instead of trusting a client-provided link snapshot.
- Reminder detail reads use the same creator-or-assignee visibility rule. Edit and delete actions are separately capability-gated.
- The canonical reminder detail location is
/reminders?reminderId=…. Legacy/reminders/[reminderId]links redirect into that drawer so saved links and previously delivered notifications remain valid. - Calendar remains a projection surface. Editing a reminder happens in the reminder editor, not the calendar-event editor.
Implementation Surface
- Schema and functions:
packages/backend/convex/org/reminders.ts - Org API adapter:
apps/app/src/app/[locale]/_lib/convex/api/org/reminders.ts - Workspace and dialogs:
apps/app/src/app/[locale]/org/(dashboard)/reminders/* - Projections:
packages/backend/convex/org/today.tsand the org calendar route - Shell entry points: create registry, topbar reminder quick view, utility navigation, launchpad, dock, and hotkeys
Follow-up
- Extend the contextual “New reminder” action to other record surfaces only where their existing action menu naturally owns it.
- Add recurrence only after recurrence editing, series completion, and timezone behavior are specified together.
- Consider email delivery as a separate notification-policy decision with per-user preferences and localized delivery content.