SHLS (Sebis Hierarchical List Structure) записує структуровані дані без лапок, дужок, двокрапок і повторюваних ключів: кожен розділ називає свої ключі один раз, а записи нижче містять лише значення. Редактор SHLS показує код, а поруч - блок ключів і записи кожного розділу. Змінюйте значення, ключі й записи просто там, бачте проблеми за рядками, перетворюйте з JSON, YAML і CSV та на них і дивіться, скільки токенів SHLS заощаджує порівняно з JSON.
Усе працює у вашому браузері. Документи нікуди не вивантажуються, немає ні реєстрації, ні реклами.
Розділ починається з назви. Його блок ключів перелічує ключі з відступом в один пробіл; ключі вкладеного списку - на рівень глибше. Після рівно одного порожнього рядка йдуть записи: одне значення на рядок у порядку ключів. Вкладений список має власний рядок (свій ключ або 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.
Будь-яка сторінка https (і localhost) може вбудувати редактор за допомогою <iframe> і ?embed=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}';
Редактор повідомляє 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 «Копіювати промпт» використовує буфер обміну напряму (інакше редактор вдається до старої команди копіювання або показує промпт, щоб скопіювати його вручну). Посилання, яке надсилає ШІ, не може дістатися до редактора всередині іншого сайту, тому редактор просить ШІ та користувача натомість вставити всю відповідь ШІ в редактор - або відкрити редактор в окремому вікні.
window.open("https://shls.giit.ch/?embed=window", "shlseditor-17") відкриває повний редактор в окремому вікні, і він обмінюється тими самими повідомленнями з window.opener. Посилання від ШІ доходять до нього туди. shlseditor:load може також містити context: { host, title, rules } - тоді промпт для ШІ каже, де розміщено документ, і дотримується ваших правил - і hook: { url, token }, вебхук лише для цього документа, який ніколи не зберігається. Якщо закрити вікно з незбереженими змінами, надсилається shlseditor:closing.
Передайте редактору власний промпт, адресу на вашому сайті та ключ для цього сеансу редактора. Тоді діалог ШІ показує «Під’єднано до» вашого сайту, що ви повідомляєте ШІ, і вибір змінити поточний документ або створити новий; Копіювати промпт збирає все разом. ШІ надсилає свій результат із ключем на ваш сервер, а ваша сторінка відкриває його в редакторі - новий документ відкривається окремо й залишається в браузері користувача. Один ключ на сеанс редактора: він дійсний, поки редактор відкрито, і лише поки ключа немає, редактор запитує його через 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 (Sebis Hierarchical List Structure) - текстовий формат для структурованих даних, створений Sebastian Grünwald. Кожен розділ називає свої ключі один раз у блоці ключів; записи нижче містять лише значення, по одному на рядок, а відступи показують вкладеність. Без лапок, дужок, двокрапок і повторюваних ключів ті самі дані потребують значно менше токенів, ніж JSON, - тому це добрий формат для моделей ШІ.
Ні. Редактор повністю працює у вашому браузері. Ваші документи ніколи не надсилаються на сервер, якщо тільки ви самі не налаштуєте вебхук на свій власний сервер.
Так. Редактор читає й записує SHLS точно так, як SHLSDecoder і SHLSEncoder із репозиторію SHLS, - JSON у вкладці «Конвертер» - це саме ті дані, які дають класи Python. Там, де вони читають документ інакше, ніж він виглядає (запис, якому бракує значення, порожній рядок із пробілами), редактор показує це як проблему з номером рядка.
Так. Клацніть значення, ключ або назву розділу посередині, введіть текст і натисніть Enter. Кнопки над записами додають, дублюють, переміщують і видаляють записи та ключі; коли ви додаєте чи видаляєте ключ, кожен запис розділу отримує або втрачає своє значення. Кожна зміна - один крок для «Скасувати».
Вкладка Конвертер рахує приблизну кількість токенів вашого документа як SHLS і тих самих даних у JSON. Для таблиць записів SHLS часто потребує менше половини токенів JSON із відступами, бо ключі записуються лише один раз.
Так. Відкрийте файл .json, .yaml, .csv або .jsonl, і він стане SHLS, записаним так, як це робить SHLSEncoder; редактор повідомить, чого SHLS не може зберегти (порожні значення, значення з розривами рядків). Вкладка «Конвертер» і «Експорт» записують JSON, YAML, CSV, JSON Lines і простий текст.
Так, будь-який ШІ - ChatGPT, Claude, Gemini, Copilot або ШІ у вашому інструменті для програмування. Натисніть «ШІ-асистент», потім «Копіювати промпт»: промпт пояснює SHLS, тож будь-який ШІ пише коректний SHLS. ШІ відповідає посиланням; клацніть його, і документ з’явиться у вашому редакторі. «Скасувати» повертає кожну зміну назад.
Ні. Редактор безкоштовний, без реклами й без реєстрації.