plasmoid
EN

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.

Last updated: 2026-06-22