b882c304b1
Admin login & user management (novaconium/ISSUES.md): session-based
login against a SQLite users table replaces the single-user HTTP Basic
Auth stopgap (admin_username/admin_password_hash and /admin/password-hash
are gone; one admin_auth_enabled flag, off by default with zero DB
footprint). New /admin/login, /admin/logout (POST-only, real page), and
/admin/users pages plus bin/create-admin-user.php.
First user created is the admin; everyone after is registered with a
unique normalized email and an optional group. /admin/* and drafts are
admin-only; Lib\Access gates page content from sidecars
(Access::require('group:members')) with login-redirect/404 responses —
public by default, static pages always public by construction. User
management covers disable/enable, delete, promote/demote, group, email,
and password, with last-active-admin lockout guards.
Also: Session::regenerate() against fixation, friendly missing-PDO-driver
errors in Lib\Db, docs at /admin/docs/access-control and updates across
admin-auth/drafts/sidecars/config/libraries and README/AGENTS.md.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
78 lines
4.0 KiB
Twig
78 lines
4.0 KiB
Twig
{% 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 %}
|
|
<section class="hero">
|
|
<span class="hero-eyebrow">novaconium</span>
|
|
<h1>You're up and running.</h1>
|
|
<p class="hero-lede">A tiny, Hugo-flavored PHP micro-framework: file-based routing, Twig templates, and static caching — no Composer, no build step. This page lives at <code>App/pages/index.twig</code>; start editing there.</p>
|
|
<div class="hero-actions">
|
|
<a class="button-link" href="/admin/docs">Read the docs</a>
|
|
<a class="button-link button-link--ghost" href="https://git.4lt.ca/4lt/novaconium">{{ icons.git() }}View source</a>
|
|
</div>
|
|
<ul class="hero-badges">
|
|
<li class="badge">PHP 8.1+</li>
|
|
<li class="badge">No Composer</li>
|
|
<li class="badge">Twig vendored</li>
|
|
<li class="badge">Static caching</li>
|
|
</ul>
|
|
</section>
|
|
|
|
<section class="feature-grid">
|
|
<article class="feature-card">
|
|
<h2>File-based routing</h2>
|
|
<p>A directory under <code>App/pages/</code> <em>is</em> a route. <code>[param]</code> segments capture into <code>$params</code>. No route table to maintain.</p>
|
|
</article>
|
|
<article class="feature-card">
|
|
<h2>Optional sidecars</h2>
|
|
<p>Drop an <code>index.php</code> next to any <code>index.twig</code> for real logic, or return a <code>Response</code> to short-circuit templating entirely.</p>
|
|
</article>
|
|
<article class="feature-card">
|
|
<h2>Static caching</h2>
|
|
<p>Sidecar-less pages render once and get served straight from Apache afterwards — this page included.</p>
|
|
</article>
|
|
<article class="feature-card">
|
|
<h2>SEO out of the box</h2>
|
|
<p>Meta description, canonical links, Open Graph, and Twitter Card tags ship by default, all overridable per page.</p>
|
|
</article>
|
|
<article class="feature-card">
|
|
<h2>Matomo & admin auth</h2>
|
|
<p>Built-in analytics tracking and a multi-user session login for <code>/admin/*</code> — both off until you turn them on in <code>App/config.php</code>.</p>
|
|
</article>
|
|
<article class="feature-card">
|
|
<h2>Override anything</h2>
|
|
<p><code>App/</code> is checked before <code>novaconium/</code> for every page, layout, and <code>Lib\</code> class — override by dropping a file at the same relative path.</p>
|
|
</article>
|
|
</section>
|
|
|
|
<section class="next-steps">
|
|
<h2>Where to next</h2>
|
|
<ul>
|
|
<li><a href="/admin/docs/getting-started">Getting started</a> — requirements, running locally, deploying on Apache.</li>
|
|
<li><a href="/admin/docs/routing">Routing</a> and <a href="/admin/docs/sidecars">sidecars</a> — how pages and logic fit together.</li>
|
|
<li><a href="/blog">The blog example</a> — a listing sidecar, individual posts, and a layout override.</li>
|
|
<li><a href="/admin">Admin</a> — clear the cache and browse these docs live.</li>
|
|
</ul>
|
|
</section>
|
|
{% endblock %}
|