Skip to content

reminder add / reminder update: support --urgent flag for urgent (iOS 26) reminders #350

@moritzketzer

Description

@moritzketzer

Summary

td reminder add and td reminder update cannot set the is_urgent
flag on a reminder, and td reminder get / td reminder list drop
is_urgent from their output. Urgent reminders are the iOS 26 feature
where time-based reminders fire a full-screen alarm that breaks through
Silent and Do Not Disturb modes (help center).

The SDK already types the field (@doist/todoist-sdk 10.2.0, bumped in
v1.65.0), so this is purely a CLI surface gap.

Requested changes

Write path

  • td reminder add: add --urgent (and --no-urgent for symmetry)
    that threads through to is_urgent on the reminder_add sync
    command.
  • td reminder update: same flag.

Read path

  • td reminder get and td reminder list: include is_urgent in
    plain output and as a key in --json output.

Current behaviour (tip of main, v1.65.0)

src/lib/api/reminders.ts defines local types that omit the field:

export interface Reminder {
    id: string
    itemId: string
    type: 'absolute' | 'relative' | 'location'
    due?: ReminderDue
    minuteOffset?: number
    isDeleted: boolean
}

export interface AddReminderArgs {
    itemId: string
    minuteOffset?: number
    due?: ReminderDue
}

export interface UpdateReminderArgs {
    minuteOffset?: number
    due?: ReminderDue
}

toReminder() hand-picks fields from the SDK's Reminder, so
isUrgent is dropped on read. addReminder() / updateReminder()
build the sync commands without it, so the CLI never sends it on
writes. Help output for both commands lacks any urgent flag:

$ td reminder add --help
Options:
  --task <ref>         Task reference (name or id:xxx)
  --before <duration>  Time before due (e.g., 30m, 1h)
  --at <datetime>      Specific time (e.g., 2024-01-15 10:00)
  --json               Output the created reminder as JSON
  --dry-run            Preview what would happen without executing

$ td reminder update --help
Options:
  --before <duration>  Time before due (e.g., 30m, 1h)
  --at <datetime>      Specific time (e.g., 2024-01-15 10:00)
  --dry-run            Preview what would happen without executing

SDK + server side already accept it

The SDK types isUrgent: z.ZodOptional<z.ZodBoolean> on reminder
request and response schemas across:

  • dist/types/types/reminders/requests.d.ts (multiple request shapes)
  • dist/types/types/sync/resources/reminders.d.ts (resource shape)
  • dist/types/types/sync/response.d.ts (sync response)
  • dist/types/types/webhooks/reminders.d.ts (webhook events — here
    it is isUrgent: z.ZodBoolean, non-optional)

I verified the sync API accepts it by direct POST to /api/v1/sync:

[{"type":"reminder_add","temp_id":"","uuid":"","args":{
  "item_id":"<task id>",
  "type":"absolute",
  "due":{"date":"2026-05-19T10:52:35Z","timezone":null,
         "is_recurring":false,
         "string":"2026-05-19T10:52:35.000000Z","lang":"en"},
  "is_urgent":true
}}]

Response: HTTP 200, sync_status: {"<uuid>": "ok"}. A subsequent
sync read returns the reminder with "is_urgent": true preserved.

Suggested patch shape

Roughly a dozen lines in src/lib/api/reminders.ts:

  1. Add isUrgent?: boolean to Reminder, AddReminderArgs,
    UpdateReminderArgs.
  2. Map isUrgent: r.isUrgent in toReminder().
  3. Pass isUrgent through pickDefined({...}) in both
    addReminder() and updateReminder().

Plus --urgent / --no-urgent flag wiring in
src/commands/reminder/add.ts and update.ts, and an [urgent]
marker (or similar) in the plain-text formatters.

Notes / out of scope

  • This issue is scoped to the CLI surface gap. Whether iOS currently
    renders or fires urgent alarms in response to server-set
    is_urgent: true is a separate concern at the iOS / sync layer.
  • Per Todoist docs, urgent applies only to time-based reminders;
    location reminders are excluded.

Environment

  • todoist-cli: 1.62.2 (gap confirmed on main @ v1.65.0)
  • @doist/todoist-sdk: 10.2.0
  • Plan: Pro (legacy personal)

Metadata

Metadata

Labels

Type

No type
No fields configured for issues without a type.

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions