Inside the app

Gamification, standups & Copilot

Around the task list sits a thin layer of motivation: XP and streaks, a daily standup ritual, an activity feed, smart notifications, and an AI assistant (Copilot) that knows your workspace. None of it is required — all of it rewards showing up.

XP, levels & streaks

Completing work awards XP. XP maps to a level; levels display on your avatar ring; streaks track consecutive active days. The numbers are stored on member_stats and update via the same realtime channel as everything else.

Pipeline: task complete → XP event → member_stats update → level check → celebration toast.
From check-box click to confetti. Five steps, all idempotent — a realtime echo won't double-award.
task_complete
Base award. Fires when a task moves to status = done.
task_complete_flagged
Bonus award on top when the task was flagged important.
focus_session
Awarded when a focus-timer run completes its target duration.
current_streak
Days-in-a-row with at least one awarded event. Resets after a missed day.
longest_streak
Personal best — updated monotonically.
Opinionated but skippable
The XP system is meant to be a soft nudge, not a leaderboard you have to beat. Turn off XP toasts in notification preferences if you prefer a quieter workspace.

Daily standups

The classic three-question format: yesterday / today / blockers. Writing one is an upsert against daily_standups keyed by (member_id, date), so you can edit all day until you hit post. Posting creates a feed entry of type standup and fires notifications to teammates.

Standup editor with yesterday, today, and blockers fields.
One upsert, three fields. Blockers surface in every teammate's notification bell.

Activity feed

One stream per workspace. Three entry types:

post
A manual update — text, optional URL with unfurled metadata (title, description, image).
task_complete
Auto-logged when a task moves to done. Links to the task and the member who finished it.
standup
Auto-logged when a standup is posted. Inline yesterday/today/blockers body.
Feed showing a mix of manual posts, task completions, and standup entries.
The feed is the only workspace-level view in the app — everything else is project-scoped.

Notifications

A minimal inbox of events addressed to you. Fan-out happens server-side on mutations that affect another member: task assigned, task blocked, standup posted, EOD reminder. Unread count rings the bell on the top bar; per-type preferences (sound, desktop, muted) are stored in localStorage.

task_assigned
Someone assigned a task to you — or changed your existing assignment.
task_blocked
An assignee flagged one of your tasks as blocked.
standup_posted
A teammate's standup went live in the feed.
eod_reminder
End-of-day nudge if you're close to a streak break.
level_up
A teammate leveled up — celebration is optional.

Copilot

A chat panel scoped to the current workspace. It can read tasks, projects, standups, and notes — everything you can read — and answer questions like “what did Ana ship this week?” or “summarize the blockers on Project Atlas.” It does not execute writes on your behalf without explicit confirmation.

Copilot chat panel open on the right side of the workspace.
Slides in from the right. Lazy-loaded so it doesn't cost anything until you open it.
Context scope
Copilot only sees data in the current workspace. Switching workspaces resets the conversation and the context window — there is no cross-workspace memory.

Next up

The trust layer — auth, identity, and what RLS does and doesn't protect against.

Security & access →