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) - текстовый формат для структурированных данных, созданный Себастианом Грюнвальдом. Каждый раздел называет свои ключи один раз в блоке ключей; записи под ним перечисляют только значения, по одному на строку, а отступ показывает вложенность. Без кавычек, скобок, двоеточий и повторяющихся ключей те же данные требуют гораздо меньше токенов, чем 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. ИИ отвечает ссылкой; щёлкните по ней, и документ появится в вашем редакторе. «Отменить» откатывает любое изменение.
Нет. Редактор бесплатный, без рекламы и без регистрации.