Handgezeichneter Zeichen-Editor für .excalidraw-Dateien als signiertes Renderer-Plugin für
MindGraph Notes. Öffnet .excalidraw-Dateien im Vault in einem eigenen
Editor-Tab (Excalidraw 0.18.1), Speichern zurück in den Vault über die Plugin-Host-Vault-Bridge.
Renderer-Plugin (voller React-Canvas im Hauptfenster, signaturbasiertes Vertrauen). Setzt die
Renderer-Plugin-Host-Fähigkeit der App voraus (ab dem R1a-Host in mindgraph-notes).
Excalidraw lädt seine Handschrift-Fonts normalerweise vom esm.sh-CDN. Die App-CSP (default-src 'self')
blockt das. Statt die Fonts wegzuschalten (was Text gegen System-Fallback misst → falsche, driftende
gespeicherte Geometrie), bettet der Build alle 7 Nicht-CJK-Familien (Excalifont, Nunito, Comic Shanns,
Virgil, Cascadia, Lilita One, Liberation Sans) mit allen Subsets und originaler unicode-range als
data:-@font-face ein → measureText trifft die echten Excalidraw-Metriken → portable, Cross-OS-konsistente
Koordinaten. Der renderer.tsx-Preload ist fail-closed: lädt eine Pflichtfamilie nicht, bleibt der Editor
schreibgeschützt statt falsche Geometrie zu speichern. Xiaolai (CJK, 12,8 MB) bleibt bewusst draußen.
Ein gehärtetes Build-Gate (build.mjs) erzwingt exakte Patch-Counts, Version-Pin auf Excalidraw 0.18.1
und semantische Bundle-Asserts — bei Excalidraw-Update wird der Build rot statt still Fonts vom CDN zu laden.
npm install
# Dev-Key AUSSERHALB des Projekts erzeugen (nie committen):
node scripts/keygen-dev.mjs /pfad/ausserhalb/dev-key.json
npm run build # → dist/renderer.js + dist/styles.css + dist/manifest.json
node scripts/pack.mjs /pfad/ausserhalb/dev-key.json releases/excalidraw-$(node -p "require('./manifest.json').version").mgxpluginLokal installierbar nur in ungepackten App-Builds mit gesetztem MINDGRAPH_PLUGIN_DEV_KEYRING_PATH
(JSON { keyId: spkiPem }). Gepackte Apps ignorieren Dev-Keys.
Dieses Repo signiert nicht selbst — und bekommt den Prod-Schlüssel nie zu sehen. Offizielle Releases werden zentral im Repo mindgraph-notes über den Workflow „Sign Plugin Release" signiert:
- Hier nur bauen + taggen:
npm run builderzeugtdist/(=manifest.json+renderer.js+styles.css); Commit taggen alsvX.Y.Zund pushen. Keine Secrets, kein Signier-Workflow hier. - Ein Maintainer startet in mindgraph-notes den Workflow „Sign Plugin Release" (manuell, auf
master) mitrepo(owner/repo),tagund exaktemcommit_sha. - Ein untrusted Build-Job (ohne Schlüssel) baut dieses Repo am Commit; ein geschützter Signier-Job
im Environment
release-signingsigniert das gebautedist/mit dem Prod-Key (keyIdmindgraph-release-2026-01) und re-verifiziert das Archiv. - Das signierte
.mgxpluginwird als Workflow-Artefakt erzeugt und ans GitHub-Release gehängt.
- Dev-Key ≠ Produktionsschlüssel. Der private Prod-Key liegt ausschließlich im geschützten
GitHub-Environment — nie im Repo. Nur sein Public Key ist in der App gepinnt (
OFFICIAL_KEYS). - Privates Schlüsselmaterial wird nie committet (
.gitignoresperrt zusätzlich*key*/*.pem/*secret*). - Single-File-ESM:
renderer.jsist selbstenthalten (kein externer Import, keineval/new Function) — der App-Packer weist ein nicht-selbstenthaltenes Bundle zurück.