Install
$ agentstack add skill-mikefluff-skills-flyer-maker ✓ 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 No
- ✓ 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
End-to-end flyer / poster generator. Input: event details (title, optional date / location / CTA) plus an optional user-supplied photo. Output: N single-image variants at different aspect ratios, each with the event details embedded as text + the photo integrated (if provided) + a consistent visual style.
This skill orchestrates three lower-level components:
image-promptstyle anchor + composition-zone vocabularycommon/runnersexecute layer — multi-aspect batch generation via the chosen image providercommon/style-library/carousel/— reuses the 24 carousel visual styles as the visual vocabulary (poster styles overlap heavily with editorial carousel styles)
Use when the user wants a finished flyer image — not just a prompt. Without --execute, returns the assembled prompts; with --execute, generates the actual PNGs.
This skill does NOT:
- Generate animated flyers (use
reel-builderfor motion) - Render print-ready CMYK / 300DPI files — outputs are RGB at standard digital resolutions (1080 / 1240 px). For print: open the PNG in a real DTP tool (Affinity / InDesign / Photoshop) and convert.
- Compose multi-image collages — single image per aspect.
- Generate QR codes (deferred to v2.5.x — if you need a QR, generate separately and overlay manually).
- Search Eventbrite / Meetup / Luma for event metadata — you provide title / date / location explicitly.
- Replace a designer's judgment on layout — the composition zones are starter conventions; tweak via prompt iteration.
ROLE
Read the event details + optional photo + optional style → pick a model (text-friendly + multi-ref-capable if photo provided) → assemble per-aspect prompts with composition zones filled in → batch execute via the image provider → save PNGs + manifest → print paths.
PIPELINE
- Resolve event details:
- Required:
--title - Strongly recommended: at least one of
--date,--location, or--cta(a flyer without a single detail is just a styled portrait) - Optional:
--subtitle,--time(can be merged with date)
- Resolve photo (optional):
--photo: passed as reference image to the chosen model.- Multi-ref capable models needed (Nano Banana Pro / Flux Kontext / gpt-image-2 / Ideogram 3 / Seedream 5.0).
- If
--photoprovided AND--model auto: skill picks a ref-capable model. - If
--photoprovided AND--modelthat can't handle refs: warn + auto-substitute, or exit if user passed--strict.
- Resolve style — see
references/event-details.md:
--style: load fromcommon/style-library/carousel/.md. Use theStyle anchor (text-in-image mode)block (flyers always have text).--style auto: pick from library based on the event type implied by the title + the chosen tone (formal, casual, indie, corporate). Algorithm same as carousel-builder.--style-mod "": append a tweak to the anchor.
- Pick model — see
references/model-picker.md:
--model auto:- Photo provided + identity preserve critical (named speaker) →
nano-banana-pro - Photo provided + brand-style transfer needed →
flux-2-proorseedream-5 - Photo provided + Latin/CJK text needed →
gpt-image-2 - No photo + text-heavy →
ideogram-3-quality - No photo + photoreal style →
nano-banana-proorflux-2-pro --model: explicit override.- ONE model for all aspects (consistency across the family).
- Build per-aspect prompts — see
references/composition-zones.md:
Each aspect has a composition template with three zones:
- Headline zone (top 20-25%): title in large bold typography
- Visual zone (middle 50-55%): photo integration if provided, else style anchor visual
- Details zone (bottom 25-30%): date + location + CTA in smaller typography
The prompt assembly per aspect: ```
Composition:
Embed text: Headline: ""
Aspect ratio: Size: ```
- Estimate cost + confirm — sum aspects × variants. Under default carousel budget ($1.50) → no prompt; over → ask once.
- Batch execute —
common.runners.batch.run_batch():
- Parallelism default 2 (each aspect = ~5-10s API call; running 3 in parallel rarely problematic but rate-limit safety)
- Manifest updated after each aspect
--resumeretries only failed aspects
- Output:
`` ./generated/flyer// portrait.png (1080×1350) square.png (1080×1080) story.png (1080×1920) landscape.png (1920×1080, if requested) a4.png (1240×1754, if requested) manifest.json style-used.md prompts.md ``
stdout last lines: `` Flyer: ./generated/flyer// (N/M aspects succeeded) Files: portrait.png · square.png · story.png ``
MODES
Required
flyer-maker --title ""
Strongly recommended (provide ≥1)
--date ""— free-form date / time--location ""--cta ""— call to action (e.g., "Tickets: link in bio", "RSVP via DM", "Free entry")
Optional content
--subtitle ""— secondary line under the title--photo— reference image to embed (speaker face, venue shot, theme image)--lang en|ru— language of embedded text (default: matches the language of--title)
Visual
--style auto|— visual style (uses carousel style library; default auto)--style-mod ""— append a tweak to the chosen anchor--aspects portrait,square,story,landscape,a4— comma list (default:portrait,square,story)--variants N— N takes per aspect (default 1)--model auto|— image provider (default auto)
Execution
--execute— actually generate (else returns plan + prompts)--output— custom output (default./generated/flyer//)--parallelism N— concurrent API calls (default 2, max 4)--yes— skip cost confirmation--resume— retry only failed aspects--strict— fail (don't auto-substitute) if--modelcan't handle--photo
Inspection
--prompts-only— print plan + per-aspect prompts, exit (no API call)--cost-only— print total cost, exit--check— validate env vars + library files exist
STRUCTURED LAYOUT (Ideogram 4 only)
When --model is an ideogram-4* tier, emit the layout as structure instead of flattening it into a sentence: add json_prompt to each plan item's kwargs, following [common/references/json-prompt.md](../../common/references/json-prompt.md). This skill already knows where every element goes; sending that directly is what stops the arrangement drifting between variants.
On any v3 tier the provider refuses a json_prompt rather than ignoring it, so keep the prose prompt as written and send nothing extra.
REFERENCES (load on demand)
| File | When to load | |---|---| | [references/event-details.md](references/event-details.md) | Step 1 — required vs. optional fields, formatting conventions for date/time/location | | [references/aspect-presets.md](references/aspect-presets.md) | Step 5 — pixel dimensions, social-platform-specific recommendations | | [references/composition-zones.md](references/composition-zones.md) | Step 5 — headline/visual/details zone layouts per aspect, anti-clutter rules | | [references/model-picker.md](references/model-picker.md) | Step 4 — auto-pick decision tree, capability matrix, cost preview | | [references/troubleshoot.md](references/troubleshoot.md) | When text renders wrong, photo doesn't integrate, layout collapses |
EXAMPLES
See [examples/before-after.md](examples/before-after.md) — 3 calibration runs: solo founder workshop with embedded speaker photo (Nano Banana Pro), conference poster without photo using bold typographic Swiss style (Ideogram 3 Quality), three-aspect launch event with Kinfolk-minimal aesthetic + RU+EN bilingual variant (gpt-image-2).
CONSTRAINTS
- Embedded text on image is the differentiator. Without text rendering, this is just a styled image — use
image-promptdirectly. The skill defaults to text-friendly models because the title + details MUST land readable.
- Headlines ≤8 words. Past 8 words, even the best text-in-image models distort. The validator warns; the prompt assembly trims if longer.
- One model for all aspects. Mixing providers across the portrait / square / story batch breaks visual cohesion. Lock per-flyer.
- One style for all aspects. Same anchor across the batch.
- Photo identity preserve uses Nano Banana Pro by default. For speaker portraits in a flyer, NBP is the safest pick. Override with
--model gpt-image-2if you need text + photo blended in a stylized layout.
- Aspect compositions differ. A 1080×1350 portrait and a 1080×1920 story have different headline/details zones — see
references/composition-zones.md. Don't assume the prompt is identical across aspects.
- Cost confirm ONCE per batch. Sum across all aspects + variants.
--prompts-onlyis the safety dry-run. Always recommend it for first iteration — flyers iterate on copy + composition more than on style.
- Manifest updates after every aspect.
--resumeretries only failed ones.
- No QR codes in v1. If you need a QR (ticketing link, venue map), generate separately and overlay in a real image editor.
- No print-ready output in v1. Outputs are RGB PNG at digital resolutions. For print: open in a DTP tool and convert.
- Event-slug derived from title. Default: kebab-case of title, max 40 chars + date suffix. Override via
--output.
--photoaccepts local paths AND URLs. Provider routes accordingly.
- Never print API keys. Mask in errors.
- Output dir is
./generated/flyer//by default.
INVOCATION HINTS
When the user says any of:
- "make a flyer for X", "event poster for Y", "workshop flyer"
- "meetup poster", "concert poster", "exhibition flyer"
- "use this photo on a flyer", "put my face on a workshop poster"
- "flyer with embedded date and location"
- "промо для мероприятия", "афиша", "плакат", "флайер"
- "сделай афишу для воркшопа / встречи / митапа"
- "афиша с моей фоткой"
Defaults: --aspects portrait,square,story --style auto --model auto. Without --execute, returns prompts + plan; with --execute, generates files.
If the user mentions a specific platform (Instagram → emphasize 4:5 portrait + 9:16 story; LinkedIn → emphasize 1:1 square + 1.91:1 landscape; print → suggest A4 aspect), bias --aspects accordingly.
This skill is distinct from:
image-prompt— that writes prompts for any image; this orchestrates a multi-aspect batch for flyers specificallycarousel-builder— that's N-slide narrative; this is 1-image-per-aspect event postersreel-builder— that's video; this is static images
For album / book / podcast covers: use image-prompt --execute with a simpler one-shot prompt (no event-details structure). A dedicated cover-maker skill is planned (see ROADMAP).
For YouTube thumbnails: image-prompt --execute with 16:9 size + face + bold title. A dedicated thumbnail-maker skill is planned.
Source & license
This open-source skill is cataloged on AgentStack and links to its original source — we do not rehost the code.
- Author: Mikefluff
- Source: Mikefluff/skills
- License: MIT
- Homepage: https://www.npmjs.com/package/@mikefluff/skills
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.