loading…
Search for a command to run...
loading…
Routes one brief to the right image model across 60+ (gpt-image-1.5, Ideogram 3, Recraft V4, Flux), validates the output, and fans out to iOS/Android/PWA/favico
Routes one brief to the right image model across 60+ (gpt-image-1.5, Ideogram 3, Recraft V4, Flux), validates the output, and fans out to iOS/Android/PWA/favicon/visionOS/Flutter bundles. Works without an API key via Pollinations, HF Inference, Stable Horde, or host-LLM inline SVG.

Free image generation for developers, from the CLI or your AI assistant.
Turn one brief into app icons, favicons, OG images, logos, splash screens, SVG, and platform bundles using the best zero-cost routes first.
Built for Cloudflare Workers AI, NVIDIA NIM, HF Inference, Stable Horde, Pollinations, free trials, and offline SVG.
Pick one. Run it. You're done. The recommended path is first.
Runtime: Node ≥ 20.11 (24 recommended). macOS, Linux, Windows (WSL2 for --fix native deps).
🔵 AI assistant · recommendedClick an install button above. Then paste one of these into chat:
Works in Cursor, Claude Code, VS Code, Windsurf, Codex, Gemini CLI. Zero terminal typing. |
🟢 Zero key, zero installOne
Outputs: iOS AppIconSet, Android adaptive, PWA, favicon bundle, visionOS scaffold. |
🟣 CLI · free API keysBest CLI experience: free tokens first, paid keys optional.
Start with Cloudflare Workers AI, NVIDIA NIM, HF Inference, Stable Horde, and free trials. Paid providers remain optional fallbacks. |
You don't need a paid API key. Ranked best-first:
| Route | Gets you | Signup |
|---|---|---|
inline_svg via AI assistant |
Logos, favicons, icon packs — instant | None |
| Cloudflare Workers AI | Flux-1-Schnell + SDXL, 10k neurons/day | Free token + account ID |
| NVIDIA NIM | Flux.1-dev, Flux.2-klein, SDXL, SANA | Free token, no card |
| HF Inference | SDXL, SD3, Flux dev/schnell | Free read token |
| Stable Horde | SDXL, Flux on community GPUs | Anonymous queue |
| Pollinations (HTTP GET) | Last-resort raster, RGB | None |
| Google AI Studio (paste-only UI) | Nano Banana / Nano Banana Pro | Google account |
Details + quotas: Free paths beyond Pollinations. Run p2a doctor or ask your assistant for asset_doctor() to see what's live right now.
[!TIP] Stuck? Click Install in Cursor or Install in VS Code above, restart the editor, and say: "make a favicon for my app, dark-mode aware."
p2a doctor, p2a pick, and the MCP tools rank free API routes before paid models, so developers can generate inside the CLI without enabling billing.inline_svg (host LLM authors SVG), external_prompt_only (paste into any web UI), api (server calls a free or paid provider). Pick what fits. All three can finish on $0.Never column. No wordmarks past 3 words through a diffusion sampler. No transparent PNG through Imagen. No negative_prompt on Flux.border-image + Android .9.png.You just talk to your assistant. Example from a new chat:
Make me a transparent logo for a developer-tools company called Forge. Flat vector, two-tone warm orange on neutral.
Behind the scenes:
asset_doctor() — check what modes and providers are live.asset_init_brand({ app_name: "Forge", palette: ["#EA580C", "#F5F5F4"] }) if no brand.json exists.asset_enhance_prompt({ brief }) returns an AssetSpec: classification, rewritten prompt, modes_available[], optional svg_brief, optional paste_targets, and a routing_trace pointing at the research file that backed the decision (plus never_models — why Imagen or DALL·E got rejected).inline_svg / external_prompt_only / api.inline_svg: it writes <svg> inline and calls asset_save_inline_svg → writes master.svg, favicon.ico, apple-touch, AppIconSet, PWA bundle to disk.external_prompt_only: assistant shows the refined prompt and the best paste target (free first). You generate, save, then say "ingest this file" → asset_ingest_external.api: assistant calls the routed provider. Server mattes, vectorizes, exports, validates.asset_export_bundle with the saved master.Zero CLI typing. The CLI is still first-class for CI, shell scripts, and non-MCP environments — both surfaces hit the same core.
Two facts shape everything here.
Producing production-grade software assets is a routing and post-processing problem, not a prompt-engineering problem.
Imagen 3/4 and Gemini Flash Image can't produce real RGBA PNGs — their VAE is RGB-only, so asking for a transparent background renders the grey-and-white checkerboard as pixels. SDXL can't spell past ~8 characters. Only Recraft emits native SVG. Flux errors on negative_prompt. None of that is visible in the model UI. All of it silently breaks one-shot "prompt → asset" tools.
You may not have an image-model API key. The plugin works anyway.
Every one of the three modes can finish on $0.
flowchart LR
A["one-line brief"] --> B["asset_enhance_prompt"]
B --> C{"mode"}
C -->|inline_svg| D["Host LLM emits SVG inline<br/>→ asset_save_inline_svg"]
C -->|external_prompt_only| E["Paste into web UI<br/>→ asset_ingest_external"]
C -->|api| F["Server calls routed provider"]
D --> G["matte · vectorize · validate"]
E --> G
F --> G
G --> H["AssetBundle<br/>ios · android · pwa · favicon · visionos · flutter"]
| Mode | Key? | What happens | Best for |
|---|---|---|---|
inline_svg |
No | Server returns an SVG-authoring brief (viewBox, palette, path budget ≤ 40). Host LLM emits <svg>…</svg> inline, then asset_save_inline_svg writes master + favicon.ico + apple-touch + AppIconSet + PWA bundle. Instant. Deterministic. |
Logos, favicons, icon packs, stickers, simple app-icon masters |
external_prompt_only |
No | Server returns the dialect-correct prompt plus a ranked list of paste targets, free paths first: Pollinations, HF Inference, Stable Horde, Google AI Studio, Ideogram, Recraft, Midjourney, fal.ai, BFL, ChatGPT, Firefly, Krea. Generate elsewhere, save locally, call asset_ingest_external. |
Anything — best for illustrations, heroes, text-heavy logos |
api |
Optional | Server calls the provider directly. Works zero-key via Pollinations / Horde / HF, or with paid keys. Route → generate → matte → vectorize → export → validate → content-addressed bundle. | Automation, CI, no rate-limit tolerance |
The host LLM picks the mode, or you do. The server surfaces modes_available so the assistant offers them to you. Free paths first — always.
Router decisions live in data/routing-table.json. Capability matrix in data/model-registry.json. Every rule cites its research source.
| Need | Primary | Fallback | Never |
|---|---|---|---|
| Transparent PNG mark | gpt-image-1.5 with background:"transparent" |
Ideogram 3 Turbo (/generate-transparent) → Recraft V4 |
Imagen, Gemini Flash Image, SD 1.5 |
| Logo with 1–3 word text | Ideogram 3 Turbo → gpt-image-1.5 → Recraft V4 |
Composite SVG type over mark | Imagen, SD 1.5, flux-schnell |
| Logo with >3 word text | Never a diffusion sampler. Mark + SVG typography composite. | — | — |
| Native SVG | Recraft V4 (V3 for brand-style pipelines) | inline_svg (host LLM authors SVG) |
Everyone else |
| Photoreal hero | Free CLI route first: Cloudflare / NVIDIA NIM / HF | Flux Pro / gpt-image-1.5 / Gemini with paid keys |
DALL·E 3, Imagen 4 for new work |
| Iterate an existing mark | flux-kontext-pro (edit-only) |
Pollinations Kontext (free) | — |
| Zero-cost everything | inline_svg → Cloudflare / NVIDIA NIM / HF / Horde |
Pollinations → paste-only | — |
The Never column matters. It's why prompt-to-asset refuses to render wordmarks past 3 words in any diffusion sampler, and why asking for a transparent PNG never goes to Imagen.
| Option | How | Best at | Catch |
|---|---|---|---|
| Cloudflare Workers AI | Free API token + account ID | Flux-1-Schnell, SDXL, DreamShaper | 10k neurons/day cap (~900 Flux-Schnell or 5k SDXL-Lightning) |
| NVIDIA NIM | Free API token, no card | Flux.1-dev, Flux.2-klein, SDXL, SANA | 1k requests/month; strong free CLI route |
| HF Inference | Free read token | SDXL, SD3, Flux dev + schnell | Rate-limited, cold-start latency |
| Stable Horde | Anonymous kudos queue | SDXL, Flux community GPUs | Minutes of queue on the free lane |
| Pollinations.ai | curl → HTTP GET. No signup. |
Throwaway raster | Last resort: silent model swaps, downsizing, RGB only |
| Google AI Studio (UI) | Free interactive web UI at aistudio.google.com | Nano Banana / Nano Banana Pro | No free API — paste-only; download PNG, call asset_ingest_external |
| Local ComfyUI | Community comfyui-mcp adapter |
Full fidelity, no caps | You bring the GPU |
inline_svg |
Host LLM emits <svg> in chat |
Logos, favicons, simple icons | ≤40 paths; simple geometry |
external_prompt_only |
Paste into any web UI | Whatever that UI gives you | Manual save, then asset_ingest_external |
Verified 2026-04-26 against public Gemini API pricing:
gemini-3.1-flash-image-preview (Nano Banana 2), gemini-3-pro-image-preview (Nano Banana Pro), and gemini-2.5-flash-image (original Nano Banana) list image output only in the paid tier. Billing must be enabled on the GCP project to use these via API.Free of charge input + output on the free tier.external_prompt_only + asset_ingest_external if you want Nano Banana quality without billing.gemini-2.5-flash-image) $0.039; Nano Banana 2 Flash (gemini-3.1-flash-image-preview) $0.045/0.5K, $0.067/1K, $0.101/2K, $0.151/4K; Nano Banana Pro (gemini-3-pro-image-preview) $0.134/1K-2K, $0.24/4K (+ $0.0011 per input image); Imagen 4 Fast $0.02, Standard $0.04, Ultra $0.06. Batch API is 50% off.Run
p2a doctor(or ask your assistant forasset_doctor()) to see what's live in your environment right now.
Every command works via npx — no install required.
# Zero install
npx prompt-to-asset doctor # what's live in this shell right now
npx prompt-to-asset doctor --fix # auto-install native deps (brew / cargo / scoop; never sudo)
npx prompt-to-asset pick # interactive route picker
npx prompt-to-asset init --register # scaffold brand.json + register in .cursor / .vscode / .windsurf
# Or global for daily use
npm i -g prompt-to-asset
p2a doctor
# Or per-project for CI
npm i -D prompt-to-asset
Claude Code
Smithery (universal)
|
Cursor · VS Code · Windsurf · Codex · Gemini CLI Use the install buttons at the top of this README, or see docs/install.md for the exact stanza per IDE. Claude Desktop Download the .mcpb bundle → double-click → restart. |
Once registered, your assistant has the full 24 asset_* tool surface.
Paid direct APIs: gpt-image-1, gpt-image-1.5, dall-e-3 (deprecated 2026-05-12), imagen-3, imagen-4, gemini-3-flash-image (Nano Banana), gemini-3-pro-image, sd-1.5, sdxl, sd3-large, playground-v3, flux-schnell, flux-dev, flux-pro, flux-2, flux-kontext-pro, ideogram-3, ideogram-3-turbo, recraft-v3, leonardo-phoenix, leonardo-diffusion-xl, fal-flux-pro, fal-flux-2, fal-sdxl.
Free-tier / zero-key: pollinations-flux, pollinations-turbo, pollinations-kontext, pollinations-sd, horde-sdxl, horde-flux, hf-sdxl, hf-sd3, hf-flux-schnell, hf-flux-dev.
Paste-only surfaces: midjourney-v6, midjourney-v7, firefly-3, krea-image-1. Calling asset_generate_* with mode: "api" against a paste-only primary soft-falls-back to the first API-reachable model in the chain and surfaces a warning. If the whole chain is paste-only, you get an ExternalPromptPlan rather than an error.
| Tool | Purpose |
|---|---|
asset_capabilities |
Inventory of modes + providers. Buckets paid / free-tier / paste-only; surfaces zero-key routes first. Read-only. |
asset_enhance_prompt |
Classify, route, rewrite. Returns modes + svg_brief + paste_targets + routing_trace { research_sources, never_models, fallback_chain } + clarifying_questions[] when the brief is ambiguous. Read-only. |
asset_generate_logo |
inline_svg / external_prompt_only / api. Returns InlineSvgPlan / ExternalPromptPlan / AssetBundle. |
asset_generate_app_icon |
Same three modes. api produces full iOS / Android / PWA / visionOS / Flutter fan-out. Set ios_18_appearances: true for dark + tinted variants. |
asset_generate_favicon |
favicon-{16,32,48}.png, icon.svg, icon-dark.svg, apple-touch, PWA 192/512/512-maskable, <link> snippet, manifest.webmanifest. |
asset_generate_og_image |
1200×630 via Satori + @resvg/resvg-js. Deterministic typography, no diffusion-rendered text garbage. |
asset_generate_illustration |
external_prompt_only / api. Brand-locked via bundle refs, LoRA, or style_id. Routed primary: Flux.2 (up to 8 refs). |
asset_generate_splash_screen |
iOS LaunchScreen-2732.png, Android mipmap-*/splash.png + theme XML, PWA splash + README. Pass existing_mark_svg to reuse an approved mark. |
asset_generate_hero |
Marketing hero art (16:9 / 21:9 / 3:2 / 2:1). external_prompt_only / api. |
asset_save_inline_svg |
Round-trip for inline_svg. Validates the SVG against the brief, writes the bundle. |
asset_ingest_external |
Round-trip for external_prompt_only. Matte → vectorize → validate → bundle. |
asset_remove_background |
BiRefNet / BRIA RMBG-2.0 / LayerDiffuse / difference matte / U²-Net. |
asset_vectorize |
vtracer / potrace / Recraft / posterize fallback, then SVGO. |
asset_upscale_refine |
DAT2 / Real-ESRGAN / SUPIR / img2img / Lanczos; asset-type-aware. |
asset_validate |
Tier-0 (dims, alpha, checkerboard FFT, safe-zone bbox, ΔE2000 palette, WCAG contrast, OCR Levenshtein). Tier-2 VLM-as-judge via PROMPT_TO_BUNDLE_VLM_URL. |
asset_brand_bundle_parse |
Parse brand.json / DTCG tokens / AdCP / Markdown into a canonical BrandBundle. |
asset_doctor |
Structured env inventory: native deps, free-tier routes ranked best-first, paid keys, paste-only surfaces, pipeline URLs, mode flags, "what to try next." Read-only. |
asset_models_list |
Browse the 60+ model registry with filters: free / paid / paste_only / rgba / svg. Read-only. |
asset_models_inspect |
Full capability dump for one model id (or aka alias). Strengths, weaknesses, paste targets, routing rules, env status. Read-only. |
asset_export_bundle |
Fan a 1024² master PNG into iOS AppIconSet + Android adaptive + PWA maskable + visionOS parallax + Flutter launcher + favicon. Offline. |
asset_sprite_sheet |
Pack PNG/WEBP/JPG frames into a sprite sheet + TexturePacker-compatible JSON atlas (Phaser / PixiJS / Godot / Unity). Offline. |
asset_nine_slice |
Emit a 9-slice config + CSS border-image + engine-ready numbers (Unity / Godot / Phaser / PixiJS) from an image plus four pixel guides. Optional Android .9.png. |
asset_init_brand |
Scaffold brand.json and ensure the assets dir exists. Auto-detects Next.js, Expo, Flutter, Xcode, Astro, Vite, Remix, Nuxt, React Native, Electron, Node. |
asset_train_brand_lora |
Wrap a user-owned LoRA training endpoint (PROMPT_TO_BUNDLE_MODAL_LORA_TRAIN_URL). Path-guarded; validates inputs. |
Tools are annotated readOnlyHint / idempotentHint so Cursor auto-approves without prompting.
Used by the LLM over Bash when MCP isn't registered yet, and by CI. Every read-only command accepts --json.
p2a # default — MCP stdio server
p2a mcp # same, explicit
p2a export <master.png> # offline platform fan-out
p2a export <master.png> --json
p2a init # interactive brand.json + IDE registration hints
p2a init --register # + auto-write .cursor/mcp.json / .vscode/mcp.json / .windsurf/mcp.json
p2a pick # interactive model picker
p2a doctor # environment inventory
p2a doctor --json # structured output
p2a doctor --data # check data/model-registry.json ↔ data/routing-table.json consistency
p2a doctor --fix # auto-install missing native deps (brew / cargo / scoop; never sudo)
p2a models list # --free | --paid | --paste-only | --rgba | --svg
p2a models inspect <id> # full capability dump
p2a sprite-sheet <dir> # pack frames → PNG + atlas
p2a nine-slice <image> # 9-slice JSON + CSS + engine numbers + .9.png
p2a --help
brand.json{
"name": "Halcyon",
"palette": ["#2563eb", "#ffffff"],
"fonts": { "display": { "family": "Inter", "weights": [700, 800] } },
"style_refs": ["https://…/sample1.png", "./refs/style2.png"],
"do_not": ["drop shadows", "heavy gradients"],
"lora": "halcyon-flux-v2",
"sref_code": "--sref 1234567890",
"style_id": "rc_halcyon_01"
}
p2a init writes this for you, detecting the framework and suggesting an assets directory. Once present, every generator reads from it automatically.
| Platform | What you get |
|---|---|
| iOS (Xcode) | AppIcon.appiconset with 1024 opaque, squircle-ready. iOS 18 dark + tinted variants via ios_18_appearances: true. |
| Android | Adaptive foreground + background, Android 13 monochrome, all mipmap densities, optional .9.png. |
| PWA / web | favicon.ico (16/32/48 multi-res), icon.svg with prefers-color-scheme dark support, apple-touch-icon.png 180×180 opaque, 192/512/512-maskable, manifest.webmanifest, <link> snippet for your <head>. |
| Flutter | Pre-populated flutter_launcher_icons.yaml wiring iOS, Android adaptive, web, macOS, Windows. |
| visionOS | Three-layer parallax scaffold with a README. Layer split stays a human decision. |
| Next.js / Astro / Vite / Remix / Nuxt / Expo / React Native / Electron | Framework detection via p2a init / asset_init_brand and a sensible output dir. |
| Games | sprite-sheet produces TexturePacker-compatible atlases (Phaser, PixiJS, Godot, Unity). nine-slice emits engine-ready numbers. |
brief (text)
↓ asset_capabilities → modes available + free/paid/paste-only bucketing
↓ asset_enhance_prompt → AssetSpec {
↓ routing_trace: { rule_id, reason, research_sources, never_models, fallback_chain },
↓ modes_available,
↓ svg_brief?, (inline_svg)
↓ paste_targets?, (external_prompt_only)
↓ rewritten_prompt, …
↓ }
↓
├─ mode: inline_svg → host LLM emits <svg>; asset_save_inline_svg writes bundle
├─ mode: external_prompt_only → user pastes into web UI; asset_ingest_external runs matte → vectorize → validate
└─ mode: api → provider(model, prompt, params) → matte → vectorize → upscale → export → validate
Content-addressed storage: assets/<hash[0:2]>/<hash>/<variant>.<ext>. The MCP server is synchronous and stateless. prompt_hash and params_hash in every AssetBundle are designed to drop straight into a BullMQ / SQS / Cloudflare Queues jobId for a hosted pipeline. Reference design: docs/research/18-asset-pipeline-tools/18e-production-pipeline-architecture.md.
You own the API keys. The LLM owns everything else.
The only thing that happens in a terminal is installing the package and putting keys in .env. Secrets shouldn't pass through chat. Every other verb — doctor checks, model inspection, platform fan-out, brand scaffolding, sprite sheets, 9-slice configs — is an MCP tool the assistant calls when you ask in natural language.
| Tool | Prompt enhancement | Multi-model routing | Zero-key | Dev-asset bundle | Offline platform fan-out |
|---|---|---|---|---|---|
| Promptati / PromptHero | cinematic only | ✗ | ✗ | ✗ | ✗ |
| Looka / Brandmark / Designs.ai | ✗ | ✗ | ✗ | partial | ✗ |
| ChatGPT / Midjourney / Ideogram (direct) | ✗ | ✗ | ✗ | ✗ | ✗ |
| appicon.co | ✗ | ✗ | ✓ | partial | iOS only |
| flutter_launcher_icons | ✗ | ✗ | ✓ | partial | iOS + Android |
prompt-to-asset |
✓ | ✓ (60+ models) | ✓ (Pollinations / HF / Horde / SVG) | ✓ | ✓ (iOS + Android + PWA + visionOS + favicon + Flutter) |
This tool handles API keys for up to 15 providers. Non-negotiables:
redact() (packages/mcp-server/src/security/redact.ts) before reaching the host LLM.image_path / output_dir / existing_mark_svg resolve through symlinks and reject anything escaping project cwd + configured output dir + cache dir + OS tempdir. Widen with P2A_ALLOWED_PATHS=/path1:/path2.<script>, <foreignObject>, on*= handlers, javascript: URIs, external <image href> / <use href>, CSS @import over the network — all rejected. The check runs unconditionally; SVGO is not required.P2A_MAX_SPEND_USD_PER_RUN=5.00 to cap any single tool call. Pre-flight estimate refuses to call if over. Free-tier routes are always $0.assertDataIntegrityAtBoot() runs on start. If a routing rule points at a model id not in the registry, the server refuses to boot with a clear error. Check in CI with p2a doctor --data.Full policy: SECURITY.md.
Every routing rule, dialect switch, safe-zone size, and text ceiling that's implemented is backed by a file under docs/research/. asset_enhance_prompt returns a routing_trace.research_sources array on every call. The angle → code pointer map, plus an honest ledger of what's wired and what's deferred, lives in docs/RESEARCH_MAP.md.
git clone https://github.com/MohamedAbdallah-14/prompt-to-asset.git
cd prompt-to-asset
npm install
npm run build
npm run typecheck
npm run lint
npm test # vitest watch
npm run test:run # vitest run (CI)
npm run smoke # list tools via MCP stdio + correctness assertions
npm run sync # regenerate IDE mirrors from SSOTs
npm run verify # byte-verify mirrors match SSOTs
SSOTs live in skills/*/SKILL.md, rules/*.md, .claude-plugin/, and data/*.json. Don't edit .cursor/, .claude/, .windsurf/ directly — they're regenerated by scripts/sync-mirrors.sh and CI byte-verifies them.
If this repo saved you from hand-crafting another AppIconSet, a star helps it reach other developers fighting the same fight.
MIT © prompt-to-asset contributors.
Добавь это в claude_desktop_config.json и перезапусти Claude Desktop.
{
"mcpServers": {
"prompt-to-asset": {
"command": "npx",
"args": []
}
}
}