Skip to contentSkip to Content
Feedback
PluginsRoadmap

Roadmap

The built-in roadmap integration renders source-defined phases as a release timeline. The view below reads the same data as the standalone /roadmap/ route, which is optional: routes.public: true turns it on.

The roadmap integration is compiled into folioh: nothing to install, nothing to list. It stays inert until a roadmap: section appears in docs.yaml — the config key is the activation switch.

Activate it in docs.yaml:

roadmap: routes: docs: true public: true phases: - id: "foundation" version: "0.1" project: "docs" title: "Foundation" status: "shipped" layer: "Source analysis" summary: "Parse Python source and docs into a static site." command: "folioh build" features: - "Parser" - "Search"

The timeline is rendered from source: change phases in docs.yaml, commit the file, and rebuild the site to update this view. Give phases a project to render independent release sequences from one roadmap.

Routes are opt-out: routes.docs (default true) publishes a generated /docs/roadmap/ page when your sources do not already contain one, and routes.public (default false) adds the standalone /roadmap/ page. The generated page is a # Roadmap heading over the timeline; write your own roadmap.md to replace it. The folioh roadmap CLI command prints the configured phases as a table.

phases must be a list of mappings. A phase takes id, version, project, title, status, layer, summary, command and features, and no other key. id, version, title, status, layer and summary are required strings: quote a version ("0.1"), or YAML reads it as a number. status is one of shipped, active, next or later, project and command are optional strings, and features, when present, must be a list. Any other shape stops the build with an error that names the entry, for example roadmap.phases[0].features must be a list (got string). A phase without features renders with an empty feature list.

The optional top-level description is the page’s own copy: the /roadmap/ page shows it under the title, above the releases. Releases are ordered by version, never by status.

Each feature can be a string or an object with text and an optional done boolean. Strings inherit completion from the phase: features in a shipped phase are complete. Use done to mark individual work within an active phase, or to override that inherited state:

features: - "Inherits the phase status" - text: "Source batches" done: true - text: "Native performance comparison" done: false

Naming the projects

Give a phase a project and the plugin groups the roadmap by it. On the standalone /roadmap/ page each project becomes a card, and every card holds that project’s whole plan: the release list on the left, the release you pick opened beside it. Projects are numbered independently, so two projects that ship separately each start at their own 0.1.

An optional projects: block names them. A label titles the card and a description sits under it; without either, the project key is shown as written.

The plugin also writes the projects: block to lib/roadmap-projects.ts as roadmapProjects, keyed by project, whether or not routes.public is on. A page that draws a project card outside the /roadmap/ view (a landing, or a theme page) reads the label and description from there, so they stay in docs.yaml.

roadmap: routes: public: true projects: engine: label: "Engine" description: "The library the CLI drives." cli: label: "CLI" phases: - id: "foundation" project: "engine" version: "0.1" # ...

Every card is expanded by default, and each one can be collapsed to its heading. ?product=<key> opens one card and collapses the rest, which is the link a project’s own landing page should use: /roadmap/?product=cli. A release is addressable too, scoped by project: /roadmap/#cli-0.2.

Collapsing hides a card’s releases; it does not drop them. Every release is in the served HTML whatever the page is showing, so a crawler or a reader with JavaScript off still sees the whole roadmap. The page’s Markdown mirror and llms-full.txt do not carry the timeline yet.

Internally, the integration uses the same extension primitives as the other built-in plugins: it registers a Roadmap component for embedding and a RoadmapPage component for the standalone route, writes two typed data modules (lib/roadmap-data.ts and lib/roadmap-projects.ts), and, when routes.public is on, creates the /roadmap/ view with the required folioh.public layout.

Live demo

This is Folioh’s own roadmap — the code tab shows the shape of the roadmap: section in this repository’s docs.yaml, the preview tab is the component rendering the real data:

Folioh's release line

v0.1

Foundation

Python first: source in, documented site out.

Source analysis
  • One command sets the project up
  • Reads your source, never runs it
  • API reference and your guides in one site
  • Types in signatures link to their pages
  • Edit a docstring, see the page
  • A component library and full-text search
  • llms.txt from day one
v0.2

Theming

Own the look at any depth, then ship it anywhere static files go.

Visual ownership
  • Presets, shareable packages, or your own template
  • Readers retheme the site from the site
  • A preview site per pull request
  • Social preview images
v0.3

One Binary

One native binary reads Python, JavaScript and Rust; the built-in plugins share one contract, and this site runs on it.

One platform
  • The core in Rust: one native binary, no Python to install
  • Three readers in the binary: Python, JavaScript, and Rust
  • Built-in plugins ship pages, components, and data
  • Your own React components in any page
  • Every project ships its authoring contract
  • Every page gets a portable Markdown mirror
  • Roadmap, landing, and OpenAPI integrations
v0.4

Agent Ready

Up next

A documentation harness for your coding agent: it writes the docs, keeps them in step with the code, and migrates them from any documentation tool. Every piece is built around Folioh, from the skill to the MCP server.

Agent surfaces
  • Agent discovery by the specs: .well-known and text/markdown negotiation
  • folioh mcp — search and read the docs from your editor, read-only
  • Every project ships a skill that teaches agents to write and maintain its docs
  • The site serves that skill to agents that never cloned the repo
  • A typed export of the whole site for tools and agents
  • Per-page structured data and content signals for search engines and AI crawlers
  • Your agent moves documentation from any tool to Folioh with a migration skill and a few scripts
v0.5

Every Language

Later
Reach
  • TypeScript, then Go, C#, and Java, next to Python, JavaScript, and Rust
  • Versioning — docs for every version of your library
  • Internationalization — sites in your readers' languages
  • Cross-language references
  • One search, one llms.txt, every language
  • Inline type information in examples
  • Folioh's own API reference, read by its Rust reader
  • Python read in depth: inherited members and re-exports
v1.0

Open Platform

Later
Extensibility
  • Project plugins return as sidecars over JSON-RPC
  • Language contract — a public way to add a language
  • Other tools add their own commands to the folioh CLI
  • Built with Folioh — a catalog of the projects and plugins built on Folioh, open to outsiders
  • One site across products and repos
  • The OpenAPI plugin becomes a full reference: a page per endpoint, schema fields, requests you can try, and Swagger 2.0 specs
  • Starter templates
  • Live plugin demos with their source
roadmap: routes: docs: false # this guide page owns the docs demo public: false # this site has no standalone /roadmap projects: docs: label: "Folioh Docs" phases: - id: "foundation" version: "0.1" project: "docs" title: "Foundation" status: "shipped" # shipped | active | next | later layer: "Source analysis" summary: "Python first: source in, documented site out." features: ["Parser", "API reference pages"] - id: "extension" version: "0.3" project: "docs" title: "One Binary" status: "shipped" layer: "One platform" summary: "One native binary reads Python, JavaScript and Rust; the built-in plugins share one contract."