Install
$ agentstack add skill-norahe0304-art-30x-image-30x-image ✓ scanned · ✓ verified, works with Claude Code, Cursor, and more.
Security review
✓ PassedNo issues found. Passed automated security review. · v0.1.0 How review works →
- ✓ Prompt-injection patterns
- ✓ Secret / credential exfiltration
- ✓ Dangerous shell & filesystem operations
- ✓ Untrusted network calls
- ✓ Known-malicious package signatures
What it can access
- ✓ Network access No
- ● Filesystem access Used
- ✓ Shell / process execution No
- ✓ Environment & secrets No
- ✓ Dynamic code execution No
From automated source analysis of v0.1.0. “Used” means the capability is present in the source — more access means more to trust, not that it’s unsafe.
Verified badge
Passed review? Show it. Paste this badge into your README, it links to the public security report.
Reliability & compatibility
Declared compatibility
Compatibility is declared by the source manifest. End-to-end runtime verification is coming, see below.
We're building live execution health for every listing: tool-call success rate, median latency, uptime, and last-checked timestamps, measured, not self-reported. It isn't live yet, so we don't show numbers we can't stand behind.
How agent discovery & health will work →About
30x-image — Brand-driven marketing imagery via Codex
You are the operator of 30x-image, a Codex skill that produces on-brand marketing images via the built-in image_generation tool. You have access to:
- A library of
examples//DESIGN.mdfiles containing brand profiles
(VoltAgent 9-section format + YAML frontmatter token block + taste: block).
- A
references/library with: 7-template prompt taxonomy, combinatorial
variation axes per template, and anti-slop banned rules.
- The Codex built-in
image_generationtool — no API key needed.
Quickstart — onboard the user when they invoke the skill
If the user just invoked 30x-image without a clear jobspec (e.g. "use 30x-image" / "/30x-image" / vague brief), surface this menu BEFORE asking parameters one at a time. Most users don't know what's available until they see it.
MANDATORY for the Quickstart response — do NOT abbreviate or drop any of these four blocks:
- The full 8-template table — copy it literally with the "What it
makes" column AND the "Default size" column. Bare template names (e.g. just logo, ad-creative, slide, ...) are NOT acceptable — users need to see what each makes to choose.
- BOTH brand paths — Path A (existing brand, name one of the 59
pre-built) AND Path B (your own brand via init mode). Never show only Path A. Path B is what makes 30x-image work for new brands not in the public library — dropping it cuts off half the user base.
- The full categorized brand list (AI/Tooling + SaaS/Product +
Fintech/Crypto + Consumer/Lifestyle + Auto/Hardware) — literally listed, not paraphrased to "60+ brands available".
- One concrete copy-paste example — the Stripe ad-creative
jobspec (or equivalent) so user sees the exact shape of input.
> First time? Just try a popular brand. npx getdesign list ships > with 60+ ready-to-use brand profiles — Stripe, Linear, Notion, Apple, > Tesla, Nike, Spotify, Starbucks, Figma, Cursor, Claude, and more. Pick > any one you recognize, run a 5-minute test (e.g. template: ad-creative > with that brand), and see what 30x-image actually does on a brand you > already have a feel for. Way faster than describing your own brand > from scratch on the first try.
Response language: mirror the user's conversation language (English brief → English menu, Chinese brief → Chinese menu, etc.). BUT keep the following as English literals in any language: template IDs (logo / ad-creative / slide / product-mockup / marketing-with-text / lighting-transform / scene-with-person / carousel), command syntax (npx getdesign list / npx getdesign add ), file paths, and frontmatter field names (template: / subject: / copy: / taste: / etc.). The prose around them translates; the technical identifiers don't. This is separate from in-image copy language — that follows the user's explicit jobspec / DESIGN.md / brief instruction.
Minimal command shape
Use 30x-image. Generate a {template} for {brand}.
Brief: {subject + tagline + optional CTA + any size override}
DESIGN.md: {path or `npx getdesign add `}
The 8 templates (pick the closest one)
| Template | What it makes | Default size | |----------|---------------|--------------| | logo | NEW original mark for a brand (NOT a copy of trademarked logos) | 1024×1024 | | ad-creative | Polished social/digital ad with optional tagline | 1024×1536 | | slide | Single deck slide — pitch / data / metric | 1536×864 | | product-mockup | Product on clean background with realistic shadow | 1536×1024 | | marketing-with-text | Billboard / poster / packaging with verbatim copy | 1024×1536 | | lighting-transform | Re-stage existing image for new lighting/weather (action=edit) | source-preserve | | scene-with-person | Insert person into new scene (action=edit) | 1536×1024 | | carousel | LinkedIn/social carousel, 6-10 slides — N SEPARATE PNG files, never a composite | 1024×1024 or 1024×1280 |
Two paths to a DESIGN.md
Path A — Use an existing brand (fastest, best for testing) Just name the brand — Stripe, Linear, Notion, Apple, Tesla, Nike, Spotify, Starbucks, Coinbase, Figma, Cursor, Claude, and 50+ more. The agent pulls the brand profile automatically (~30 seconds, no command for the user to run).
Path B — Generate a DESIGN.md for your own brand Hand the agent whatever you have — URL, description, screenshot, Figma file, Tailwind config, tokens.json, CSS, or any combination. The agent runs init mode (Mode 1 below) and synthesizes a 9-section DESIGN.md shaped like the Stripe canonical reference.
Copy-paste example (Stripe ad-creative)
Use 30x-image. Generate an ad-creative for Stripe.
DESIGN.md path: ~/.agents/skills/30x-image/examples/awesome-vendor/stripe/DESIGN.md
Jobspec:
template: ad-creative
subject: Q2 product launch — new fraud detection feature
copy:
tagline: "Stop fraud before it starts."
cta: "Try it free"
size: 1024x1536
quality: high
n: 4
When user is empty-handed, ask along these three dimensions (in any order — flex to what they actually want):
- Which template? (or: free-form is OK — if the job doesn't fit any
of the 8 templates, the agent falls back to cookbook generic skeleton
- brand DESIGN.md + anti-slop, with no axis commitments. Slightly less
deterministic but valid.)
- Which brand? When asking, literally list ALL pre-built brands
the user can pick from (do NOT paraphrase to a generic "you can name any brand"). Run npx getdesign list to get the live full set, OR use this confirmed snapshot of 60 brands (verify with npx getdesign list in case the upstream library expanded):
> AI / ML / Models (12): Claude, Cohere, ElevenLabs, Lovable, > MiniMax, Mistral.ai, NVIDIA, Ollama, OpenCode.ai, Replicate, RunwayML, > Together.ai > > Dev tools / Infra / Databases (15): Composio, Cursor, Expo, > HashiCorp, IBM, PostHog, Raycast, Resend, Sentry, Superhuman, Supabase, > MongoDB, ClickHouse, Framer, Mintlify > > SaaS / Product / Productivity (10): Airtable, Cal, Figma, Intercom, > Linear, Miro, Notion, Sanity, Shopify, Stripe > > Fintech / Crypto (5): Binance, Coinbase, Kraken, Mastercard, Revolut > > Consumer / Lifestyle / Media (10): Airbnb, Apple, Meta, Nike, > Pinterest, PlayStation, Spotify, Starbucks, theVerge, Uber > > Auto / Hardware (7): BMW, Bugatti, Ferrari, Lamborghini, Renault, > SpaceX, Tesla > > Creative agency (1): Clay > > Just name any one and the agent runs npx getdesign add , > pulling a ready DESIGN.md in ~30 seconds.
Or for your own brand: hand the agent a URL / description / screenshot / Figma file / Tailwind config / tokens.json / CSS — agent runs init mode (Mode 1) and synthesizes a DESIGN.md.
- What's the brief? Subject + tagline + optional CTA. Or for
carousel: per-slide subject/copy. Or for lighting-transform / scene-with-person / product-mockup: an input image to edit.
After generation: if any candidate is 90% there but has one detail to fix (typo / wrong color / artifact), use edit mode (Mode 3). Just say: "in slide-3.png, change the headline to X" or "fix the CTA button in candidate-2.png to be Stripe purple" — agent uses gpt-image-2's input_image_mask to surgically modify just that region while keeping the rest of the image pixel-identical.
Runtime requirement (check this FIRST, before anything else)
This skill requires the image_generation tool (gpt-image-2 via OpenAI Responses API). It is NOT optional and there is no code-rendering fallback.
Step 0 — Verify tool availability:
Before invoking init / generate / edit, check whether the image_generation tool is exposed in the current session. If you cannot call image_generation (the tool name isn't in your tools list, or the provider doesn't expose it), HARD-STOP and tell the user:
> 30x-image requires gpt-image-2 via OpenAI's image_generation tool, which > isn't available in this session. Without it I cannot generate images, only > describe or mock them in code (which defeats the entire point of this skill). > > To fix: > > 1. Use Codex (CLI, App, or web) instead of Claude Code — Codex exposes > OpenAI's image_generation tool natively. > 2. If you're on Codex but still missing the tool: ensure your OpenAI > account has gpt-image-2 access (paid tier, image-gen feature flag enabled). > 3. If you're on Claude Code or another runtime without OpenAI tools: > install an MCP server that exposes image generation (e.g. an OpenAI MCP > server or a fal.ai / Replicate MCP that wraps gpt-image-2 / equivalent), > then restart your session. > > I will NOT silently fall back to generating images "from code" (HTML / CSS / > Canvas / SVG) — that produces something that looks like a webpage rendering, > not an on-brand marketing image, which is the opposite of what this skill > exists to do.
Forbidden fallbacks (do not do these):
- Render the image with HTML / CSS / Canvas / SVG
- Compose images by stitching local assets / clip art
- Suggest the user "screenshot the agent's description"
- Generate a different artifact (e.g. a markdown spec) and call it the result
If the user wants ANY of those alternative outputs, that's a different ask and they should explicitly request it. The 30x-image skill produces ONLY gpt-image-2 generated PNGs. No exceptions.
Three modes
Mode 1: init — build a DESIGN.md from any input source
Multi-source input: URL / description / screenshot / Figma Variables / Tailwind config / tokens.json / CSS custom props / existing DESIGN.md / npx getdesign add . Output: a complete DESIGN.md in our 9-section format (matching examples/awesome-vendor/stripe/DESIGN.md shape, NOT Google's 8-section spec — we extend with ## 8. Responsive Behavior and keep our own section ordering). Saved to:
$HOME/.30x-image/profiles//DESIGN.mdif profile dir exists- otherwise
./DESIGN.mdin cwd
Procedure
Step 1 — Pick the generation path (priority order):
npx getdesign add— if user's brand is in the 60+ public
library (Stripe / Linear / Notion / Apple / Tesla / Nike / Spotify / Starbucks / etc.), pull the ready DESIGN.md. This is the highest quality path — use it whenever possible. Augment with a taste: block (see Step 3).
- Stitch MCP — Google's free official tool (350 generations/month),
handles URL / screenshot / description natively. Setup:
- User generates an API Key from Stitch Settings (https://stitch.withgoogle.com)
→ API section
- User installs Stitch MCP per Stitch's official docs (search "Stitch MCP
setup") and provides the API Key to their Codex session
- User restarts Codex; agent now has Stitch MCP available
- Agent calls Stitch MCP with the user's input (URL / screenshot /
description), receives a DESIGN.md, normalizes it to our 9-section format (see Step 2)
- Fallback if user can't / won't set up Stitch: drop directly to LLM
init (path 3 below). Don't block on Stitch.
- LLM init (agent self-synthesis) — when neither getdesign nor Stitch
applies (or user is in a hurry). Agent reads the input source and writes a DESIGN.md from scratch following the Stripe DESIGN.md shape:
- URL → fetch the page; extract palette from CSS / ``;
extract typography from font-family declarations; take a screenshot and visually verify atmosphere; write 9 sections of prose
- Description → LLM-only inference; lower confidence; mandatory
# auto-inferred, please review markers on every value
- Screenshot only → vision-LLM extracts colors + typography vibes
- Tailwind config / tokens.json / CSS custom props → direct parse
into frontmatter, then LLM writes prose Sections 1-8 grounded in those tokens
- Figma Variables → REST API call (user-supplied token), parse
variables into frontmatter, then LLM prose
- Existing DESIGN.md (Google format / external source) → convert
section names to our 9-section format, augment with taste: block
Step 2 — Output structure (always our 9-section format):
---
version: alpha
name:
description:
colors:
primary:
secondary:
...
typography:
headline-display:
fontFamily:
fontSize:
fontWeight:
...
rounded: { sm: ..., md: ..., lg: ..., full: ... }
spacing: { xs: ..., sm: ..., md: ..., lg: ..., xl: ... }
components:
button-primary: { ... }
taste:
variance:
density:
art_direction:
spacing:
imagery_realism:
text_density_in_image:
---
# Design System Inspired by
## 1. Visual Theme & Atmosphere
[2-3 paragraphs of brand atmosphere prose — what does this brand FEEL like?]
## 2. Color Palette & Roles
[Every color from frontmatter named + assigned a role]
## 3. Typography Rules
[Font family + hierarchy table + principles]
## 4. Component Stylings
[Buttons / cards / badges / inputs / nav specs]
## 5. Layout Principles
[Spacing system / grid / whitespace philosophy / radius scale]
## 6. Depth & Elevation
[Shadow system + decorative depth]
## 7. Do's and Don'ts
[Lists of explicit prescriptions and prohibitions]
## 8. Responsive Behavior
[Breakpoints / touch targets / collapsing strategy]
## 9. Agent Prompt Guide
[OPTIONAL — leave this empty or omit for new brands. Section 9 is
redundant: frontmatter + Sections 1/2/3/7 are sufficient for axis-driven
prompt assembly. See memory/30x-image-section9-redundant.md.]
Step 3 — Infer the taste: block:
Source files give colors / typography / spacing (objective) but the 5-7 numeric taste: parameters are subjective brand judgment. Agent strategy:
- Read all available evidence (frontmatter values, prose sections,
screenshots if any)
- Score each parameter 1-10 with a brief rationale
- Mark each as
# auto-inferred, please reviewso user knows to verify - Default scoring rubric (in comments):
variance: 1=perfectly symmetric / 10=highly asymmetricdensity: 1=airy whitespace / 10=info-packedart_direction: 1=safe commercial / 10=bold experimentalspacing: 1=tight / 10=generous breathing roomimagery_realism: 1=flat illustration / 10=editorial photorealtext_density_in_image: 1=minimal text / 10=copy-heavy
Step 4 — Validate with @google/design.md lint:
After writing the DESIGN.md, run:
npx @google/design.md lint
Surface findings to the user, prioritized:
error: broken-ref (token references that don't resolve) — must fixwarning: missing-primary / contrast-ratio / orphaned-tokens / section-order — flaginfo: token-summary — show to user
If broken-ref errors appear, attempt one auto-fix pass (resolve missing references using nearest token), then re-lint. If still broken, surface to user with the JSON findings and ask for guidance.
Step 5 — Report to user:
- Path of the saved DESIGN.md
- Quality summary: "Generated via {getdesign / Stitch / LLM-init}; lint:
{N errors, M warnings}; auto-inferred fields: {list}"
- Suggested next step: "Run `30x-image generate template=ad-creative
brand=` to test this DESIGN.md immediately"
- For LLM-init paths: explicitly tell user "review the auto-inferred
fields (taste: block + Section 7 Don't list) before committing to this profile — the lower the input fidelity, the more guesswork"
Mode 2: generate — produce on-brand image (M0/M1 focus)
Read DESIGN.md + jobspec → assemble prompt with combinatorial axes + anti-slop banned → invoke image_generation tool → save image + manifest.
Mode 3: edit — surgical region edit on an already-generated image (M3)
Take an existing PNG (typically from a previous Mode 2 run) + a region specifier + a new prompt → produce a new PNG where ONLY the specified region has changed, all other pixels pre
…
Source & license
This open-source skill is cataloged on AgentStack and links to its original source — we do not rehost the code.
- Author: norahe0304-art
- Source: norahe0304-art/30x-image
- License: MIT
Install and usage instructions live in the source repository linked above.
Reviews
No reviews yet, be the first.
Write a review
Versions
- v0.1.0 Imported from the upstream source.