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.

Edite SHLS online - o formato de dados que economiza tokens

O SHLS (Sebis Hierarchical List Structure) escreve dados estruturados sem aspas, colchetes, dois-pontos ou chaves repetidas: cada seção nomeia as suas chaves uma vez, e os registros abaixo listam só os valores. O Editor SHLS mostra o código e, ao lado, o bloco de chaves e os registros de cada seção. Altere valores, chaves e registros ali mesmo, veja problemas por linha, converta de e para JSON, YAML e CSV e veja quantos tokens o SHLS economiza em relação ao JSON.

Tudo roda no seu navegador. Os documentos não são enviados, não há cadastro nem publicidade.

SHLS em um minuto

Uma seção começa com o nome dela. O seu bloco de chaves lista as chaves, indentadas com um espaço; as chaves de uma lista aninhada um nível mais fundo. Depois de exatamente uma linha em branco vêm os registros: um valor por linha, na ordem das chaves. Uma lista aninhada tem uma linha própria (a chave dela, ou PH como marcador) com os registros um nível mais fundo. Todos os valores são texto - convertê-los em números ou datas fica a cargo do programa que os lê.

Product
 Name
 Price

 Smartphone A1
 599.99

 Laptop B2
 1299.99

Company
 Name
 Location
  Country
  City

 TechCorp
 PH
  USA
  San Francisco

Os mesmos dados em JSON repetem cada chave em cada registro e precisam de aspas, colchetes e dois-pontos. O SHLS foi feito para modelos de IA locais e na nuvem, onde cada token conta. SHLS by Sebastian Grünwald - o formato, as suas regras e os SHLSDecoder e SHLSEncoder de referência (Python) estão no repositório SHLS no GitHub.

O que o editor sabe fazer

Código e registros

SHLS com realce à esquerda - seções, chaves, valores, níveis de aninhamento e marcadores PH. No meio, o bloco de chaves de cada seção e os registros dela, com as chaves como rótulos. Um clique pula para o código, o cursor do código marca o registro dele.

Edite ali mesmo

Altere valores, chaves e nomes de seção; adicione, duplique, mova e remova registros e chaves. Os registros acompanham o bloco de chaves: uma nova chave recebe "-" em cada registro. Cada coisa é um passo para Desfazer.

Leitura igual à referência

O editor lê SHLS exatamente como o SHLSDecoder e lista o que ele leria diferente do que parece: um registro com um valor a menos ou a mais, a indentação, linhas em branco depois do bloco de chaves, uma chave repetida.

Tokens

A aba Converter conta os tokens aproximados do seu SHLS e dos mesmos dados em JSON, para você ver a economia num relance.

Converter

De e para JSON exatamente como o SHLSDecoder e o SHLSEncoder, YAML, CSV (uma seção como tabela) e JSON Lines. Arquivos JSON, YAML, CSV e JSON Lines abrem como SHLS.

Muitos documentos

Guarde quantos documentos quiser no seu navegador, cada um com o próprio histórico de desfazer, e baixe todos em um ZIP.

Como funciona

  1. Comece - escolha um modelo em "Novo", abra um arquivo .shls, ou abra um arquivo JSON, YAML ou CSV para obtê-lo como SHLS.
  2. Edite - no código ou nos registros; os dois sempre mostram os mesmos dados.
  3. Verifique e converta - corrija os problemas listados, compare os tokens e baixe SHLS, JSON, YAML, CSV ou texto.

Use o editor no seu próprio site

Qualquer página https (e localhost) pode incorporar o editor com um <iframe> e ?embed=1 - sem cadastro, sem chave. Incorporado, o editor oculta este texto e mostra um botão Salvar. Há dois jeitos de levar o documento para dentro e para fora.

1. Abrir um arquivo de um link, salvar no seu servidor

src= abre um arquivo (seu servidor precisa permitir CORS), webhook= faz "Salvar" (Ctrl+S) enviar o documento para esse endereço. Acrescente &token=… para um cabeçalho Authorization: Bearer … e &auto para salvar após cada alteração.

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

O webhook recebe um POST com JSON { editor: "shls", event: "save", id, name, content, updated }; content é o documento como string. Um pequeno script PHP que o 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. A sua página guarda o documento (postMessage)

O editor diz shlseditor:ready, a sua página responde com shlseditor:load, o editor informa shlseditor:loaded, shlseditor:change em edições reais e shlseditor:save quando o usuário salva. A sua página pode enviar shlseditor:get (o estado atual) ou shlseditor:save (apertar Salvar). Salvar passa então pelo seu próprio login e sessão.

<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') {              // o editor está pronto: entregue o documento a ele
    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';   // uma edição real
  if (m.type === 'shlseditor:save') {               // o usuário clicou em "Salvar"
    await fetch('/api/save', { method: 'POST', headers: { 'Content-Type': 'application/json' },
      body: JSON.stringify({ name: m.name, content: m.content }) });
    document.title = 'Saved';
  }
});

// Um botão de salvar na sua própria página: a resposta chega como shlseditor:save
function saveNow() { ed.contentWindow.postMessage({ type: 'shlseditor:get' }, ORIGIN); }
</script>

Assistente de IA dentro da sua página: ele também funciona no frame. Com allow="clipboard-write" no iframe, "Copiar prompt" usa a área de transferência diretamente (senão o editor recorre ao antigo comando de copiar, ou mostra o prompt para copiar à mão). Um link enviado pela IA não alcança um editor dentro de outro site, então o editor pede à IA e ao usuário que colem a resposta inteira da IA no editor - ou abram o editor em uma janela própria.

3. Em uma janela própria

window.open("https://shls.giit.ch/?embed=window", "shlseditor-17") abre o editor completo em uma janela própria e troca as mesmas mensagens com window.opener. Os links de uma IA chegam até ele ali. shlseditor:load também pode levar context: { host, title, rules } - o prompt da IA então diz a que lugar o documento pertence e segue as suas regras - e hook: { url, token }, um webhook só para este documento que nunca é guardado. Fechar a janela com alterações não salvas envia shlseditor:closing.

4. IA pelo seu próprio servidor

Entregue ao editor o seu próprio prompt, um endereço no seu site e uma chave para esta sessão do editor. A janela de IA mostra então "Conectado a" o seu site, o que você diz à IA, e a escolha alterar o documento atual ou criar um novo; Copiar prompt junta tudo. A IA envia o resultado com a chave para o seu servidor, e a sua página o abre no editor - um novo documento abre separado e fica no navegador do usuário. Uma chave por sessão do editor: ela vale enquanto o editor estiver aberto, e só enquanto não tiver nenhuma o editor a pede com shlseditor:key-request. O editor nunca envia a chave por conta própria e nunca a guarda; o endereço precisa ser https no seu próprio host ou em um subdomínio dele.

const key = async () => (await fetch('/api/ai-key.php?doc=17')).json();   // uma chave por sessão do 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);
// guarde o id de shlseditor:loaded e ignore change/save/closing com outro id
// só enquanto o editor não tiver chave:
if (m.type === 'shlseditor:key-request') { const k = await key(); ed.contentWindow.postMessage({ type: 'shlseditor:ai', key: k.key }, ORIGIN); }
// enquanto o editor estiver aberto, avise o seu servidor a cada minuto; fechar o editor ou a página invalida a chave
setInterval(() => fetch('/api/ai-key.php?alive=' + k.key.slice(0, 8)), 60000);
// o seu servidor tem um resultado (polling, SSE …): target é "current" ou "new"
ed.contentWindow.postMessage({ type: 'shlseditor:load', name: 'Products', content: draft, from: 'ai', target }, ORIGIN);

Crie chaves com pelo menos 128 bits aleatórios, guarde só o hash delas, vincule cada uma ao usuário logado, ao documento e a esta sessão do editor, crie uma por sessão, mantenha-a válida só enquanto a sua página informar que a sessão está aberta, e invalide-a quando o editor ou a página fechar.

O protocolo completo está em llms.txt - entregue-o a uma IA e ela monta a conexão para o seu sistema. O Editor JSON funciona do mesmo jeito com o prefixo jsoneditor: - json.giit.ch.

Perguntas frequentes

O que é SHLS?

O SHLS (Sebis Hierarchical List Structure) é um formato de texto para dados estruturados criado por Sebastian Grünwald. Cada seção nomeia as suas chaves uma vez em um bloco de chaves; os registros abaixo listam só os valores, um por linha, e a indentação mostra o aninhamento. Sem aspas, colchetes, dois-pontos ou chaves repetidas, os mesmos dados precisam de bem menos tokens que em JSON - o que faz dele um bom formato para modelos de IA.

Meus dados são enviados para algum lugar?

Não. O editor roda inteiramente no seu navegador. Seus documentos nunca são enviados a um servidor, a não ser que você mesmo configure um webhook para o seu próprio servidor.

O editor lê SHLS exatamente como o código de referência?

Sim. O editor lê e escreve SHLS exatamente como o SHLSDecoder e o SHLSEncoder do repositório SHLS - o JSON da aba Converter são os dados que as classes Python devolvem. Onde elas leem um documento diferente do que ele parece (um registro com um valor a menos, uma linha em branco com espaços), o editor aponta isso como um problema com a linha.

Posso editar os registros sem mexer no código?

Sim. Clique em um valor, uma chave ou um nome de seção no meio, digite e pressione Enter. Os botões acima dos registros adicionam, duplicam, movem e removem registros e chaves; quando você adiciona ou remove uma chave, cada registro da seção ganha ou perde o valor dela. Cada alteração é um passo para Desfazer.

Quantos tokens o SHLS economiza?

A aba Converter conta os tokens aproximados do seu documento em SHLS e dos mesmos dados em JSON. Em tabelas de registros, o SHLS muitas vezes precisa de menos da metade dos tokens do JSON indentado, porque as chaves são escritas só uma vez.

Ele converte JSON, YAML ou CSV para SHLS?

Sim. Abra um arquivo .json, .yaml, .csv ou .jsonl e ele vira SHLS, escrito como o SHLSEncoder escreve; o editor diz o que o SHLS não consegue guardar (valores vazios, valores com quebras de linha). A aba Converter e Exportar escrevem JSON, YAML, CSV, JSON Lines e texto simples.

Uma IA pode escrever no Editor SHLS?

Sim, qualquer IA - ChatGPT, Claude, Gemini, Copilot ou a IA da sua ferramenta de programação. Clique em "Assistente de IA", depois em "Copiar prompt": o prompt explica o SHLS, então qualquer IA escreve SHLS válido. A IA responde com um link; clique nele e o documento aparece no seu editor. "Desfazer" desfaz qualquer alteração.

O Editor SHLS custa alguma coisa?

Não. O editor é gratuito, sem anúncios e sem cadastro.