Distinct from cover-maker:
- No medium / title / creator — just a quote and an attribution
- Text is the SUBJECT, not the label on top of an image
- Different composition: type takes 60-80% of the frame
- Default to text-rendering-strongest model
Distinct from flyer-maker:
- No event details — quote cards are timeless
- No CTA / date / location — just text + attribution
- Different aesthetic: editorial, not promotional
This skill does NOT:
- Generate long-form text graphics (>3 sentences) — for that, use
carousel-builder (multi-slide)
- Translate quotes — pass the quote in the target language
- Verify attribution authenticity (Mark Twain didn't say half the things he's quoted on) — that's your responsibility
- Add watermarks / brand bumpers — append in your editor if needed
ROLE
Read quote + attribution + style → pick text-strong + clean-typography-capable model → assemble per-aspect prompts where typography dominates 60-80% of the frame → batch execute → save PNGs.
PIPELINE
Resolve quote:
- Required:
--quote "<text>"
- 1-3 sentences, ideally ≤20 words
- Required-recommended:
--attribution "<name>" (or --anonymous for unattributed)
Resolve aspect — multi-aspect by default:
--aspects square,portrait,story — comma list (default square)
square — 1080×1080 (Twitter / IG square / LinkedIn)
portrait — 1080×1350 (IG portrait — Vogue/editorial vibe)
story — 1080×1920 (IG Stories / Reels cover)
landscape — 1200×630 (Twitter header / OG image)
Resolve style — see references/style-presets.md:
--style auto: picks text-friendly styles from carousel library
--style swiss-grid-poster — Swiss grid typography (default text-friendly)
--style editorial-magazine — magazine layout
--style monochrome-bold — high-contrast B&W
--style minimal-serif — Bodoni-esque serif on cream
- Or any carousel library style with text-anchor strength
Pick model:
- Default:
ideogram-3-quality (text leader)
- Override:
--model gpt-image-2 (when style demands a textured visual element)
Compose ONE LLM call — load common/visual-prompt-library/system-prompt.md (shared SYSTEM_PROMPT, same as carousel-builder / cover-maker) and buildUserMessage(opts) with Mode=quote-card, N=<aspects count>, quote + attribution + style + aspect ratios. Spawn ONE Agent with that system + user. Receives JSON {"slides":[{"number":1,"prompt":"..."}]} — 1–3 sentence prompts where typography dominates 60–80% of the frame, quote and attribution in double quotes, no meta-labels. Library styles via common/visual-prompt-library/styles/_index.md.
Estimate cost + confirm — inherits SKILLS_CAROUSEL_BUDGET=1.50.
Batch execute — common.runners.batch.run_batch().
Output:
./generated/quote/<slug>/
square.png
portrait.png
story.png
manifest.json
style-used.md
prompts.md
MODES
Required
quote-card-maker --quote "<text>" --attribution "<name>"
Optional content
--anonymous — explicit no-attribution mode
--lang en|ru — language hint (default: auto-detect)
--context "<note>" — e.g., "from his 1843 journal", "essay on freedom"
Visual
--aspects square,portrait,story,landscape — comma list (default square)
--style auto|<library-id> — visual style
--style-mod "<override>" — tweak (e.g., "with single accent line in vermillion")
--variants N — variants per aspect (default 1)
--model auto|<slug> — image provider
Execution
--execute — actually generate
--output <dir> — custom output
--parallelism N — concurrent calls (default 2)
--yes — skip cost confirmation
--resume — retry failed
--prompts-only — dry run
REFERENCES (load on demand)
| File |
When to load |
| references/style-presets.md |
Step 3 — which library styles work best as quote-card anchors, when to pick which |
| references/composition-zones.md |
Step 5 — per-aspect text-dominant composition templates |
| references/troubleshoot.md |
When text wraps wrong, attribution dominates, style fights legibility |
EXAMPLES
See examples/before-after.md — 3 calibration runs: philosophy quote in editorial style, marketing aphorism in vibrant style, RU literature quote in minimal serif style.
CONSTRAINTS
Quote ≤20 words. Past 20 words, text gets too small to read on mobile. Long quotes belong in carousel-builder (multi-slide).
One quote per card. Don't mix multiple quotes — that's a carousel.
Attribution is short. "— Søren Kierkegaard" not "— Søren Kierkegaard, Danish philosopher, 1844 essay on dread". Add context via --context (it goes into prompt as a separate styling hint).
Typography dominates. All variants reserve 60-80% of the frame for the quote text. The visual support is minimal — texture, single line, geometric shape, maybe one illustrated element.
Default model is text-rendering-strongest. ideogram-3-quality for a reason — quote-cards live and die on text legibility.
Multi-aspect = same quote across formats. All aspects share the same quote/attribution; composition adapts.
Cost confirm ONCE per batch. Sum across aspects × variants.
Quote authenticity is YOUR responsibility. The skill doesn't verify attributions.
Lang detection: quote in Russian → switches text-rendering hint to Cyrillic; quote in English → Latin. Mixed-script quotes work but render less reliably.
Never print API keys. Mask in errors.
INVOCATION HINTS
When the user says any of:
- "quote card", "aphorism graphic", "pull quote post"
- "make a quote post for Instagram / Twitter"
- "цитата для соцсетей", "афоризм на картинке", "постер с цитатой"
- "сделай цитату Кьеркегора в монохромном стиле"
If the user pastes a long quote (>20 words), suggest carousel-builder instead. If the user wants multiple quotes, suggest a loop or carousel.
Defaults: --aspects square --style auto --variants 1 --model ideogram-3-quality. Without --execute, returns prompts.
Default style picks (--style auto):
- Quote feels philosophical / literary →
minimal-serif or editorial-magazine
- Quote feels marketing-y / motivational →
swiss-grid-poster or gradient-mesh-modern
- Quote feels punchy / contrarian →
monochrome-bold or brutalist-grid
This skill is distinct from:
carousel-builder — multi-slide narrative. This is single card.
cover-maker — albums/books with title+creator. This is text-as-subject.
flyer-maker — events. This is timeless quotes.
image-prompt — free-form. This is structured typography-dominant cards.
1---2name: quote-card-maker3description: Quote card / aphorism graphic generator — bold short text + attribution + minimal visual. Typography IS the image. Multi-aspect: 1080×1080, 1080×1350, 1080×1920. Default ideogram-3-quality for clean text. Use when: 'quote card', 'aphorism graphic', 'pull quote post', 'цитата для соцсетей', 'афоризм на картинке', 'постер с цитатой'.4license: MIT5---67<objective>8Quote-card generator. Input: short text (1-3 sentences) + attribution + optional style. Output: N variants where the quote IS the image — typography dominant, minimal visual support.910Distinct from `cover-maker`:11- No medium / title / creator — just a quote and an attribution12- Text is the SUBJECT, not the label on top of an image13- Different composition: type takes 60-80% of the frame14- Default to text-rendering-strongest model1516Distinct from `flyer-maker`:17- No event details — quote cards are timeless18- No CTA / date / location — just text + attribution19- Different aesthetic: editorial, not promotional2021This skill does NOT:22- Generate long-form text graphics (>3 sentences) — for that, use `carousel-builder` (multi-slide)23- Translate quotes — pass the quote in the target language24- Verify attribution authenticity (Mark Twain didn't say half the things he's quoted on) — that's your responsibility25- Add watermarks / brand bumpers — append in your editor if needed26</objective>2728## ROLE2930Read quote + attribution + style → pick text-strong + clean-typography-capable model → assemble per-aspect prompts where typography dominates 60-80% of the frame → batch execute → save PNGs.3132## PIPELINE33341. **Resolve quote**:35 - Required: `--quote "<text>"`36 - 1-3 sentences, ideally ≤20 words37 - Required-recommended: `--attribution "<name>"` (or `--anonymous` for unattributed)38392. **Resolve aspect** — multi-aspect by default:40 - `--aspects square,portrait,story` — comma list (default `square`)41 - `square` — 1080×1080 (Twitter / IG square / LinkedIn)42 - `portrait` — 1080×1350 (IG portrait — Vogue/editorial vibe)43 - `story` — 1080×1920 (IG Stories / Reels cover)44 - `landscape` — 1200×630 (Twitter header / OG image)45463. **Resolve style** — see `references/style-presets.md`:47 - `--style auto`: picks text-friendly styles from carousel library48 - `--style swiss-grid-poster` — Swiss grid typography (default text-friendly)49 - `--style editorial-magazine` — magazine layout50 - `--style monochrome-bold` — high-contrast B&W51 - `--style minimal-serif` — Bodoni-esque serif on cream52 - Or any carousel library style with text-anchor strength53544. **Pick model**:55 - Default: `ideogram-3-quality` (text leader)56 - Override: `--model gpt-image-2` (when style demands a textured visual element)57585. **Compose ONE LLM call** — load [`common/visual-prompt-library/system-prompt.md`](../../common/visual-prompt-library/system-prompt.md) (shared SYSTEM_PROMPT, same as carousel-builder / cover-maker) and `buildUserMessage(opts)` with `Mode=quote-card`, `N=<aspects count>`, quote + attribution + style + aspect ratios. Spawn ONE Agent with that system + user. Receives JSON `{"slides":[{"number":1,"prompt":"..."}]}` — 1–3 sentence prompts where typography dominates 60–80% of the frame, quote and attribution in double quotes, no meta-labels. Library styles via [`common/visual-prompt-library/styles/_index.md`](../../common/visual-prompt-library/styles/_index.md).59606. **Estimate cost + confirm** — inherits `SKILLS_CAROUSEL_BUDGET=1.50`.61627. **Batch execute** — `common.runners.batch.run_batch()`.63648. **Output**:65 ```66 ./generated/quote/<slug>/67 square.png68 portrait.png69 story.png70 manifest.json71 style-used.md72 prompts.md73 ```7475## MODES7677### Required7879- `quote-card-maker --quote "<text>" --attribution "<name>"`8081### Optional content8283- `--anonymous` — explicit no-attribution mode84- `--lang en|ru` — language hint (default: auto-detect)85- `--context "<note>"` — e.g., "from his 1843 journal", "essay on freedom"8687### Visual8889- `--aspects square,portrait,story,landscape` — comma list (default `square`)90- `--style auto|<library-id>` — visual style91- `--style-mod "<override>"` — tweak (e.g., "with single accent line in vermillion")92- `--variants N` — variants per aspect (default 1)93- `--model auto|<slug>` — image provider9495### Execution9697- `--execute` — actually generate98- `--output <dir>` — custom output99- `--parallelism N` — concurrent calls (default 2)100- `--yes` — skip cost confirmation101- `--resume` — retry failed102- `--prompts-only` — dry run103104## REFERENCES (load on demand)105106| File | When to load |107|---|---|108| [references/style-presets.md](references/style-presets.md) | Step 3 — which library styles work best as quote-card anchors, when to pick which |109| [references/composition-zones.md](references/composition-zones.md) | Step 5 — per-aspect text-dominant composition templates |110| [references/troubleshoot.md](references/troubleshoot.md) | When text wraps wrong, attribution dominates, style fights legibility |111112## EXAMPLES113114See [examples/before-after.md](examples/before-after.md) — 3 calibration runs: philosophy quote in editorial style, marketing aphorism in vibrant style, RU literature quote in minimal serif style.115116## CONSTRAINTS117118- **Quote ≤20 words.** Past 20 words, text gets too small to read on mobile. Long quotes belong in carousel-builder (multi-slide).119120- **One quote per card.** Don't mix multiple quotes — that's a carousel.121122- **Attribution is short.** "— Søren Kierkegaard" not "— Søren Kierkegaard, Danish philosopher, 1844 essay on dread". Add context via `--context` (it goes into prompt as a separate styling hint).123124- **Typography dominates.** All variants reserve 60-80% of the frame for the quote text. The visual support is minimal — texture, single line, geometric shape, maybe one illustrated element.125126- **Default model is text-rendering-strongest.** `ideogram-3-quality` for a reason — quote-cards live and die on text legibility.127128- **Multi-aspect = same quote across formats.** All aspects share the same quote/attribution; composition adapts.129130- **Cost confirm ONCE per batch.** Sum across aspects × variants.131132- **Quote authenticity is YOUR responsibility.** The skill doesn't verify attributions.133134- **Lang detection**: quote in Russian → switches text-rendering hint to Cyrillic; quote in English → Latin. Mixed-script quotes work but render less reliably.135136- **Never print API keys.** Mask in errors.137138## INVOCATION HINTS139140When the user says any of:141142- "quote card", "aphorism graphic", "pull quote post"143- "make a quote post for Instagram / Twitter"144- "цитата для соцсетей", "афоризм на картинке", "постер с цитатой"145- "сделай цитату Кьеркегора в монохромном стиле"146147If the user pastes a long quote (>20 words), suggest carousel-builder instead. If the user wants multiple quotes, suggest a loop or carousel.148149Defaults: `--aspects square --style auto --variants 1 --model ideogram-3-quality`. Without `--execute`, returns prompts.150151Default style picks (`--style auto`):152153- Quote feels philosophical / literary → `minimal-serif` or `editorial-magazine`154- Quote feels marketing-y / motivational → `swiss-grid-poster` or `gradient-mesh-modern`155- Quote feels punchy / contrarian → `monochrome-bold` or `brutalist-grid`156157This skill is distinct from:158- `carousel-builder` — multi-slide narrative. This is single card.159- `cover-maker` — albums/books with title+creator. This is text-as-subject.160- `flyer-maker` — events. This is timeless quotes.161- `image-prompt` — free-form. This is structured typography-dominant cards.