how this works — firefly tic-tac-toe

developer guide for firefly tic-tac-toe — hello world of firefly avatars + express mcp prototypes
August 31, 2026 · 5 min · 976 words · Bryan Chasko

hello world — firefly avatars + express mcp

firefly tic-tac-toe is the 2d successor to sumerian squares — same 3×3 engine, new firefly-generated hosts, 2d canvas/dom (no babylon). this page is the hello world: nine firefly avatars idle, a playable preview, and the express add-on prototypes that generated them.

bryanchasko.com / firefly-tic-tac-toe — hello world

Nine Firefly hosts · 3×3 · Express MCP prototypes

Static hello world — real game is /firefly-tic-tac-toe/. Frames below are from docs/asl-concept-guide/assets/frame-01..06.png + static/firefly-tic-tac-toe/ (1440×400) — ever-improving reference, not yet a live 3×3 engine.

frame 01F1HELLO
frame 02WORLD
frame 03FIREFLY
frame 04STYLE ref
XX · gold
frame 05STRUCT ref
frame 06SEED 4219
OO · violet
+add-on

Sources: static/firefly-tic-tac-toe/frame-01..06.png (1440×400) — also docs/asl-concept-guide/assets/. Board below reuses assets/asl-prototype/{sumerian,firefly}/animation-mixer.ts (copy/fork, not inline) for ASL gloss → hands 74–115 brows 18–26 isolation.

play the preview on /firefly-tic-tac-toe/ — 3×3 div grid, X amber/gold glow, O violet glow, same win detection as sumerian squares (8 lines). hello world above is static; real engine is assets/firefly-tic-tac-toe/src/app.ts (esbuild) forked from assets/sumerian-squares/src/game.ts 9-tuple Player|null, GamePhase select|answering|deciding|stealing|result|gameover (see spec/firefly-tic-tac-toe/spec.md FT-ENGINE-01..03).

how this works — 2d, firefly, express mcp

1. 2d not 3d — same engine, different render

  • Sumerian squares: BabylonJS 9.3.4 UMD, single Engine per cell, 9 Draco .glb hosts (5–28M), 6 animation layers (stand_idle, lipsync 18 groups, gesture 14, emote 3, face_micro, blink 3 variants, poi.glb 27 groups), camera.ts measured-geometry framing, host-pool.ts LRU cap 6 phone / 9 desktop, AudioManager + Polly Brian enlil.
  • Firefly tic-tac-toe: 2d canvas/dom + esbuild, no babylon/three/audiocontext. grid is 3×3 divs aspect-ratio:1, glow via css box-shadow/linear-gradient, board state Array(9).fill(null), win check 8 lines — same engine.ts logic verbatim, forked to assets/firefly-tic-tac-toe/src/engine.ts. Hosts are 1024×1024 webp + optional mp4 loops, not .glb. See spec/firefly-tic-tac-toe/spec.md FT-BUILD-01..03.

2. firefly avatars — nine hosts, style + structure refs

capabilitywhere it liveswhat it does for 9 hosts
Text-to-Image Image Model 4/5POST https://firefly-api.adobe.io/v2/images/generatebase portraits — prompt + size + seed per cell
Structure ReferencestructureReference / styleReferencesame pose wireframe → 9 outputs, varying god/palette
Style ReferencestyleReference asset + strength 60–85lock clay/lapis/nebula palette across hosts
Generative Fill/ExpandPhotoshop API POST /v2/images/fillfix cropped wing/hand without regen
Text-to-VectorIllustrator APIclean X/O svg glyphs, recolor via fill
Firefly Custom ModelsumerianHost <id> class token72 PNGs per host → contact sheet → datasets/<host>.zip → custom model (see below)

Generation spec: spec/firefly-tic-tac-toe/spec.md FT-HOST-01..05 (1024×1024 hero, 4 poses idle/hover/selected/win, 2 loops idle/win ≤3s ≤1MB, manifest static/firefly-tic-tac-toe/hosts/manifest.json). Style tokens from cloud-del-norte-website/src/styles/tokens.css--cdn-navy #00002a → --cdn-purple-deep #30006a, --cdn-violet #9060f0, --cdn-lavender #d7c7ee, --cdn-gold #c9a23f, --cdn-orange #ff9900 (gradient 120deg #00002a→#30006a + dust rgba(215,199,238,.06)).

3. asl prototype — gloss → hands, forked not inline

the universal 6-frame storyboard (landing → board empty → host turn → question → X/O → win fanfare) drives both pipelines — sumerian (babylon .glb) and firefly (firefly 2d) plus a universal track where they diverge. see docs/firefly-tic-tac-toe/storyboard.md + docs/assets/firefly-vs-sumerian-storyboard.svg.

  • Glimmer gloss: http://127.0.0.1:8181/v1/chat/completions muse-glimmer-30b Q4_K_M NGL13 ctx4096, Valkey gpu_lock NX EX900 — prompts P1 English→gloss / P2 VTT→gloss / P3 warfare casting, outputs docs/asl/gloss.json G01–G72 (12/frame, 420ms) + docs/asl/cast.json + docs/asl/fixtures/vtt-sample.json + docs/asl/prompts/gloss.md.
  • Blender rig: fork latrodectus-bishopi.blendlatrodectus-bishopi-hand.blend 42 joints HOST_SCORECARD 74–115 (21/hand), asl-actions.blend 72 actions NLA additive, fixtures/asl/<gloss>.glb via scripts/export-asl-glb.py.
  • Contact sheet → Firefly dataset: scripts/blender-contact-sheet.sh blender -b … 8 views×9=72 PNGs → comfy-workflows/workflow-api.json captions HOST_ACCENT+hometown sumerianHost <id>renders/captioned/datasets/<host>.zip 1024px.
  • Mixer: assets/asl-prototype/sumerian/animation-mixer.ts + assets/asl-prototype/firefly/animation-mixer.ts (copy/fork, not inline — sumerian-squares stays pristine) — ASL_HANDS_RANGE [74,115] BROWS [18,26] LIPSYNC [44,58] MIXER_LERP 0.12 MIXER_FPS 60, priority ASL hands+brows > lipsync jaw > emote, 24 tests (12 per stack), vitest.config.ts includes assets/asl-prototype/**/*.test.ts.

sumerian squares owns assets/sumerian-squares/ and can touch it for shipped work — for ASL, only copy/fork, never inline. fix/asl-fork-stacks (#294 → 18bee2b) forked animation-mixer to assets/asl-prototype/{sumerian,firefly}/ and restored assets/sumerian-squares/src/camera.ts/game-controller.ts to 421dc58 pre-mixer.

4. express add-on prototypes — manifest v2 + iframe ↔ sandbox

ground truth @adobe/express-developer-mcp@1.0.0 via npx -y @adobe/express-developer-mcp@latest --yes stdio, manifestVersion: 2, express-document-sdk, Communication APIs runtime.exposeApi/getApi.

add-onmanifestiframesandbox
asl-concept (universal 6-frame mock, ever-improving reference)addons/asl-concept/manifest.json V2 panel asl-concept documentSandbox:code.jsindex.html addOnUISdk.ready + theme pills Sumerian/Firefly/Universal + host Babylon.js/Express + gloss/play toggles 420ms + exposeApi/getApi('sandbox')code.js editor.createRectangle/makeColorFill/makeImageFill 6 cards 180×220 pill 48×18 + renderASLConcept/varyCard/clearArtboard
asl-labaddons/asl-lab/manifest.json V2 panel asl-labindex.html 4 controls theme data-theme×3 host data-host×2 #gloss #play 420ms gold rgb(201,162,63) + Generate Firefly Twin fetch https://firefly-api.adobe.io/v2/images/generate seed:4219 styleReference+structureReferencecreateImageBitmapapi.generateFireflyTwincode.js editor.createRectangle(10x) makeColorFill(6x) makeImageFill(8x) + generateFireflyTwin({imageBitmap,seed=4219}) via createRectangle 1024×1024 + makeImageFill
firefly-tic-tac-toe (standalone, spec/firefly-tic-tac-toe/spec.md FT-ADDON-01..06)addons/firefly-tic-tac-toe/manifest.json V2 panel panel1 documentSandbox:code.js permissions:{sandbox:["allow-popups"]}index.html addOnUISdk.ready 4 controls theme/headline/subhead/tagline, Firefly fetch in iframe only (fetch → proxy via runtime.exposeApi/getApi)code.js import { editor } from "express-document-sdk" + editor.createRectangle + makeColorFill/makeImageFillinsertionParent.children.append(node) — hallucinated adobe.addOn.createShape absent, verified by MCP semantic search

Lab assets: docs/firefly-tic-tac-toe/features.md (image4/style/structure/custom model), docs/firefly-tic-tac-toe/sumerian-squares-teardown.md (9 hosts 134–137 joints), docs/assets/firefly-tic-tac-toe-hero.svg 1440×400 + firefly-vs-sumerian-storyboard.svg 2×6, spec/asl/spec.md ASL-ROUTE/CONTENT/RIG/DATA/MIX/ADDON/STYLE/BUILD/GLIM.

5. routes + builds

  • Hugo siblings, no s3-prefix-registry: content/firefly-tic-tac-toe/index.md (layout: firefly-tic-tac-toe, type: page) → public/firefly-tic-tac-toe/index.html at bryanchasko.com/firefly-tic-tac-toe/; content/firefly-tic-tac-toe-how-this-works/index.md…/firefly-tic-tac-toe/how-this-works/; content/firefly-tic-tac-toe/asl-demo.md…/asl-demo/; content/firefly-tic-tac-toe/asl-guide.md…/asl-guide/ — all under Hugo root s3://bryanchasko.com two-pass sync (--delete + --exclude "mom/*" "listen/*" "bench/*" "design/*" "chat/*" "news/*" "aws/*"), no new bucket.
  • Builds: hugo --minify 188 pages Static 806; npx vitest run 24 tests (2 suites assets/asl-prototype/{sumerian,firefly}/animation-mixer.test.ts 12 each) MIXER_LERP 0.12 MIXER_FPS 60; npx biome check 8 warnings (non-null ! + unused vi/beforeEach only).
  • Living guide: docs/asl-concept-guide/README.md 233 lines + assets/frame-01..06.png ever-improving — mirrored to …/asl-guide/ via content/firefly-tic-tac-toe/asl-guide.md. docs/firefly-tic-tac-toe/asl.md cites prior results 1–7 (must cite G01–G72 420ms, muse-glimmer-30b gpu_lock, 42 joints 74–115, 72 PNGs, mixer mask, seed 4219).