{% 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.

Admin authentication

A multi-user session login gates every /admin/* route, with email verification for new accounts. Off by default in App/config.php.

Access control & drafts

Gate a page to a user or group with one Lib\Access call in its sidecar, or preview an unfinished page as an admin-only draft.

Media manager & comments

An upload/browse/delete UI at /admin/media, and Lib\Comments for a moderated comment thread on any page.

Database, zero setup

Lib\Db wraps PDO for SQLite or MySQL, multiple named connections at once, migrating automatically on first use.

Search, sitemap & tags

One content index backs full-text /search, /sitemap.xml, and blog tag browsing — reindexed lazily, no extra steps.

Blog RSS feed

/blog/feed is built from the same hand-written post list App/pages/blog/index.php renders from — no database required.

Matomo & dark/light theme

Built-in analytics tracking, off by default, alongside a nav toggle that swaps every color via CSS custom properties.

Form security by default

Lib\Csrf, Lib\SpamGuard's honeypot check, and cleaning input accessors — wired into the contact form and every admin form.

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 %}