{% extends layout %} {% block title %}Home{% endblock %} {% block description %}A tiny, Hugo-flavored PHP micro-framework: file-based routing, Twig templates, and static caching.{% endblock %} {# Every block below is optional — the layout already supplies a sensible default for each (see /admin/docs/seo). Shown here uncommented as a reference for every override a page can make; delete what you don't need. #} {% block robots %}index, follow{% endblock %} {% block canonical %}{{ request_path|default('/') }}{% endblock %} {% block og_type %}website{% endblock %} {% block og_title %}{{ block('title') }}{% endblock %} {% block og_description %}{{ block('description') }}{% endblock %} {% block og_url %}{{ block('canonical') }}{% endblock %} {% block twitter_card %}summary{% endblock %} {% block twitter_title %}{{ block('title') }}{% endblock %} {% block twitter_description %}{{ block('description') }}{% endblock %} {% import '_layout/icons.twig' as icons %} {% block content %}
novaconium

You're up and running.

A tiny, Hugo-flavored PHP micro-framework: file-based routing, Twig templates, and static caching — no Composer, no build step. This page lives at App/pages/index.twig; start editing there.

Read the docs {{ icons.git() }}View source

File-based routing

A directory under App/pages/ is a route. [param] segments capture into $params. No route table to maintain.

Optional sidecars

Drop an index.php next to any index.twig for real logic, or return a Response to short-circuit templating entirely.

Static caching

Sidecar-less pages render once and get served straight from Apache afterwards — this page included.

SEO out of the box

Meta description, canonical links, Open Graph, and Twitter Card tags ship by default, all overridable per page.

Matomo & admin auth

Built-in analytics tracking and a multi-user session login for /admin/* — both off until you turn them on in App/config.php.

Override anything

App/ is checked before novaconium/ for every page, layout, and Lib\ class — override by dropping a file at the same relative path.

Where to next

{% endblock %}