Skip to content

Repository files navigation

Hi, I am Nino.

Language: English · Deutsch

Live Demo

Build websites, not programs.

Nino is a lean foundation for modern PHP websites. It works entirely without a database or external packages and avoids unnecessary bloat. Developers retain control over the frontend, templates, and functionality; editors and site owners maintain content through a streamlined GUI. Nino does not get lost in possibilities—it puts content on the web.

The entire project remains a readable set of files that can be versioned with Git and runs on standard PHP hosting. The initial setup takes only a few minutes and leaves a working foundation for further development. Developers can equip it with the tools they need and add custom functionality through a flexible callback system. Multilingual content, posts and elements, forms, user permissions, and backups are already included; a newsletter, a search and further features come from the dapeio/nino-features catalogue.

Why another CMS?

There are excellent PHP solutions for websites: Mature systems such as WordPress cover almost every use case with themes, plugins, and a large community. This versatility is their strength—and also their greatest weakness. Technical frameworks such as Laravel enable highly complex applications, but require a more extensive Composer-based environment and additional frontend tooling for conventional websites. Pure HTML/CSS/JavaScript websites, on the other hand, are very lean but repeatedly need to reinvent editorial features.

Nino occupies the space between them: a practical foundation for dynamic websites. Developers can adapt projects quickly; site owners get a simple interface for essential content maintenance.

Who is Nino for?

Nino is primarily intended for web developers and small agencies that build individual, conventional websites and may hand them over to third parties for content maintenance.

Solid HTML, CSS, and JavaScript skills plus basic PHP knowledge are useful for implementation. Custom modules, APIs, or databases can be integrated, but require correspondingly greater PHP experience.

The pillars of Nino

Frontend — simple, yet individual

Example of a frontend created with Nino

The frontend is built from simple HTML-based templates, textfills, shortcodes, and recurring elements. Nino does not impose a ready-made page structure: the visible result remains an individual project.

The included design system, with its base components and modules, provides a quick starting point for conventional websites. Multilingual content, responsive design, performance, and security remain part of the project.

/_admin — the workbench

Textfill overview in the Nino workbench

One management interface with one login. Developers set the project up and build its structure and appearance here; editors maintain its content here. Every screen is a panel, grouped into Content (elements, texts, images, submissions, log), Structure (routes, navigations), Features (an installed feature's own panel, whatever group it names) and System (users and roles, languages and translations, backups, config, features); the shape of the content – element types, text keys, image slots – sits on tabs beside it. An account holds a role, a role one permission per panel or tab; the wizard writes Editor and Developer, and a panel an account may not use is not rendered.

The workbench provides full access for development, diagnostics and corrections, and a narrow, permission-controlled surface for daily editorial work. All changes can alternatively be made directly in the file system. /_admin/recovery.php is the way back in when the accounts themselves are broken.

The setup wizard — a quick start for the project

Route configuration in the Nino setup wizard Completion screen in the Nino setup wizard

Every fresh checkout is configured through the wizard, which is what /_admin shows until it is done. It checks the environment, guides you through languages and modules, copies the theme the base unit delivers along with the required assets, creates initial pages and basic information, creates the first developer accounts and sets the recovery password. Afterwards it locks itself out, and _admin/install/ can be removed from a production delivery.

The Template Builder — a feature, Alpha

Template overview and section canvas in the Nino Template Builder Section preset library in the Nino Template Builder Configuring an articles section with live preview

The Template Builder turns page-*.tpl files into a focused sequence of complete HTML and [template] sections. Developers can create a template, choose from different section presets, assign meaningful IDs, configure content and layout, and immediately fill native textfills or connect an Elements collection. It is a workspace panel: the rail folds to its icons and the template list, the section canvas and the inspector share the whole width.

The Template Builder preserves ordinary HTML+ source. Standalone template shortcodes can be chosen directly through Add section and remain movable canvas items, while the page header and footer are ordinary [template] shortcodes managed safely through fixed Template Settings. A display name and VPA default live as inert metadata at the start of the file. Unrelated source remains locked and byte-identical. A deliberate HTML+ escape hatch is available for code-authored sections.

Status: Alpha. Preset manifests and generated .tpl markup are readable and extensible, but the library and composition workflow may still evolve. The panel belongs to the Template Builder feature from the catalogue dapeio/nino-features and is there while that feature is copied into features/ and switched on in the Features panel.

What Nino includes

  • multilingual routing, texts, and content
  • a dedicated template system with shortcodes and a clear separation of HTML and PHP
  • one workbench for developers and editors, with roles, recovery and an optional section-first Template Builder for .tpl files (Alpha)
  • a file-based content model for textfills and recurring elements
  • one fixed theme, asset bundling, and frontend base components
  • forms, navigation, language selection, and image processing
  • installable features with a manifest, settings and versioned updates, switched on in the workbench - a newsletter and a search among those the dapeio/nino-features catalogue provides
  • users, granular permissions, login protection, and activity logs
  • automatic encrypted backups and restoration
  • an integrated callback system for custom modules and integrations

Nino vs. WordPress, Laravel, Kirby, and Grav

None of these systems is inherently better than the others. They simply start from different premises and emphasize different priorities.

As of August 2026

System Approach Technical foundation Particularly suitable for
Nino Compact website framework with its own editorial interface PHP and file system; no database or external packages Individual multilingual websites with a clear handover from developers to editors
WordPress Universal content-oriented CMS with a large theme and plugin ecosystem PHP with MySQL or MariaDB Projects that benefit from ready-made extensions, themes, and a large community
Laravel Full-stack framework for web applications Composer-based PHP ecosystem Custom applications, complex business logic, and scalable infrastructure
Kirby Flexible flat-file CMS with a mature panel and plugin platform File-based content and modern PHP Custom websites with an established flat-file ecosystem
Grav Open-source flat-file CMS with themes and plugins Markdown, Twig, Symfony components, and a package manager File- and Markdown-oriented websites with an open extension ecosystem

Nino deliberately chooses a smaller scope: no universal plugin ecosystem, no abstract application toolkit, and no database.

In return, the stable kernel, fast setup, developer tools, and editorial interface form a coherent workflow specifically designed for individual websites.

By dispensing with an open plugin system and third-party runtime packages, Nino reduces its attack surface as well as update and supply-chain risks. Less third-party code and fewer interdependent versions make the installed codebase easier to understand and audit.

This does not replace secure development, but it significantly reduces update and maintenance effort.

Quick Start

Nino requires PHP 8.4 or newer with the gd, mbstring, session, and json extensions plus the PharData class provided by Phar. It starts without a package manager or build step:

git clone https://github.com/dapeio/nino.git
cd nino
php -S 127.0.0.1:8000 router.php

Then open http://127.0.0.1:8000/_admin.

The setup wizard is required for a fresh checkout and creates the first working project state.

The complete process is described in Getting Started. All options and write operations are covered in the Setup Wizard reference.

Project Structure

A checkout is code and nothing else. Everything below private/ and public/ is one installation's own state, created by the wizard and tracked by nobody:

index.php        Main entry point of the website
router.php       Built-in server routing, for local development

_nino/           Kernel and frontend core, one class per file under _nino/Nino/,
                 with every module Nino ships under _nino/Nino/Modules/: the
                 ones every project needs and the optional Form, Navigation
                 and Localepicker, switched on or off in /nino/modules
app/             Project-owned PHP classes under their own namespace
features/        The features a project installs, one directory each with a
                 feature.php manifest, installed from the signed catalogue of
                 github.com/dapeio/nino-features in the workbench's Features
                 panel or copied in by hand, and switched on there - a
                 checkout ships none
_admin/          The workbench: the shell alone, recovery.php, its own screens
                 as modules under _admin/Nino/Modules/ (Dashboard, Elements,
                 Text, Images, Logs, Routes, Users, Language, Backups, Config),
                 and the setup wizard with its library under _admin/install/
docs/            Documentation, with the extension recipes under docs/recipes/

private/         Never served, only read by PHP - created by the wizard
  config.php       Site configuration
  templates/       Page and section templates
  text/            Texts by language and global settings
  elements/        Element types
  assets/          Project-specific CSS and JavaScript, bundled into public/.cache/
  data/            Runtime data

public/          Everything a browser loads directly - created by the wizard
  images/          Uploaded images
  fonts/           Webfonts the theme declares
  favicon/         The generated favicon set
  .cache/          The css and js bundles, built from private/assets/

Tests

Each file is a standalone script and runs against an isolated sandbox directory:

php tests/kernel-smoke.php
php tests/admin-smoke.php
php tests/admin-system-smoke.php
php tests/install-smoke.php
php tests/features-smoke.php
php tests/catalogue-smoke.php
for test in features/*/tests/*-smoke.php; do [ -e "$test" ] && php "$test"; done
for test in tests/*-js-smoke.js; do node "$test"; done
php tests/concurrency-smoke.php

tests/harness.php is the bootstrap they share; a feature's own test lives in its directory and loads it from there.

Static analysis runs beside them, without a package manager: PHPStan reads phpstan.neon, ESLint eslint.config.mjs. phpstan-baseline.neon lists the findings that were open when the check arrived, so only something new fails. CI runs both after the syntax checks.

phpstan analyse
npx eslint .

Philosophy and technology

Nino deliberately keeps its architecture small: a central $appData array carries the application state, $request remains responsible for the HTTP request and response, and callbacks connect the kernel, modules, and templates.

Further documentation

  • Concepts: architecture, data flow, and separation of concerns
  • Developer Manual: runtime contracts, APIs, modules, and tests
  • Extension recipes: a panel, a runtime module, an installer package, a section preset, templates and page units, element types, a feature - step by step
  • Getting Started: from checkout to a configured website
  • Setup Wizard: steps, writing rules, and library format
  • /_admin Workbench: every panel, accounts, roles, configuration, backups and recovery
  • Template Builder: composing page templates from complete HTML and template sections - a feature from the catalogue dapeio/nino-features
  • Features: installable packages - the manifest, the settings, activation and updates
  • Feature catalogue: the features Nino publishes - newsletter and search among them - installed by copying a directory into features/
  • Deployment: web server, security, backups, and go-live
  • Design Manual: frontend, design system, CSS, and template work (WIP)
  • Security Policy: security reports and supported versions
  • Changelog: changes between versions

Status and Security

Nino as a whole is currently in the Beta phase. Individual optional tools have their own, lower maturity level:

Area Status
Kernel, frontend, workbench and existing project foundation Beta
Template Builder (a feature from the catalogue) Alpha

Security fixes land directly on main; there is no separate LTS version yet.

Security issues should not be reported as public issues. Contact details and the currently supported version are listed in the Security Policy.

License

MIT

About

A compact, dependency-free PHP framework for individual, multilingual websites.

Topics

Resources

Security policy

Stars

2 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages