·
KINOSHITA STUDIO · BLACK MIRROR BOARD · SPELLBOOK

◼ COMMAND REFERENCE — v1.2

あなた専用のスペルブック。左の目次をクリックすると、各コマンドの詳細がこちら側で展開します。 $command の形式は "呪文(spell)" — プリセットとユーザー定義どちらも同じ表記です。

Quick Start — I want to…

BMBoard を久しぶりに開いて「あれ、何ができるんだっけ?」となった時のチートシート。
やりたい事 → 打つコマンドの逆引きです。詳細は各セクションへ。

— DRAW
  • 図形を出したい → キーボード C(円)/ Q(四角)/ G(三角)/ A(矢印)
  • フリーハンドで描くP(pen)
  • テキストT → クリックして入力
  • 画像を貼るI(ファイル選択) / 直接ドラッグ&ドロップ / スクショ → ⌘ + V でペースト
  • スクショの撮り方 → Mac ⌘ + Shift + Ctrl + 4(クリップボード)/ ⌘ + Shift + 4(ファイル → D&D) · Windows PrtScn(通常キー)/ Win + Shift + S
  • キーワードで画像を呼ぶfetch-img mountain 6
— EDIT
  • 選択S → クリック / 範囲ドラッグ
  • 削除 → 選択して Delete / Backspace
  • 取り消し⌘ + Z / やり直し ⌘ + Shift + Z
  • パンSpace + ドラッグ
  • ズーム → ホイール or ピンチ / リセット ダブルタップ
  • 画像を白黒に → 選択して monoclo
— TERMINAL
  • テーマ切替light / dark / gray
  • 履歴を消すclear
  • プリセット魔法を見るlist
  • 過去の入力を呼ぶ → ターミナルで /
  • ヘルプhelp
— SAVE / SHARE
  • キャンバスを保存save name
  • 保存一覧ls
  • 呼び戻しload name
  • PNG で書き出しX または export
  • SVG で書き出しsvg(Illustrator/Figma 編集可)
  • URL でシェアshare(gzip+URL に圧縮)
— SPELL(魔法)
  • 魔法を一発実行$spell-name または spell-name
  • 登録済の魔法を見るlist
  • 自分で魔法を作る↓ Write Your First Spell
  • 他人の魔法を取り込む → JSON を canvas に drag-drop
  • 魔法を共有share spell-name でクリップボードにコピー
— EASTER EGGS
  • 自撮りカメラで自分を映すBlack Mirror
  • カメラ OFFBlack Mirror off
  • ?youtube

Write Your First Spell

"魔法 (spell)" は 選択中の図形を変形させる JS スニペットregister で名前付き登録 → 以降は $その名前 で何度でも呼び出せる。 他人にも JSON 1 個で送れる。

01
まずプリセットを試す
円を描いて選択 → ターミナルに $biwako-blue と打つ → 線が琵琶湖ブルー (#0044CC) に。
これが「魔法」の最小例。1 行で全選択を一括変換します。
02
自作してみる(コピペで OK)
ターミナルに以下を 1 行で打つ:
register paint-red for(const o of BM.all()){BM.setStroke(o,'#FF0000')}BM.redraw();BM.log('painted red!')
登録完了。次から $paint-red で全図形が赤線になる。
03
仕組み
register spell-name JS コード の形式で登録。コードの中で BM.xxx() という API が使える。 よく使う API:
  • BM.all() — 全図形の配列
  • BM.getSelected() — 今選択中の図形
  • BM.setStroke(obj, color) — 線の色を変える
  • BM.translate(obj, dx, dy) — 位置をずらす
  • BM.create(type, props) — 新規作成 (`circle` / `square` / `triangle` / `arrow` / `text`)
  • BM.redraw() — 反映
  • BM.log(text) — ターミナルにメッセージ
全 API は ↓ BM API へ。
04
魔法を共有
share paint-red → JSON がクリップボードへ。SNS や Discord に貼り付ければ、相手はそれを drag-drop or paste するだけで使える。
「自分の作品 + 自作魔法」をワンセットで人に送れるのが BMBoard の核です。
05
AI に書いてもらう
ChatGPT や Claude に「BM API(BM.all() / BM.setStroke() / BM.translate())を使って、選択した全図形をランダム位置に散らす JS スニペットを 1 行で」と頼めば、すぐ出してくれる。
出力をそのまま register scatter-mine ... に貼って登録、で完成。
⚠ 注意: register は JS をそのまま実行できます。 知らない人から受け取った魔法を取り込む前に、JSON の中身を確認してください。怪しいコードは登録しない。

01Themes

一語でパレット全体を切り替える。キャンバス / ツールバー / ポップオーバー / ヘッダが連動。

lightpaper ground · default THEME

背景 #FAFAF8 / インク #0c0c0c。標準テーマ。

別名: light mode

darkvoid / CRT phosphor THEME

背景 #000000 / インク #F0EDE6。ダークモード。

別名: dark mode

注: オブジェクトのfillは元のlight-modeの色を保持しており、描画時に resolveFill() で反転される(破壊的変更なし)。

graypebble + cobalt · studio palette THEME

背景 #DCDBD5(暖かい石色)/ アクセント #1600A2(エレクトリックコバルト)。

別名: grey, gray mode, grey mode

02Canvas Control

ターミナルの出力を消す。キャンバス上のオブジェクトは消えない(それはヘッダの CLEAR ボタンや選択→Del で)。

clearwipe terminal output TERMINAL

ターミナルの出力ログをクリア。キャンバスは無変更。

flushalias of clear TERMINAL

clear と同じ。

03Camera / Black Mirror Wipe

自分のウェブカメラをセルフミラーでPIP表示。ドラッグで好きな場所に置ける。YouTubeライブ/スクリーン収録/描きながら自分を見たいときに。

Black Mirrorcamera ON · draggable PIP CAMERA

getUserMedia を呼び、右上にPIP (220×165 / モバイル 128×170) を配置。赤い REC ドットが点滅、◼ BLACK MIRROR ラベルは mix-blend-mode: difference

フレームを掴むとドラッグで移動可能。ホバーで × クローズが表示。

別名: Black Mirror on

Black Mirror offrelease camera tracks CAMERA

トラックを全解放してPIPを閉じる。タブを閉じなくてもカメラのインジケーターはすぐに消える。

別名: Black Mirror-off

04Project Persistence

すべて IndexedDB にローカル保存。サーバー無し、クラウド無し。

save <name>snapshot canvas + view IndexedDB

キャンバス全体とビュー (scale / tx / ty) を <name> で保存。

名前ルール: [a-zA-Z0-9][a-zA-Z0-9_\-. ]{0,40}

> save biwako-study
→ serializing...
→ 23 object(s)
[SUCCESS] Snapshot 'biwako-study' committed.
lslist all snapshots IndexedDB

保存済みのスナップショット一覧。新しい順。

load <name>restore a snapshot IndexedDB

指定のスナップショットに戻す。選択状態はリセットされ、ビューも復元される。

05Export

SVG / PNG / JSON バンドル。全てローカル、クラウド不要。

$svgeditable SVG for Figma / Illustrator EXPORT

選択オブジェクト(無ければ全体)をネイティブSVGに書き出し。すべてのプリミティブが対応:

  • circle<ellipse>
  • square<rect>
  • triangle<polygon>
  • arrow<line> + <polygon>
  • text<text dominant-baseline="hanging">
  • stroke<path M…Q…>
  • image<image>
  • 回転は <g transform="rotate(θ cx cy)"> でラップ
exportproject → .json EXPORT

現在のプロジェクトを .json で書き出し。ヘッダの SAVE ボタンと同等。

export-allproject + spells → .json bundle EXPORT

プロジェクト + 登録済みスペル全部を1つの .json に。自分のBMセットアップの完全バックアップ。

別名: exportall

export-spells [names...]spells only EXPORT

スペルだけ。名前を空白区切りで指定すると、それだけを含む。無指定なら全ユーザースペル。

別名: exportspells

Xtransparent PNG (keyboard) PNG

選択オブジェクト(無ければ全体)をbbox切り抜きの透過PNGで書き出し。3× DPR上限でメモリスパイク抑止。

06Spellbook

機能は買うものじゃなく、呪文として共有するもの。1行のJSで新機能を登録、JSONで他人と交換。

listevery registered spell META

登録済みコマンド全部を [preset] または [ user ] タグ付きで列挙。

register <name> <js>install a new spell META

新しいスペルを登録。名前の制約: [a-z0-9][a-z0-9_-]{0,30}

> register hi BM.log('hello, spellbook!')
→ compiling...
→ persisting...
[OK] $hi — try it now.
alias <new>=<old>clone an existing spell META

既存スペルに別名を付ける。短縮名を作りたい時に。

forget <name>remove a user spell META

ユーザースペルを削除。プリセットは削除できない。

別名: unregister

paste JSONinstall from a payload META

JSONペイロードをターミナルに貼るだけでスペル登録。形式:

{
  "command": "my-spell",
  "action": "BM.log('hello from JSON')"
}

スキーマチェックが通ると IndexedDB にバインドされ、以後 $my-spell で呼べる。

07Preset Spells

ビルトインのスペル。いずれも $name の形で呼び出し。貼り直せば上書き可能。

$scatterrandom-jitter the selection PRESET

選択オブジェクトを ±400px (x) / ±300px (y) の範囲でランダムに移動。

$grid-3x3place 9 squares PRESET

ビューの中心に 80×80 の四角を 3×3 で配置。ワイヤーフレームの下敷きに。

$biwako-blueretint all objects #0044CC PRESET

全オブジェクトのストローク(と存在すればfill)を #0044CC に。"Biwako Silence" パレット。

$svgexport SVG PRESET

Export セクション参照。

$monoclograyscale selected image(s) PRESET

選択画像をグレースケール化(grayscale(100%) contrast(110%) brightness(95%))。オフスクリーンcanvasでdataURLを書き換え、元画像はそのまま残さない(上書き)。

08Image Brainstorm

キーワードを投げると、イメージが散らばる。ブレスト用、思考のノンストップ。

$fetch-img [keyword] [n]mood-board scatter PRESET

使い方

  • $fetch-img — 1枚 (biwako)
  • $fetch-img ocean — 1枚 (キーワード ocean)
  • $fetch-img ocean 9 — 9枚(上限 25)

公開画像フィードから取得、ランダム回転と余白でキャンバスに散布。CORS安全な画像は永続化可能、ブロックされた画像はプレースホルダで代替。

09Share

機能もキャンバスも、テキスト一片。テキストは、どこにでも届く。

sharecanvas → URL (modal) SHARE

シェアモーダルを開く。

  • Copy URLCompressionStream でgzip → base64url → コピー。開いた側でそのまま復元。
  • Open in New Tab — 同じURLを新規タブでプレビュー。
  • Download .json — ファイル配布。
share <spell-name>copy spell JSON SHARE

指定スペルのJSONをクリップボードへ。Slack / X / gist / 友人のDM に貼り、彼らがペーストすれば自動登録。

10Help / Docs

helpquick reference card DOC

ターミナル内でクイックリファレンスを表示。登録済みスペル数と主要コマンドをまとめて確認できる。

別名: ?

usageopen full USAGE panel DOC

詳細なマニュアルパネルを開く。Escで閉じる。

別名: man, docs

11Easter Eggs / Diagnostics

youtubetrigger animation EGG

YouTube イースターエッグのアニメーションを発火。別名 yt, youtube.com

objectsprint raw objects array DIAG

内部の S.objects 配列をダンプ。スペル作成時のデバッグに。

test-parse <text>echo tokens DIAG

入力のパース結果を返す。スペル作成時の引数挙動確認に。

12Ideas to Extend

以下はまだ実装していない候補。いずれも register か JSON ペーストで追加できる。 Claude や ChatGPT に BM API と一文の意図を渡せば、動くJSONが返ってくる。

align <edge>align selection IDEA · LAYOUT

選択オブジェクトを共通の辺に揃える: left / right / top / bottom / center-x / center-y

distribute-h / distribute-vequal spacing IDEA · LAYOUT

3つ以上の選択オブジェクト間のギャップを均等化。水平 / 垂直を別コマンドに。

group / ungroupvirtual grouping IDEA · STRUCTURE

選択オブジェクトを仮想グループ化。Sgroups マップを追加し、ヒットテストがグループを優先する。

bring-front / send-backz-order swap IDEA · STRUCTURE

描画順を直接操作。raise / lower で1段ずつ、bring-front / send-back で両端に。

flip-h / flip-v / mirror <axis>flip selection IDEA · GEOMETRY

選択オブジェクトを水平/垂直反転。

palette <name>apply a palette IDEA · COLOR

名前付きパレットを一括適用(biwako / ink-brush / crt / ...)。$biwako-blue をベースに多色化。

sepia / noir / neon / duotoneimage filters IDEA · IMAGE

$monoclo の兄弟コマンド。duotone <hex1> <hex2> で2色マッピング。

grain <amount>sprinkle pixel noise IDEA · IMAGE

選択画像にピクセルグレインを散らす。amount で強度調整。

sticky <text>post-it note object IDEA · INPUT

黄色い付箋風テキストオブジェクト。リサイズ可・回転可。ブレスト専用。

checkbox <text>interactive tickbox IDEA · INPUT

クリックで✓が入る小さなトグル付きテキスト。TODO用。

callout <text>arrow + label combo IDEA · INPUT

矢印+ラベルをまとめた一発作成。画面キャプチャに注釈をつけるワークフロー向け。

timer <min>pomodoro countdown IDEA · PRODUCTIVITY

PIPスロットでカウントダウン。0で通知。集中作業支援。

countobject type stats IDEA · DIAG

キャンバス上のオブジェクトをtype別に集計。

search <keyword>highlight matches IDEA · DIAG

テキストオブジェクトの本文・タグから検索し、マッチしたものを点滅ハイライト。

speak <text>Web Speech TTS IDEA · AUDIO

Web Speech API でテキストを読み上げる。配信やプレゼンテーションに。

hearspeech → text IDEA · AUDIO

Web Speech Recognition で音声入力。認識結果をテキストオブジェクトとして配置。

ai <prompt>ask AI for a spell IDEA · AI

プロンプトをAIに渡し、返ってきたJSONをそのまま登録。fetch で OpenAI / Anthropic / Gemini 互換APIを叩く設計に。

replaystroke animation IDEA · FUN

ストローク生成順を記録しておき、アニメーションで再生。制作プロセスの記録に。

layer new / layer hidenamed layers IDEA · STRUCTURE

オブジェクトに layer タグを付与し、表示/非表示を切替。最小限の階層化。

13Keyboard Shortcuts

キーボードから直接触れるアクション一覧。

KeyAction
Sselect
Ppen (freehand)
Npath (bezier)
Eeraser
Ccircle
Gtriangle
Qsquare
Aarrow
Ttext
1 / 2 / 3stroke width 1 / 2 / 3
Space + dragpan view
Xexport selection (or all) → transparent PNG
Ctrl/⌘ + Zundo
Ctrl/⌘ + Y or Shift+Zredo
Del / Backspacedelete selected (ignored during text edit)
Shift (during drag)aspect-lock resize
Alt (during drag)resize from the opposite anchor
Esccancel gesture / exit text edit

14The BM API

スペル作者向けの最小API。スペルのJSは args(コマンド以降の文字列)と BM オブジェクトを使える。

BM.*spell runtime surface API
BM.all()                 // array of every object on the canvas
BM.getSelected()         // array of currently-selected objects
BM.redraw()              // mark dirty, re-render
BM.save()                // commit to IndexedDB
BM.log(msg, cls?)        // print to the terminal
                         //   cls: 't-ok' | 't-err' | 't-dim'
BM.create(type, data)    // new object; type =
                         //   'circle' | 'square' | 'triangle'
                         //   | 'arrow' | 'text' | 'image' | 'stroke'
BM.translate(obj, dx, dy)
BM.viewCenter()          // { x, y } in world coords
BM.rand(a, b)            // random float in [a, b)
BM.exportSvg(targets?)   // same as $svg (default: selection or all)

最小のスペル例:

{
  "command": "spread",
  "action": "const sel = BM.getSelected(); if (!sel.length) { BM.log('select first.', 't-err'); return; } for (const o of sel) BM.translate(o, BM.rand(-600, 600), 0); BM.log('spread ' + sel.length + ' object(s) horizontally.');"
}

ターミナルに貼るだけで $spread が恒久登録される。