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) - текстовий формат для структурованих даних, створений Sebastian Grünwald. Кожен розділ називає свої ключі один раз у блоці ключів; записи нижче містять лише значення, по одному на рядок, а відступи показують вкладеність. Без лапок, дужок, двокрапок і повторюваних ключів ті самі дані потребують значно менше токенів, ніж 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?

Ні. Редактор безкоштовний, без реклами й без реєстрації.