Core Concepts
Tasks
A task is the central unit of work. Every task has:
| Field | Description |
|---|---|
title | Short description of the work |
priority | P0 (critical) → P1 → P2 (default) → P3 (low) |
status | Current state in the workflow |
assigneeId | Who is responsible for the task |
creatorId | Who created the task |
tags | Free-form labels, auto-populated by AI |
depth | Position in the task tree (0 = root) |
Tasks can be nested up to 5 levels deep. Deleting a parent task soft-deletes all its children.
Task Status
Tasks move through a defined set of states:
┌─────────────────────────────┐
│ │
┌──────────▼──────────┐ │
│ INBOX │ │
└──┬──────┬──────┬────┘ │
│ │ │ │
accept │ │reject│ clarify │
│ │ │ │
▼ ▼ ▼ │
ACCEPTED REJECTED NEEDS_CLARIFICATION │
│ │ │ │
start │ │resend│ (reply) │
│ └──────┴──────► INBOX │
▼ │
IN_PROGRESS │
│ │
done │ │
▼ │
DONE ────────────── reopen ────────────┘| Transition | From | To | Who |
|---|---|---|---|
accept | INBOX | ACCEPTED | Assignee |
reject | INBOX | REJECTED | Assignee |
clarify | INBOX | NEEDS_CLARIFICATION | Assignee |
start | ACCEPTED | IN_PROGRESS | Assignee |
done | IN_PROGRESS | DONE | Assignee |
reopen | DONE | IN_PROGRESS | Assignee or Creator |
resend | REJECTED | INBOX | Creator |
Self-assigned tasks (no assigneeId, or assigneeId equals the creator) skip INBOX and start as ACCEPTED automatically.
Teams
Teams group users together. They now have explicit roles, visibility, and join policy.
- Creating a team auto-joins you as the first
OWNER - Roles are
OWNER,ADMIN, andMEMBER OWNERcan manage all roles, delete the team, and must never drop to zeroADMINcan manage join requests, invitations, members, and basic team settingsMEMBERcan see member-only details but cannot manage the team- Teams can be
PUBLICorPRIVATE PUBLICteams can useAUTO_JOIN; all other team setups require approval- Task assignment across teams is not allowed
API Keys
Authentication uses API keys with the prefix doto_. Keys are:
- Generated as
doto_+ 32 random bytes (base62 encoded) - Stored as SHA-256 hashes — the raw key is never persisted
- Limited to 10 active keys per user
- Revocable at any time
Pass the key in every request:
Authorization: Bearer doto_xxxxxxxx...AI Classification
When a task is created and an AI provider is configured, Doto automatically:
- Generates free-form tags based on the title and description
- Suggests a priority level (stored but not auto-applied)
Both are stored in aiClassification on the task. If no AI provider is configured, the task is created normally with empty tags and aiClassification: null.
Supported providers: OpenAI, Anthropic, Google, Groq, Mistral, xAI, and OpenRouter.