SHLS (Sebis Hierarchical List Structure) schreibt strukturierte Daten ohne Anführungszeichen, Klammern, Doppelpunkte oder wiederholte Schlüssel: Jeder Abschnitt nennt seine Schlüssel einmal, und die Datensätze darunter listen nur die Werte auf. Der SHLS-Editor zeigt den Code und daneben den Schlüsselblock und die Datensätze jedes Abschnitts. Ändere Werte, Schlüssel und Datensätze direkt dort, sieh Probleme mit ihrer Zeile, wandle von und nach JSON, YAML und CSV um und sieh, wie viele Tokens SHLS gegenüber JSON spart.
Alles läuft in deinem Browser. Dokumente werden nicht hochgeladen, es gibt keine Anmeldung und keine Werbung.
Ein Abschnitt beginnt mit seinem Namen. Sein Schlüsselblock listet die Schlüssel auf, um ein Leerzeichen eingerückt; die Schlüssel einer verschachtelten Liste eine Ebene tiefer. Nach genau einer Leerzeile folgen die Datensätze: ein Wert pro Zeile, in der Reihenfolge der Schlüssel. Eine verschachtelte Liste hat eine eigene Zeile (ihren Schlüssel oder PH als Platzhalter), ihre Datensätze eine Ebene tiefer. Alle Werte sind Text - sie in Zahlen oder Daten umzuwandeln, ist Sache des Programms, das sie liest.
Product
Name
Price
Smartphone A1
599.99
Laptop B2
1299.99
Company
Name
Location
Country
City
TechCorp
PH
USA
San Francisco
Dieselben Daten als JSON wiederholen jeden Schlüssel in jedem Datensatz und brauchen Anführungszeichen, Klammern und Doppelpunkte. SHLS wurde für lokale und Cloud-KI-Modelle gemacht, bei denen jedes Token zählt. SHLS by Sebastian Grünwald - das Format, seine Regeln und die Referenzklassen SHLSDecoder und SHLSEncoder (Python) stehen im SHLS-Repository auf GitHub.
Links hervorgehobenes SHLS - Abschnitte, Schlüssel, Werte, Verschachtelungsebenen und PH-Platzhalter. In der Mitte der Schlüsselblock jedes Abschnitts und seine Datensätze, die Schlüssel als Beschriftung. Ein Klick springt zum Code, der Cursor im Code markiert seinen Datensatz.
Werte, Schlüssel und Abschnittsnamen ändern; Datensätze und Schlüssel hinzufügen, duplizieren, verschieben und entfernen. Die Datensätze folgen ihrem Schlüsselblock: Ein neuer Schlüssel erhält in jedem Datensatz ein «-». Je ein Schritt für Rückgängig.
Der Editor liest SHLS genau so wie SHLSDecoder und listet auf, was dieser anders lesen würde, als es aussieht: einen Datensatz mit einem Wert zu wenig oder zu viel, Einrückung, Leerzeilen nach dem Schlüsselblock, einen Schlüssel doppelt.
Der Tab «Umwandeln» zählt die ungefähren Tokens deines SHLS und derselben Daten als JSON, damit du die Ersparnis auf einen Blick siehst.
Von und nach JSON genau wie SHLSDecoder und SHLSEncoder, YAML, CSV (ein Abschnitt als Tabelle) und JSON Lines. JSON-, YAML-, CSV- und JSON-Lines-Dateien öffnen sich als SHLS.
Behalte beliebig viele Dokumente in deinem Browser, jedes mit eigenem Rückgängig-Verlauf, und lade alle als ZIP herunter.
Jede https-Seite (und localhost) kann den Editor mit einem <iframe> und ?embed=1 einbetten - ohne Anmeldung, ohne Schlüssel. Eingebettet blendet der Editor diesen Text aus und zeigt einen Speichern-Knopf. Das Dokument kommt auf zwei Arten hinein und wieder heraus.
src= öffnet eine Datei (dein Server muss CORS erlauben), webhook= lässt «Speichern» (Ctrl+S) das Dokument an diese Adresse senden. Füge &token=… für einen Authorization: Bearer …-Header hinzu und &auto, um nach jeder Änderung zu speichern.
<iframe src="https://shls.giit.ch/?embed=1&src=https://your-site.com/data/products.shls&webhook=https://your-site.com/save.php"
allow="clipboard-write" style="width:100%;height:800px;border:0"></iframe>
Der Webhook erhält einen POST mit JSON { editor: "shls", event: "save", id, name, content, updated }; content ist das Dokument als String. Ein kleines PHP-Skript, das ihn speichert:
<?php
header('Access-Control-Allow-Origin: https://shls.giit.ch');
header('Access-Control-Allow-Headers: Content-Type, Authorization');
header('Access-Control-Allow-Methods: POST, OPTIONS');
if ($_SERVER['REQUEST_METHOD'] === 'OPTIONS') exit;
if (($_SERVER['HTTP_AUTHORIZATION'] ?? '') !== 'Bearer SECRET') { http_response_code(403); exit; }
$d = json_decode(file_get_contents('php://input'), true);
$name = preg_replace('/[^\w\- ]/u', '_', $d['name']);
file_put_contents(__DIR__ . "/data/$name.shls", $d['content']);
echo '{"ok":true}';
Der Editor meldet shlseditor:ready, deine Seite antwortet mit shlseditor:load, der Editor meldet shlseditor:loaded, shlseditor:change bei echten Änderungen und shlseditor:save, wenn gespeichert wird. Deine Seite kann shlseditor:get (den aktuellen Stand) oder shlseditor:save (Speichern drücken) senden. Gespeichert wird dann über dein eigenes Login und deine eigene Sitzung.
<iframe id="ed" src="https://shls.giit.ch/?embed=1" allow="clipboard-write" style="width:100%;height:800px;border:0"></iframe>
<script>
const ed = document.getElementById('ed');
const ORIGIN = 'https://shls.giit.ch';
addEventListener('message', async e => {
if (e.source !== ed.contentWindow || e.origin !== ORIGIN) return;
const m = e.data;
if (m.type === 'shlseditor:ready') { // der Editor ist bereit: ihm das Dokument geben
ed.contentWindow.postMessage({
type: 'shlseditor:load',
name: 'Products',
content: await (await fetch('/data/products.shls')).text()
}, ORIGIN);
}
if (m.type === 'shlseditor:change') document.title = '● not saved'; // eine echte Änderung
if (m.type === 'shlseditor:save') { // es wurde auf "Speichern" geklickt
await fetch('/api/save', { method: 'POST', headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ name: m.name, content: m.content }) });
document.title = 'Saved';
}
});
// Ein Speichern-Knopf auf deiner eigenen Seite: die Antwort kommt als shlseditor:save
function saveNow() { ed.contentWindow.postMessage({ type: 'shlseditor:get' }, ORIGIN); }
</script>
KI-Assistent in deiner Seite: Er funktioniert auch im Frame. Mit allow="clipboard-write" am iframe nutzt «Prompt kopieren» direkt die Zwischenablage (sonst greift der Editor auf den alten Kopierbefehl zurück oder zeigt den Prompt zum Kopieren von Hand). Ein Link der KI erreicht keinen Editor in einer anderen Website, darum sagt der Editor der KI und dir, die ganze Antwort der KI stattdessen in den Editor einzufügen - oder den Editor in einem eigenen Fenster zu öffnen.
window.open("https://shls.giit.ch/?embed=window", "shlseditor-17") öffnet den vollen Editor in einem eigenen Fenster, das dieselben Meldungen mit window.opener austauscht. Links einer KI erreichen ihn dort. shlseditor:load kann auch context: { host, title, rules } mitgeben - der KI-Prompt sagt dann, wohin das Dokument gehört, und befolgt deine Regeln - sowie hook: { url, token }, einen Webhook nur für dieses Dokument, der nie gespeichert wird. Wird das Fenster mit ungespeicherten Änderungen geschlossen, kommt shlseditor:closing.
Gib dem Editor deinen eigenen Prompt, eine Adresse auf deiner Website und einen Schlüssel für diese Editor-Sitzung. Der KI-Dialog zeigt dann «Verbunden mit» deiner Website, was du der KI sagst, und die Wahl das aktuelle Dokument ändern oder ein neues erstellen; Prompt kopieren setzt alles zusammen. Die KI sendet ihr Ergebnis mit dem Schlüssel an deinen Server, und deine Seite öffnet es im Editor - ein neues Dokument öffnet sich separat und bleibt im Browser der Person, die schreibt. Ein Schlüssel pro Editor-Sitzung: Er bleibt gültig, solange der Editor offen ist, und nur solange er keinen hat, fragt der Editor mit shlseditor:key-request danach. Der Editor sendet den Schlüssel selbst nie und speichert ihn nie; die Adresse muss https auf deinem eigenen Host oder einer Subdomain davon sein.
const key = async () => (await fetch('/api/ai-key.php?doc=17')).json(); // ein Schlüssel pro Editor-Sitzung
const k = await key();
ed.contentWindow.postMessage({ type: 'shlseditor:load', name: 'Products', content, ai: {
label: 'My Site', prompt: 'Keep every key. Only add records.',
endpoint: 'https://your-site.com/api/ai-result.php', key: k.key } }, ORIGIN);
// die id aus shlseditor:loaded merken und change/save/closing mit anderer id ignorieren
// nur solange der Editor keinen Schlüssel hat:
if (m.type === 'shlseditor:key-request') { const k = await key(); ed.contentWindow.postMessage({ type: 'shlseditor:ai', key: k.key }, ORIGIN); }
// solange der Editor offen ist, jede Minute deinem Server melden; Schliessen des Editors oder der Seite macht den Schlüssel ungültig
setInterval(() => fetch('/api/ai-key.php?alive=' + k.key.slice(0, 8)), 60000);
// dein Server hat ein Ergebnis (Polling, SSE …): target ist "current" oder "new"
ed.contentWindow.postMessage({ type: 'shlseditor:load', name: 'Products', content: draft, from: 'ai', target }, ORIGIN);
Erzeuge Schlüssel mit mindestens 128 Zufallsbits, speichere nur ihren Hash, binde jeden an die angemeldete Person, das Dokument und diese Editor-Sitzung, erzeuge einen pro Sitzung, lass ihn nur gültig, solange deine Seite die Sitzung als offen meldet, und mach ihn ungültig, wenn der Editor oder die Seite schliesst.
Das ganze Protokoll steht in llms.txt - gib es einer KI, und sie baut die Anbindung für dein System. Der JSON-Editor funktioniert gleich, mit dem Präfix jsoneditor: - json.giit.ch.
SHLS (Sebis Hierarchical List Structure) ist ein Textformat für strukturierte Daten von Sebastian Grünwald. Jeder Abschnitt nennt seine Schlüssel einmal in einem Schlüsselblock; die Datensätze darunter listen nur die Werte auf, einen pro Zeile, und die Einrückung zeigt die Verschachtelung. Ohne Anführungszeichen, Klammern, Doppelpunkte oder wiederholte Schlüssel brauchen dieselben Daten weit weniger Tokens als JSON - das macht es zu einem guten Format für KI-Modelle.
Nein. Der Editor läuft vollständig in deinem Browser. Deine Dokumente werden nie an einen Server gesendet, ausser du richtest selbst einen Webhook zu deinem eigenen Server ein.
Ja. Der Editor liest und schreibt SHLS genau so wie SHLSDecoder und SHLSEncoder aus dem SHLS-Repository - das JSON im Tab «Umwandeln» sind die Daten, welche die Python-Klassen liefern. Wo sie ein Dokument anders lesen, als es aussieht (ein Datensatz mit einem Wert zu wenig, eine Leerzeile mit Leerzeichen), listet der Editor es als Problem mit seiner Zeile auf.
Ja. Klicke in der Mitte auf einen Wert, einen Schlüssel oder einen Abschnittsnamen, tippe und drücke Enter. Die Knöpfe über den Datensätzen fügen Datensätze und Schlüssel hinzu, duplizieren, verschieben und entfernen sie; fügst du einen Schlüssel hinzu oder entfernst ihn, erhält oder verliert jeder Datensatz des Abschnitts seinen Wert. Jede Änderung ist ein Schritt für Rückgängig.
Der Tab Umwandeln zählt die ungefähren Tokens deines Dokuments als SHLS und derselben Daten als JSON. Bei Tabellen von Datensätzen braucht SHLS oft weniger als die Hälfte der Tokens von eingerücktem JSON, weil die Schlüssel nur einmal geschrieben werden.
Ja. Öffne eine .json-, .yaml-, .csv- oder .jsonl-Datei, und sie wird zu SHLS, so geschrieben, wie SHLSEncoder schreibt; der Editor sagt, was SHLS nicht behalten kann (leere Werte, Werte mit Zeilenumbrüchen). Der Tab «Umwandeln» und «Exportieren» schreiben JSON, YAML, CSV, JSON Lines und reinen Text.
Ja, jede KI - ChatGPT, Claude, Gemini, Copilot oder die KI in deinem Programmierwerkzeug. Klicke auf «KI-Assistent», dann auf «Prompt kopieren»: Der Prompt erklärt SHLS, damit jede KI gültiges SHLS schreibt. Die KI antwortet mit einem Link; klicke darauf, und das Dokument erscheint in deinem Editor. «Rückgängig» nimmt jede Änderung zurück.
Nein. Der Editor ist kostenlos, ohne Werbung und ohne Anmeldung.