> **⚠️ Status update 2026-04-21:** Google removed Gemini / Imagen image-gen from the universal free API tier in December 2025. Claims in this document about "~1,500 free images/day" or "Nano Banana free tier" now refer only to the AI Studio **web UI** (https://aistudio.google.com), which is still free for interactive generation. For **programmatic** free image-gen, prefer Cloudflare Workers AI (Flux-1-Schnell, 10k neurons/day), HF Inference (free HF_TOKEN), or Pollinations. Paid Gemini: $0.039/img Nano Banana; $0.02/img Imagen 4 Fast.
# Research → implementation map
Every research category in [`docs/research/`](./research/) is listed below
with a pointer to the file(s) / function(s) where the finding is actually
applied. If a line reads **not yet wired** the research is still at the
"sticky note on the wall" stage; opening an issue to wire it is welcome.
The research corpus runs 20 categories × 104 angle files. Rather than cite
every angle individually, this map cites the load-bearing ones. Each tool
source file also carries `// Source: docs/research/…` comments at decision
points so the linkage survives refactors.
## Orientation before you read
- **Wired** means the file/function cited contains production code that
reads the research finding at runtime (routing table, rewriter dialect,
safe-zone number, dimension constant).
- **Reference-only** means the research shaped a decision during design
but isn't consulted at runtime. Two whole categories are in this state
and that's intentional:
- `docs/research/21-oss-deep-dive/` (20 files — OSS imagegen survey)
- `docs/research/22-repo-deep-dives/` (20 files — specific codebase reads)
- **Deferred** research lives at [`docs/research/future/`](./research/future/).
Twelve asset-research files moved there during the 2026-04-20 triage because
they described tooling (pHash, visual diff, moderation, motion, mockups,
stock APIs, audio, etc.) that isn't on the v1 critical path. Each one is
listed in [future/README.md](./research/future/README.md) with a status
note.
---
## 01 — Prompt Engineering Theory
| Angle | Implementation |
| -------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| 1a CFG / negative-prompt | `data/model-registry.json` encodes `negative_prompt_support` per model (`ignored`, `native`, `error`, `supported`, `--no flag`). `src/rewriter.ts` emits `negative_prompt` only for SD family; **drops it on Flux** (documented in the registry as `"error"`). |
| 1c LLM prompt expansion | `src/rewriter.ts` does LLM-style prompt expansion deterministically (no LLM call). Pads Imagen/Gemini prompts to ≥30 words so their invisible rewriter does not fire. |
| 1d Prompt-weighting syntax | Partially wired. Tag-salad mode emits flat tags with `BREAK` separator (subject before BREAK, background after — prevents color leakage on SDXL); token-weighting (`(word:1.2)`) deferred until a caller requests it. |
## 02 — Image Generation Models
| Angle | Implementation |
| ----------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------ |
| 2b gpt-image-1 autoregressive | `data/model-registry.json` `gpt-image-1` entry (`native_rgba: true`, `text_ceiling_chars: 50`). Router primary for transparent-mark rule. |
| 2c Flow-matching / Flux | `flux-pro` / `flux-2` registry entries, `negative_prompt_support: "error"` encoded, used by router `hero-photoreal` and `illustration-no-brand`. |
| 2e Imagen technical reports | `imagen-3`, `imagen-4` registered with `native_rgba: false` + 30-word rewriter note in rewriter. |
## 03 — Evaluation Metrics
| Angle | Implementation |
| ---------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| 3a CLIP / VQAScore | `src/pipeline/validate.ts` tier-0 (deterministic). VQAScore (tier-1) not yet wired; tier-2 VLM-as-judge is a POST-to-URL shim at `src/pipeline/validate.ts::tier2Vlm` — set `PROMPT_TO_BUNDLE_VLM_URL` to enable. |
| 3e Asset-specific eval | tier-0 implemented: dimensions exact, alpha probe, tile-luma checkerboard heuristic with alternation check, OCR Levenshtein (tesseract.js; bundled `eng.traineddata` used when present), palette ΔE2000 against brand bundle, WCAG contrast vs #FFF and #0F172A, safe-zone bbox. Source: `src/pipeline/validate.ts`. |
## 04 — Gemini / Imagen Prompting
| Angle | Implementation |
| -------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| 4b Nano Banana | `data/paste-targets.json` entry for `gemini-3-flash-image` references Nano Banana by nickname and routes to Google AI Studio. Used by external_prompt_only mode. |
| 4c **Transparent-background checkerboard problem** | **Load-bearing.** `data/routing-table.json` `transparent-mark` rule has `never: [imagen-3, imagen-4, gemini-3-flash-image, …]`. `src/rewriter.ts::buildBackgroundClause` warns if transparency requested against a non-RGBA model and requests solid white + post-matte. Multiple skill `SKILL.md` files document it. |
## 05 — OpenAI DALL·E / gpt-image
| Angle | Implementation |
| --------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| 5b gpt-image-1 API + transparency | `src/providers/openai.ts` calls `/v1/images/generations` with `background: "transparent"` when `transparency: true`. Primary for `transparent-mark` and `sticker` routing rules. |
| 5c Logo / icon generation | Router `logo-with-text-1-3-words` rule places `gpt-image-1` as second-choice after Ideogram (because Ideogram has better wordmark rendering). |
## 06 — Stable Diffusion / Flux
| Angle | Implementation |
| -------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| 6b Flux family prompting | `src/rewriter.ts` dialect `"prose"` branch, with the explicit guard that drops `negative_prompt` and converts do-not clauses to positive anchors. Warning emitted when the caller attempts to set negatives for Flux. |
| 6d LoRA training for brand style | `BrandBundle.lora` field flows through to `illustration-branded` routing rule (`params.lora: "brand.lora"`). Actually dispatching LoRA to Flux.2 / SDXL requires a provider with LoRA support wired — Flux.2 provider accepts `lora` in params; SDXL provider not yet wired. |
## 07 — Midjourney / Ideogram / Recraft
| Angle | Implementation |
| ------------------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| 7a Midjourney v6/v7 | `src/rewriter.ts` dialect `"prose+flags"` branch emits `--ar`, `--v 7`, `--style raw`, optional `--sref`. `data/paste-targets.json` routes MJ to web + Discord (no API). |
| 7b Ideogram wordmark rendering | Router `logo-with-text-1-3-words` primary = `ideogram-3-turbo` with `magic_prompt: OFF`. `data/model-registry.json` records `text_ceiling_chars: 60`. Transparency via dedicated `/ideogram-v3/generate-transparent` endpoint with `rendering_speed` param (not `style: "transparent"`). `src/rewriter.ts` `"prose+quoted"` dialect keeps the wordmark in quotes. |
| 7c Recraft V3/V4 native SVG | `data/model-registry.json` `recraft-v3` and `recraft-v4` both have `native_svg: true`. Router `logo-text-free-vector` primary = `recraft-v4` (higher quality); V3 fallback for brand-style pipelines requiring `style_id` (V4 dropped style support). `src/providers/recraft.ts` requests `output_format: "svg"`. |
## 08 — Logo Generation
| Angle | Implementation |
| ------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| 8c Text rendering in logos | Rewriter `buildTextClause` drops wordmarks > 3 words with a warning. Router `logo-with-text-many-words` primary = `composite` strategy (mark + SVG typography). |
| 8d Palette control | `BrandBundle.palette` → rewriter prose injects `"Palette strictly limited to these colors: …"`. Recraft provider uses `controls.colors`. |
| 8e **SVG vector logo pipeline** | **Load-bearing.** Four paths: (a) Recraft native SVG (router primary for `logo-text-free-vector`), (b) LLM-author SVG (**this is the `inline_svg` mode** — `src/modes.ts`, `src/svg-briefs.ts`), (c) raster → matte → `vtracer` on PATH → SVGO, (d) raster → matte → `potrace` on PATH → SVGO. If neither binary is installed, `src/pipeline/vectorize.ts` emits a posterize run-length fallback and warns. SVGO cleanup runs via `src/pipeline/svgo.ts` when the optional dep is installed. |
## 09 — App Icon Generation
| Angle | Implementation |
| ---------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| 9a iOS HIG specs | `src/tools/enhance-prompt.ts::safeZoneForAssetType` returns `{ width: 824, height: 824 }` (iOS 80% of 1024). `src/svg-briefs.ts::appIconBrief` enforces the 824² safe zone. |
| 9b Android adaptive / themed | `src/pipeline/export.ts::exportAppIconBundle` emits foreground + background + monochrome layers. |
| 9c PWA maskable | Same exporter emits 192 / 512 / 512-maskable with 80% safe zone. |
## 10 — UI Illustrations
| Angle | Implementation |
| ------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| 10 (category) | `src/rewriter.ts::composeContext` illustration branch. Router `illustration-branded` / `illustration-no-brand` rules. `src/svg-briefs.ts::iconPackBrief` for the icon-pack sub-case. |
## 11 — Favicon / Web Assets
| Angle | Implementation |
| ------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| 11 (category) | `src/svg-briefs.ts::faviconBrief` enforces 16×16 legibility, ≤8 paths, 2-color palette. `src/pipeline/export.ts::exportFaviconBundle` emits `.ico`, `icon.svg`, `apple-touch-icon.png`, PWA 192/512/512-maskable + `` snippet. |
## 12 — Vector / SVG Generation
| Angle | Implementation |
| ------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| 12 (category) | `src/pipeline/vectorize.ts` (raster → SVG). `src/svg-briefs.ts` (inline_svg authoring). `data/routing-table.json` favicon + icon_pack rules reference `llm_author_svg` strategy. |
## 13 — Transparent Backgrounds
| Angle | Implementation |
| ------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| 13 (category) | `src/pipeline/matte.ts` — BiRefNet / RMBG / difference / local chroma key. Used by every generator when `transparency_required && !native_rgba`. Also `src/tools/ingest-external.ts` runs matte on pasted-back images. |
## 14 — Negative Prompting / Artifacts
| Angle | Implementation |
| ------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| 14 (category) | `src/rewriter.ts::positiveAnchorsFromDoNot` rewrites "no drop shadows" → "flat matte surfaces with no cast shadows" so the guidance survives models that ignore negative_prompt (Imagen / gpt-image-1 silently ignore) or error on it (Flux). |
## 15 — Style Consistency / Brand
| Angle | Implementation |
| ------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| 15 (category) | `BrandBundle` type (`src/types.ts`). Rewriter injects palette, do-not, sref_code. Router `illustration-branded` uses bundle fields. `src/brand.ts::hashBundle` content-addresses a bundle for cache keys. |
## 16 — Background Removal / Vectorization
| Angle | Implementation |
| ------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------- |
| 16 (category) | `src/pipeline/matte.ts` + `src/pipeline/vectorize.ts` + `src/tools/remove-background.ts` + `src/tools/vectorize.ts` + `src/tools/ingest-external.ts`. |
## 17 — Upscaling / Refinement
| Angle | Implementation |
| ------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| 17 (category) | `src/pipeline/upscale.ts` + `src/tools/upscale-refine.ts`. Asset-type-aware routing (DAT2 for flat, Real-ESRGAN/SUPIR for photoreal, img2img for diffusion polish). |
## 18 — Asset Pipeline Tools
| Angle | Implementation |
| ------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| 18 (category) | `src/pipeline/export.ts` fan-out for AppIconSet / Android adaptive / PWA maskable / visionOS master / favicon bundle — all hand-rolled `sharp` with optional `png-to-ico` for the multi-res `.ico`. `src/pipeline/og-render.ts` prefers Satori + @resvg/resvg-js when a font is available (`PROMPT_TO_BUNDLE_OG_FONT` or the optional `@fontsource/inter` dep), else falls back to a hand-authored SVG + `sharp` rasterization path. BullMQ/R2 pipeline in 18e is reference architecture for a future hosted mode; the current MCP server is synchronous and stateless. |
## 19 — Agentic / MCP / Skills Architectures
| Angle | Implementation |
| ------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| 19 (category) | The whole tool surface: **16 small tools** (not one god-tool), stdio transport, readOnlyHint / idempotentHint annotations for auto-approve, data-driven routing. **The three-mode surface (inline_svg / external_prompt_only / api) is also the direct application of this category's finding that "an MCP server whose output has one delivery channel is brittle."** Source: `src/modes.ts`, `src/tools/capabilities.ts`, `src/tools/ingest-external.ts`. |
## 20 — Open Source Repos Landscape
| Angle | Implementation |
| ------------- | ----------------------------------------------------------------------------------------------------------------- |
| 20 (category) | `data/paste-targets.json` is the output — every "where do users actually go to generate" is an item in that JSON. |
## 21 & 22 — Deep Dives
Standalone reference reading. Not directly wired; informs routing decisions.
## 23 — Combinations
Cross-category findings (e.g. "text rendering + transparency + vector
output is only viable via Ideogram-then-composite"). Encoded in the
`logo-with-text-many-words` routing rule and the rewriter's text-clause logic.
---
## 24 — Agentic Orchestration Patterns
| Angle | Implementation |
| ------------------------------ | --------------------------------------------------------------------------------------- |
| 24a multi-agent handoff | Use agents-as-tools (not handoffs) for validate-regenerate loop. Not yet wired. |
| 24b plan-execute-react | ReAct for single-asset; Plan-and-Execute for brand kits. Not yet wired. |
| 24c parallel fan-out best-of-N | `Promise.allSettled` across providers, fan-in by validation score. Not yet wired. |
| 24d retry-fallback chains | Layered: backoff → circuit-breaker per provider → fallback chain. Not yet wired. |
| 24e state machine pipelines | LangGraph checkpointing for resume-without-regeneration. Not yet wired. |
| 24f-g GitHub repo survey | Reference reading. `lastmile-ai/mcp-agent` is the only MCP-native evaluator loop found. |
## 25 — Structured Generation & Constrained Decoding
| Angle | Implementation |
| -------------------------------------- | ----------------------------------------------------------------------------------------------------------- |
| 25a constrained decoding | Outlines/LMFE/Guidance require logit access — cannot constrain Claude API. Not wired. |
| 25b Instructor / TypeScript validation | Instructor-JS for complex validation; Claude native SO for high-volume. Not yet wired. |
| 25c SVG grammar enforcement | Post-hoc pipeline: xmldom parse → path-count → viewBox → palette → SVGO. Partial in `src/pipeline/svgo.ts`. |
| 25d AssetSpec schema design | TypeBox + `additionalProperties: false` + `spec_version` literal. Not yet wired. |
| 25e runtime validation | TypeBox `TypeCompiler.Compile()` at startup (~10× faster than Zod). Not yet wired. |
| 25f-g MCP tool design | STRAP consolidation (7 `asset_generate_*` → 1 with `asset_type` enum). Not yet wired. |
## 26 — Reflection & Self-Refinement
| Angle | Implementation |
| ----------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------- |
| 26a Reflexion / Self-Refine | Two-critic design: deterministic tier-0 then VLM rubric. Hard cap 4 iterations. Not yet wired. |
| 26b VLM-as-judge rubric | Prometheus-Vision 1–5 Likert format; two-critic beats unified. Not yet wired. |
| 26c asset critique templates | Ready-to-use 4–5 criteria rubrics per asset type. See `docs/research/26-reflection-self-refinement/26c-asset-specific-critique-templates.md`. |
| 26d convergence criteria | Return best-seen not latest. Stop if score plateau < 0.15 over 2 rounds. Not yet wired. |
| 26e critique-to-prompt repair | Alpha failures → re-route (not re-prompt). Palette drift → inject hex. Not yet wired. |
## 27 — Agent Evaluation Frameworks
| Angle | Implementation |
| ------------------------ | --------------------------------------------------------------------------------- |
| 27a benchmarking | DeepEval `TextToImageMetric` (GPT-4V, 0–1 score). Not yet wired. |
| 27b image eval pipelines | VQAScore outperforms CLIP by 2–3× on compositional prompts. Not yet wired. |
| 27c golden dataset | ~44 prompts across all asset types; invariants as JSON not pixels. Not yet built. |
| 27d automated metrics CI | Tier-0/1 on every PR, Tier-2 nightly. Not yet wired. |
| 27e provider regression | Never use "latest" model alias — pin explicit version strings. Not yet enforced. |
## 28 — CI/CD Asset Automation
| Angle | Implementation |
| --------------------------------- | -------------------------------------------------------------------------------------------- |
| 28a GitHub Actions image pipeline | artifact-upload@v4 (v3 retired Jan 2025), dorny/paths-filter for scoped jobs. Not yet wired. |
| 28b PR preview generation | Two-workflow fork-safe pattern (pull_request + workflow_run). Not yet wired. |
| 28c MCP server testing | In-memory SDK transport (no subprocess); vitest-image-snapshot. Not yet wired. |
| 28d release automation | Changesets + npm OIDC; `server.json` for MCP Registry missing and must be created. |
| 28e secrets management | GitHub OIDC does not solve third-party AI provider key management. |
## 29 — RAG for Brand Knowledge
| Angle | Implementation |
| ------------------------------ | ------------------------------------------------------------------------------------------------ |
| 29a brand guideline extraction | Dembrandt (Playwright + CSS analysis), Brandfetch REST, LlamaIndex PDF. Not yet wired. |
| 29b CLIP style embeddings | CSD (arXiv:2404.01292) for pure style similarity; LanceDB for embedding storage. Not yet wired. |
| 29c brand bundle storage | Git for JSON; LanceDB for embeddings; S3+SHA256 for binary blobs. Not yet wired. |
| 29d Figma tokens pipeline | Figma Variables API requires Enterprise plan; Style Dictionary v4 for transforms. Not yet wired. |
| 29e cross-session consistency | SQLite + Recraft `style_id`; CSD cosine drift detection. Not yet wired. |
## 30 — Agent Memory & State
| Angle | Implementation |
| ---------------------------- | ------------------------------------------------------------------------------------------------------------ |
| 30a memory architectures | Borrow patterns from Letta/MemGPT, not the full framework. SQLite WAL is practical middle ground. |
| 30b session vs long-term | In-process dict for session; SQLite for cross-session. Not yet wired. |
| 30c MCP resources | URI `asset-memory://projects/{name}/brand-bundle`; resources are read-only passive injection. Not yet wired. |
| 30d user preference learning | PAHF framework; Anthropic TTL now 5min (dropped from 1h in March 2026). Not yet wired. |
| 30e asset set coherence | Recraft `style_id` as strongest coherence primitive; dual-layer dedup (hash + semantic). Not yet wired. |
## 31 — Cost Optimization
| Angle | Implementation |
| -------------------------- | ------------------------------------------------------------------------------------------------------ |
| 31a provider-level caching | `asset_enhance_prompt` system prompt is immediate target for Anthropic `cache_control`. Not yet wired. |
| 31b model routing | RouteLLM matrix-factorization; Haiku 4.5 for simple brief-length heuristic routing. Not yet wired. |
| 31c batch APIs | OpenAI Batch API covers `/v1/images/generations` — gpt-image-1 at ~$0.02 (50% off). Not yet wired. |
| 31d thumbnail-first | Generate 256×256, validate, upscale only on pass. 62% cost reduction. Not yet wired. |
| 31e semantic dedup | GPTCache; cosine threshold ≥ 0.85; pHash Hamming ≤ 8 as fast pre-filter. Not yet wired. |
## 32 — Streaming & Real-Time UX
| Angle | Implementation |
| -------------------------------- | -------------------------------------------------------------------------------------------------------------- |
| 32a MCP Streamable HTTP progress | `notifications/progress` with `message` strings; stdio silently discards (Cursor activates it). Not yet wired. |
| 32b SSE long-running tools | `/events/:jobId` sidecar SSE endpoint works regardless of host transport. Not yet wired. |
| 32c incremental SVG rendering | Claude `eager_input_streaming: true`; split at complete `` boundaries. Not yet wired. |
| 32d BullMQ + SSE | `job.updateProgress()` → `QueueEvents` → EventEmitter → SSE. Only needed for multi-user HTTP deployment. |
| 32e optimistic previews | Cloud providers (gpt-image-1, Ideogram, Recraft) return full image only; fal.ai gives queue position only. |
## 33 — Model Routing & Ensembling
| Angle | Implementation |
| ------------------------------- | ----------------------------------------------------------------------------------------------------------------------- |
| 33a routing frameworks | Structured feature vectors beat text embeddings for asset routing (categorical: asset_type, transparency, text_length). |
| 33b confidence-based escalation | 4-tier cascade (SVG → flux-schnell → flux-pro → gpt-image-1) as `cascade[]` field in routing-table.json. Not yet wired. |
| 33c best-of-N | `Promise.any` not `Promise.race`; break-even when failure rate > ~30%. Not yet wired. |
| 33d ELO / A/B testing | Artificial Analysis Arena ELO as priors; Bradley-Terry MLE for local scores. Not yet wired. |
| 33e async race with validation | fal.ai cancellation free while IN_QUEUE, partial cost once IN_PROGRESS. |
## 34 — Installable Skills Survey
| Angle | Implementation |
| ---------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| nano-banana-skills | `gemini-3-pro-image-preview` shut down March 9 2026 — strip from asset_capabilities(). Live model: `gemini-3.1-flash-image-preview`. |
| fal-ai-skills | Official bash scripts, no npm/pip, just `FAL_KEY`. Image restoration pre-pass (deblur before matting) is top gap. |
| multi-provider-mcp-servers | Recraft MCP has 16 tools (inpainting, bg-replace, style training) not in prompt-to-asset. comfyui-mcp has 31 tools. |
| web-asset-skills | No SVG icon set skill exists anywhere. jezweb optical correction rules + VLM QA loop worth borrowing. |
| video-generation-skills | No zero-key video path exists. Narrow `video-gen` skill: App Store preview + splash animation + animated logo. |
| audio-tts-skills | `audio-gen` skill scoped to notification sounds + voiceover, routed through elevenlabs-mcp. |
| awesome-collections | Not a single skill across 12 high-star repos produces RGBA-transparent PNGs. Zero overlap with prompt-to-asset vocab (logo/favicon/app-icon). |
| composio-volt-collections | Zero of 119 media skills implement alpha validation, checkerboard FFT, safe-zone bbox, OCR Levenshtein, or SVG authoring. |
| openai-official-skills | Codex imagegen uses built-in `image_gen` tool — not portable to Claude Code. Figma suite (8 skills) fully portable. |
| diagram-svg-skills | VoltAgent/awesome-claude-design (475 DESIGN.md files) is ready test corpus for `asset_brand_bundle_parse`. |
| flux-and-antigravity-skills | No standalone Flux SKILL.md exists. shipdeckai covers 10 providers including BFL direct. `comfyui-gateway` has `sprite_transparent_bg` + `icon_512` workflows. |
| free-nokey-generation-skills | Nakkas MCP (`npx nakkas@latest`) — structured SVGConfig JSON, zero key, better than freehand SVG authoring. MCPollinations for RGB raster. |
| figma-design-tool-skills | `figma.createNodeFromSvgAsync(svgString)` pushes SVG as native Figma vector nodes. REST API has zero write capability. |
| 3d-realtime-emerging-skills | Lottie-animate from SVG master: zero API key, fills animated logo gap. TripoSR (<0.5s, $0.07) for 3D preview. |
| SYNTHESIS + ROADMAP | Priority 1: `nano-banana` + `flux` skills. Priority 2: `video-gen` + `audio-gen`. Priority 3: `3d-gen` + `lottie-animate`. |
---
## How to add research citations to code
When you add a decision (routing rule, dialect switch, safe-zone size, text
ceiling, etc.) that is grounded in a research angle, add a one-line
source comment at the declaration:
```ts
// Source: docs/research/09-app-icon-generation/9a-ios-app-icon-hig-specs.md
// iOS safe zone is 80% of 1024 = 824×824.
case "app_icon":
return { width: 824, height: 824 };
```
If a decision has no research backing and is pure product judgment, say
so explicitly:
```ts
// Product judgment, not from research: we prefer inline_svg in auto-mode
// because zero-friction onboarding is worth more than marginal fidelity.
if (avail.includes("inline_svg")) return { mode: "inline_svg", reason: "…" };
```
This keeps the research corpus honest: every load-bearing line either
cites an angle or explicitly marks itself as product judgment.