Add processing logic when templates alone are not enough.
Templates are best for presentation. Python extension points are useful when a site format needs logic: normalizing resume entries, grouping publications, fetching page data, or turning a folder into a structured page.
from webifier.core.base import RendererModule
class ResumeRenderer(RendererModule):
template = "renderers/resume.html"
META_KEYS = frozenset({"kind", "template", "profile", "experience"})
Package the renderer inside an extension:
from webifier.core.extensions import Extension
class ResumeExtension(Extension):
id = "my.resume"
renderers = {
"resume": "my_resume.renderers.ResumeRenderer",
}
template_dirs = ["/path/to/my_resume/templates"]
Expose it through package entry points:
[project.entry-points."webifier.extensions"]
"my.resume" = "my_resume.extension:ResumeExtension"
Then enable it in a site:
webifier:
extensions:
resume:
uses: my.resume
profile:
kind: resume
Resolvers compute values inside YAML:
def year(value, ctx):
return value[:4]
Register them through an extension:
from webifier.core.extensions import Extension
class DatesExtension(Extension):
id = "my.dates"
resolvers = {
"year": "my_dates.resolvers.year",
}
published: ${year:2026-06-13}
Extensions are configured before interpolation, so custom resolvers can be used in the same site file that enables them.
For full details, see Resolver System and Extension and Customization Guide.