Agent skill
deck-studio
On-brand custom visuals from the user's own brand and every source of context the agent can reach (CRM, calls, email, docs, chat, website, web research) - sales and deal decks, LinkedIn and Meta ad sets, PDF one-pagers, infographics, carousels, website hero images and custom graphics on demand, with generated imagery (OpenAI gpt-image-2.5) and real company logos.
Filed under LinkedIn and social.
From Astra-GTM/gtm-skills · 1 skill entry · 0 · pushed 2026-09-29
What it does when it runs
On-brand custom visuals from the user's own brand and every source of context the agent can reach (CRM, calls, email, docs, chat, website, web research) - sales and deal decks, LinkedIn and Meta ad sets, PDF one-pagers, infographics, carousels, website hero images and custom graphics on demand, with generated imagery (OpenAI gpt-image-2.5) and real company logos. Use for any deck, slide, ad creative, one-pager, leave-behind, infographic, carousel/document post, hero or banner image, brand/design system, or pushing a deck to Google Slides. First run sets up the brand stack and a master deck.
Automated analysis of the skill and the 56 files bundled beside it. A skill’s own description is written to be selected by an agent, so it describes the job and not the dependencies.
- Keys and connectors you must supply
- OPENAI_API_KEY
- Hosts it reaches
- acme.com
- api.openai.com
- api.svgl.app
- astragtm.io
- cdn.brandfetch.io
- cdn.example
- cdn.jsdelivr.net
- cdn.simpleicons.org
- commons.wikimedia.org
- console.cloud.google.com
- docs.google.com
- drive.google.com
- fonts.googleapis.com
- t1.gstatic.com
- theircompany.com
- www.acme.com
- www.googleapis.com
- www.wikidata.org
- Tool permissions it declares
- No
allowed-toolsin the frontmatter. It does act, so it runs under whatever permissions your session already grants. - Actions present in the files
- shellwrites filesnetwork
Install it
View source on GitHub ↗git clone --depth 1 --filter=blob:none --sparse https://github.com/Astra-GTM/gtm-skills.git /tmp/gtm-skills git -C /tmp/gtm-skills sparse-checkout set "plugins/deck-studio/skills/deck-studio" mkdir -p ~/.claude/skills/deck-studio cp -R "/tmp/gtm-skills/plugins/deck-studio/skills/deck-studio/." ~/.claude/skills/deck-studio/
Picked up without a restart. A project skill of the same name is shadowed by your personal one. For one repository only, swap ~/.claude/skills for .claude/skills. Claude Code docs ↗
Or take the whole library
This repo ships a .claude-plugin manifest, so Claude Code can install all 1 skills at once. Plugin skills are invoked as /<plugin>:<skill>, so they never collide with your own.
/plugin marketplace add Astra-GTM/gtm-skills /plugin
The folder is the same in every client that implements the format — 46 of them — so if yours is not above, only the destination changes.
Before you install: this skill will not complete its job on a bare agent. It needs OPENAI_API_KEY, which you have to obtain separately.
The skill
Source on GitHub ↗Reproduced in full from Astra-GTM/gtm-skills/blob/9abf7ff842bb653748860681936b330f2f353f0f/plugins/deck-studio/skills/deck-studio/SKILL.md, which is licensed MIT (repository). 1,489 words, 8 headings.
deck-studio
A deck is a deck.yaml; the engine renders it. The craft lives in three places
that do not depend on who is building that day: a brand stack (one token
file every render reads), a block library with measured build gates, and a
design team (art director, parallel designers, a cold critic) that learns
taste from a reference library of approved and rejected work.
Everything runs through one CLI. $DS below means python3 <this skill>/scripts/deck.py.
The user's work lives in a workspace, ~/deck-studio (or $DECK_STUDIO_HOME),
never inside this skill folder.
Rules that hold on every run
- Harvest before you write. No slide copy until the context step is done and written down with sources. Facts come from sources, never from you.
- Nothing invented. Every customer name, logo and number traces to a
source line in the deal brief or to
library/proof.yamlwithverified: true. The build enforces this for stat, case-study and practice slides; you enforce it everywhere else. An empty number slot is honest; an invented one is not. - Their words beat yours. Priorities and problems go on slides near verbatim from calls and emails.
- Look at every render before showing it. The build measures fit and lint; you judge the idea. Open the PNGs.
- Gates that need a person: brand sheet approval (setup), master deck
approval (setup), deck review before it is pushed anywhere a buyer can see it,
and any image spend over the daily image budget (default $5,
DECK_STUDIO_IMAGE_BUDGET; the image command refuses past it). - One clean headline phrase, no trailing period, no em dashes, nothing under 14px. The build fails on these; do not look for a flag to skip them.
First run: set up (once per company)
Tell the user what setup will do and roughly how long (30-60 minutes, most of it automated), then run these in order. Detail for each step is in the reference named; read it when you reach that step.
- Install and check.
$DS doctor. If anything REQUIRED is missing, ask the user once, then run$DS setup(installs the Python packages and Chromium, creates the workspace, re-runs doctor).references/setup.mdif it fails. - Harvest company context. Inventory every source you can reach and pull
everything about the user's own company: site, positioning, existing decks,
case studies, pricing, customer proof, ICP.
references/context-harvest.md(Part 1: the source inventory, Part 2: company context). - Build the brand stack.
$DS brand extract <their site>writes the evidence and a starterbrand/brand.json. Look at the evidence, correct the starter, delete its_reviewkey,$DS brand apply, openbrand/sheet.png. Show the sheet and get an explicit yes.references/brand-stack.md. - Seed proof. Write every customer, logo and figure you found into
library/proof.yamlwith its source,verified: false. Ask the user to confirm which are verified and cleared for external use. Unconfirmed stays false. - Build the master deck. Rewrite
decks/master/deck.yamlfrom the company context (the template is a skeleton),$DS build ~/deck-studio/decks/master, openreview.pngand then every slide, fix, show the user. Removedraft: trueonce they approve and every figure is verified.references/blocks.md. - Optional: Google Slides.
references/push-to-slides.md. Without it the build's.pptxstill works.
Each deal (about 20 minutes)
$DS new-deal <slug> --client-domain <their domain>(scaffolds the deck, the brief and their logo chip).- Harvest the deal. In parallel, one subagent per source: every call
transcript, email thread, CRM record and note, shared doc and chat thread about
this deal, plus web research on the company and each stakeholder. Each writes a
sourced summary into
decks/<slug>/context/. Then synthesizecontext/brief.md.references/context-harvest.md(Part 3). Ask the user only about what is still a gap. - Structure and copy.
references/deal-deck-method.md: the running order, the "what we heard" slide from their words, which master slides to reuse and what to override. Give the key slides anotes:talk track from the brief; it becomes the speaker notes. - Custom graphics. For each idea that needs showing, not telling (usually
one per workstream or proposed solution), run the design team.
references/design-team.md. Run separate ideas in parallel. - Build and look.
$DS build ~/deck-studio/decks/<slug>. Fix every FAIL; read every warn. Openreview.png, then every PNG. Check product mockups against the vendor's real docs. - Review with the user. Show them
review.png(or the PDF). Once they say yes, removedraft: true, rebuild, and deliver: the PDF or.pptxfrom the deck folder, or Google Slides with$DS push <deck> --new "<title>"(or--presentation-id <id>), then$DS verify <deck> --presentation-id <id>. Never push over a presentation id the user did not give you for this; look at it first.references/push-to-slides.md.
Everything else: ads, one-pagers, infographics, carousels, heroes, custom art
The design team makes every other kind of visual with the same brand, canon and
gates. Pick the mode that matches the ask (references/design-team.md has the
table; references/modes/<mode>.md is the craft for each):
| The ask | Mode | You get |
|---|---|---|
| "a LinkedIn / Meta ad", "ad creative" | ad (or ad-linkedin, ad-meta) | one concept rendered at every placement, safe zones enforced |
| "a one-pager", "a leave-behind", "a PDF" | one-pager | vector PDF (Letter or A4) + page PNGs |
| "an infographic" | infographic | a data story at feed or long-form size |
| "a carousel", "a document post" | carousel | multi-page PDF + one PNG per page |
| "a hero image", "a banner", "custom art" | hero (or --formats WxH) | generated plate + exact type, cropped per format |
| "a graphic for this slide" | graphic | a 1600x900 piece shipped into the deck |
The flow is the design-team loop: harvest the facts the piece needs (Part 3 of
context-harvest if it is for a deal; company context otherwise), studio direct --mode <mode>, parallel designers, render, critic, iterate, show the user, then
studio ship --export <dir> (or --deck-diagram for a slide).
Scope decides the message. Every piece is brand-level unless --deal <slug>
(or --campaign <brief>) narrows it. A brand piece (ad, hero, one-pager,
infographic, social, carousel, a graphic not tied to a deal) takes its message
from the company's whole offer: the art director writes company/offer-map.json
from company context (every offer line, the core marked, a source on each), and
the direction records which lines the piece covers. Deal briefs and
company/context/campaign-*.md never feed a brand piece. studio new refuses a
brand piece that skips the core or cites a deal source; the critic judges
"representative of the business" from the pixels; ship --export refuses a
brand piece the critic did not clear. One deal's angle leading the brand ad set
is the failure this exists to stop. Logos of other
companies come from $DS logo <domain> (references/logos.md); never draw one.
Generated imagery follows references/image-generation.md: the image model paints
the scene, HTML sets every word and logo, spend is logged against a daily budget.
Learning (this is what makes it compound)
When the user approves a graphic or slide, add it to library/reference-library.md
as a canon entry in their words. When they reject one, add an anti-example with
their quote and the fix. A graphic that proves itself across deals gets promoted
into the master deck. Do this in the same turn as the feedback.
Harness notes
- Subagents. The design team and the context harvest want parallel, independent agents: designers must not see each other's work, and the critic must never be one of the designers. In Claude Code use the Agent tool (one message, several calls). In Codex use subagents if enabled; otherwise run each role as a separate pass that starts from only its prompt file, and run the critic last from only the renders and the report.
- Seeing renders. Open PNGs with your image-reading tool. If your harness cannot view images, say so and ask the user to review the contact sheet.
- Models. Use the strongest model you have for the art director, the critic and client-facing designers.
Files
| Path | What |
|---|---|
scripts/deck.py | the CLI ($DS --help) |
references/setup.md | install, workspace, doctor |
references/context-harvest.md | source inventory, company context, deal context, web research |
references/brand-stack.md | extract, decide, apply, approve |
references/deal-deck-method.md | running order, copy rules, inheritance |
references/blocks.md | every slide block and its keys |
references/design-team.md | modes, art director, designers, critic, ship, export |
references/modes/*.md | the craft and critic checklist for each mode |
references/formats.md | every canvas: sizes, safe zones, text floors, file caps |
references/image-generation.md | generated imagery: models, prompts, references, edits, one master to many formats |
references/logos.md | other companies' logos: sources, forms, sizing, checks |
references/push-to-slides.md | Google Slides push, verify, edit gate |
assets/templates/ | master deck, deal deck, brief, proof, reference library |
assets/examples/diagrams/ | two approved-bar example graphics, brand-neutral |
Files bundled with it
These load only when the skill asks for them, so they cost nothing until it runs.
- LICENSE
- README.md
- data_foundation.html
- engagement_timeline.html
- brief.md
- deck.yaml
- deck.yaml
- proof.yaml
- reference-library.md
- blocks.md
- brand-stack.md
- context-harvest.md
- deal-deck-method.md
- design-team.md
- formats.md
- image-generation.md
- logos.md
- ad.md
- carousel.md
- graphic.md
- hero.md
- infographic.md
- one-pager.md
- social.md
- push-to-slides.md
- setup.md
- deck.py
- __init__.py
- blocks.py
- brand.py
- brand_extract.py
- build.py
- color.py
- engine.py
- formats.py
- google_auth.py
- image_gen.py
- layout.py
- lint.py
- logo_measure.py
- logo_site.py
- logo_sources.py
- logos.py
- page.py
- pageload.py
- push_slides.py
- sheet.py
- studio.py
- theme.py
- workspace.py
- requirements.txt
- test_block_defaults.py
- test_logos.py
- test_master_size.py
- test_push_slides.py
- test_studio_scope.py
Other skills for the same job
Different authors, same problem. Matched on the words in the skill name, across every library in the catalogue except this one.
- deck-generator by ericosiu · 3,608
- graphic-slide-deck by Varnan-Tech · 672
- customer-deck-builder by zapier · 342
- data-viz-deck by thatrebeccarae · 162
- looker-studio by thatrebeccarae · 162
- pro-deck-builder by thatrebeccarae · 162
- deck by octavehq · 11
- gtm-deck by getbeton · 6
Need help setting it up?
This page tells you what deck-studio does and what it needs. Cheetah builds the agent setup it runs inside: data, CRM, sequencing and the guardrails.
Book a call →The directory stays free. There is nothing gated behind this.