SHLS (Sebis Hierarchical List Structure) schrijft gestructureerde gegevens zonder aanhalingstekens, haakjes, dubbele punten of herhaalde sleutels: elke sectie noemt haar sleutels één keer, en de records eronder geven alleen de waarden. De SHLS-editor toont de code en daarnaast het sleutelblok en de records van elke sectie. Wijzig waarden, sleutels en records daar direct, zie problemen per regel, zet om van en naar JSON, YAML en CSV, en zie hoeveel tokens SHLS bespaart ten opzichte van JSON.
Alles draait in je browser. Documenten worden niet geüpload, er is geen registratie en geen reclame.
Een sectie begint met haar naam. Haar sleutelblok noemt de sleutels, één spatie ingesprongen; de sleutels van een geneste lijst een niveau dieper. Na precies één lege regel volgen de records: één waarde per regel, in de volgorde van de sleutels. Een geneste lijst heeft een eigen regel (haar sleutel, of PH als plaatshouder) met haar records een niveau dieper. Alle waarden zijn tekst - ze omzetten naar getallen of datums is aan het programma dat ze leest.
Product
Name
Price
Smartphone A1
599.99
Laptop B2
1299.99
Company
Name
Location
Country
City
TechCorp
PH
USA
San Francisco
Dezelfde gegevens als JSON herhalen elke sleutel in elk record en hebben aanhalingstekens, haakjes en dubbele punten nodig. SHLS is gemaakt voor lokale en cloud-AI-modellen, waar elk token telt. SHLS by Sebastian Grünwald - het formaat, de regels en de referentie-SHLSDecoder en -SHLSEncoder (Python) staan in de SHLS-repository op GitHub.
Gekleurde SHLS links - secties, sleutels, waarden, nestingniveaus en PH-plaatshouders. In het midden het sleutelblok en de records van elke sectie, de sleutels als labels. Een klik springt naar de code, de cursor van de code markeert zijn record.
Wijzig waarden, sleutels en sectienamen; voeg records en sleutels toe, dupliceer, verplaats en verwijder ze. Records volgen hun sleutelblok: een nieuwe sleutel krijgt "-" in elk record. Telkens één stap voor Ongedaan maken.
De editor leest SHLS precies zoals SHLSDecoder en toont wat die anders zou lezen dan het eruitziet: een record met een waarde te weinig of te veel, inspringing, lege regels na het sleutelblok, een sleutel die twee keer voorkomt.
Het tabblad Omzetten telt de geschatte tokens van je SHLS en van dezelfde gegevens als JSON, zodat je de besparing in één oogopslag ziet.
Van en naar JSON precies zoals SHLSDecoder en SHLSEncoder, YAML, CSV (één sectie als tabel) en JSON Lines. JSON-, YAML-, CSV- en JSON Lines-bestanden openen als SHLS.
Bewaar zoveel documenten als je wilt in je browser, elk met een eigen geschiedenis voor Ongedaan maken, en download ze allemaal als ZIP.
Elke https-pagina (en localhost) kan de editor insluiten met een <iframe> en ?embed=1 - geen registratie, geen sleutel. Ingesloten verbergt de editor deze tekst en toont hij een knop Opslaan. Er zijn twee manieren om het document erin en eruit te krijgen.
src= opent een bestand (je server moet CORS toestaan), webhook= zorgt dat "Opslaan" (Ctrl+S) het document naar dat adres stuurt. Voeg &token=… toe voor een header Authorization: Bearer … en &auto om na elke wijziging op te slaan.
<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>
De webhook krijgt een POST met JSON { editor: "shls", event: "save", id, name, content, updated }; content is het document als tekst. Een klein PHP-script dat het opslaat:
<?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}';
De editor zegt shlseditor:ready, je pagina antwoordt met shlseditor:load, de editor meldt shlseditor:loaded, shlseditor:change bij echte bewerkingen en shlseditor:save wanneer de gebruiker opslaat. Je pagina mag shlseditor:get (de huidige toestand) of shlseditor:save (op Opslaan drukken) sturen. Opslaan loopt dan via je eigen login en sessie.
<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') { // de editor is klaar: geef hem het document
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'; // een echte bewerking
if (m.type === 'shlseditor:save') { // de gebruiker klikte op "Opslaan"
await fetch('/api/save', { method: 'POST', headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ name: m.name, content: m.content }) });
document.title = 'Saved';
}
});
// Een opslaanknop op je eigen pagina: het antwoord komt als shlseditor:save
function saveNow() { ed.contentWindow.postMessage({ type: 'shlseditor:get' }, ORIGIN); }
</script>
AI-assistent binnen je pagina: die werkt ook in het frame. Met allow="clipboard-write" op het iframe gebruikt "Prompt kopiëren" direct het klembord (anders valt de editor terug op het oude kopieercommando, of toont hij de prompt om met de hand te kopiëren). Een link die de AI stuurt, kan een editor binnen een andere website niet bereiken, dus vraagt de editor de AI en de gebruiker om in plaats daarvan het hele antwoord van de AI in de editor te plakken - of de editor in een eigen venster te openen.
window.open("https://shls.giit.ch/?embed=window", "shlseditor-17") opent de volledige editor in een eigen venster en spreekt dezelfde berichten met window.opener. Links van een AI bereiken hem daar. shlseditor:load kan ook context: { host, title, rules } meegeven - de AI-prompt zegt dan waar het document thuishoort en volgt je regels - en hook: { url, token }, een webhook alleen voor dit document die nooit wordt opgeslagen. Als het venster met niet-opgeslagen wijzigingen wordt gesloten, stuurt het shlseditor:closing.
Geef de editor je eigen prompt, een adres op je site en een sleutel voor deze editorsessie. Het AI-venster toont dan "Verbonden met" je site, wat je de AI vertelt, en de keuze het huidige document wijzigen of een nieuw maken; Prompt kopiëren zet alles bij elkaar. De AI post het resultaat met de sleutel naar je server, en je pagina opent het in de editor - een nieuw document opent apart en blijft in de browser van de gebruiker. Eén sleutel per editorsessie: hij blijft geldig zolang de editor open is, en alleen zolang de editor er geen heeft, vraagt hij erom met shlseditor:key-request. De editor verstuurt de sleutel nooit zelf en slaat hem nooit op; het adres moet https zijn op je eigen host of een subdomein ervan.
const key = async () => (await fetch('/api/ai-key.php?doc=17')).json(); // één sleutel per editorsessie
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);
// onthoud de id uit shlseditor:loaded en negeer change/save/closing met een andere id
// alleen zolang de editor geen sleutel heeft:
if (m.type === 'shlseditor:key-request') { const k = await key(); ed.contentWindow.postMessage({ type: 'shlseditor:ai', key: k.key }, ORIGIN); }
// zolang de editor open is, meld het elke minuut aan je server; het sluiten van de editor of de pagina maakt de sleutel ongeldig
setInterval(() => fetch('/api/ai-key.php?alive=' + k.key.slice(0, 8)), 60000);
// je server heeft een resultaat (polling, SSE …): target is "current" of "new"
ed.contentWindow.postMessage({ type: 'shlseditor:load', name: 'Products', content: draft, from: 'ai', target }, ORIGIN);
Maak sleutels met minstens 128 willekeurige bits, sla alleen hun hash op, koppel elke sleutel aan de ingelogde gebruiker, het document en deze editorsessie, maak er één per sessie, houd hem alleen geldig zolang je pagina de sessie als open meldt, en maak hem ongeldig wanneer de editor of de pagina sluit.
Het hele protocol staat in llms.txt - geef het aan een AI en die bouwt de koppeling voor je systeem. De JSON-editor werkt op dezelfde manier met het voorvoegsel jsoneditor: - json.giit.ch.
SHLS (Sebis Hierarchical List Structure) is een tekstformaat voor gestructureerde gegevens van Sebastian Grünwald. Elke sectie noemt haar sleutels één keer in een sleutelblok; de records eronder geven alleen de waarden, één per regel, en de inspringing toont de nesting. Zonder aanhalingstekens, haakjes, dubbele punten of herhaalde sleutels hebben dezelfde gegevens veel minder tokens nodig dan JSON - daardoor is het een goed formaat voor AI-modellen.
Nee. De editor draait volledig in je browser. Je documenten worden nooit naar een server gestuurd, tenzij je zelf een webhook naar je eigen server instelt.
Ja. De editor leest en schrijft SHLS precies zoals SHLSDecoder en SHLSEncoder uit de SHLS-repository dat doen - de JSON in het tabblad Omzetten zijn de gegevens die de Python-klassen opleveren. Waar die een document anders lezen dan het eruitziet (een record met een waarde te weinig, een lege regel met spaties), toont de editor het als probleem met de regel.
Ja. Klik in het midden op een waarde, een sleutel of een sectienaam, typ en druk op Enter. De knoppen boven de records voegen records en sleutels toe, dupliceren, verplaatsen en verwijderen ze; als je een sleutel toevoegt of verwijdert, krijgt of verliest elk record van de sectie zijn waarde. Elke wijziging is één stap voor Ongedaan maken.
Het tabblad Omzetten telt de geschatte tokens van je document als SHLS en van dezelfde gegevens als JSON. Voor tabellen met records heeft SHLS vaak minder dan de helft van de tokens van ingesprongen JSON nodig, omdat de sleutels maar één keer worden geschreven.
Ja. Open een .json-, .yaml-, .csv- of .jsonl-bestand en het wordt SHLS, geschreven zoals SHLSEncoder het schrijft; de editor zegt wat SHLS niet kan bewaren (lege waarden, waarden met regeleinden). Het tabblad Omzetten en Exporteren schrijven JSON, YAML, CSV, JSON Lines en platte tekst.
Ja, elke AI - ChatGPT, Claude, Gemini, Copilot of de AI in je programmeertool. Klik op "AI-assistent", dan op "Prompt kopiëren": de prompt legt SHLS uit, zodat elke AI geldige SHLS schrijft. De AI antwoordt met een link; klik erop en het document verschijnt in je editor. "Ongedaan maken" draait elke wijziging terug.
Nee. De editor is gratis, zonder reclame en zonder registratie.