Filtering & Sorting
Filter entries by any property with rich operators, OR logic via filter groups, relation filters, and system date filtering.
Overview
Every template page supports filtering and sorting. Filters narrow down which entries are shown, and sorting controls the order. Both work across all four view modes (table, list, card, and board) and persist per template in your browser.
Filtering
Click the Filter button at the top of a template page to open the filter builder. A badge shows how many active filter conditions are applied.
{/* screenshot: Filter builder with Notion-style condition rows */}
Filter Builder
The filter builder uses a row-based interface. Each row is a single filter condition with three parts:
- Field — what to filter on (Title, any custom property, Tags, Created, Updated, or Relations)
- Operator — how to compare (contains, equals, is before, etc.)
- Value — what to compare against (text, number, date, tag, entry, or template)
Click Add filter group to create your first filter. Click Add filter within a group to add more conditions. Use the X button to remove individual conditions.
Filter Types and Operators
Each field type supports specific operators:
| Field Type | Operators |
|---|---|
| Text / URL / Title | contains, does not contain, equals, does not equal, starts with, ends with, is empty, is not empty |
| Number | = , \u2260 , > , < , \u2265 , \u2264 , is empty, is not empty |
| Date / Created / Updated | is, is before, is after, is on or before, is on or after, is between, is empty, is not empty |
| Select | is, is not, is empty, is not empty |
| Multi-select | contains, does not contain, is empty, is not empty |
| Checkbox | is checked, is not checked |
| Content | contains, does not contain, is empty, is not empty |
| Tags | contains, does not contain, has no tags, has tags |
| Relations | links to, links to template, has links, has no links |
Changing the field resets the operator to the default for that field type and clears the value.
Content filtering searches the body text of entries. Content data is loaded on-demand only when a content filter is active, keeping default page loads lightweight. The search bar also matches against body text when content data is available.
Filter Groups (OR Logic)
Filter conditions within the same group use AND logic — an entry must match every condition in the group. To create OR logic, add multiple filter groups using the Add filter group button.
Groups are separated by an or divider. An entry appears if it matches any group (OR between groups) where it matches all conditions in that group (AND within groups).
Example: To show entries that are either "active" status OR have the "urgent" tag:
- Create a group with condition: Status is "active"
- Add another filter group with condition: Tags contains "urgent"
System Dates
Created and Updated are available as filterable fields with all date operators. These filter on the entry's created_at and updated_at timestamps.
Relation Filters
Filter entries based on their links to other entries:
| Operator | Behavior |
|---|---|
| links to | Entry has a relation (link or mention) to a specific entry |
| links to template | Entry has a relation to any entry of the selected template |
| has links | Entry has at least one relation |
| has no links | Entry has no relations |
Filter Pills
Active filters appear as removable pills below the filter bar. Each pill shows the field name, operator, and value (e.g., "Title contains meeting" or "Tags has tags"). Click the X on any pill to remove that specific condition. Click Clear all inside the filter popover to remove all filters.
When filters are active, the header shows a count like "5 of 12 Tasks" so you always know how many entries are hidden.
{/* screenshot: Filter pills showing active filter conditions with operator labels */}
Empty Filtered State
When no entries match your filters, a message appears: "No {template plural name} match your filters" with a Clear filters link.
Sorting
Click the Sort dropdown to choose a field and direction.
Sortable Fields
You can sort by:
- Manual (user-defined drag-and-drop order)
- Title (alphabetical)
- Tags (alphabetical by tag names)
- Updated (most recent first/last)
- Created (most recent first/last)
- Any custom property defined on the template
Each field except Manual supports ascending and descending order.
Manual Sort
When Manual sort is selected, drag handles appear next to each entry in table and list views. Drag entries to reorder them. The order persists across sessions and is stored per entry.
Manual sort has no direction toggle — it always displays entries in the order you've arranged them. New entries that haven't been manually positioned appear at the top of the list.
Default Sort
The default sort is Updated (descending) — most recently edited entries appear first.
Table Column Headers
In table view, clicking a column header toggles sort by that column. The current sort column shows a directional arrow. Column header sorts stay in sync with the Sort dropdown — they're two ways to control the same thing.
{/* screenshot: Table view with sort arrow on a column header */}
Persistence
Both filter and sort selections are saved per template in your browser's localStorage. When you return to a template page, your previous filter and sort settings are restored automatically. Switching between view modes preserves the current filter and sort state.
Accessibility
- Filter changes are announced via an
aria-liveregion (e.g., "Showing 5 of 12 entries") - Sort direction is communicated via
aria-sortattributes on table columns - All filter controls (field, operator, value selects) have
aria-labelattributes - Filter pills are keyboard-navigable with clear labels
- The Clear filters link is reachable via keyboard
- Entry search in relation filters supports keyboard navigation (arrow keys + Enter)