{% extends layout %} {% import '_layout/icons.twig' as icons %} {% block title %}Novaconium Features{% endblock %} {% block description %}A tour of what ships with novaconium out of the box: routing, sidecars, caching, admin auth, access control, media manager, database, search, RSS, and more.{% endblock %} {% block robots %}index, follow{% endblock %} {% block tags %}features, meta{% endblock %} {% block canonical %}{{ request_path|default('/') }}{% endblock %} {% block og_type %}article{% 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 %} {% block blog_content %}
A tour of what ships with novaconium out of the box. Every topic below has a full writeup at {{ icons.book() }}/admin/docs on any running instance — this post is the overview.
App/pages/ is a route (Hugo-style page bundles). No route table to maintain.[param] segments — a directory literally named [param] (e.g. App/pages/products/[id]/) captures any single URL segment into $params['param'] for clean URLs, no query strings.index.php next to any index.twig to supply Twig context data, or return a Response (redirect/JSON/XML/HTML) to short-circuit templating entirely.public/cache/; .htaccess serves the cached file directly on every later hit, skipping PHP and Twig entirely.App/ (your project) is checked before novaconium/ (the framework defaults) for every page, layout, Lib\ class, and even the Sass color palette (App/sass/_colors.sass). Drop a file at the same relative path to override it; nothing needs duplicating to get a working site._layout/layout.twig directories are resolved by walking upward from the matched page, so you can override the layout for a whole subtree.matomo_url and matomo_site_id in App/config.php to enable tracking site-wide, including automatic 404 tracking. Off by default./admin/* route behind a session login with multi-user management: a SQLite-backed users table, /admin/login//admin/logout, and an /admin/users page to create, disable, delete, group, promote/demote, and change the email or password of accounts (plus a novaconium/bin/create-admin-user.php CLI for the first user or deploy scripts). Two roles: the first user created is the admin; everyone after is a registered user with an optional group. Enabled with a single admin_auth_enabled flag in App/config.php; off by default.Access::require('group:members') returns null or a ready-made Response (login redirect with a return path, or a 404 for the wrong account). Public is the default — a sidecar that never calls it is untouched, and static (sidecar-less, cached) pages are always public by construction.draft_routes in App/config.php to make it visible only to an authenticated admin; anyone else gets a plain 404, not a login prompt./admin/media, an upload/browse/delete UI for files under public/uploads/, covered by the existing /admin/* auth gate with no separate flag needed. Extension allowlist and max upload size are configurable.data-theme attribute (persisted to localStorage) that swaps every color via CSS custom properties.Lib\SpamGuard (honeypot + submission-timing check, no external CAPTCHA), Lib\FormValidator, and Lib\Validate, demonstrated on the contact form.Lib\Input (cleaning accessor for $_POST/$_GET) and Lib\Csrf (standalone session-token CSRF protection), wired into the contact form and every admin form.Lib\Db, a thin PDO wrapper (no ORM) supporting multiple named connections open at once, each with its own plain-SQL migration convention, applied automatically on first use or via php novaconium/bin/migrate.php.Lib\Session, a thin wrapper around native PHP sessions with CodeIgniter-style flash values for post/redirect/GET flows./sitemap.xml, full-text /search (SQLite FTS5), and blog tag browsing all share one crawler. Off by default; reindexes lazily on demand or via php novaconium/bin/index-content.php./blog/feed, built from the same hand-written post list App/pages/blog/index.php itself renders from, so it works with no database at all.php -S) at public/, and it runs. Twig is vendored as source.Full details on every one of these live at {{ icons.book() }}/admin/docs, rendered live from this same running instance — routing, sidecars, libraries, database, session, content index, XML sitemap, RSS feeds, layouts, static caching, SEO, Matomo, admin authentication, access control, draft pages, media manager, styling, project layout, and third-party notices.
{% endblock %}