Blog and category archives now show a numbered page list (first, last, current +/-1, collapsing gaps into an ellipsis) instead of only previous/next — see shared/utils/pagination.ts's paginationRange(). Renders page links via NuxtLink's custom/v-slot API rather than letting it render its own <a>: RouterLink's built-in active-class/aria-current detection compares only the route's path, not its query string, so every ?page=N link was incorrectly marked as the current page. The language switch now shows both "Italiano / English" at all times, with the current one as plain non-interactive text and the other as a link, moved to the header's top-right corner instead of stacked under the logo.
Documentation
Technical documentation for this repository. For setup, deployment and day-to-day commands, see the root README.md; for coding conventions and constraints, see CLAUDE.md. These docs explain the structure and behavior of the system in more depth than either of those.
- architecture.md — services, routing, request flow, environment variables.
- content-model.md — PocketBase collections, admin panel, permissions, editorial workflow.
- frontend.md — Nuxt routes, server (Nitro) endpoints, data flow, SEO.
What this repository is
A blog website with two faces:
- Public site — anonymous visitors read articles and browse categories. Fully server-rendered, no login, no client-side calls to the CMS.
- Admin panel — the site owner logs into PocketBase's admin UI (
/admin, redirects to/_/) to write, edit and publish articles and categories. This is the only way content changes; there is no other CMS and no public user accounts.
One codebase, two runtime components (Nuxt frontend, PocketBase — CMS and database in one process), fronted by a single Caddy reverse proxy on one domain.