SHLS (Sebis Hierarchical List Structure) は、引用符、括弧、コロン、繰り返しのキーなしで構造化データを書きます。各セクションはキーを一度だけ挙げ、その下のレコードは値だけを並べます。SHLS エディターはコードと、その横に各セクションのキーブロックとレコードを表示します。その場で値、キー、レコードを変更し、問題を行ごとに確認し、JSON、YAML、CSV と相互変換し、JSON と比べて SHLS がどれだけトークンを節約するかを確認できます。
すべてブラウザー内で動作します。ドキュメントはアップロードされず、登録も広告もありません。
セクションは名前で始まります。その キーブロック にはキーがスペース 1 つのインデントで並び、入れ子のリストのキーはさらに 1 レベル深くなります。ちょうど 1 つの空行 の後に レコード が続きます: キーの順に 1 行 1 値です。入れ子のリストは専用の行 (そのキー、またはプレースホルダーの PH) を持ち、そのレコードは 1 レベル深くなります。値はすべてテキストです。数値や日付への変換は、読み込むプログラムに任されます。
Product
Name
Price
Smartphone A1
599.99
Laptop B2
1299.99
Company
Name
Location
Country
City
TechCorp
PH
USA
San Francisco
同じデータを JSON で書くと、すべてのレコードでキーを繰り返し、引用符、括弧、コロンが必要になります。SHLS は、トークンの 1 つ 1 つが重要なローカルやクラウドの AI モデルのために作られました。SHLS by Sebastian Grünwald - 形式、そのルール、リファレンスの SHLSDecoder と SHLSEncoder (Python) は GitHub の SHLS リポジトリにあります。
左側にハイライト付きの SHLS (セクション、キー、値、入れ子のレベル、PH プレースホルダー)。中央には各セクションのキーブロックとそのレコードが表示され、キーはラベルになります。クリックするとコードへ移動し、コードのカーソル位置のレコードが示されます。
値、キー、セクション名の変更、レコードとキーの追加、複製、移動、削除。レコードはキーブロックに従い、新しいキーにはすべてのレコードで "-" が入ります。それぞれ「元に戻す」1 回分です。
エディターは SHLSDecoder とまったく同じように SHLS を読み、見た目と異なって読まれる箇所を一覧表示します: 値が 1 つ多い / 少ないレコード、インデント、キーブロックの後の空行、2 回あるキー。
変換タブで、SHLS と同じデータの JSON のおおよそのトークン数を数えるので、節約量がひと目でわかります。
SHLSDecoder と SHLSEncoder とまったく同じ JSON との相互変換、YAML、CSV (1 セクションを表として)、JSON Lines。JSON、YAML、CSV、JSON Lines ファイルは SHLS として開きます。
ドキュメントをいくつでもブラウザー内に保管でき、それぞれに元に戻す履歴があり、すべてを ZIP でダウンロードできます。
https のページ (および localhost) なら、<iframe> と ?embed=1 でエディターを埋め込めます。登録もキーも不要です。埋め込まれたエディターはこの説明文を隠し、保存ボタンを表示します。ドキュメントを受け渡す方法は 2 つあります。
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>
Webhook は JSON { editor: "shls", event: "save", id, name, content, updated } を含む POST を受け取ります。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>
ページ内の AI アシスタント: フレーム内でも動作します。iframe に allow="clipboard-write" を付けると、「プロンプトをコピー」がクリップボードを直接使います (付けない場合は古いコピーコマンドを使うか、手動でコピーできるようプロンプトを表示します)。AI が送るリンクはほかの Web サイト内のエディターには届かないため、エディターは AI とユーザーに、代わりに AI の回答全体をエディターに貼り付けるよう案内します。または、エディターを専用のウィンドウで開いてください。
window.open("https://shls.giit.ch/?embed=window", "shlseditor-17") は完全なエディターを専用のウィンドウで開き、window.opener と同じメッセージをやり取りします。AI からのリンクもそこに届きます。shlseditor:load には context: { host, title, rules } (AI プロンプトがドキュメントの所属先を伝え、あなたのルールに従います) と hook: { url, token } (このドキュメント専用で保存されない Webhook) も含められます。未保存の変更があるままウィンドウを閉じると shlseditor:closing が送られます。
エディターに独自のプロンプト、サイト上のアドレス、このエディターセッション用のキーを渡します。すると AI ダイアログには、あなたのサイトへの「接続先」、AI に伝える内容、そして 現在のドキュメントを変更 か 新しいドキュメントを作成 の選択肢が表示され、プロンプトをコピー ですべてがまとめられます。AI はキーを付けて結果をあなたのサーバーに送り、ページがそれをエディターで開きます。新しいドキュメントは別に開き、ユーザーのブラウザー内に残ります。キーはエディターセッションごとに 1 つです。エディターを開いている間は有効で、キーがないときだけエディターが shlseditor:key-request で要求します。エディターがキーを自分で送ったり保存したりすることはありません。アドレスはあなた自身のホストまたはそのサブドメイン上の https である必要があります。
const key = async () => (await fetch('/api/ai-key.php?doc=17')).json(); // エディターセッションごとにキーを 1 つ
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);
// shlseditor:loaded の id を覚えておき、別の id の change/save/closing は無視する
// エディターにキーがないときだけ:
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);
// サーバーに結果がある (ポーリング、SSE …): target は "current" または "new"
ed.contentWindow.postMessage({ type: 'shlseditor:load', name: 'Products', content: draft, from: 'ai', target }, ORIGIN);
キーは 128 ビット以上のランダム値で作り、ハッシュだけを保存し、それぞれをログイン中のユーザー、ドキュメント、このエディターセッションに結び付けてください。キーはセッションごとに 1 つ作り、ページがセッションを開いていると報告している間だけ有効にし、エディターまたはページが閉じたら無効にしてください。
プロトコルの全体は llms.txt にあります。AI に渡せば、あなたのシステム用の接続を作ってくれます。JSON エディターも接頭辞 jsoneditor: で同じように動作します - json.giit.ch。
SHLS (Sebis Hierarchical List Structure) は、Sebastian Grünwald による構造化データ用のテキスト形式です。各セクションはキーブロックでキーを一度だけ挙げ、その下のレコードは値だけを 1 行に 1 つずつ並べ、インデントで入れ子を表します。引用符、括弧、コロン、繰り返しのキーがないため、同じデータでも JSON よりはるかに少ないトークンで済み、AI モデル向けの形式として適しています。
いいえ。エディターは完全にブラウザー内で動作します。自分で自分のサーバーへの Webhook を設定しない限り、ドキュメントがサーバーに送られることはありません。
はい。エディターは SHLS リポジトリ の SHLSDecoder と SHLSEncoder とまったく同じように SHLS を読み書きします。変換タブの JSON は Python クラスが返すデータそのものです。ドキュメントが見た目と異なって読まれる箇所 (値が 1 つ足りないレコード、スペースを含む空行) は、エディターが行付きの問題として一覧表示します。
はい。中央の値、キー、セクション名をクリックし、入力して Enter を押します。レコードの上のボタンでレコードとキーの追加、複製、移動、削除ができます。キーを追加または削除すると、セクションのすべてのレコードでその値が追加または削除されます。変更はそれぞれ「元に戻す」1 回分です。
変換 タブで、ドキュメントを SHLS にした場合と同じデータを JSON にした場合のおおよそのトークン数を数えます。レコードの表では、キーが一度しか書かれないため、SHLS はインデント付き JSON の半分以下のトークンで済むことがよくあります。
はい。.json、.yaml、.csv、.jsonl ファイルを開くと、SHLSEncoder と同じ書き方の SHLS になります。SHLS で保持できないもの (空の値、改行を含む値) はエディターが知らせます。変換タブとエクスポートでは、JSON、YAML、CSV、JSON Lines、プレーンテキストを書き出せます。
はい、どの AI でも使えます。ChatGPT、Claude、Gemini、Copilot、またはコーディングツールの AI です。「AI アシスタント」、続いて「プロンプトをコピー」をクリックします。プロンプトが SHLS を説明するので、どの AI も正しい SHLS を書きます。AI はリンクで回答します。クリックするとドキュメントがエディターに表示されます。「元に戻す」ですべての変更を戻せます。
いいえ。エディターは無料で、広告も登録もありません。