Getting it into your agent
One page per mod, every tool's command on it. A separate URL per tool would split the same page into five that compete with each other.
npx skills add datatorag/mcp-gateway --skill product-capturegit clone --depth 1 https://github.com/datatorag/mcp-gatewayWrote this? Show the measurements
A badge with what this costs and how it scanned, read live from this page, so it follows the numbers instead of freezing them. Markdown for a README, HTML for a documentation site or a project page.
[](https://agentmods.dev/skills/datatorag/mcp-gateway/product-capture)<a href="https://agentmods.dev/skills/datatorag/mcp-gateway/product-capture"><img src="https://agentmods.dev/badge/skills/datatorag/mcp-gateway/product-capture/github.svg" alt="Measured on agentmods" height="20"></a>Or the 80×15 button, for a site that already has a row of RSS and ATOM ones. Only the verdict fits; the numbers stay here.
<a href="https://agentmods.dev/skills/datatorag/mcp-gateway/product-capture"><img src="https://agentmods.dev/badge/skills/datatorag/mcp-gateway/product-capture.svg" alt="Reviewed on agentmods" width="80" height="20"></a>What it costs to keep this loaded
Counted locally with the o200k_base tokenizer, which is exact for GPT models; Claude uses its own tokenizer and its counts differ. Treat this as one consistent yardstick across the catalogue rather than a bill. Prices are per million input tokens.
| Model | Per session | Once invoked |
|---|---|---|
| Fable 5.1 | $0.00066 | $0.01459 |
| Opus 5 | $0.00033 | $0.00730 |
| Sonnet 5 | $0.00013 | $0.00292 |
| Haiku 4.5 | $0.00007 | $0.00146 |
Grade A, and why
product-capture scanned grade A with 0 findings against 26 rules in 11 categories — prompt injection, anti-refusal, data exfiltration, privilege escalation, supply chain, agent snooping, system-prompt leakage, SSRF and excessive agency — measured 8d ago.
A static scan of the body, not an audit. Every finding is printed with the line that produced it so you can judge whether it matters here. A mod is markdown that instructs an agent; that is exactly why what it instructs is worth reading.
Nothing flagged
None of the 26 patterns this scan looks for appear in this file: no shell pipes, no recursive deletes, no credential paths, no hidden text, no instruction-override or anti-refusal phrasing, no agent-config snooping. That is not a guarantee, it is the absence of the things that are checkable.
How it starts
The opening of the file, as written. The whole thing — 103 lines — stays where its author put it; the contents beside it link to each section on GitHub.
Product Capture (Remotion)
tools/capture/ is a Remotion project whose shots import the gateway's real
components via the @/ alias (@/components/... resolves to
apps/gateway/src). That is the entire point: a copied component is a
snapshot that drifts the moment the UI changes; an imported one means a
screenshot cannot silently misrepresent the product. If a render looks
wrong, the product looks wrong, and you just found a bug worth filing.
Layout
tools/capture/
remotion.config.ts # publicDir → gateway/public, webpack: tailwind + @ alias + react dedupe
src/index.ts # registerRoot + asset shim install
src/Root.tsx # <Still> per shot per format, <Composition> for motion
src/style.css # imports the gateway's real globals.css + animation kill
src/lib/formats.ts # per-format sizes/zoom/padding (the only place units live)
src/lib/cue.ts # SETTLED cue + spring helpers (one component = video + still)
src/lib/fonts.ts # Inter/Montserrat/PT Mono via @remotion/google-fonts
src/lib/asset-shim.ts# rewrites root-absolute <img> srcs through staticFile()
src/shots/*.tsx # one file per shot; connector-card.tsx is the reference
out/ # renders (gitignored)
Commands (run from tools/capture/)
pnpm install --ignore-workspace # once; tools/ is outside the pnpm workspace
npx remotion studio # live preview while authoring
npx remotion still connector-card-landscape out/connector-card-landscape.png
npx remotion render connector-card-video out/connector-card.mp4
The traps (each of these cost real time — do not relearn them)
AbsoluteFillhard-setswidth/heightto 100%, soright/bottominset props on it silently do nothing. Use it only as the stage background; position content with plainposition: absolutedivs.- CSS animations/transitions are unusable. They run on wall-clock time
while Remotion seeks its own frame clock, so state differs frame to frame.
src/style.csskills them globally (*, *::before, *::after { animation: none !important; transition: none !important; }) — leave that block alone and drive all motion fromuseCurrentFrame(). - Author narrow, scale with CSS
zoom. Shots are authored atAUTHOR_WIDTH(430px) and zoomed per format.zoomparticipates in layout (the container sizes itself to the zoomed content); ascale()transform does not, and everything overlaps. This is what keeps the product'stext-xslegible — capturing at natural width produces unreadable strips. - Sizing is per-format, always. A value tuned for 1200x628 overflows
960x1200. Every unit that differs by format lives in
src/lib/formats.ts; never hardcode one in a shot. - Stills come from a cue in the past. Give animated components
cue = SETTLED(-400) and every spring sits at its final value, so one component set serves both video and images. No static variants to drift. - No top-level await (the bundler targets chrome85). Font loading and any
async setup go through
delayRender/continueRender—@remotion/google-fontswraps this for fonts (src/lib/fonts.ts). - Remotion does not serve
public/at the URL root. Author shots withstaticFile("icons/services/gmail.svg"). Product components that hardcode root-absolute srcs (ServiceIcon, logos) are handled bysrc/lib/asset-shim.ts, which rewrites them throughstaticFile()at runtime;remotion.config.tspoints the public dir at the gateway's realpublic/, so the rewritten URL serves the real asset. Do not fork components to fix their paths. - next/font does not exist here. The theme's
--font-inter/--font-montserrat/--font-pt-monovariables are bound insrc/style.cssto faces loaded bysrc/lib/fonts.ts. A serif-looking render means font loading broke, not that the theme changed. - Two React copies break hooks. Gateway components would resolve the
gateway's React while shots use this project's.
remotion.config.tsaliasesreact/react-domto one copy — if you see "invalid hook call", check that alias before anything else. - Review outputs as one contact sheet, not one at a time. A single grid
of 17 assets surfaced six problems that per-asset review had missed
(2026-07-27). Render everything, then eyeball a grid:
magick montage out/*.png -tile 4x -geometry +8+8 sheet.png, or an HTML page of<img>s if ImageMagick isn't around.
What this file has done since we first saw it
Hashed on every crawl. A supply-chain change to an agent config is a question of when, not whether, so the history is kept rather than the latest state alone.
- 8d ago First seen · 103 lines · 66 tokens per session scan A 7123a360483c
product-capture is a skill published in the GitHub repository datatorag/mcp-gateway (4 stars, last pushed yesterday), licensed MIT. It adds 66 tokens to every session and 1,459 once invoked, about $0.0003 per session on Opus 5. A static security scan graded it A with 0 findings. No closer match exists in the catalogue, so it is treated as the original; first seen 2026-08-31.
Other skills, from other repositories
html-ppt-zhangzara-retro-zine
A neighborhood zine on the disappearing corner shops — portraits, voices, and what a block loses when they close. Built as a decision-grade story deck for community, local readers.
html-ppt-zhangzara-studio
A photography studio's portfolio-and-rate deck — the signature work, the process, and the packages that win the brief. Built as a decision-grade design craft deck for prospective clients.
motion-frames
A single-frame motion-design composition with looping CSS animations — rotating type ring, animated globe, ticking timer, parallax labels. Renders as a hero video poster you can hand straight to HyperFrames or any keyframe-based exporter. Use when the brief asks for "motion design", "animated hero", "loop", "video…
webgl-halftone-drift
A self-contained WebGL2 hero: a flowing field screened through a rotated halftone dot grid into a duotone print aesthetic; move the cursor to bend the drift.
webgl-holographic-foil
A self-contained WebGL2 hero: thin-film interference over a crushed-foil surface whose palette shifts with the viewing angle; move the cursor to tilt the film.
motion-graphics
A short, design-led motion graphic where motion is the message — kinetic typography, stat count-up, chart/data-viz hit, logo sting / brand lockup, lower-third / callout / social overlay, animated map (highlight regions, connect places, zoom to a location), animated tweet / news-article / headline, webpage / UI…