A fresh holm application: file-system routing, server-rendered Python components, dynamic updates over HTMX.
Every piece is a well-documented tool. Click through for the details.
A Next.js-like metaframework: standard FastAPI, htmy, and
HTMX composed through file-system conventions. Files in
app/ become pages and actions.
The standard web framework underneath. Pages and actions are plain FastAPI routes, so the ecosystem works unchanged.
htmyServer-side rendering in typed, async Python with JSX-like components. No template language required.
HTMXDynamic updates without a client framework. Endpoints return HTML fragments, rendered via FastHX.
TailwindCSSUtility-first styling for the application and its components.
Accessible components as editable Python htmy code,
vendored into your repo from
htmui.
You own the files.
See the design page or
DESIGN.md for more details.
app/
The application package, the one holm walks. A page.py becomes
a route, a layout.py wraps pages, and actions.py
defines endpoints that return HTML fragments. The rotating greeting in the
title comes from app/actions.py.
components/
BasecoatUI as pure Python htmy components, copied into the
project by
htmui.
They live in your repo, so you can open and change them. They sit outside
app/ so holm never treats them as routes.
See the showcase.
assets/
The source files for the stylesheet and the JS bundle. Edit
app.css for Tailwind and your own CSS, and app.js
for HTMX, Basecoat, and your own scripts. Watchers and build tasks compile
these into static/.
static/
The compiled stylesheet and JS bundle, served at /static.
Don't edit these files; change assets/ and rebuild. The minified
app.css and app.js belong in the repo so a fresh
checkout can run and deploy without a production build.
One command starts everything: the app with auto-reload, plus watchers rebuilding the dev stylesheet and JS bundle on every save. Edit, save, refresh.
uv run poe start # http://localhost:5000
uv run poe dev # app only, dev assets
uv run poe preview # app only, minified assets (what gets deployed)
Checks run with ruff and mypy (strict);
uv run poe check runs them all. Deployments serve the minified
builds, so run uv run poe build first, then any FastAPI host works.
Vercel and FastAPI Cloud need no configuration. The details are on the
design page.
Two more pages come with the application.