neuedaten / freezed
Freezed is a static site generator powered by the TYPO3 Fluid template engine.
Requires
- php: >=8.1
- symfony/property-access: ^7.0
- typo3fluid/fluid: ^2.10
This package is auto-updated.
Last update: 2026-06-11 19:31:15 UTC
README
❄️ Freezed
A static site generator powered by the TYPO3 Fluid template engine.
Templates in, static files out. No database, no runtime, no surprises.
What is Freezed?
Freezed renders a folder of content and one or more themes into a plain static
website using Fluid — the same templating engine that powers TYPO3 CMS. You
write layouts, partials, sections and (optionally) custom ViewHelpers, and
Freezed compiles everything to static HTML and assets in a public/ directory
you can host anywhere.
content/ + themes/ ──► freezed build ──► public/ (static HTML + assets)
Features
- Fluid templating — layouts, partials, sections and ViewHelpers.
- Stackable themes — drop themes into
themes/; they layer and override cleanly. - Content as folders — every page is a folder with a template and a
variables.php. - Asset pipeline — reference CSS/JS/images via the
resourceViewHelper. - Static files — anything in
static/is copied verbatim into the build. - Build hooks — run shell commands before and after a build.
- Zero runtime — the output is just files; host it on any static host or CDN.
Quick start
Start a new site (recommended)
Use the starter skeleton, which scaffolds a working site for you:
composer create-project neuedaten/freezed-skeleton my-site cd my-site ./vendor/bin/freezed build # open public/index.html
The skeleton also ships a Docker dev environment (docker compose up --build).
See neuedaten/freezed-skeleton.
Add Freezed to an existing project
composer require neuedaten/freezed ./vendor/bin/freezed install # scaffold content/, themes/, config ./vendor/bin/freezed build # render into public/
Project structure
A Freezed site is just a handful of folders:
my-site/
├─ content/ # your pages, grouped by content type
│ └─ pages/
│ └─ home/
│ ├─ index.html # a Fluid template
│ └─ variables.php # variables for this page
├─ themes/ # one or more stackable themes
│ └─ 00_default/
│ ├─ templates/{layouts,partials,templates}/
│ ├─ assets/{css,js,images}/
│ └─ static/
├─ static/ # files copied verbatim into the build
├─ public/ # generated output (git-ignored)
└─ freezed.config.php # content types, default variables, build hooks
Documentation
| Guide | What it covers |
|---|---|
| Getting started | Install, first build, the dev loop |
| Installation | Skeleton, library, requirements |
| Concepts | The build pipeline and core ideas |
| Content & pages | Writing pages, variables, content types |
| Themes | Layouts, partials, assets, the resource ViewHelper |
| Configuration | freezed.config.php reference |
| CLI | The freezed command |
| Docker | The containerised dev environment (ships with the skeleton) |
| Deployment | Hosting the static output |
Requirements
- PHP 8.1 or newer
- Composer
- PHP extensions:
mbstring,dom(both ship with most PHP builds)
This repository
This is the engine — the freezed CLI and rendering pipeline, published as
the Composer package neuedaten/freezed.
.
├─ bin/freezed # CLI entry point
├─ Classes/ # PSR-4: Neuedaten\Freezed\
│ ├─ Commands/ # install / compile commands
│ ├─ Domain/ # models + repositories (content, themes, resources)
│ ├─ Services/ # config, compile, render, file, static, scripts, log
│ └─ ViewHelpers/ # ResourceViewHelper
├─ assets/ # default theme + example content + default config
├─ includes/config.php # built-in path defaults
└─ docs/ # documentation
A ready-to-build starter project lives in the companion repo neuedaten/freezed-skeleton.
Status
Freezed is in beta. The build pipeline is stable; the API may still change before 1.0. Issues and feedback are very welcome.
License
GPL-2.0-or-later © Bastian Schwabe / neuedaten