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.

Modifica SHLS online - il formato di dati che risparmia token

SHLS (Sebis Hierarchical List Structure) scrive dati strutturati senza virgolette, parentesi, due punti o chiavi ripetute: ogni sezione nomina le sue chiavi una sola volta, e i record sotto elencano solo i valori. L'Editor SHLS mostra il codice e, accanto, il blocco di chiavi e i record di ogni sezione. Cambia valori, chiavi e record direttamente lì, vedi i problemi per riga, converti da e verso JSON, YAML e CSV e vedi quanti token risparmia SHLS rispetto a JSON.

Tutto funziona nel tuo browser. I documenti non vengono caricati, non c'è registrazione né pubblicità.

SHLS in un minuto

Una sezione inizia con il suo nome. Il suo blocco di chiavi elenca le chiavi, rientrate di uno spazio; le chiavi di una lista annidata un livello più in profondità. Dopo esattamente una riga vuota seguono i record: un valore per riga, nell'ordine delle chiavi. Una lista annidata ha una riga propria (la sua chiave, o PH come segnaposto) con i suoi record un livello più in profondità. Tutti i valori sono testo - convertirli in numeri o date spetta al programma che li legge.

Product
 Name
 Price

 Smartphone A1
 599.99

 Laptop B2
 1299.99

Company
 Name
 Location
  Country
  City

 TechCorp
 PH
  USA
  San Francisco

Gli stessi dati in JSON ripetono ogni chiave in ogni record e richiedono virgolette, parentesi e due punti. SHLS è nato per i modelli di IA locali e nel cloud, dove ogni token conta. SHLS by Sebastian Grünwald - il formato, le sue regole e le classi di riferimento SHLSDecoder e SHLSEncoder (Python) sono nel repository SHLS su GitHub.

Cosa sa fare l'editor

Codice e record

A sinistra SHLS evidenziato - sezioni, chiavi, valori, livelli di annidamento e segnaposto PH. Al centro il blocco di chiavi di ogni sezione e i suoi record, con le chiavi come etichette. Un clic porta al codice, il cursore nel codice segna il suo record.

Modifica sul posto

Cambia valori, chiavi e nomi di sezione; aggiungi, duplica, sposta e rimuovi record e chiavi. I record seguono il loro blocco di chiavi: una nuova chiave riceve «-» in ogni record. Un passo di Annulla per ciascuna modifica.

Legge come il riferimento

L'editor legge SHLS esattamente come SHLSDecoder ed elenca ciò che questo leggerebbe diversamente da come appare: un record con un valore in meno o in più, il rientro, righe vuote dopo il blocco di chiavi, una chiave doppia.

Token

La scheda Converti conta i token approssimativi del tuo SHLS e degli stessi dati in JSON, così vedi il risparmio a colpo d'occhio.

Converti

Da e verso JSON esattamente come SHLSDecoder e SHLSEncoder, YAML, CSV (una sezione come tabella) e JSON Lines. I file JSON, YAML, CSV e JSON Lines si aprono come SHLS.

Molti documenti

Tieni quanti documenti vuoi nel tuo browser, ognuno con la propria cronologia di annullamento, e scaricali tutti come ZIP.

Come funziona

  1. Inizia - scegli un modello in «Nuovo», apri un file .shls, oppure apri un file JSON, YAML o CSV per ottenerlo come SHLS.
  2. Modifica - nel codice o nei record; entrambi mostrano sempre gli stessi dati.
  3. Controlla e converti - correggi i problemi elencati, confronta i token e scarica SHLS, JSON, YAML, CSV o testo.

Usare l'editor sul tuo sito web

Qualsiasi pagina https (e localhost) può integrare l'editor con un <iframe> e ?embed=1 - senza registrazione, senza chiave. Integrato, l'editor nasconde questo testo e mostra un pulsante Salva. Ci sono due modi per far entrare e uscire il documento.

1. Aprire un file da un link, salvare sul tuo server

src= apre un file (il tuo server deve consentire CORS), webhook= fa sì che «Salva» (Ctrl+S) invii il documento a quell'indirizzo. Aggiungi &token=… per un'intestazione Authorization: Bearer … e &auto per salvare dopo ogni modifica.

<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>

Il webhook riceve un POST con JSON { editor: "shls", event: "save", id, name, content, updated }; content è il documento come stringa. Un piccolo script PHP che lo salva:

<?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. La tua pagina custodisce il documento (postMessage)

L'editor dice shlseditor:ready, la tua pagina risponde con shlseditor:load, l'editor segnala shlseditor:loaded, shlseditor:change alle modifiche reali e shlseditor:save quando l'utente salva. La tua pagina può inviare shlseditor:get (lo stato attuale) o shlseditor:save (premi Salva). Il salvataggio passa così dal tuo login e dalla tua sessione.

<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') {              // l'editor è pronto: passagli il documento
    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';   // una modifica reale
  if (m.type === 'shlseditor:save') {               // l'utente ha fatto clic su "Salva"
    await fetch('/api/save', { method: 'POST', headers: { 'Content-Type': 'application/json' },
      body: JSON.stringify({ name: m.name, content: m.content }) });
    document.title = 'Saved';
  }
});

// Un pulsante Salva sulla tua pagina: la risposta arriva come shlseditor:save
function saveNow() { ed.contentWindow.postMessage({ type: 'shlseditor:get' }, ORIGIN); }
</script>

Assistente IA nella tua pagina: funziona anche nel riquadro. Con allow="clipboard-write" sull'iframe, «Copia il prompt» usa direttamente gli appunti (altrimenti l'editor ricorre al vecchio comando di copia, o mostra il prompt da copiare a mano). Un link inviato dall'IA non può raggiungere un editor dentro un altro sito web, quindi l'editor dice all'IA e all'utente di incollare invece l'intera risposta dell'IA nell'editor - oppure di aprire l'editor in una finestra propria.

3. In una finestra propria

window.open("https://shls.giit.ch/?embed=window", "shlseditor-17") apre l'editor completo in una finestra propria e usa gli stessi messaggi con window.opener. Lì lo raggiungono i link di un'IA. shlseditor:load può portare anche context: { host, title, rules } - il prompt per l'IA dice allora a chi appartiene il documento e segue le tue regole - e hook: { url, token }, un webhook solo per questo documento che non viene mai salvato. Chiudere la finestra con modifiche non salvate invia shlseditor:closing.

4. IA tramite il tuo server

Passa all'editor il tuo prompt, un indirizzo sul tuo sito e una chiave per questa sessione dell'editor. La finestra dell'IA mostra allora «Connesso a» il tuo sito, ciò che dici all'IA e la scelta modificare il documento attuale o crearne uno nuovo; Copia il prompt mette tutto insieme. L'IA invia il risultato con la chiave al tuo server, e la tua pagina lo apre nell'editor - un nuovo documento si apre separatamente e resta nel browser dell'utente. Una chiave per sessione dell'editor: resta valida finché l'editor è aperto, e solo finché non ne ha una l'editor la chiede con shlseditor:key-request. L'editor non invia mai la chiave di sua iniziativa e non la salva mai; l'indirizzo deve essere https sul tuo host o su un suo sottodominio.

const key = async () => (await fetch('/api/ai-key.php?doc=17')).json();   // una chiave per sessione dell'editor
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);
// ricorda l'id da shlseditor:loaded e ignora change/save/closing con un altro id
// solo finché l'editor non ha una chiave:
if (m.type === 'shlseditor:key-request') { const k = await key(); ed.contentWindow.postMessage({ type: 'shlseditor:ai', key: k.key }, ORIGIN); }
// finché l'editor è aperto, avvisa il tuo server ogni minuto; chiudere l'editor o la pagina annulla la chiave
setInterval(() => fetch('/api/ai-key.php?alive=' + k.key.slice(0, 8)), 60000);
// il tuo server ha un risultato (polling, SSE …): target è "current" o "new"
ed.contentWindow.postMessage({ type: 'shlseditor:load', name: 'Products', content: draft, from: 'ai', target }, ORIGIN);

Crea chiavi con almeno 128 bit casuali, salvane solo l'hash, lega ciascuna all'utente connesso, al documento e a questa sessione dell'editor, creane una per sessione, mantienila valida solo finché la tua pagina segnala la sessione come aperta, e annullala quando l'editor o la pagina si chiude.

L'intero protocollo è in llms.txt - dallo a un'IA e costruirà il collegamento per il tuo sistema. L'Editor JSON funziona allo stesso modo con il prefisso jsoneditor: - json.giit.ch.

Domande frequenti

Che cos'è SHLS?

SHLS (Sebis Hierarchical List Structure) è un formato di testo per dati strutturati di Sebastian Grünwald. Ogni sezione nomina le sue chiavi una sola volta in un blocco di chiavi; i record sotto elencano solo i valori, uno per riga, e il rientro mostra l'annidamento. Senza virgolette, parentesi, due punti o chiavi ripetute, gli stessi dati richiedono molti meno token di JSON - il che lo rende un buon formato per i modelli di IA.

I miei dati vengono caricati?

No. L'editor funziona interamente nel tuo browser. I tuoi documenti non vengono mai inviati a un server, a meno che tu non configuri da solo un webhook verso il tuo server.

L'editor legge SHLS esattamente come il codice di riferimento?

Sì. L'editor legge e scrive SHLS esattamente come SHLSDecoder e SHLSEncoder del repository SHLS - il JSON nella scheda Converti sono i dati che danno le classi Python. Dove leggono un documento diversamente da come appare (un record con un valore in meno, una riga vuota con spazi), l'editor lo elenca come problema con la sua riga.

Posso modificare i record senza toccare il codice?

Sì. Fai clic al centro su un valore, una chiave o un nome di sezione, scrivi e premi Enter. I pulsanti sopra i record aggiungono, duplicano, spostano e rimuovono record e chiavi; quando aggiungi o rimuovi una chiave, ogni record della sezione riceve o perde il suo valore. Ogni modifica è un passo di Annulla.

Quanti token risparmia SHLS?

La scheda Converti conta i token approssimativi del tuo documento come SHLS e degli stessi dati come JSON. Per tabelle di record SHLS richiede spesso meno della metà dei token del JSON rientrato, perché le chiavi sono scritte una sola volta.

Può convertire JSON, YAML o CSV in SHLS?

Sì. Apri un file .json, .yaml, .csv o .jsonl e diventa SHLS, scritto come lo scrive SHLSEncoder; l'editor dice cosa SHLS non può conservare (valori vuoti, valori con a capo). La scheda Converti ed Esporta scrivono JSON, YAML, CSV, JSON Lines e testo semplice.

Un'IA può scrivere nell'Editor SHLS?

Sì, qualsiasi IA - ChatGPT, Claude, Gemini, Copilot o l'IA del tuo strumento di programmazione. Fai clic su «Assistente IA», poi su «Copia il prompt»: il prompt spiega SHLS, così qualsiasi IA scrive SHLS valido. L'IA risponde con un link; fai clic e il documento appare nel tuo editor. «Annulla» ritira ogni modifica.

L'Editor SHLS costa qualcosa?

No. L'editor è gratuito, senza pubblicità e senza registrazione.