SHLS Editor online

Code

Export

My documents

Click a document to open it. They are stored only in this browser - nothing is uploaded. Clearing the browser's site data removes them, so download the ones you want to keep.

AI Assistant

Any AI can work with you - ChatGPT, Claude, Gemini, Copilot. The prompt explains SHLS, so the AI writes valid SHLS.

  1. Click Copy prompt.
  2. Paste it into your AI and say what it should change.
The AI should

The document travels in the link after the “#”, which no server sees. What you paste into your AI is handled by its provider.

Save to your server

The editor can send each saved version to your own server (a webhook), so your work is kept where you want it. Nothing is sent until you enter an address here.

What your server receives

A POST request with JSON (your server must allow CORS from https://shls.giit.ch); content is the document as a string:

{ "editor": "shls", "event": "save", "id": "…", "name": "Products",
  "content": "Product\n Name\n Price\n\n Lamp\n 19.90\n",
  "updated": "2026-01-15T09:30:00.000Z" }
Embed the editor in your website
<iframe src="https://shls.giit.ch/?embed=1" style="width:100%;height:80vh;border:0"></iframe>
<script>
const frame = document.querySelector('iframe');
addEventListener('message', e => {
  if (e.origin !== 'https://shls.giit.ch' || e.source !== frame.contentWindow) return;
  if (e.data.type === 'shlseditor:ready')
    frame.contentWindow.postMessage({ type: 'shlseditor:load', name: 'Products',
      content: shlsText }, 'https://shls.giit.ch');
  if (e.data.type === 'shlseditor:save') saveOnYourServer(e.data.content);
});
</script>

Also possible: ?src=<URL of a .shls file> opens a file, &webhook=<URL> saves this document there. The editor can also open in a window of its own (?embed=window), and your page can hand it its own AI prompt and a session key so the AI sends its result to your server (shlseditor:ai, shlseditor:key-request) - see "Use the editor on your own website" below the editor. Details are in llms.txt.

Help

How it works

  1. Write SHLS on the left - or start with New and one of the templates. A section is its name, then its keys (indented by one space, the keys of a nested list one level deeper), exactly one blank line, then the records: one value per line in the order of the keys.
  2. The middle shows each section with its key block and its records, the keys as labels; nested lists fold. It reads the code exactly as the reference SHLSDecoder does.
  3. Click a value, a key or a section name to change it right there. Enter or a click elsewhere writes the change into the code (one step for Undo), Escape cancels. The buttons above add, duplicate, move and remove records and keys - a key added or removed is added to or removed from every record.
  4. A click in the middle puts the code's cursor on that line; the cursor in the code marks its record, key or value. Problems (a record with a value too few, indentation that is not a whole level, a missing blank line) are listed above the code with their line - click one to go there.
  5. Record on the right shows the selected record as a form; Insert adds records, keys and sections; Convert counts the tokens against JSON and converts to JSON, YAML, CSV and JSON Lines; Outline lists the sections.
  6. My documents (the folder button at the top left) lists every document kept in this browser. Export saves it as SHLS, JSON, YAML, CSV or text.

Keyboard shortcuts

↑ ↓ ← →
In the records: go up and down, fold and unfold
Enter
In the records: change the value, key or section name
Delete
In the records: remove the record or key
Alt + ↑ / ↓
In the records: move the record or key up / down
Ctrl + F
Search keys and values
Tab / Shift + Tab
Indent / outdent in the code by one level
Ctrl + Z / Y
Undo / redo
Ctrl + S / E
Save (download, or to your server) / export
Ctrl + O
My documents

Enter keeps the indentation of the line; after a section name it starts the key block.

SHLS online bewerken - het gegevensformaat dat tokens bespaart

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.

SHLS in één minuut

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.

Wat de editor kan

Code en records

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.

Ter plekke bewerken

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.

Lezen zoals de referentie

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.

Tokens

Het tabblad Omzetten telt de geschatte tokens van je SHLS en van dezelfde gegevens als JSON, zodat je de besparing in één oogopslag ziet.

Omzetten

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.

Veel documenten

Bewaar zoveel documenten als je wilt in je browser, elk met een eigen geschiedenis voor Ongedaan maken, en download ze allemaal als ZIP.

Hoe het werkt

  1. Beginnen - kies een sjabloon onder "Nieuw", open een .shls-bestand, of open een JSON-, YAML- of CSV-bestand om het als SHLS te krijgen.
  2. Bewerken - in de code of in de records; beide tonen altijd dezelfde gegevens.
  3. Controleren en omzetten - herstel de vermelde problemen, vergelijk de tokens, en download SHLS, JSON, YAML, CSV of tekst.

De editor op je eigen website gebruiken

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.

1. Een bestand openen via een link, opslaan op je server

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}';

2. Je pagina beheert het document (postMessage)

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.

3. In een eigen venster

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.

4. AI via je eigen server

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.

Veelgestelde vragen

Wat is SHLS?

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.

Worden mijn gegevens geüpload?

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.

Leest de editor SHLS precies zoals de referentiecode?

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.

Kan ik de records bewerken zonder de code aan te raken?

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.

Hoeveel tokens bespaart SHLS?

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.

Kan de editor JSON, YAML of CSV omzetten naar SHLS?

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.

Kan een AI in de SHLS-editor schrijven?

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.

Kost de SHLS-editor iets?

Nee. De editor is gratis, zonder reclame en zonder registratie.