Search
Slog provides a single, human-friendly text query that searches across tasks, projects, and milestones at once. The same query syntax is used by the CLI (slog search), the SDK (slog.search()), and the
GET /search endpoint.
A query is a whitespace-separated list of terms. All terms are combined with
AND. Comma means OR within a single field, and a leading - negates
a term. There is no free-standing OR keyword and no parentheses.
login AND the phrase auth flow, AND status is todo
or blocked, AND has an assignee, AND priority ≥ high, AND due before
2026-06-30.
Term forms
A query with no
field: terms is a pure keyword search; a query with no bare
words is a pure structured filter; the two mix freely.
Operators and value modifiers
Modifiers are written as a prefix on the value, keepingfield: clean.
- Enum and keyword matching is case-insensitive (
status:Blocked=status:blocked). IDs and references are matched as given. priorityis an ordered enum (LOW < MEDIUM < HIGH < URGENT), sopriority:>=highis meaningful and expands to “high or urgent”.
Fields
Universal fields (all resource types)
Type-specific fields
Using a type-specific field implicitly narrows results to the types that have it. For example,priority:high returns only tasks; due:overdue returns tasks and
milestones (both have a due date) but never projects.
Dates
Three interchangeable formats anywhere a date is expected:- Absolute:
2026-06-02(ISOYYYY-MM-DD).YYYY-MMandYYYYare allowed and expand to the natural range —due:2026-06≡due:2026-06-01..2026-06-30. - Relative: signed offset from today in
d/w/m/y—-7d,-2w,+1m. Most useful with comparisons:created:>-7d(last week),due:<+3d(due within 3 days). - Named:
today,yesterday,tomorrow,overdue(= before today),week/month(the current calendar period as a range).
due:today, due:overdue, created:>=-30d,
updated:2026-05-01..2026-05-31.
People values
Used byassignee and createdBy / author:
assignee:@me(orassignee:me) — the current userassignee:[email protected]— resolved by emailassignee:"Chris W"— resolved by name (quoted because it contains a space)assignee:none/no:assignee— unassignedassignee:*/has:assignee— assigned to anyoneassignee:@me,[email protected]— assigned to either
Cross-resource semantics
A single query fans out to tasks, projects, and milestones and returns one mixed result set.- The
type:selector narrows which kinds are searched:type:task(only tasks),type:project,milestone(both). Omittingtype:searches all three. - Per-type value resolution. The
statusenum differs by type. Astatus:value is matched against each type’s own enum:status:activematches projects and milestones (ACTIVE);status:blockedmatches only tasks (BLOCKED). A value that exists in no searched type’s enum is a validation error with a “did you mean” hint.
is: / has: / no: aliases
Friendly shortcuts that expand to the filters above. has: / no: are generic
presence / absence over any nullable field. is: is a curated set, including
cross-type states that paper over the per-type enum differences.
Aliases compose with everything:
is:overdue is:blocked assignee:@me.
Free-text keywords
- A bare word matches a
containsacross a resource’s primary text fields: tasktitle+description, project / milestonename+description. - A
"quoted phrase"matches the whole phrase contiguously. - Multiple keywords are ANDed (
login page= contains “login” AND contains “page”). Use a quoted phrase to match"login page"as one unit. - A negated keyword
-spamexcludes matches.
Quoting and escaping
- Wrap any value containing spaces or
:in double quotes:label:"needs design",name:"v2 launch". - A literal quote inside a quoted value is
\"; a literal backslash is\\. - A leading
-in a keyword is escaped as\-to avoid being read as negation. - A bare word containing
:that is not a known field (e.g.http://x) is treated as a keyword, not a filter — only registered field names trigger filter parsing.