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
| Term | Meaning | Example |
|---|---|---|
| bare word | free-text keyword (substring match on text fields) | login |
"quoted phrase" | exact-phrase free-text match | "auth flow" |
field:value | field filter (equality / membership) | status:blocked |
field:OPvalue | comparison filter | due:>2026-06-30 |
field:a..b | range filter | due:2026-06-01..2026-06-30 |
field:a,b,c | OR within one field | status:todo,in_progress |
-term | negation of any of the above | -status:done, -label:wontfix, -spam |
is: / has: / no: | semantic aliases (see below) | is:overdue, no:assignee |
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.
| Written | Meaning | Applies to |
|---|---|---|
field:v | equals | any (enum / text / id / date) |
field:>v field:>=v field:<v field:<=v | greater / less than (or equal) | dates, numbers, ordered enums |
field:a..b | range (≥ a and ≤ b) | dates, numbers |
field:a,b,c | matches any of | any |
-field:v | not equal (or not-in for a list) | any |
field:~text | contains (explicit substring) | text fields |
field:^text | starts with | text fields |
field:* / has:field | present (not null) | nullable fields |
field:none / no:field | absent (null / empty) | nullable fields & relations |
- 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)
| Field (aliases) | Value form |
|---|---|
status | enum value, resolved per type (see Cross-resource semantics) |
team | team prefix (ENG), name, or id |
label | label name (quoted if it contains spaces) |
created (createdAt) | date / range / relative |
updated (updatedAt) | date / range / relative |
ref (reference) | text; supports ^ prefix match |
name (title) | text; contains by default |
id | resource id |
type (in) | task, project, milestone — narrows which kinds are searched |
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.
| Field (aliases) | Available on | Value form |
|---|---|---|
assignee | tasks | person (see People values) |
createdBy (author) | tasks | person |
priority | tasks | ordered enum |
project | tasks | project reference / name / id |
parent | tasks | task reference / id |
due (dueDate) | tasks, milestones | date / range / relative |
start (startDate) | milestones | date / range / relative |
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.
| Alias | Expands to |
|---|---|
is:open | not in a terminal state (task: not DONE/CANCELLED; project/milestone: not COMPLETED/CANCELLED) |
is:closed | in a terminal state |
is:done | task DONE / project·milestone COMPLETED |
is:active | task IN_PROGRESS / project·milestone ACTIVE |
is:blocked | task BLOCKED (tasks only) |
is:overdue | due date before today AND open (tasks, milestones) |
is:unassigned | unassigned (tasks only) |
has:assignee / no:assignee | assignee present / absent |
has:label / no:label | has any label / none |
has:due / no:due | due date present / absent |
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.