# todo.filter The todos a list shows for its three controls: the view tab (`all`, `active`, `completed`), the tag picked in the sidebar, and the search box. A todo must pass all three, and the result keeps the input order, so sort first (todo.sort) or after, whichever the app prefers. - **View**: `active` is not done, `completed` is done, `all` is both. Any other view is an error: a typo should not quietly show an empty list. - **Tag**: `null` means any tag. Otherwise the tag is normalised exactly as stored tags are (todo.normalise-tags), so `"#Home"` and `" HOME "` find todos tagged `home`, and `"Home Office"` finds `home-office`. It is an exact tag match: `home` does not find `home-office`. A tag that normalises to nothing (`"#"`, `" "`) matches no todo, since a tag filter was asked for and no todo carries an empty tag. The todos' own tags are compared as stored; todo.item keeps them normalised. - **Search**: the query is trimmed of ASCII spaces, then matched as a case-insensitive (ASCII only) substring of the title, the notes, or the tags joined with spaces, using collections.search-text. So searching `bills` finds a todo tagged `bills`, and `home` finds one tagged `home-office`. An empty or all-space query matches everything.