○ △ □ → — draw · wheel/pinch zoom · space+drag to pan · drag □ anchors to deform
blackmirror — bash
❯
GIF on canvas drop a.giffile → animates in place (copy-paste from web converts to PNG; use file D&D) align <direction> align 2+ selected objects:left/center/right/top/middle/bottomdistribute h | v evenly space 3+ selected objects (by center) tpl <name> instant scaffold at view center:wireframe·kanban·mindmap·moodboardtplalone opens a picker modal bg-pattern <name>dots/grid/cross/dotted-grid/stripesbg-opacity 0-100 adjust background pattern opacity bg none clear background pattern drawmode <name>classic(BMBoard signature pencil) /tldraw(smooth vector style) DUP button (header) 1-tap duplicate of selected object — mobile-friendly, no long-press required
↑ Select tap/click · drag to move · Del to delete
↳ drag ○ handle above box to rotate
↳ drag blue □ anchors to deform (single select)
↳ drag on empty canvas → marquee multi-select
✎ Pen draw freely — shape detected on lift
⌫ Eraser tap object to remove · with selection: 1-tap batch-delete
○ △ □ → drag to place shape → terminal fires
🪣 Fill tap bucket → pick none/black/grey/white
T Text tap canvas, type, Enter to confirm
Drag on empty canvas → blue dotted rect. Release → all fully-enclosed objects selected. drag move whole group ○ handle rotate whole group Del delete all selected (Eraser tap on mobile) Esc deselect all
Space + drag pan canvas (desktop) 2-finger drag pan canvas (mobile / trackpad) Pinch zoom in / out (touch) Wheel zoom in / out (mouse) Dbl-tap/click reset view to 100%
SAVE download .json — all objects + terminal log OPEN import .json — fully restore project Local only. No upload. No account required. ⚠ IMAGES & AUTOSAVE Autosave (localStorage) stores shapes, text, and positions — but NOT image pixel data. If your board contains images, always SAVE to .json before closing or reloading. Images are fully embedded in the .json and restore on OPEN.
save <name> commit canvas → blackmirror / projects
ls list every snapshot
load <name> restore a snapshot to the canvas
snapshots live in IndexedDB — survive reloads, no upload.
Select → blue □ anchors appear. Drag to deform: ○ 4 edge points (radii) △ 3 vertices (free edit) □ 4 corners + 4 edge midpoints → start + end endpoints ✎✐ every vertex editable (pen strokes auto-simplified)
○ outline ● black ◑ grey □ white Set before drawing, or apply to selected object.
S P N E C G Q A T switch tool (N = path/anchor) I upload image from disk X export selection → transparent PNG 1 2 3 line width Space hold to pan Shift (resize) lock aspect ratio Alt / Option (resize) scale from center Cmd+Z / Cmd+Shift+Z undo / redo Del / Backspace delete selected Esc cancel / deselect
○ git init / npm create ◎ docker run / kubectl apply △ git branch / if-else build □ docker build / terraform → curl | jq / grep | sort T stdin echo → terminal
dark / light / gray theme switch Black Mirror live selfie wipe · top-right · drag to reposition Black Mirror off dismiss the selfie wipe youtube a surprise awaits help / ? quick in-terminal reference usage / man / docs summon this manual overlay clear / flush wipe terminal output objects dump every object (debug)
$scatter scatter selected objects
$grid-3x3 place a 3×3 square grid
$sticky-3x3 place a 3×3 yellow sticky-note grid
$sakura 桜の花びらをループで降らせる (toggle)
$rain 雨をループで降らせる (toggle)
$leaf 茶色の落ち葉をループで降らせる (toggle)
$snow 雪をループで降らせる (toggle)
$powerpoint 16:9 slide frame + title/body プレースホルダ配置
$biwako-blue retint every stroke to #0044CC
$make-img <kw> <n> summon n images (Lorem Flickr, no key) · alias: $fetch-img
$monoclo grayscale the selected image(s)
$svg export selection as editable vector SVG
I key upload an image from disk (dataURL) make-img sea 6 6 photos · auto 3×2 grid · color by default monoclo select image(s) → grayscale · Cmd+Z reverts · max 25 per fetch · grid cols = ceil(√n) · CORS-safe images are dataURL-persisted into bundles ⚠ IMAGE PERSISTENCE Images are NOT saved by autosave (localStorage limit). They exist in memory for the current session only. → Use SAVE or export data to write a .json file. → The .json contains full image data and restores on OPEN. → Tip: save to iCloud Drive to share between Mac and iPhone.
register <name> <js> save a JS action as$namealias <new>=<old> duplicate under a new name share <name> copy command JSON → clipboard share (no args) generate a URL that re-opens your exact canvas list preset + user spells inventory forget <name> remove a user spell (presets protected) bgm 1 on start ambient bgm track 1 (lofi) bgm 2 on / bgm 3 on switch to track 2 / 3 bgm off stop bgm volume off / mute silence click + timer beep + chime paste{"command":"...","action":"..."}into the terminal → auto-register. Enter not required. drop a.jsonfile anywhere on the board · single / array / blackmirror.spells / blackmirror.bundle · same name → renamed<name>_2026-04-19· identical action → skipped · preset never overwritten spells live in IndexedDB (blackmirror / commands), mirrored tolocalStoragefor portability.
export selection → transparent PNG (or X key) $svg selection → editable SVG (Illustrator / Figma) export pptx / pptx selection → editable .pptx (PowerPoint / Keynote) export magic spell picker modal (checkbox-per-spell) export data bundle dialog (canvas / user / preset) export-all non-interactive · project + all spells export-spells [names] non-interactive · spells package
Ask Claude / ChatGPT for a spell by pasting:
Make a Black Mirror Board spell as JSON:
{"command":"NAME","action":"JS"}
BM API: getSelected(), all(), create(type, props),
translate, setStroke, setFill, remove, viewCenter,
rand(min,max), log(msg,cls), redraw(), save().
types: circle | square | triangle | arrow | text
NO 'rect'. NO async/await. Always end with redraw().
Paste the JSON back into the terminal — auto-registers.
Full guide → usage.html §5