Swashbuckler

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:

  1. Field — what to filter on (Title, any custom property, Tags, Created, Updated, or Relations)
  2. Operator — how to compare (contains, equals, is before, etc.)
  3. 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 TypeOperators
Text / URL / Titlecontains, 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 / Updatedis, is before, is after, is on or before, is on or after, is between, is empty, is not empty
Selectis, is not, is empty, is not empty
Multi-selectcontains, does not contain, is empty, is not empty
Checkboxis checked, is not checked
Contentcontains, does not contain, is empty, is not empty
Tagscontains, does not contain, has no tags, has tags
Relationslinks 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:

  1. Create a group with condition: Status is "active"
  2. 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:

OperatorBehavior
links toEntry has a relation (link or mention) to a specific entry
links to templateEntry has a relation to any entry of the selected template
has linksEntry has at least one relation
has no linksEntry 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-live region (e.g., "Showing 5 of 12 entries")
  • Sort direction is communicated via aria-sort attributes on table columns
  • All filter controls (field, operator, value selects) have aria-label attributes
  • 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)

On this page