neuedaten / freezed-desk
Desk is the editorial backend for Freezed: schema-driven records in SQLite, a local web UI, and a content source for the static build.
Requires
- php: ^8.4
- ext-json: *
- ext-mbstring: *
- ext-pdo: *
- ext-pdo_sqlite: *
- league/commonmark: ^2.6
- neuedaten/freezed: ^0.14.0-beta
Requires (Dev)
- phpunit/phpunit: ^12.0
Suggests
- ext-curl: Fetching inbox submissions from a remote endpoint.
- ext-fileinfo: MIME detection for uploads (strongly recommended).
- ext-intl: Better slug transliteration for non-Latin titles.
Provides
None
Conflicts
None
Replaces
None
This package is auto-updated.
Last update: 2026-09-27 10:06:14 UTC
README
Desk is the editorial backend for Freezed:
structured records in a SQLite file, a local web UI to edit them, and a content
source that feeds them into freezed build. The core stays what it is --
templates in, static files out, no runtime. Desk is the one place in a project
where state is allowed, and it lives in exactly one folder of the project.
freezed.config.php ─┐
desk/types/*.php ──┼──▶ Desk UI (local) ──▶ data/desk.sqlite, data/media/
│ │
└──▶ freezed build ◀── DeskSource ◀┘
│
▼
public/
- Schema: one PHP file per type declares the fields. No file, no field.
- Storage:
data/desk.sqliteplusdata/media/.desk:exportwrites a git-friendly JSON copy. - Source:
DeskSourceturns published records into items, like avariables.phpwould. - UI:
freezed desk, rendered with Fluid, overridable per project. - CLI: everything as JSON in and out, for scripts and agents (
freezed desk:agent).
Requirements
PHP 8.4 or newer with pdo_sqlite, Freezed 0.14 or newer. GD is used for
thumbnails when present, intl for slugs of non-Latin titles.
Install
composer require neuedaten/freezed-desk
Then, in freezed.config.php:
use Neuedaten\FreezedDesk\Desk; use Neuedaten\FreezedDesk\Source\DeskSource; return [ 'assetRoots' => ['media' => 'data/media'], 'variables' => array_merge(['siteName' => 'Example'], Desk::variables('site')), 'contentTypes' => [ 'pages' => ['targetDirectory' => '', 'targetFileExtension' => 'html'], 'entries' => ['targetDirectory' => 'entries', 'targetFileExtension' => 'html', 'source' => DeskSource::class], ], ];
Declare a type in desk/types/entries.php, put its templates into
content/entries/, and start the UI:
vendor/bin/freezed desk # the UI at http://localhost:8081 vendor/bin/freezed run --desk # site at :8080 rebuilt on every save, UI at :8081
See docs/getting-started.md for the walk-through.
Documentation
- Getting started
- Configuration
- Schema and field types
- Templates and variables
- CLI
- The UI
- Export, import and seeds
- Actors, approval and conflicts
- Inbox module
- Outbox module
- Scripts and agents: the JSON CLI
- Extending Desk
License
MIT, see LICENSE.