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"
}columndrives the board view (todo / in-progress / review / done);boardseparates teams.- Assignee is denormalized — the board renders names without joins (see Storages).
- Everything searchable (
title,labels) is lowercase at write time.
The Views
- Board: one
function_searchper column (term onboard+column, sorted byprioritythendue) or one search grouped in the flow witharrayblocks — the dashboard pattern from Dashboards. - My tasks:
user_current→ term onassignee_guid+column != done, sorted bydueascending. - Detail: the task + its activity log (term on
task_guid) on one page. - 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_nametogether (never one without the other), then notify the new assignee with the email pattern. - Daily digest —
schedule_repeating_event: tasks due tomorrow per assignee, one mail each withreminder_sentmarkers to stay idempotent. - Close — status to
donewith 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.
