Skip to main content

Fast, plugin-first documentation generator. Rust core, Python-friendly.

Project description

farol

docs, lit. Forged in Rust. Lit for life.

Fast, plugin-first documentation generator. Rust core. Python-friendly. Apache-2.0, free forever.

Status: pre-alpha.


Why farol

A lighthouse - a farol - is built of iron and lit to guide.

That is what a docs site should be: a structure that stands on its own, and a beam that points the reader home. Existing tools fail at one or both. MkDocs is Python and slow; Material for MkDocs lives downstream of an owner's roadmap; Zensical gates features behind paid tiers; Docusaurus and Starlight ship JavaScript runtimes to render static prose; Hugo is fast but hostile to extension; Marmite is lovely but blog-first and AGPL.

farol is built for docs, in Rust, and lit by Python. The iron is fast. The beam is ergonomic. Both are free, forever.


Design principles

  1. Fast by default. 10k pages under 3 seconds cold, under 200ms warm. Incremental rebuild with a persistent dependency graph.
  2. Plugins are first-class, not a bolt-on. Every builtin feature uses the same public plugin API the community uses.
  3. Python for plugin authors, Rust for the engine. pip install farol-plugin-foo is all a user should need.
  4. Free forever, legally durable. Apache-2.0, no CLA, trademark separated. The code cannot be rug-pulled, relicensed, or quietly closed.
  5. i18n and versioning are core, not plugins. They shape the routing graph and belong in the engine.
  6. No JS framework in the output. Static HTML, CSS, and small islands of vanilla JS. No React. No hydration.
  7. Great default theme. One polished theme ships with the binary. Community themes distribute as pip packages.
  8. Honest errors. Every parse, config, or render error points at the file, line, and column.

Install

pip install farol

A pre-built wheel with the Rust engine embedded (no Rust toolchain required on your side).

Quick start

farol new my-docs
cd my-docs
farol serve

Open http://localhost:8000. Edit a .md file. The browser refreshes in milliseconds.

Plugins in ten lines

# farol_plugin_wave/__init__.py
from farol import hookimpl

@hookimpl
def on_page_markdown(markdown, page, config):
    return markdown.replace(":wave:", "๐Ÿ‘‹")

Register in pyproject.toml:

[project.entry-points."farol.plugins"]
wave = "farol_plugin_wave"

pip install farol-plugin-wave and it's picked up automatically. No base class, no manifest, no setup step.

Scaffold a new plugin in one command:

farol plugin new my-plugin

Configuration

# farol.toml
site_name = "My Docs"
site_url  = "https://docs.example.com"

[theme]
name    = "default"
palette = "slate"
primary = "indigo"

[i18n]
default   = "en"
languages = ["en", "pt-BR", "es"]

[versioning]
current  = "v2.1"
versions = ["v2.1", "v2.0", "v1.9"]

[search]
stemming = "auto"
fuzzy    = true

[plugins]
enabled  = ["search", "sitemap", "admonitions", "code-copy"]
disabled = ["rss"]

Architecture

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚                      farol CLI                          โ”‚
โ”‚         (Rust, distributed via pip as wheel)            โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
                     โ”‚
     โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
     โ”‚                               โ”‚
โ”Œโ”€โ”€โ”€โ”€โ–ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”            โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ–ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚  Core (Rust) โ”‚            โ”‚  Plugin runtime     โ”‚
โ”‚              โ”‚            โ”‚  (PyO3 + pluggy)    โ”‚
โ”‚ - Parser     โ”‚   hooks    โ”‚                     โ”‚
โ”‚ - Graph      โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ–บโ”‚  @hookimpl          โ”‚
โ”‚ - Cache      โ”‚            โ”‚  def on_page_md(โ€ฆ)  โ”‚
โ”‚ - Renderer   โ”‚            โ”‚                     โ”‚
โ”‚ - Search     โ”‚            โ”‚  Discovered via     โ”‚
โ”‚ - i18n       โ”‚            โ”‚  entry_points       โ”‚
โ”‚ - Versioning โ”‚            โ”‚                     โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜            โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

Builtin plugins

Tier Plugins State
Always on nav-builder, toc, frontmatter, link-resolver, asset-pipeline, sitemap Not disableable
On by default search, admonitions, code-copy, syntax-highlight, anchor-links, rss, redirects Togglable
Opt-in builtin mermaid, katex, mkdocs-migrate, social-cards, git-info, llm-txt, api-reference Off by default

Analytics, comments, and SaaS integrations are community plugins, not builtins. The core stays neutral.


Default theme

One polished theme ships with the binary. Layouts: default, landing, blog, api. Light and dark, responsive, config-driven colors. Template engine: MiniJinja (Jinja2-compatible - Material for MkDocs templates port with minimal work).

Users can override individual templates in overrides/ without forking the theme. Community themes are pip packages that may extends = "default" and override only what they need.

JavaScript budget for the theme: under 15 KB gzipped, all vanilla, zero framework. Works with JS disabled except for search and switchers.


Roadmap

Milestone Scope
M0 CLI scaffold, parse MD โ†’ HTML, minimal theme, build and serve
M1 Incremental dependency graph, persistent cache, hot reload
M2 Python plugin API (PyO3 + pluggy), tier-1 and tier-2 builtins
M3 tantivy search (static + optional server)
M4 i18n and versioning
M5 Default theme polish, MiniJinja templates, plugin scaffolding CLI
M6 pip install farol, wheel distribution, mkdocs-migrate
M7 Dogfood - farol's own docs built with farol

Governance

  • Apache-2.0. Patent grant included.
  • No CLA. Contributions stay with their authors.
  • Trademark separate from code. The name "farol" and the logo are protected; the code is free. Forks are welcome; misleading "official" forks are not.
  • RFC process for breaking plugin-API changes, with six-month deprecation on major bumps.
  • Hook signature stability guaranteed across minor versions.

Non-goals

  • Replacing full-featured SSGs like Next.js or Astro. farol is docs-shaped.
  • Arbitrary React or Vue components inside content. MDX-style mixing is out.
  • A hosted service. farol builds static output; host it wherever.
  • Paid tiers. Ever.

Origin

The word farol comes from Pharos, the lighthouse of Alexandria - the first structure built to guide travelers home. Modern lighthouses are iron towers; the mirrors that first focused their flame were polished bronze. Metal, shaped to point the way.

farol is forged in ferrumio - a foundry of Rust-powered developer tools. From the same forge as pydynox, farol is the piece built to light the path.


License

Apache-2.0. See LICENSE.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distributions

No source distribution files available for this release.See tutorial on generating distribution archives.

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

farol-0.0.1-cp311-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (6.5 MB view details)

Uploaded CPython 3.11+manylinux: glibc 2.17+ x86-64

farol-0.0.1-cp311-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (6.3 MB view details)

Uploaded CPython 3.11+manylinux: glibc 2.17+ ARM64

farol-0.0.1-cp311-abi3-macosx_11_0_arm64.whl (5.9 MB view details)

Uploaded CPython 3.11+macOS 11.0+ ARM64

farol-0.0.1-cp311-abi3-macosx_10_12_x86_64.whl (6.2 MB view details)

Uploaded CPython 3.11+macOS 10.12+ x86-64

File details

Details for the file farol-0.0.1-cp311-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for farol-0.0.1-cp311-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 c8ac7a3cc990379bb41c968b93bfef04ee447f7bb3fd978f9ab9d014e0e50cf3
MD5 3ce73017bb141f6b5ed28f54a3cc8795
BLAKE2b-256 59df12b9ec642e04ce7c26ddf82b1932452054ec0dc6d8d2b7efd6c18a074170

See more details on using hashes here.

Provenance

The following attestation bundles were made for farol-0.0.1-cp311-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:

Publisher: release.yml on ferrumio/farol

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file farol-0.0.1-cp311-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for farol-0.0.1-cp311-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 0188e7392d7671e2bab04398dcb1890926c335ca716d00b059e141d630b1ece1
MD5 7576ef65edc1cf40355a0837fa65eed2
BLAKE2b-256 9cf6dd7296485feb61172661b202ab9abb8cd9942dc43f860dd910f15b400338

See more details on using hashes here.

Provenance

The following attestation bundles were made for farol-0.0.1-cp311-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl:

Publisher: release.yml on ferrumio/farol

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file farol-0.0.1-cp311-abi3-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for farol-0.0.1-cp311-abi3-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 f98e86ed78b4e0f7b14a76c6b25fc158b449183f7466f966da7b199ca8fa24c4
MD5 d2a2b58a1350f4a23e2bbacfb328d8cb
BLAKE2b-256 9c1088a6520d8b68b40e4d56f73f94e50030954134f3e413f238b58ce1130b9d

See more details on using hashes here.

Provenance

The following attestation bundles were made for farol-0.0.1-cp311-abi3-macosx_11_0_arm64.whl:

Publisher: release.yml on ferrumio/farol

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file farol-0.0.1-cp311-abi3-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for farol-0.0.1-cp311-abi3-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 dc945ad9114e9a554338bde152196319ecdcdad754abe27589730ea050f424fb
MD5 7eccd587f22906e58e437a74b383af71
BLAKE2b-256 fc97adfdf382c7607cb0a8cb9126f1b5a3e45ba5e24fa4053a9c4a0ce46ceeed

See more details on using hashes here.

Provenance

The following attestation bundles were made for farol-0.0.1-cp311-abi3-macosx_10_12_x86_64.whl:

Publisher: release.yml on ferrumio/farol

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page