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 онлайн - формат данных, который экономит токены

SHLS (Sebis Hierarchical List Structure) записывает структурированные данные без кавычек, скобок, двоеточий и повторяющихся ключей: каждый раздел называет свои ключи один раз, а записи под ним перечисляют только значения. Редактор SHLS показывает код и рядом - блок ключей и записи каждого раздела. Меняйте значения, ключи и записи прямо там, смотрите проблемы по строкам, преобразуйте из JSON, YAML и CSV и обратно и смотрите, сколько токенов SHLS экономит по сравнению с JSON.

Всё работает в вашем браузере. Документы не загружаются на сервер, нет ни регистрации, ни рекламы.

SHLS за одну минуту

Раздел начинается со своего имени. Его блок ключей перечисляет ключи с отступом в один пробел; ключи вложенного списка - на уровень глубже. После ровно одной пустой строки следуют записи: одно значение на строку, в порядке ключей. Вложенный список занимает отдельную строку (его ключ или PH как заполнитель), а его записи идут на уровень глубже. Все значения - текст; превращать их в числа или даты - задача программы, которая их читает.

Product
 Name
 Price

 Smartphone A1
 599.99

 Laptop B2
 1299.99

Company
 Name
 Location
  Country
  City

 TechCorp
 PH
  USA
  San Francisco

Те же данные в JSON повторяют каждый ключ в каждой записи и требуют кавычек, скобок и двоеточий. SHLS создан для локальных и облачных моделей ИИ, где важен каждый токен. SHLS by Sebastian Grünwald - формат, его правила и эталонные классы SHLSDecoder и SHLSEncoder (Python) находятся в репозитории SHLS на GitHub.

Что умеет редактор

Код и записи

Слева - SHLS с подсветкой: разделы, ключи, значения, уровни вложенности и заполнители PH. В центре - блок ключей каждого раздела и его записи, ключи служат подписями. Щелчок ведёт к коду, курсор в коде отмечает свою запись.

Правка на месте

Меняйте значения, ключи и имена разделов; добавляйте, дублируйте, перемещайте и удаляйте записи и ключи. Записи следуют за своим блоком ключей: новый ключ получает «-» в каждой записи. Каждое действие - один шаг отмены.

Чтение как у эталона

Редактор читает SHLS точно так же, как SHLSDecoder, и перечисляет то, что тот прочитал бы иначе, чем это выглядит: запись с лишним или недостающим значением, отступы, пустые строки после блока ключей, повторяющийся ключ.

Токены

Вкладка «Конвертер» подсчитывает примерное число токенов вашего SHLS и тех же данных в JSON, так что экономия видна сразу.

Преобразование

Из JSON и в JSON точно как SHLSDecoder и SHLSEncoder, YAML, CSV (один раздел в виде таблицы) и JSON Lines. Файлы JSON, YAML, CSV и JSON Lines открываются как SHLS.

Много документов

Храните в браузере сколько угодно документов, каждый со своей историей отмены, и скачивайте их все одним ZIP.

Как это работает

  1. Начните - выберите шаблон в меню «Новый», откройте файл .shls или откройте файл JSON, YAML или CSV, чтобы получить его как SHLS.
  2. Правьте - в коде или в записях; оба всегда показывают одни и те же данные.
  3. Проверьте и преобразуйте - исправьте перечисленные проблемы, сравните токены и скачайте SHLS, JSON, YAML, CSV или текст.

Редактор на вашем сайте

Любая страница на https (и localhost) может встроить редактор через <iframe> и ?embed=1 - без регистрации и без ключа. Во встроенном виде редактор скрывает этот текст и показывает кнопку «Сохранить». Есть два способа передать документ в редактор и получить его обратно.

1. Открыть файл по ссылке, сохранять на ваш сервер

src= открывает файл (ваш сервер должен разрешать CORS), webhook= заставляет «Сохранить» (Ctrl+S) отправлять документ на этот адрес. Добавьте &token=… для заголовка Authorization: Bearer … и &auto, чтобы сохранять после каждого изменения.

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

Вебхук получает POST с JSON { editor: "shls", event: "save", id, name, content, updated }; content - это документ в виде строки. Небольшой PHP-скрипт, который его сохраняет:

<?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. Документ хранит ваша страница (postMessage)

Редактор сообщает shlseditor:ready, ваша страница отвечает shlseditor:load, редактор сообщает shlseditor:loaded, shlseditor:change при настоящих правках и shlseditor:save, когда пользователь сохраняет. Ваша страница может отправить shlseditor:get (текущее состояние) или shlseditor:save (нажать «Сохранить»). Сохранение тогда идёт через ваш собственный вход и сеанс.

<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') {              // редактор готов: передаём ему документ
    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';   // настоящая правка
  if (m.type === 'shlseditor:save') {               // пользователь нажал «Сохранить»
    await fetch('/api/save', { method: 'POST', headers: { 'Content-Type': 'application/json' },
      body: JSON.stringify({ name: m.name, content: m.content }) });
    document.title = 'Saved';
  }
});

// Кнопка сохранения на вашей странице: ответ приходит как shlseditor:save
function saveNow() { ed.contentWindow.postMessage({ type: 'shlseditor:get' }, ORIGIN); }
</script>

ИИ-ассистент внутри вашей страницы: он работает и во фрейме. С allow="clipboard-write" на iframe кнопка «Копировать промпт» напрямую использует буфер обмена (иначе редактор переходит на старую команду копирования или показывает промпт для ручного копирования). Ссылка, которую присылает ИИ, не может попасть в редактор внутри другого сайта, поэтому редактор просит ИИ и пользователя вставить весь ответ ИИ в редактор - или открыть редактор в отдельном окне.

3. В отдельном окне

window.open("https://shls.giit.ch/?embed=window", "shlseditor-17") открывает полный редактор в отдельном окне и обменивается теми же сообщениями с window.opener. Ссылки от ИИ попадают туда. shlseditor:load может также содержать context: { host, title, rules } - тогда промпт для ИИ говорит, к чему относится документ, и следует вашим правилам, - и hook: { url, token }, вебхук только для этого документа, который никогда не сохраняется. При закрытии окна с несохранёнными изменениями отправляется shlseditor:closing.

4. ИИ через ваш собственный сервер

Передайте редактору свой промпт, адрес на вашем сайте и ключ для этого сеанса редактора. Тогда диалог ИИ показывает «Подключено к» вашему сайту, что вы сообщаете ИИ, и выбор изменить текущий документ или создать новый; Копировать промпт собирает всё вместе. ИИ отправляет свой результат с ключом на ваш сервер, а ваша страница открывает его в редакторе - новый документ открывается отдельно и остаётся в браузере пользователя. Один ключ на сеанс редактора: он действует, пока редактор открыт, и только пока ключа нет, редактор запрашивает его через shlseditor:key-request. Редактор никогда сам не отправляет ключ и никогда не сохраняет его; адрес должен быть https на вашем собственном хосте или его поддомене.

const key = async () => (await fetch('/api/ai-key.php?doc=17')).json();   // один ключ на сеанс редактора
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);
// запомните id из shlseditor:loaded и игнорируйте change/save/closing с другим id
// только пока у редактора нет ключа:
if (m.type === 'shlseditor:key-request') { const k = await key(); ed.contentWindow.postMessage({ type: 'shlseditor:ai', key: k.key }, ORIGIN); }
// пока редактор открыт, сообщайте серверу каждую минуту; закрытие редактора или страницы аннулирует ключ
setInterval(() => fetch('/api/ai-key.php?alive=' + k.key.slice(0, 8)), 60000);
// у вашего сервера есть результат (polling, SSE …): target - "current" или "new"
ed.contentWindow.postMessage({ type: 'shlseditor:load', name: 'Products', content: draft, from: 'ai', target }, ORIGIN);

Создавайте ключи минимум из 128 случайных бит, храните только их хеш, привязывайте каждый к вошедшему пользователю, документу и этому сеансу редактора, создавайте один ключ на сеанс, считайте его действительным, только пока ваша страница сообщает, что сеанс открыт, и аннулируйте его, когда редактор или страница закрываются.

Весь протокол описан в llms.txt - дайте его ИИ, и он построит подключение для вашей системы. Редактор JSON работает так же с префиксом jsoneditor: - json.giit.ch.

Частые вопросы

Что такое SHLS?

SHLS (Sebis Hierarchical List Structure) - текстовый формат для структурированных данных, созданный Себастианом Грюнвальдом. Каждый раздел называет свои ключи один раз в блоке ключей; записи под ним перечисляют только значения, по одному на строку, а отступ показывает вложенность. Без кавычек, скобок, двоеточий и повторяющихся ключей те же данные требуют гораздо меньше токенов, чем JSON, - поэтому это хороший формат для моделей ИИ.

Загружаются ли мои данные на сервер?

Нет. Редактор полностью работает в вашем браузере. Ваши документы никогда не отправляются на сервер, если только вы сами не настроите вебхук на свой собственный сервер.

Читает ли редактор SHLS точно так же, как эталонный код?

Да. Редактор читает и записывает SHLS точно так же, как SHLSDecoder и SHLSEncoder из репозитория SHLS, - JSON на вкладке «Конвертер» - это те данные, которые выдают классы Python. Там, где они читают документ иначе, чем он выглядит (запись без одного значения, пустая строка с пробелами), редактор показывает это как проблему с номером строки.

Можно ли править записи, не трогая код?

Да. Щёлкните в центре по значению, ключу или имени раздела, введите текст и нажмите Enter. Кнопки над записями добавляют, дублируют, перемещают и удаляют записи и ключи; когда вы добавляете или удаляете ключ, каждая запись раздела получает или теряет своё значение. Каждое изменение - один шаг отмены.

Сколько токенов экономит SHLS?

Вкладка Конвертер подсчитывает примерное число токенов вашего документа в виде SHLS и тех же данных в виде JSON. Для таблиц записей SHLS часто требует меньше половины токенов JSON с отступами, потому что ключи записываются только один раз.

Можно ли преобразовать JSON, YAML или CSV в SHLS?

Да. Откройте файл .json, .yaml, .csv или .jsonl, и он станет SHLS, записанным так, как пишет SHLSEncoder; редактор сообщает, что SHLS не может сохранить (пустые значения, значения с переносами строк). Вкладка «Конвертер» и «Экспорт» записывают JSON, YAML, CSV, JSON Lines и простой текст.

Может ли ИИ писать в редакторе SHLS?

Да, любой ИИ - ChatGPT, Claude, Gemini, Copilot или ИИ в вашем инструменте разработки. Нажмите «ИИ-ассистент», затем «Копировать промпт»: промпт объясняет SHLS, поэтому любой ИИ пишет корректный SHLS. ИИ отвечает ссылкой; щёлкните по ней, и документ появится в вашем редакторе. «Отменить» откатывает любое изменение.

Платный ли редактор SHLS?

Нет. Редактор бесплатный, без рекламы и без регистрации.