Skip to content

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 @errand

That 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.

Token Sets Examples
#name Project #Admin, #Work
@name Label @errand, @deep-work
p1p4 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

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
mondaysunday (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.

for is required, for the same reason. Everything after it is one token:

for 90m for 2h for 1h30m for 45min for 2hours

Hours accept h, hr, hrs, hour, hours; minutes accept m, min, mins, minute, minutes. The maximum a task can hold is 1440 minutes.

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.

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.

  • First wins for dates. The first recognisable date phrase becomes the due date; later ones stay in the name.
  • Last wins for projects. #a #b puts the task in b.
  • Labels accumulate, and duplicates are ignored.
  • A repeat rule blocks a separate date. every monday tomorrow takes the repeat rule and leaves tomorrow in the name.
  • Unknown names are dropped, not invented. #Nothing where no project called “Nothing” exists falls back to the current project (or Inbox); a @label that 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.

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.