Understand the design
Architecture
Understand the workspace split, rendering model, asset pipeline, and incremental build strategy.
Why the system is shaped this way
The framework is built around four constraints:
the site author writes ordinary Rust
authored content lives under
content/reusable engine code lives in separate crates
developer experience matters as much as raw feature count
Workspace layout
The current workspace uses these crates:
site-core: the public site-building APIsite-assets: the internal asset pipelinesite-diagnostics: the shared diagnostic layeravif-io: the internal AVIF boundarysite: the actual website program for this repository
This keeps site code readable while letting heavier media and diagnostic work evolve behind the public API.
Rendering model
Rendering is split into phases:
load content and validate it
expand the route set
render each route into an artifact
write outputs and record cache state
That phase split is why the API has more than one context type. The goal is clarity, not indirection.
Markdown and components
Markdown is not treated as a fixed HTML string. The renderer walks structured markdown and maps generated tags into component hooks such as a and img.
That gives the site program a direct place to:
replace link behavior
replace image behavior
integrate asset transforms
eventually attach richer components to authored content
Incremental build strategy
Across process runs, a route can be skipped when:
the program identity is unchanged
the handler identity is unchanged
the route dependencies hash to the same value
the expected output still exists
Asset outputs follow a similar idea, but their cache identity is based on source bytes plus a canonical transform description.
Asset model
Routes and markdown components request the output asset they want.
The engine then:
resolves the authored reference
fingerprints the source bytes
fingerprints a canonical transform specification
reuses or builds the transformed object in
.site-cache/exposes a deterministic public URL under
/assets/
This is why the site code can stay agnostic to whether an input image was SVG, PNG, JPEG, WebP, or AVIF.