Static sites with
first-class HTMX

Eigen is a fast, opinionated static site generator built in Rust. It renders full HTML pages and HTMX fragments side-by-side — seamless partial page loads, zero client-side framework required.

Everything you need, nothing you don't

Built in Rust

Blazing fast builds powered by Rust. Templates compile through minijinja, data fetches are cached, and static assets are copied in parallel.

🔀

Automatic HTMX Fragments

Every page generates both a full HTML document and a standalone fragment. HTMX partial page loads work out of the box — no configuration needed.

📡

Remote Data Sources

Pull data from any REST API directly in your template frontmatter. Filter, sort, and limit results. Responses are cached per-build.

📄

Dynamic Pages

Generate hundreds of pages from a single [slug].html template. Powered by collection queries with automatic slug sanitization.

🔥

Live Reload Dev Server

Axum-powered dev server with SSE live reload, smart rebuilds, and built-in API proxy to eliminate CORS issues during development.

🗂

Single File Config

One site.toml controls everything — metadata, build options, data sources, asset localization, and environment variable interpolation.

From template to HTMX-ready site
1

Write templates with frontmatter data queries

Use Jinja2 syntax via minijinja. Reference local YAML/JSON files or remote APIs directly in your template's YAML frontmatter.

2

Eigen renders full pages + fragments

Each {% block %} is automatically extracted as an HTML fragment alongside the full page. No extra work required.

3

Use link_to() for seamless navigation

The link_to function emits href, hx-get, hx-target, and hx-push-url in one call. Progressive enhancement baked in.

4

Deploy anywhere — it's just static files

The output is a plain dist/ folder. Deploy to Netlify, Vercel, Cloudflare Pages, S3, or any static host.

See it in action
# Site configuration
[site]
name = "My Blog"
base_url = "https://myblog.com"

[build]
fragments = true

[sources.blog_api]
url = "https://api.example.com"
headers = { Authorization = "Bearer ${API_TOKEN}" }
<!-- templates/posts/[post].html -->
---
collection:
  source: blog_api
  path: /posts
slug_field: id
item_as: post
---
{% extends "_base.html" %}

{% block content %}
<article>
  <h1>{{ post.title }}</h1>
  <p>{{ post.body }}</p>
</article>
{% endblock %}
# Eigen generates BOTH files automatically:

dist/posts/1.html          # Full HTML page
dist/_fragments/posts/1.html # Just the <article> block

# The link_to() function wires it all up:
<a href="/posts/1.html"
   hx-get="/_fragments/posts/1.html"
   hx-target="#content"
   hx-push-url="/posts/1.html">
  Read Post
</a>
0
JS Frameworks Required
Output Per Page
1
Config File
Data Sources

Ready to build something fast?

Eigen is open source and ready for your next project.