Doc Browser Server

hypha server is a loopback-only doc browser built on the same data as the CLI, but with a visual surface humans can scan quickly. The first run pays the indexing cost; every subsequent run hits the SQLite cache and renders results on the first keystroke.

$ hypha server --port 4287
hypha server listening on http://127.0.0.1:4287

hypha server — command palette and symbol card

Highlights

  • Command-palette fuzzy search. Type Data.Map lookup or Data.Map.Strict.lookup — FZF/Telescope-style tokenised matching ranks the canonical symbol first. The dropdown is centered under the search bar and works the same on every page.

    fuzzy search dropdown mid-query

  • One result per definition. Rows that share a definition site collapse into a single hit — Data.Traversable.mapAccumL and GHC.Internal.Data.Traversable.mapAccumL are one result, not two — with the most public presentation winning. Nothing is hidden: a +N badge opens a list naming every package and module that was folded in, each a link, with the defining one tagged. Data.Map.Strict.insertWith and Data.Map.Lazy.insertWith stay two results, because they have different definitions. Press Tab to scope to one package; the scope applies before the fold, so a definition two packages present still appears under either.

  • Packages and modules are results too, ranked above the symbols beneath them: typing containers lands the package page, typing Data.Map.Strict lands the module page.

  • Live build-progress feedback. A slim accent-coloured progress bar at the top of the page shows how many packages remain to index. A shimmering "Building the docs…" placeholder fills the dropdown until the index is warm.

  • Façade modules are no longer empty. A module that only re-exports — Data.Traversable, Prelude, Data.Map.Strict — lists its entries with real signatures and Haddock, each tagged from <Module> (or from <pkg>:<Module> when the definition lives in a dependency) and linking there. Resolution goes through the search index, so a symbol re-exported through two or more modules still lands on its declaration rather than on the module that merely passes it along.

  • Faithful symbol cards. Multi-line signatures are joined, Haddock comes from the GHC parse tree — so a doc block separated from its declaration by a blank line still binds correctly — and is rendered to HTML (paragraphs, <code>, <pre> code blocks, lists, links). Every link is built from the component that defines the symbol, which may be a different package from the one in the URL. A card that could not read a signature says so instead of rendering an empty box.

    rendered symbol card with Haddock

  • Skylighting-rendered source view with a ?line=N scroll target.

    highlighted source view

  • Private libraries. Sublibs appear as separate sidebar entries — a package's main library under its own name, a sublibrary as pkg:sublib (e.g. happy-lib:frontend) — each with their own pages and search scope.

See Endpoints & Flags for the full HTTP surface and command-line options.