Entwickler
Mach es zu deinem System.
Ein schlanker PHP-Kern ohne Framework, offene Schnittstellen und klar dokumentierte Erweiterungspunkte – vom Kit bis zum eigenen CLI-Befehl.
Tech-Stack
Womit KLXM Studio gebaut ist.
Versionen laut composer.lock und tools/package.json von Version 1.0.0.
| Bereich | Technik | Details |
|---|---|---|
| Laufzeit | PHP ≥ 8.4, ohne Framework | Front-Controller, PSR-4-Autoload (Core\ → app/) über Composer; Erweiterungen sodium, gd, mbstring, dom, pdo. |
| Datenbank | SQLite oder MySQL/MariaDB | Je Website SQLite (Standard, eine Datei) oder MySQL/MariaDB ('db' in config/sites/{key}.php); Sicherung per VACUUM INTO bzw. mysqldump. Suchindex, Chat, geteilte Tabellen, Medien-Pools, Support und KI-Protokolle bleiben immer SQLite – pdo_sqlite ist Pflicht, SQLite ≥ 3.35 (Debian 12/13, Ubuntu 22.04/24.04; AlmaLinux/RHEL 8/9 zu alt). Doctrine DBAL 4.4.4 (MIT) für Tabellen-Schemas. |
| Server | Apache, nginx oder php -S | Keine .htaccess – nur public/ liegt im Webroot; läuft auf Plesk und üblichem PHP-Hosting, lokal mit php -S. |
| Suche | loupe/loupe 1.1.0 (MIT) | Volltext mit Tippfehlertoleranz auf SQLite; optional semantisch/hybrid über Vektoren (Symfony AI Store). |
| KI | Symfony AI 0.14 (MIT) | platform + store; Anbieter Ollama, Mistral, OpenAI und generisch/OpenAI-kompatibel; lokale Transkription mit whisper.cpp. |
| Sicherheit | WebAuthn, TOTP, libsodium, CSP | Passkeys mit lbuchs/webauthn 2.2.0 (MIT), TOTP mit QR-Code (chillerlan/php-qrcode 5.0.5, MIT/Apache-2.0), libsodium für verschlüsselte Anfragen und Geheimnisse, Content Security Policy ohne unsafe-inline. |
| Kalender & Sync | rlanvin/php-rrule 3.0.0 · sabre/dav 4.7.1 | Wiederholungen (MIT); CalDAV/CardDAV in der Erweiterung dav (BSD-3-Clause). |
| HTTP & Mail | symfony/http-client 8.0.16 · symfony/mailer 8.0.15 | Proxy für Karten und Vorschaubilder, KI-Anbieter, SMTP-Versand (MIT). |
| Frontend | Vanilla JS, esbuild 0.25.12 | Skripte als IIFE und ES-Module (.mjs), gebaut mit esbuild in tools/ (pnpm); Verwaltungs-Oberfläche per Shadow DOM vom Kit isoliert; CSS-Budgets je Kit. |
| Vendor-Assets | Editor.js 2.31.7 · PDF.js 6.3.289 · MapLibre GL JS 6.11.2 | Blockeditor (Apache-2.0) mit editorjs-drag-drop 1.1.16 (MIT), PDF-Viewer (Apache-2.0), Karten (BSD-3-Clause); Schrift Lato (OFL). |
| Symbole | Phosphor Icons 2.1.1 duotone (MIT) | 511 Symbole in 23 Themenbereichen, als Sprite je Website. |
| Lizenz | MIT | Kern, Kits und Erweiterungen; eigene Kits und Erweiterungen unter beliebiger Lizenz. Drittsoftware siehe THIRD-PARTY-NOTICES.md. |
Erweiterungspunkte
Wo Sie ansetzen können.
Jeder Ausschnitt stammt aus dem Quelltext von Version 1.0.0.
-
Kits
Ein Kit ist ein eigenständiges Paket: Blöcke, zentrale Einstellungen, Design-Tokens, bedingtes CSS je Block und strukturierte Daten. Neues Kit: php bin/console kit:create <name> [--from=…] – Standard ist das Start-Kit. Technisch liegt ein Kit unter themes/{name}/theme.php – der Ordnername bleibt aus Kompatibilitätsgründen (theme:create funktioniert weiter).
themes/essenz/theme.php 'jsonld' => 'essenz_jsonld', 'conditional_css' => [ 'css/b-faq.css' => ['faq'], 'js/video.js' => ['video'], ], 'design' => require __DIR__ . '/design.php', -
Blöcke als PHP-Vorlage
Renderer je Blocktyp in themes/{name}/blocks – mit Inline-Editing über $b->edit(). Der Block erscheint automatisch im Editor, in der REST-API und im MCP-Server.
themes/basis/blocks/richtext.php <div class="wrap wrap--text"> <?= basis_head($b) ?> <div class="prose"<?= $b->edit('text', 'rich') ?>><?= rich($d['text']) ?></div> </div> -
Block-Baukasten
Eigene Blöcke ohne PHP: Felder, eine sichere Vorlagensprache mit Escaping und begrenztes CSS (nur im Block); Export als Kit-Block. Auszug aus dem Block „Kommandozeile“ dieser Website:
Verwaltung → Blöcke <ol class="cli-list"> {% for c in commands %}<li class="cli-row"> <code class="cli-cmd">{{ c.cmd }}</code> <span class="cli-text">{{ c.text }}</span> </li>{% endfor %} </ol> -
Erweiterungen
Eine Erweiterung bringt Funktionen, Rechte, Migrationen, Menüeinträge, Routen, Blöcke, Proxy-Quellen und CLI-Befehle mit – aktiv je Website über 'extensions' => ['dav']. Erweiterungen liegen in extensions/{name} oder kommen als Composer-Paket vom Typ „mycms-extension“ (composer require hersteller/paket) – der Kern findet sie automatisch.
extensions/dav/extension.php 'boot' => function (Core\Extension $x): void { $x->feature('dav', 'CalDAV/CardDAV (Kalender und Kontakte in Apps)', ['dav.use']); $x->permissions('CalDAV/CardDAV', ['dav.use' => '…']); $x->migration(1, fn(Core\Database $db) => MyCms\Dav\Dav::migrate($db)); $x->nav('/admin/dav', 'Kalender & Kontakte in Apps', 'dav', 'dav.use'); -
Beispiel: Consent Kit
Eine vollständige Erweiterung mit eigener README, LICENSE (MIT) und THIRD-PARTY-NOTICES: Einwilligungsverwaltung mit 38 Vorlagen, Web Component im Shadow DOM, Consent Mode v2 und einer CSP, die sich erst nach Einwilligung erweitert. Port des REDAXO-AddOns consent_kit von KLXM.
extensions/consent_kit // config/sites/{key}.php bzw. config/config.local.php 'extensions' => ['consent_kit'], // abschalten, ohne die Erweiterung zu entfernen: 'features' => ['consent' => false], -
Hooks für die Ausgabe
Erweiterungen können das HTML der Website nachbearbeiten, Quellen zur CSP ergänzen (nie unsafe-inline) und Links in die Rechtliches-Zeile setzen.
app/Extension.php $x->htmlFilter(fn(string $html, array $ctx) => $html) $x->csp(fn() => ['script-src' => ['https://…']]) $x->footerLinks(fn() => [['label' => …, 'href' => '#…']]) -
REST-API
OpenAPI 3.1 unter /api/v1/openapi.json. Tokens mit Stufe read oder write, Ablaufdatum und Modus „Direkt übernehmen“ oder „Zur Freigabe“ – gespeichert wird nur ein SHA-256-Hash.
curl curl -H "Authorization: Bearer $TOKEN" https://ihre-domain.de/api/v1/me -
MCP-Server
Model Context Protocol über Streamable HTTP mit 42 Werkzeugen, u. a. list_pages, update_block, save_entry, upload_media, set_design, publish_page – mit denselben Tokens und Regeln wie die API.
Claude Code claude mcp add --transport http mycms https://ihre-domain.de/mcp --header "Authorization: Bearer cms_…" -
Kommandozeile
Rund 50 Befehle für Konten, Websites, Netzwerk, Kits, Schriften, Migration, Sicherungen, geteilte Daten, Suche und KI; Erweiterungen ergänzen eigene.
bin/console php bin/console site:create kunde www.kunde.de,kunde.de basis php bin/console migrate --all php bin/console health php bin/console blocks:selftest -
Datentabellen
Eigene Tabellen mit 23 Feldtypen, Bedingungen, Detailseiten und öffentlichen Formularen – geteilt zwischen mehreren Websites einer Installation.
bin/console php bin/console data:share <handle> --members=a,b [--see-members] [--merge] php bin/console shared:list -
Externe Quellen
RSS 2.0/1.0, Atom, JSON (Pfad), XML (XPath) und OpenImmo 1.2 (XML, ZIP oder Abruf-URL) werden serverseitig geholt, per Zuordnung mit Umwandlungen in Einträge einer Datentabelle übersetzt und abgeglichen; Bilder landen in der Mediathek, übernommene Einträge sind schreibgeschützt. Schutz vor SSRF, XXE und ZIP-Slip.
Zuordnung (JSON) · bin/console {"id_path": "guid | link", "rows": {"titel": {"path": "title", "tx": "text"}, "datum": {"path": "pubDate | dc:date", "tx": "date"}, "bild": {"path": "enclosure@url | media:content@url", "alt": "title"}}} */15 * * * * php bin/console sources:sync --all -
Sprachen
Feste Texte laufen über lt('…') (Website) bzw. __('…') (Verwaltung); Übersetzungen als PHP-Array je Sprache, fehlende zeigt i18n:missing.
themes/essenz/lang/site/en.php 'Datenschutz' => 'Privacy', # php bin/console i18n:missing en --site-texts -
Design-Tokens
Jeder Token wird eine CSS-Variable oder Klasse; der Style-Editor zeigt Vorlagen und prüft Kontraste, auch über API und MCP (get_design/set_design).
themes/essenz/design.php $color('accent', 'Signal (Füllfarbe)', '--e-a', '#D85B19', '#F0782F', ['with' => 'background', 'min' => 3], -
Funktionsumfang je Website
Presets und einzelne Funktionen je Website; abgeschaltete Funktionen sperren ihre Rechte – Navigation, API und MCP folgen automatisch.
config/sites/{key}.php 'preset' => 'full' | 'content' | 'minimal', 'features' => ['data.schema' => false, 'api' => false], 'blocks' => ['deny' => ['video'], 'allow' => null],
Loslegen
In vier Schritten lokal.
Aus dem Schnellstart der README. Das Entwicklerhandbuch liegt in der Verwaltung unter /admin/hilfe/technik.
-
Quelltext holen
Öffentliches Repository: github.com/klxm/studio – Fehler und Wünsche unter github.com/klxm/studio/issues.
git git clone https://github.com/klxm/studio.git cd studio -
Abhängigkeiten und Build
Composer 2 für PHP, Node 22 + pnpm 10 nur für den Build – der Server braucht weder Node noch pnpm.
shell composer install cd tools && pnpm install && pnpm build && cd .. -
Starten
Der erste Aufruf legt Datenbank und config/config.local.php (app_key, setup_token) an und spielt die Startinhalte des Kits ein.
shell php -S localhost:8000 -t public public/index.php -
Konto anlegen
Oder /admin/setup mit dem Setup-Token öffnen. Danach: Verschlüsselung, E-Mail-Versand und Kit-Angaben einrichten.
shell php bin/console user:create name@example.org admin
Kontakt
Sprechen Sie mit KLXM Crossmedia.
Vorführung, Einsatz in Ihrer Agentur oder technische Fragen – wir antworten persönlich.
Am Schürmannshütt 40g
47441 Moers
Deutschland
- Telefon
- +49 2841 889998-0
- info@klxm.de