tinymash is a flat-file CMS and publishing platform for PHP 8.4.1+. It stores content on disk, does not require a database server, and ships with both a public site and an admin interface. The current development line is also smoke-tested with PHP 8.5.x.
It is built for self-hosted publishing: pages, posts, author spaces, themes, plugins, media, tags, feeds, maintenance tasks, and a CLI for day-to-day operations.
tinymash is a good fit if you want:
- a database-free CMS
- a small self-hosted publishing stack
- pages and blog posts in the same system
- multiple authors without adding a lot of platform weight
- a PHP application that stays readable and easy to deploy
The shipped runtime includes:
- a web-based admin interface
- flat-file content, draft, user, and media storage
- public themes and theme settings
- plugin support
- media uploads for editor and site imagery
- feeds, tags, menus, search, scheduled publishing, backup/export, imports, and housekeeping tooling
- a CLI for cache management, deploy builds, housekeeping, imports, backups, and other maintenance work
The normal production path is to run tinymash from a prepared runtime tree and point your web server at public/.
If you are holding a tinymash deploy package, the short version is:
- copy the runtime tree to the server
- point the web root at
public/ - make
data/,users/, andtmp/writable by the PHP/web-server user - run
php8.4 bin/tinymash.php setup - review system settings in the admin UI
- set up scheduled publishing and housekeeping from cron
The full step-by-step version is in INSTALL.md.
- PHP
8.4.1or newer; PHP8.5.xis also smoke-tested - a web server such as Nginx or Apache
- PHP-FPM or another supported PHP SAPI
- writable
data/,users/, andtmp/directories
Required PHP extensions:
mbstringjsondomsessionopensslfileinfo
Recommended PHP extensions for full feature coverage:
curlgdorimagicksimplexmlexifintlzip
For ordinary public and admin use, tinymash can run with a small PHP memory limit; 16M is enough for many small sites. Larger batch jobs such as imports, backups/exports, media cleanup, and big upload/import runs may need more memory. The CLI import commands also accept explicit memory-limit options where that matters.
- Tinymash 1.x requires PHP
8.4.1or newer. PHP8.5is tested. - Patch and minor releases should preserve configuration, users, content, drafts, media, and plugin data.
- Upgrades use
upgrade:prepareto create a clean sibling installation. Do not overwrite an existing installation. - Required data migrations will be documented with the release.
- Documented plugin and theme interfaces remain compatible throughout 1.x. Planned removals will be deprecated for at least one minor release.
- Internal classes, storage paths, templates, HTML structure, and CSS selectors are not compatibility guarantees.
After copying a prepared runtime tree and pointing the web server at public/, run setup from the tinymash root:
php8.4 bin/tinymash.php setupSetup creates app/config/tinymash.json when needed and creates the first superadmin user. Existing configs are preserved on reruns.
For an existing installation, extract the new release into an empty sibling directory and use its CLI to inspect and copy authoritative state from the old tree:
cd /path/to/new-tinymash
php8.4 bin/tinymash.php upgrade:prepare /path/to/old-tinymash --dry-runThe command reports unmanaged local paths and missing extensions without copying them. See INSTALL.md before performing the real state copy and directory swap.
Common operator commands are documented in CLI.md.
Public sample files live under samples/:
samples/server/nginx.sample.confsamples/server/apache.sample.confsamples/server/php-fpm.sample.confsamples/server/php-opcache-production.inisamples/server/php-opcache-development.inisamples/server/tinymash.logrotatesamples/cron/tinymash.cronsamples/deploy/rsync-deploy.sh
public/: web rootapp/config/tinymash.json: main runtime configuration; deploy packages shipapp/config/tinymash.json.exampleas the safe starting pointdata/: content, drafts, media, caches, plugin/theme datausers/: user recordstmp/: temporary runtime filesbin/tinymash.php: CLI entrypoint
If you are running tinymash directly from a source checkout instead of a prepared runtime tree, install the PHP dependencies first and treat that as a developer/operator workflow rather than the normal end-user install path.
tinymash is licensed under AGPL-3.0-or-later. See LICENSE.
Copyright 2026 Joaquim Homrighausen; all rights reserved.
tinymash uses a small set of bundled third-party packages and frontend assets, including:
- Bootstrap
- Bootstrap Icons
- highlight.js
- emoji-picker-element and bundled emoji picker data
flightphp/coreflightphp/runwaylatte/latteleague/commonmarksymfony/mailer