Jetzt neu und frisch, besser vom Niederrhein. 
KLXM Studio – Startseite
Kontakt aufnehmen

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.

BereichTechnikDetails
LaufzeitPHP ≥ 8.4, ohne FrameworkFront-Controller, PSR-4-Autoload (Core\ → app/) über Composer; Erweiterungen sodium, gd, mbstring, dom, pdo.
DatenbankSQLite oder MySQL/MariaDBJe 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.
ServerApache, nginx oder php -SKeine .htaccess – nur public/ liegt im Webroot; läuft auf Plesk und üblichem PHP-Hosting, lokal mit php -S.
Sucheloupe/loupe 1.1.0 (MIT)Volltext mit Tippfehlertoleranz auf SQLite; optional semantisch/hybrid über Vektoren (Symfony AI Store).
KISymfony AI 0.14 (MIT)platform + store; Anbieter Ollama, Mistral, OpenAI und generisch/OpenAI-kompatibel; lokale Transkription mit whisper.cpp.
SicherheitWebAuthn, TOTP, libsodium, CSPPasskeys 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 & Syncrlanvin/php-rrule 3.0.0 · sabre/dav 4.7.1Wiederholungen (MIT); CalDAV/CardDAV in der Erweiterung dav (BSD-3-Clause).
HTTP & Mailsymfony/http-client 8.0.16 · symfony/mailer 8.0.15Proxy für Karten und Vorschaubilder, KI-Anbieter, SMTP-Versand (MIT).
FrontendVanilla JS, esbuild 0.25.12Skripte 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-AssetsEditor.js 2.31.7 · PDF.js 6.3.289 · MapLibre GL JS 6.11.2Blockeditor (Apache-2.0) mit editorjs-drag-drop 1.1.16 (MIT), PDF-Viewer (Apache-2.0), Karten (BSD-3-Clause); Schrift Lato (OFL).
SymbolePhosphor Icons 2.1.1 duotone (MIT)511 Symbole in 23 Themenbereichen, als Sprite je Website.
LizenzMITKern, 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],

Aufbau eines Kits

Loslegen

In vier Schritten lokal.

Aus dem Schnellstart der README. Das Entwicklerhandbuch liegt in der Verwaltung unter /admin/hilfe/technik.

  1. 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
  2. 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 ..
  3. 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
  4. 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.

KLXM Crossmedia GmbH
Am Schürmannshütt 40g
47441 Moers
Deutschland