Skip to main content

Filtering & Search

Codex provides powerful filtering and search capabilities to help you find content in your library. This guide covers the filter UI, condition-based filtering, and full-text search.

Quick Filters

The library view includes a filter panel with common filters:

Accessing Filters

  1. Navigate to a library
  2. Click the Filter button in the toolbar
  3. The filter panel opens as a drawer

Filter Groups

Read Status

Filter by reading progress:

StatusDescription
UnreadNo reading progress on any book
In ProgressCurrently reading (some progress, not completed)
ReadAll books completed

Publication Status

Filter by series publication status:

StatusDescription
OngoingSeries is still being published
EndedSeries is complete
HiatusSeries is on hold

Genres & Tags

Filter by genres and tags extracted from your media metadata (ComicInfo.xml, EPUB metadata).

Filter Modes

Each filter group supports two modes:

  • All selected (AND): Series must match ALL selected values
  • Any selected (OR): Series must match ANY of the selected values

Include vs Exclude

Click a filter chip to cycle through states:

StateVisualBehavior
NeutralGray outlineNot applied
IncludeBlue filledMust match
ExcludeRed filled with XMust NOT match

Active Filters

Active filters appear as chips below the toolbar. Click the X on any chip to remove it, or click "Clear all" to reset.

URL Persistence

Filters are saved in the URL for easy sharing and bookmarking:

/library/abc123?gf=all:Action,Comedy:-Horror&sf=ongoing

Parameters:

  • gf: Genre filter (mode:include1,include2:-exclude1)
  • tf: Tag filter
  • sf: Status filter
  • rf: Read status filter

Advanced Filtering (API)

For complex queries, use the POST /series/list or POST /books/list endpoints.

Condition Structure

Filters use a tree structure with combinators:

{
"condition": {
"allOf": [
{ "genre": { "operator": "is", "value": "Action" } },
{ "genre": { "operator": "isNot", "value": "Horror" } }
]
}
}

Combinators

CombinatorSQL EquivalentDescription
allOfANDAll conditions must match
anyOfORAny condition can match

Field Operators

OperatorDescriptionExample
isEquals{"operator": "is", "value": "Action"}
isNotNot equals{"operator": "isNot", "value": "Horror"}
isNullField is null{"operator": "isNull"}
isNotNullField has value{"operator": "isNotNull"}
containsContains substring{"operator": "contains", "value": "bat"}
beginsWithStarts with{"operator": "beginsWith", "value": "The"}

Series Filter Fields

FieldDescriptionOperators
libraryIdLibrary UUIDis, isNot
genreGenre nameis, isNot
tagTag nameis, isNot
statusPublication statusis, isNot
publisherPublisher nameis, isNot, isNull, isNotNull
languageLanguage code (BCP47)is, isNot, isNull, isNotNull
nameSeries nameis, isNot, contains, beginsWith
readStatusReading statusis, isNot

Book Filter Fields

FieldDescriptionOperators
libraryIdLibrary UUIDis, isNot
seriesIdSeries UUIDis, isNot
genreGenre nameis, isNot
tagTag nameis, isNot
titleBook titleis, isNot, contains
readStatusReading statusis, isNot
hasErrorHas parsing errorisTrue, isFalse

Example Queries

Simple Genre Filter

{
"condition": {
"genre": { "operator": "is", "value": "Action" }
}
}

Multiple Genres (OR)

Match series with Action OR Comedy:

{
"condition": {
"anyOf": [
{ "genre": { "operator": "is", "value": "Action" } },
{ "genre": { "operator": "is", "value": "Comedy" } }
]
}
}

Genre with Exclusion

Match Action series but exclude Horror:

{
"condition": {
"allOf": [
{ "genre": { "operator": "is", "value": "Action" } },
{ "genre": { "operator": "isNot", "value": "Horror" } }
]
}
}

Complex Nested Query

(Action AND Comedy) OR (Fantasy AND NOT Horror):

{
"condition": {
"anyOf": [
{
"allOf": [
{ "genre": { "operator": "is", "value": "Action" } },
{ "genre": { "operator": "is", "value": "Comedy" } }
]
},
{
"allOf": [
{ "genre": { "operator": "is", "value": "Fantasy" } },
{ "genre": { "operator": "isNot", "value": "Horror" } }
]
}
]
}
}

Read Status Filter

Find series currently being read:

{
"condition": {
"readStatus": { "operator": "is", "value": "in_progress" }
}
}

Multi-Field Filter

Ongoing Action series with Favorite tag:

{
"condition": {
"allOf": [
{ "status": { "operator": "is", "value": "ongoing" } },
{ "genre": { "operator": "is", "value": "Action" } },
{ "tag": { "operator": "is", "value": "Favorite" } }
]
}
}

Combine full-text search with condition filters:

{
"fullTextSearch": "batman",
"condition": {
"genre": { "operator": "is", "value": "Action" }
}
}

The search is case-insensitive and matches against titles. It's combined with the condition using AND logic.

The header search bar searches both series and books:

  1. Type at least 2 characters
  2. Results appear in a dropdown grouped by type
  3. Click a result to navigate, or press Enter for the full search page

Performance Tips

  1. Use specific filters: More specific filters run faster
  2. Combine with library_id: Always include library_id when filtering within a library
  3. Avoid deep nesting: Very deeply nested conditions may be slower
  4. Use pagination: Always paginate results for large libraries

Next Steps