01 — Overview
One shared list, always current
Most "who owes whom what" lives in chat threads, half-remembered voice notes, and email. It gets lost. Taski replaces that with a small, shared surface: you connect with one person, and either of you can send the other a task request carrying a deadline and notes. Both people watch the same card move through the same states until it's Done.
Two ideas separate Taski from a generic to-do app:
- It's a pair, not a project. There are no boards full of strangers. A task always has a creator and an assignee, and only those two participate.
- Done is permanent. Once finished, a task freezes — its thread closes and it drops into your reports. Nothing silently reopens.
Alongside the shared workflow, every account also gets a Personal list — a private to-do space that needs no connection at all.
02 — Core concepts
The vocabulary
Six nouns describe the whole system. Everything else is a rule about how they relate.
| Term | What it is |
|---|---|
| Connection | An accepted link between two users. It's the permission that lets either side send the other tasks. |
| Shared task | A request from one connected person (creator) to the other (assignee). Both can see it and post notes. |
| Personal task | A private task owned by a single user. No connection, no other viewer. |
| Status | Where a task sits in its lifecycle: Not Started → On Progress → Done. |
| Board | A live view of open tasks in columns — My Tasks, My Requests, or Personal. |
| Report | A time-boxed summary of what got created and completed, exportable as a PDF. |
03 — Feature
Connections & invites
A connection is the handshake that unlocks task-sending. You find someone, request a link, and once they accept, either of you can assign the other work.
Use it
- Open Connections and search by name or email (two characters minimum).
- Send a connection request. The other person sees it in their inbox and can Accept or Decline.
- Not on Taski yet? Send a shareable task link instead — they claim it by signing in, which both connects you and drops the task straight into their list.
Connections are reversible. Removing one stops new tasks from flowing and takes it out of your list, but every task you already shared — and its history in reports — stays intact. You can reconnect later.
Under the hood
Each pair is stored once with a canonical ordering (user_a < user_b) and a unique constraint, so a request can't be duplicated. A declined request enters a cooldown before it can be re-sent, preventing spam. "Removing" flips the row's status to removed rather than deleting it — that's why shared tasks survive a disconnect.
04 — Feature
Sending task requests
A request is the core unit of shared work. The creator writes it; the assignee owns it.
Use it
- From My Requests, tap the + and pick a connection.
- Give it a title, an optional rich-text description, and either a deadline or a repeat schedule.
- Send. It lands in the other person's My Tasks board, tagged New! for 24 hours.
Roles are fixed once sent: the creator owns the content (title, description, deadline); the assignee owns the status. That division is enforced by the database, not just the UI.
05 — Feature
The status flow
Every task moves through three states in one direction. The assignee drives it by dragging the card between columns.
Not Started → On Progress → Done
- Forward only. A task can advance but never slide backward (On Progress can't return to Not Started).
- Done is a one-way door. Completing a task freezes it — no edits, no status changes, and the notes thread closes.
- On-time vs late. A task finished after its deadline is marked Done · Late so the record is honest.
Under the hood
Status transitions are guarded by a database trigger, so the rules hold no matter how a write arrives. It checks three things on every update: only the assignee may change status; the change must be a forward transition; and a row already done is immutable. The completion time is stamped server-side along with the user's timezone, which is what powers the on-time / late judgement.
06 — Feature New
Progress flags
"On Progress" is rarely the whole story. A flag adds a sub-status so the other person knows why a task is sitting where it is — without a back-and-forth message.
Blocked In review Needs info On hold
Use it
- Open a task that's On Progress and pick a flag (with an optional short note, up to 120 characters).
- The flag shows as a pill on the card across every board, so the state reads at a glance.
- One flag at a time; clearing the flag returns the task to plain "working".
Under the hood
A flag is only valid while the task is on_progress — a CHECK constraint enforces that, and the flag is auto-cleared the moment the status changes. Only the assignee (shared) or owner (personal) can set it, guarded by the same update trigger. Because it's a real column, it also flows through realtime, so the other person's board updates live.
07 — Feature New
Recurring tasks
Some work isn't one-and-done — water the plants every other Friday, send the weekly report, pay rent on the 1st. Taski models this as one task with a built-in checklist, not a stream of duplicated cards. You verify each occurrence as it comes due, and a progress bar fills until the task completes itself.
Use it
- When creating a task, choose Daily, Weekly, or Monthly, then how many times it should repeat.
- Weekly picks a weekday. Monthly offers two modes: on a fixed date (e.g. the 15th, up to the 31st) or on the Nth weekday (e.g. the 2nd Friday).
- Each period, the assignee (or owner) hits Verify to check that occurrence off. The bar advances; after the final check-in the task auto-completes.
Recurring tasks live in their own Recurring row above the board rather than the kanban columns, and they carry no manual status — the schedule is the state.
Under the hood — the recurrence engine
A recurring task stores three fields: a frequency, a total number of occurrences, and an anchor — the datetime of the very first occurrence. Every later occurrence is derived, never stored:
The task's overall deadline is simply occurrence(total−1), the last one. For monthly Nth-weekday mode, a plain "+1 month" would drift (the 2nd Friday isn't a fixed date), so a single boolean flag switches the math to re-resolve the ordinal weekday within each target month. The weekday and the week-ordinal are read off the anchor, so no extra columns are needed.
Each verified occurrence is one row in a task_checkins table, keyed by slot index and unique per slot — so a period can't be double-counted. An occurrence is verifiable only on its own day: miss that day and the slot is locked for good (it shows red on the progress bar) — there's no catching up later. Once the last occurrence's day passes, the task freezes to Done regardless of any misses.
08 — Feature New
Personal list
Not everything is a request to someone else. The Personal list is a private space — only you can see it, and no connection is required. It supports the same priorities, deadlines, notes, recurring schedules, and progress flags as shared tasks.
It's also the one place with a true delete: because a personal task belongs to a single owner, removing it erases it outright. (Shared tasks are never hard-deleted — see below.)
09 — Feature
Notes & notifications
Every task carries an append-only thread. Updates are added, never edited or deleted, so the latest word is always obvious and the history is trustworthy. When a task reaches Done, its thread closes.
Notifications keep the other side in the loop without email noise. You're pinged when a task is assigned to you, when the other person adds a note, and around connection events. Boards surface the same signals inline — a New note badge on a card, an unread count in the bell.
Under the hood
Notifications are best-effort: a failed notification can never break the action that triggered it (creating a task, posting a note). A note ping always targets the other participant, which is how a board can show "new note from them" without any extra bookkeeping. Opening the task marks its pings read.
10 — Feature
Boards & clearing finished work
Three boards frame the same tasks from different angles:
- My Tasks — everything assigned to you.
- My Requests — everything you sent to others.
- Personal — your private list.
Each board shows a Recurring strip on top and kanban columns below. Boards update in realtime — when the other person moves a card, yours moves too.
To keep the Done column from growing forever, finished tasks age off the board after a week but stay in your reports. You can also clear finished tasks yourself.
Important — "Delete" on a board is per-person. Clearing a finished shared task hides it from your board only. The other participant still sees it, and it remains in both people's reports. There is no way for one person to erase a shared task from the other's side.
11 — Feature
Reports & PDF
Finished work rolls up into summaries you can review or hand off. Pick a single day or a range of up to a month; switch between a Shared and a Personal view.
- The shared report splits into Outgoing and Incoming, then groups tasks per person and by status, with an overdue tally.
- Recurring tasks are flagged with their cadence (Daily / Weekly / Monthly).
- One click exports a clean PDF — generated in the browser, previewed in-app before you download.
Under the hood
Reports scope each task by the right timestamp: done tasks by their completion date, open tasks by when they were created. That's why a board and a report can disagree — the board is "what's live now," the report is "what happened in this window." The PDF engine is loaded only when you click, so it never weighs down the app.
12 — Reference
Reference tables
Status
| State | Meaning | Who sets it |
|---|---|---|
| Not Started | Received, not yet begun. | Default on create |
| On Progress | Being worked on. Can carry a flag. | Assignee |
| Done | Complete and frozen. | Assignee (final) |
| Done · Late | Completed after the deadline. | System |
Progress flags
| Flag | Use it when… |
|---|---|
| Blocked | Something external is stopping progress. |
| In review | Work is submitted and awaiting a check. |
| Needs info | Waiting on an answer from the other person. |
| On hold | Intentionally paused for now. |
Recurrence
| Frequency | Options |
|---|---|
| Daily | Repeat for N days. |
| Weekly | A chosen weekday, for N weeks. |
| Monthly | A fixed date (1–31), or the Nth weekday (e.g. 2nd Friday), for N months. |