Search
plasmoid ships full-text search with no server and no framework — a prebuilt static index plus a tiny vanilla-JavaScript client.
How it works
At build time, every rendered page contributes its title and text to a sharded
static index written under /search/:
search/
manifest.json # shard map + metadata
docs.json # per-document titles and URLs
a.json b.json … # postings sharded by first character of the term
When a reader opens search, the client lazy-loads the manifest and the document list, then fetches only the shards for the terms being typed. Normal page loads never download the index at all, so search adds zero weight to reading.
Why sharded
A single monolithic index is the thing that eventually gets slow to download as a site grows. Sharding by the first character of each term means a query pulls a small slice of the index instead of the whole thing — search stays fast as the docs grow.
The tokenizer
Indexing and querying must agree on how text becomes tokens, so the tokenizer rules are intentionally simple and mirrored exactly between the Rust indexer and the JS client: ASCII-alphanumeric runs, lowercased, length ≥ 2, sharded by first character.
Keyboard and accessibility
The search box is a proper combobox: arrow keys move through results, Enter opens the highlighted one, and Escape closes the list. It’s usable from the keyboard and announced correctly to assistive technology.
No JavaScript?
Search is the one feature that needs JavaScript. Everything else — reading, navigation, the table of contents, theme preference — works with scripts disabled.