Quick add syntax
Every place you can type a task name, Conatus parses tokens out of it. Type the whole task in one line and the fields fill themselves in:
Renew passport tomorrow at 9am for 45m {friday} p1 #Admin @errandThat creates a P1 task called “Renew passport” in the project Admin, labelled errand, due tomorrow at 09:00, estimated at 45 minutes, with a deadline of this coming Friday.
Recognised tokens are removed from the name. Anything left over is the task name.
Tokens
Section titled “Tokens”| Token | Sets | Examples |
|---|---|---|
#name |
Project | #Admin, #Work |
@name |
Label | @errand, @deep-work |
p1–p4 |
Priority | p1, P3 |
| a date phrase | Due date | see below |
at <time> |
Due time | at 9am, at 17:30, at 9:05pm |
for <duration> |
Duration | for 90m, for 2h, for 1h30m |
{date phrase} |
Deadline | {friday}, {next week}, {2026-03-01} |
every … |
Repeat rule | every day, every 2 weeks, every monday |
Date phrases
Section titled “Date phrases”The same vocabulary is used for due dates, for deadlines inside { }, and for
due before: / due after: in the filter language.
| Phrase | Resolves to |
|---|---|
today, tod |
Today |
tomorrow, tmr |
Tomorrow |
monday … sunday (or mon, tue, …) |
The next such weekday, never today |
next week |
The coming Monday |
next friday |
That weekday in the coming week |
in 3 days |
Today plus three days |
2026-03-01 |
That ISO date |
1/3, 1.3 |
Day/month. Rolls to next year if it has already passed |
“Today” is your day, in the timezone set in Settings → Preferences.
at is required. A bare 9 is too ambiguous to treat as a time.
Accepted forms after at: 9, 09, 9am, 9pm, 9:30, 09:30, 9:05pm,
17:30. Twelve-hour forms need am or pm; without a suffix the number is read
as a 24-hour clock.
A time with no date implies today.
Durations
Section titled “Durations”for is required, for the same reason. Everything after it is one token:
for 90m for 2h for 1h30m for 45min for 2hoursHours accept h, hr, hrs, hour, hours; minutes accept m, min,
mins, minute, minutes. The maximum a task can hold is 1440 minutes.
Deadlines
Section titled “Deadlines”Braces mark a deadline rather than a due date:
File tax return {2026-04-30}Ship the release {next friday}The braces must hug the phrase exactly. { friday } will not parse and stays in
the task name. An unparseable or unterminated brace is left alone, so a task
called Fix the {weird} bug keeps its name intact.
Repeat rules
Section titled “Repeat rules”every … sets a repeat rule and picks the first occurrence:
- interval rules (
every day,every 3 weeks,every month) start today; - weekday rules (
every monday) start on the next such weekday.
The full grammar is on Recurring tasks.
Rules of resolution
Section titled “Rules of resolution”- First wins for dates. The first recognisable date phrase becomes the due date; later ones stay in the name.
- Last wins for projects.
#a #bputs the task inb. - Labels accumulate, and duplicates are ignored.
- A repeat rule blocks a separate date.
every monday tomorrowtakes the repeat rule and leavestomorrowin the name. - Unknown names are dropped, not invented.
#Nothingwhere no project called “Nothing” exists falls back to the current project (or Inbox); a@labelthat does not exist is not applied. Conatus never creates a project or label from a quick-add token. - Explicit form fields win. Whatever you pick in the priority, date or time controls overrides the parsed token.
- A task always keeps a name. If the tokens would consume the entire line, the whole line is used as the name and nothing is parsed.
Through the API
Section titled “Through the API”POST /api/v1/tasks/quick-add runs the same parser server-side:
curl -X POST https://tasks.example.com/api/v1/tasks/quick-add \ -H "Authorization: Bearer tdm_..." \ -H "Content-Type: application/json" \ -d '{"text":"Renew passport tomorrow at 9am p1 #Admin @errand"}'The response carries the created task, the parsed breakdown so a client can
show what it understood, and warnings naming any @label that did not match.
See REST API.
