lepiter is the notebook and
knowledge base system behind glamorous
toolkit. it stores pages as json files on disk—which means you can
read them without the gt environment. lepiter-cli does
exactly that: a terminal tool for browsing, searching, and editing
lepiter knowledge bases.
quick start
# browse interactively
lepiter-cli tui ./my-knowledge-base
# list all pages
lepiter-cli list ./my-knowledge-base
# search
lepiter-cli search "pharo" ./my-knowledge-base --full-text
# render a page to stdout
lepiter-cli show "Page Title" ./my-knowledge-basethe tui gives you a searchable page list, full-screen page reading
with markdown-like rendering, and link navigation. tab
cycles through links on a page, enter follows them,
h goes back.
editing
press e in page view to enter the editor. it works at
the snippet level—text and code snippets are editable, everything else
stays read-only. changes are auto-saved after a short idle period and
written back to the page json file. ctrl+u undoes,
tab moves between snippets.
plugins
lepiter’s schema has many snippet types, and new ones appear over
time. lepiter-cli handles unknown types via external
plugins: long-lived processes that receive snippet json over stdin and
return rendered lines over stdout.
{
"plugins": [
{ "name": "wardley", "types": ["wardleyMap"] }
]
}the plugin binary is resolved from PATH by convention
(lepiter-plugin-<name>), and
lepiter-core exports a small sdk with a
lepiter_plugin_main! macro to cut the boilerplate. render
output is cached by snippet hash.
structure
two crates:
lepiter-core: parser, metadata index, plugin sdk, and plain text renderer. lazy loading—metadata is indexed on open, full pages parsed on demand.lepiter-cli(lepiter-tui/): the tui, editor, and all cli subcommands.
resilience
lepiter’s schema evolves. lepiter-core handles unknown
snippet types by preserving them as Node::Unknown with
their raw json, so new snippet types don’t crash the tool—they just
render as a fallback, or get routed to a plugin if one is configured1. non-fatal parse issues are
collected separately and don’t abort indexing.
the
probeexample inlepiter-coreis useful for inspecting what snippet types appear in a corpus and whether any are hitting the unknown path.↩︎