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.

Edita SHLS online: el formato de datos que ahorra tokens

SHLS (Sebis Hierarchical List Structure) escribe datos estructurados sin comillas, corchetes, dos puntos ni claves repetidas: cada sección nombra sus claves una sola vez, y los registros de debajo solo listan los valores. El Editor de SHLS muestra el código y, a su lado, el bloque de claves y los registros de cada sección. Cambia valores, claves y registros ahí mismo, ve los problemas por línea, convierte desde y hacia JSON, YAML y CSV y ve cuántos tokens ahorra SHLS frente a JSON.

Todo funciona en tu navegador. Los documentos no se suben, no hay registro ni publicidad.

SHLS en un minuto

Una sección empieza con su nombre. Su bloque de claves lista las claves, con una sangría de un espacio; las claves de una lista anidada, un nivel más adentro. Tras exactamente una línea en blanco siguen los registros: un valor por línea, en el orden de las claves. Una lista anidada tiene una línea propia (su clave, o PH como marcador) con sus registros un nivel más adentro. Todos los valores son texto: convertirlos en números o fechas le toca al programa que los lee.

Product
 Name
 Price

 Smartphone A1
 599.99

 Laptop B2
 1299.99

Company
 Name
 Location
  Country
  City

 TechCorp
 PH
  USA
  San Francisco

Los mismos datos en JSON repiten cada clave en cada registro y necesitan comillas, corchetes y dos puntos. SHLS se creó para modelos de IA locales y en la nube, donde cada token cuenta. SHLS by Sebastian Grünwald: el formato, sus reglas y las clases de referencia SHLSDecoder y SHLSEncoder (Python) están en el repositorio de SHLS en GitHub.

Lo que puede hacer el editor

Código y registros

A la izquierda, SHLS resaltado: secciones, claves, valores, niveles de anidamiento y marcadores PH. En el centro, el bloque de claves de cada sección y sus registros, con las claves como etiquetas. Un clic lleva al código, y el cursor del código marca su registro.

Edición en el sitio

Cambia valores, claves y nombres de sección; añade, duplica, mueve y quita registros y claves. Los registros siguen a su bloque de claves: una clave nueva recibe «-» en cada registro. Un paso de Deshacer cada uno.

Lee como la referencia

El editor lee SHLS exactamente como SHLSDecoder y lista lo que este leería distinto de como se ve: un registro con un valor de menos o de más, la sangría, líneas en blanco tras el bloque de claves, una clave repetida.

Tokens

La pestaña Convertir cuenta los tokens aproximados de tu SHLS y de los mismos datos en JSON, para que veas el ahorro de un vistazo.

Convertir

Desde y hacia JSON exactamente como SHLSDecoder y SHLSEncoder, YAML, CSV (una sección como tabla) y JSON Lines. Los archivos JSON, YAML, CSV y JSON Lines se abren como SHLS.

Muchos documentos

Guarda tantos documentos como quieras en tu navegador, cada uno con su propio historial de deshacer, y descárgalos todos en un ZIP.

Cómo funciona

  1. Empieza: elige una plantilla en «Nuevo», abre un archivo .shls, o abre un archivo JSON, YAML o CSV para obtenerlo como SHLS.
  2. Edita: en el código o en los registros; ambos muestran siempre los mismos datos.
  3. Revisa y convierte: corrige los problemas listados, compara los tokens y descarga SHLS, JSON, YAML, CSV o texto.

Usa el editor en tu propio sitio web

Cualquier página https (y localhost) puede integrar el editor con un <iframe> y ?embed=1, sin registro y sin clave. Integrado, el editor oculta este texto y muestra un botón Guardar. Hay dos formas de meter y sacar el documento.

1. Abrir un archivo desde un enlace, guardar en tu servidor

src= abre un archivo (tu servidor debe permitir CORS), webhook= hace que «Guardar» (Ctrl+S) envíe el documento a esa dirección. Añade &token=… para una cabecera Authorization: Bearer … y &auto para guardar después de cada cambio.

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

El webhook recibe un POST con JSON { editor: "shls", event: "save", id, name, content, updated }; content es el documento como cadena. Un pequeño script PHP que lo guarda:

<?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. Tu página guarda el documento (postMessage)

El editor dice shlseditor:ready, tu página responde con shlseditor:load, el editor informa con shlseditor:loaded, con shlseditor:change en cada edición real y con shlseditor:save cuando el usuario guarda. Tu página puede enviar shlseditor:get (el estado actual) o shlseditor:save (pulsar Guardar). Así el guardado pasa por tu propio inicio de sesión y tu sesión.

<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') {              // el editor está listo: pásale el 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 edición real
  if (m.type === 'shlseditor:save') {               // el usuario hizo clic en «Guardar»
    await fetch('/api/save', { method: 'POST', headers: { 'Content-Type': 'application/json' },
      body: JSON.stringify({ name: m.name, content: m.content }) });
    document.title = 'Saved';
  }
});

// Un botón de guardar en tu propia página: la respuesta llega como shlseditor:save
function saveNow() { ed.contentWindow.postMessage({ type: 'shlseditor:get' }, ORIGIN); }
</script>

Asistente de IA dentro de tu página: también funciona en el marco. Con allow="clipboard-write" en el iframe, «Copiar prompt» usa el portapapeles directamente (si no, el editor recurre al antiguo comando de copiar o muestra el prompt para copiarlo a mano). Un enlace que envía la IA no puede llegar a un editor dentro de otro sitio web, así que el editor indica a la IA y al usuario que peguen la respuesta completa de la IA en el editor, o que abran el editor en una ventana propia.

3. En una ventana propia

window.open("https://shls.giit.ch/?embed=window", "shlseditor-17") abre el editor completo en su propia ventana y usa los mismos mensajes con window.opener. Ahí sí le llegan los enlaces de una IA. shlseditor:load también puede llevar context: { host, title, rules } (el prompt de IA dice entonces a dónde pertenece el documento y sigue tus reglas) y hook: { url, token }, un webhook solo para este documento que nunca se guarda. Al cerrar la ventana con cambios sin guardar se envía shlseditor:closing.

4. IA a través de tu propio servidor

Pasa al editor tu propio prompt, una dirección en tu sitio y una clave para esta sesión del editor. El diálogo de IA muestra entonces «Conectado a» tu sitio, lo que le dices a la IA y la opción cambiar el documento actual o crear uno nuevo; Copiar prompt lo junta todo. La IA envía su resultado con la clave a tu servidor, y tu página lo abre en el editor: un documento nuevo se abre aparte y se queda en el navegador del usuario. Una clave por sesión del editor: sigue siendo válida mientras el editor esté abierto, y solo mientras no tenga ninguna el editor la pide con shlseditor:key-request. El editor nunca envía la clave por sí mismo ni la guarda; la dirección debe ser https en tu propio host o en un subdominio suyo.

const key = async () => (await fetch('/api/ai-key.php?doc=17')).json();   // una clave por sesión del 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);
// recuerda el id de shlseditor:loaded e ignora change/save/closing con otro id
// solo mientras el editor no tenga clave:
if (m.type === 'shlseditor:key-request') { const k = await key(); ed.contentWindow.postMessage({ type: 'shlseditor:ai', key: k.key }, ORIGIN); }
// mientras el editor esté abierto, avisa a tu servidor cada minuto; cerrar el editor o la página anula la clave
setInterval(() => fetch('/api/ai-key.php?alive=' + k.key.slice(0, 8)), 60000);
// tu servidor tiene un resultado (polling, SSE …): target es «current» o «new»
ed.contentWindow.postMessage({ type: 'shlseditor:load', name: 'Products', content: draft, from: 'ai', target }, ORIGIN);

Crea claves con al menos 128 bits aleatorios, guarda solo su hash, vincula cada una al usuario con sesión iniciada, al documento y a esta sesión del editor, crea una por sesión, mantenla válida solo mientras tu página informe de que la sesión está abierta, y anúlala cuando se cierre el editor o la página.

El protocolo completo está en llms.txt: dáselo a una IA y construirá la conexión para tu sistema. El Editor de JSON funciona igual con el prefijo jsoneditor:: json.giit.ch.

Preguntas frecuentes

¿Qué es SHLS?

SHLS (Sebis Hierarchical List Structure) es un formato de texto para datos estructurados creado por Sebastian Grünwald. Cada sección nombra sus claves una sola vez en un bloque de claves; los registros de debajo solo listan los valores, uno por línea, y la sangría muestra el anidamiento. Sin comillas, corchetes, dos puntos ni claves repetidas, los mismos datos necesitan muchos menos tokens que JSON, lo que lo convierte en un buen formato para modelos de IA.

¿Se suben mis datos?

No. El editor funciona por completo en tu navegador. Tus documentos nunca se envían a un servidor, a menos que tú mismo configures un webhook a tu propio servidor.

¿Lee el editor SHLS exactamente como el código de referencia?

Sí. El editor lee y escribe SHLS exactamente como SHLSDecoder y SHLSEncoder del repositorio de SHLS: el JSON de la pestaña Convertir son los datos que dan las clases de Python. Donde leen un documento distinto de como se ve (un registro con un valor de menos, una línea en blanco con espacios), el editor lo lista como problema con su línea.

¿Puedo editar los registros sin tocar el código?

Sí. Haz clic en el centro sobre un valor, una clave o un nombre de sección, escribe y pulsa Enter. Los botones sobre los registros añaden, duplican, mueven y quitan registros y claves; cuando añades o quitas una clave, cada registro de la sección recibe o pierde su valor. Cada cambio es un paso de Deshacer.

¿Cuántos tokens ahorra SHLS?

La pestaña Convertir cuenta los tokens aproximados de tu documento como SHLS y de los mismos datos como JSON. En tablas de registros, SHLS suele necesitar menos de la mitad de los tokens del JSON con sangría, porque las claves se escriben una sola vez.

¿Puede convertir JSON, YAML o CSV a SHLS?

Sí. Abre un archivo .json, .yaml, .csv o .jsonl y se convierte en SHLS, escrito como lo escribe SHLSEncoder; el editor indica lo que SHLS no puede conservar (valores vacíos, valores con saltos de línea). La pestaña Convertir y Exportar escriben JSON, YAML, CSV, JSON Lines y texto sin formato.

¿Puede una IA escribir en el Editor de SHLS?

Sí, cualquier IA: ChatGPT, Claude, Gemini, Copilot o la IA de tu herramienta de programación. Haz clic en «Asistente de IA» y luego en «Copiar prompt»: el prompt explica SHLS, así que cualquier IA escribe SHLS válido. La IA responde con un enlace; haz clic en él y el documento aparece en tu editor. «Deshacer» revierte cada cambio.

¿Cuesta algo el Editor de SHLS?

No. El editor es gratuito, sin anuncios y sin registro.