Example: Task Management App

Boards, assignments, due dates, and activity — a complete team task app assembled from the CRUD tutorial upward.

This is the CRUD tutorial grown up: multiple lists, people, and notifications. It reuses the exact flows from Build Your First CRUD App and shows what to add for a real team tool.

The Task Document

Task Document
{
  "_meta": {},
  "assignee_guid": "b9ee6a631b24e78d1aa48aef0dc067fff7bfbacd24a56ef4ed1f08e537d48b6bd02",
  "assignee_name": "sami b",
  "board": "engineering",
  "column": "in-progress",
  "created_by": "sami b",
  "due": 1782432000,
  "labels": [
    "ux",
    "onboarding"
  ],
  "priority": "high",
  "title": "review q3 onboarding flow"
}
  • column drives the board view (todo / in-progress / review / done); board separates teams.
  • Assignee is denormalized — the board renders names without joins (see Storages).
  • Everything searchable (title, labels) is lowercase at write time.

The Views

  1. Board: one function_search per column (term on board + column, sorted by priority then due) or one search grouped in the flow with array blocks — the dashboard pattern from Dashboards.
  2. My tasks: user_current → term on assignee_guid + column != done, sorted by due ascending.
  3. Detail: the task + its activity log (term on task_guid) on one page.
  4. Overdue strip: column != done + due < now (range query) at the top of every board.

The Flows

  • Create/move — the CRUD flows from the tutorial, plus writing an activity entry per change (moved to review by sami b) via a second create in the same flow.
  • Assign — update assignee_guid + assignee_name together (never one without the other), then notify the new assignee with the email pattern.
  • Daily digestschedule_repeating_event: tasks due tomorrow per assignee, one mail each with reminder_sent markers to stay idempotent.
  • Close — status to done with a timestamp; boards filter it out, stats keep counting it.

Scaling Notes

  • Board queries get a cache_key — boards are read-heavy and tolerate seconds of staleness (see caching patterns).
  • Invalidate the board cache on every task write with a storage-event → Redis delete flow (cache invalidation).
  • Past a few thousand open tasks per board, split counters per column onto a stats document instead of counting live.

Next Steps

First CRUD App The tutorial this example extends. User Management System The people side of assignments. Dashboard with Charts Aggregate the board into metrics.