From pasteup
Pipeline for halftone paper-collage and stop-motion-graphic ads. Decodes a reference image into a field-editable JSON spec, generates cut-out elements directly on the Gemini image API (nano-banana line), then assembles them into build-from-empty stop motion with code: a bundled Python compositor by default, or OpenMontage's HyperFrames (HTML + GSAP) or Remotion runtimes. No paid video model needed; the assembly is deterministic. Trigger whenever the user pastes a reference to decode, replicate, or make "similar"; asks for a halftone, paper-cut, paper-collage, editorial-collage, or stop-motion-graphic look; wants a still or product turned into an animated ad or motion graphic; or says "analyze this", "break this down", "animate this", "make a collage ad", or "assemble it in". Also trigger for guided creation: "director mode", "guide me", "interview me", or a vague ask like "make me something cool for my brand". Use even when the user never says "collage" or "stop motion" but the visual is clearly this look.
How this skill is triggered — by the user, by Claude, or both
Slash command
/pasteup:pasteupThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
One pipeline, two halves: **analyze** a reference into an editable spec, then **build** on-brand elements and assemble-from-empty motion. Images come from the Gemini API directly. Motion is rendered programmatically, which makes every build guaranteed, repeatable, and free.
One pipeline, two halves: analyze a reference into an editable spec, then build on-brand elements and assemble-from-empty motion. Images come from the Gemini API directly. Motion is rendered programmatically, which makes every build guaranteed, repeatable, and free.
The look: one flat bold color field, black-and-white halftone cut-outs with clean cut edges and a soft drop shadow, one sharp idea per scene, and motion that builds the frame piece by piece instead of wobbling a finished image.
Speak in the user's language. No em dashes anywhere in output; use periods or line breaks. Keep labels and copy free of emoji unless asked.
scripts/generate_element.py, then its background is knocked out with rembg to produce a transparent PNG.scripts/assemble.py, a Pillow + ffmpeg stop-motion compositor. Deterministic build, animates on twos, per-pose jitter, snap with overshoot. Renders in seconds at zero API cost, so iteration is free.scenes/<scene>/ directories holding elements/, scene.json, and rendered output.Optional routes when the project already lives inside OpenMontage: render the same scene as HTML + GSAP through the HyperFrames runtime, or as a React composition through Remotion. See references/motion-recipes.md. An AI-video escape hatch (Kling or Seedance via fal.ai) exists only for when the user explicitly wants organic handmade wobble and accepts the cost.
generate_element.py needs a Gemini API key. Check for it before the first generation:
python scripts/generate_element.py --check-key
If missing, walk the user through it: get a free key at https://aistudio.google.com/apikey, then either
export GEMINI_API_KEY=their_key (macOS/Linux) or setx GEMINI_API_KEY their_key then reopen the terminal (Windows), or.env file in the project root containing GEMINI_API_KEY=their_key. The script reads .env from the current directory and the skill directory automatically. Never ask the user to paste the key into chat if they can set it themselves; if they do paste it, write it into .env for them and remind them the file should not be committed to git.
The script also accepts GOOGLE_API_KEY as a fallback name.pip install pillow rembg google-genai and ffmpeg on PATH. Install what is missing without asking.gemini-3-pro-image-preview; verify the current id against Google's docs at session start if generation fails, model ids rotate. Requires the API key from the setup check above.Run this whenever a reference is in play. If the user refers to an image but none is attached, ask for it rather than guessing. This phase is model-agnostic, so specs decoded in other tools or earlier sessions port over directly.
The driving question is: "If I had to regenerate this exact frame from scratch, what would I need to specify?" Over-analyze on purpose, because the next request is almost always a variation ("same look, change the color field", "same style, different idea"), and that only works if every attribute is independently swappable. For every observation, name the technique and the why, not just a label. "Has texture" is nothing. "Visible halftone dot pattern on the black-and-white elements, dense at 45 lpi, which reads as printed-magazine craft instead of flat digital" is reproducible.
## [Short title describing the frame]
### Breakdown
A walk through the dimensions under clear subheadings (Medium and craft, Color field,
Elements and cut, Composition and depth, Idea, Label, Mood). Every element carries its
technique and why.
### Element prompts
One self-contained natural-language prompt PER ELEMENT, each ready to paste into the
Gemini image model: the subject, its halftone treatment, its cut edge, on a plain white
background, flat even lighting, no cast shadow, no background scene. Plus one optional
full-frame prompt for an approval still.
### JSON spec
The field-by-field collage spec (schema below) as valid JSON.
Valid JSON, no comments, no trailing commas, every field concrete, always self-contained. Never write "same as previous". style_signature is one compact liftable line so the user can anchor other prompts to the look without carrying the whole object.
{
"medium": "",
"craft_style": "",
"aspect_ratio": "",
"style_signature": "",
"color_field": {
"background_hex": "",
"evenness": "",
"paper_grain": ""
},
"elements": [
{
"what": "",
"role": "",
"halftone": "",
"cut_edge": "",
"drop_shadow": "",
"color_treatment": "",
"placement": ""
}
],
"palette_hex": [],
"composition": {
"layout": "",
"depth_layers": "",
"negative_space": "",
"balance": ""
},
"idea": "",
"label": {
"present": "",
"content": "",
"font_character": "",
"weight": "",
"placement": "",
"treatment": ""
},
"mood": "",
"references_era": "",
"negative_prompt": ""
}
references/collage-dimensions.md holds precise vocabulary for halftone, cut, layer, color-field, and label treatments, plus a fully worked example. Read it the first time you produce a spec so the specificity is calibrated.
Note the spec's drop_shadow fields now map directly to compositor parameters (dx, dy, blur, opacity) rather than prompt language. Capture them as numbers where you can.
Decode each fully and separately, then add one ## Shared style summary capturing the common system: color-field logic, halftone density, cut and shadow convention, label treatment, idea density. Specific enough to seed a fresh on-brand frame.
If a reference was decoded in Phase A, the spec is the blueprint. If the user has only a brief or a product, draft the spec fields first (color field, idea, label), then proceed. If the user just wants stills and no motion, stop after B3.
Director mode. If the user asks for guidance ("director mode", "guide me", "help me figure out what I want", "I don't know where to start"), or the brief is too vague to draft a spec from ("make me something cool"), read references/director-mode.md and run the staged interview it describes instead of B1. It replaces B1 entirely: the interview ends with a confirmed spec, then continue at B2. Never force the interview on a user who gave a complete brief or a reference.
Help and examples. If the user asks what the skill can do, wants inspiration, use cases, or example prompts ("what can I make with this", "show me examples", "give me ideas"), pull the relevant section from references/user-guide.md (prompt library, use cases, style recipes) and present it conversationally. Offer director mode as the next step if they still seem unsure.
For users with a mostly-complete brief, fill only the gaps. If the spec and the ask already answer these, skip. Otherwise ask all at once:
For each element in the spec, call:
python scripts/generate_element.py \
--prompt "<element prompt from Phase A>" \
--out scenes/<scene>/elements/<name>.png \
--ref <product-or-brand-image, repeatable> \
--knockout
The script hits the Gemini image API, saves the result, and (with --knockout) runs rembg to produce a transparent-background PNG. Pass the product or brand reference image in every call so subject and palette stay locked across the set.
Element prompt shape (self-contained, every time):
A single cut-out collage element on a plain pure-white background: [subject], rendered
as [halftone treatment, e.g. fine black-and-white round-dot halftone, ~70 lpi], with a
[cut edge, e.g. crisp machine-cut edge with a thin white paper keyline]. Flat even
lighting, no cast shadow, no drop shadow, no background scene, no color field, premium
editorial print-craft texture. The element fills most of the frame.
Optionally also generate ONE full-frame approval still from the Phase A full-frame prompt, purely so the user signs off on the look before you animate. It is a mood target, not a production asset.
Display each element. Reroll with an adjusted prompt until approved.
Translate the collage spec into a scene.json for the compositor: canvas size and background hex from the spec, one entry per element with its target position, entry edge, entry time, and shadow numbers, then the label with font, size, tracking, and position. Full schema and a worked example live in references/motion-recipes.md. Choreography defaults that make it read as the signature look:
python scripts/assemble.py scenes/<scene>/scene.json --out scenes/<scene>/clip.mp4
Deterministic, seconds to render, zero API cost. Show the result. Iterate by editing scene.json (timing, order, jitter, shadow) and re-rendering; this loop is where the taste goes, and it is free, so use it.
Alternative render routes (see references/motion-recipes.md for the recipes):
SteppedEase for the stop-motion cadence. Choose when the project already runs OpenMontage or the brief drifts toward kinetic type.Pick ONE route per delivered set. Mixing renderers breaks the cadence and shadow consistency that makes the set read as a brand.
Lock the look once (color field, halftone and cut convention, shadow numbers, label treatment, cadence settings), then vary only the idea and elements per scene. Reuse the same scene.json skeleton with new element PNGs and positions. Consistency across scenes is what makes it read as a brand rather than one-offs.
references/collage-dimensions.md: vocabulary and taxonomies for halftone, cut and edge, drop shadow, color field, paper grain, composition, label treatment, and named collage looks, plus one fully worked decode-and-spec example. Consult when decoding a reference or calibrating a spec.references/motion-recipes.md: the scene.json schema with a worked example, the stop-motion cadence spec, and the HyperFrames/GSAP, Remotion, and fal.ai escape-hatch recipes. Consult before the first render of a session.references/director-mode.md: the staged interview protocol for guiding a user from a blank page to a confirmed spec. Consult whenever director mode triggers.references/user-guide.md: the end-user guide with the prompt library, seven worked use cases, style recipes, and FAQ. Consult when the user asks for examples, ideas, or help understanding what is possible.scripts/generate_element.py: Gemini image generation plus rembg knockout.scripts/assemble.py: the stop-motion compositor (Pillow + ffmpeg).npx claudepluginhub tmoody1973/pasteup --plugin pasteupGuides collaborative design exploration before implementation: explores context, asks clarifying questions, proposes approaches, and writes a design doc for user approval.
Creates structured, bite-sized implementation plans from specs or requirements before writing code. Useful for breaking down multi-step tasks into testable steps with file structure and task boundaries.
Synthesizes the current conversation into a structured spec (PRD) and publishes it to the project issue tracker with a ready-for-agent label, without interviewing the user.