Not in the top 1,000 by GitHub stars
ucsandman/marketing-studio
Create product launch assets with Remotion, then review and distribute them through guarded, dry-run-first workflows.
History
Review weekly changes to SKILL.md before updating. Dates mark the weeks in which we observed each version; checks apply to the recorded commits.
View weekly changes
skills/announce/SKILL.md
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Instructions only
First observation → 66cd1c30919f
No earlier version was observed for comparison.
skills/audio-track/SKILL.md
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 66cd1c30919f
No earlier version was observed for comparison.
skills/de-vibe/SKILL.md
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Local scripts
First observation → 66cd1c30919f
No earlier version was observed for comparison.
skills/frontend-verify/SKILL.md
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Local scripts
First observation → 66cd1c30919f
No earlier version was observed for comparison.
skills/launch/SKILL.md
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Instructions only
First observation → 66cd1c30919f
No earlier version was observed for comparison.
skills/launch-video/SKILL.md
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Local scripts
First observation → 66cd1c30919f
No earlier version was observed for comparison.
skills/logo-reveal/SKILL.md
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Local scripts
First observation → 66cd1c30919f
No earlier version was observed for comparison.
skills/marketing/SKILL.md
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 66cd1c30919f
No earlier version was observed for comparison.
skills/marketing-studio/SKILL.md
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 66cd1c30919f
No earlier version was observed for comparison.
skills/og-assets/SKILL.md
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 66cd1c30919f
No earlier version was observed for comparison.
skills/polish/SKILL.md
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Instructions only
First observation → 66cd1c30919f
No earlier version was observed for comparison.
skills/product-demo/SKILL.md
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Instructions only
First observation → 66cd1c30919f
No earlier version was observed for comparison.
skills/ship/SKILL.md
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Instructions only
First observation → 66cd1c30919f
No earlier version was observed for comparison.
skills/ship-it/SKILL.md
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Instructions only
First observation → 66cd1c30919f
No earlier version was observed for comparison.
skills/social-clip/SKILL.md
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Local scripts
First observation → 66cd1c30919f
No earlier version was observed for comparison.
Verified commit 66cd1c30919f1144c60aed3692a915bb0b2c6238
git clone --filter=blob:none --no-checkout https://github.com/ucsandman/marketing-studio.git .hotskills/ucsandman-marketing-studio && git -C .hotskills/ucsandman-marketing-studio checkout --detach 66cd1c30919f1144c60aed3692a915bb0b2c6238
# Copy each selected skill directory from .hotskills/ucsandman-marketing-studio into .claude/skills/<skill-name>/Heat
0.4- Star growth, last 7 daysNot available
- Star growth, last 24 hoursNot available
- Rank movement, last 7 daysNot available
- Commits, last 30 daysNot available
- Accounts asking about it through MCP, last 7 daysNot available
- Hot votes this weekNot available
Heat never changes the order by stars, and sponsorship never touches it. How heat works
Stars over time
30-day change not yet available: not enough history.
Individual skills in this repository
- announce
skills/announce - audio-track
skills/audio-track - de-vibe
skills/de-vibe - frontend-verify
skills/frontend-verify - launch
skills/launch - launch-video
skills/launch-video - logo-reveal
skills/logo-reveal - marketing
skills/marketing - marketing-studio
skills/marketing-studio - og-assets
skills/og-assets - polish
skills/polish - product-demo
skills/product-demo - ship
skills/ship - ship-it
skills/ship-it - social-clip
skills/social-clip
How it works
announce
When your agent uses it
Use when a product or feature is ready to go public — after shipping, when the user says "announce it", "go live", "tell people about it", or wants a release marketed end to end.
What it loads into context
Frontmatter
48 tokensAlways available to the agent
SKILL.md
1,429 tokensWhen the skill is activated
Reference documents
2,392 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- 1. Pre-flight (verify, don't assume)
- 2. Assets
- 3. Announcement drafts (draft only — approval gate before ANY send)
- 4. Publish (only after explicit approval, channel by channel)
- 5. Post-launch loop
- Failure modes
Files
../../.claude-plugin/marketplace.jsonasset927 bytes../../.claude-plugin/plugin.jsonasset1,162 bytesSKILL.mdcore6,170 bytesreferences/strategy.mddoc3,818 bytesreferences/virality.mddoc6,394 bytes
Read SKILL.md
# Launch: ship → announce → measure
Chains existing capabilities into one launch pass. Draft everything, send nothing without approval — external comms are a CLAUDE.md Hard Stop.
The announcement rules below are distilled from sharing research and current platform-algorithm behavior; the full notes (per-platform signal weights, HN/PH/Reddit norms, sources) are in `references/virality.md` — read it when drafting for a channel not covered here or when the user asks why a rule exists. For strategy above the per-post mechanics (ORB channel portfolio, five-phase rollout, relaunch cadence, measurement loop), read `references/strategy.md` — especially when planning a launch rather than executing one.
## 1. Pre-flight (verify, don't assume)
- Uncommitted work? Run `/ship` first.
- Prod deploy live: check latest deployment status/logs (offlocal `get_latest_deployment_logs` / Vercel tools).
- Domain resolves, HTTPS works, OG meta + title + favicon present: fetch the live page and look.
- UI-facing? Run `/de-vibe` if it hasn't had a pass.
## 2. AssetsView the complete source on GitHubaudio-track
When your agent uses it
Use when the user wants music, voiceover, narration, or a soundtrack added to a video asset, OR wants standalone generated audio for any purpose (e.g. "/audio-track", "add music to the launch video", "narrate the demo", "make a 30 second music sting", "generate a voiceover mp3", "jingle for the intro").
What it loads into context
Frontmatter
83 tokensAlways available to the agent
SKILL.md
1,192 tokensWhen the skill is activated
Reference documents
2,991 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Recipe A0: bespoke film
- Recipe A: video soundtrack
- Recipe B: standalone audio
Scripts executed separately
../../feeders/audio/client.mjs../../feeders/audio/client.mjs../../scripts/build-sfx.mjs../../scripts/check-audio.mjs../../scripts/check-audio.mjs../../scripts/level-sfx.mjs../../scripts/level-sfx.mjs../../scripts/level-sfx.mjs../../scripts/lib/env.mjs../../scripts/lib/workspace.mjs../../scripts/score-film.mjs../../scripts/score-film.mjs../../scripts/verify-cue.mjs../../scripts/verify-cue.mjs../../scripts/verify-cue.mjs
Files
../../docs/playbook/audio.mddoc10,868 bytes../../feeders/audio/client.mjsruns16,405 bytes../../feeders/audio/client.mjsruns16,405 bytes../../scripts/build-sfx.mjsruns3,744 bytes../../scripts/check-audio.mjsruns8,112 bytes../../scripts/check-audio.mjsruns8,112 bytes../../scripts/level-sfx.mjsruns4,600 bytes../../scripts/level-sfx.mjsruns4,600 bytes../../scripts/level-sfx.mjsruns4,600 bytes../../scripts/lib/env.mjsruns968 bytes../../scripts/lib/workspace.mjsruns6,619 bytes../../scripts/score-film.mjsruns16,808 bytes../../scripts/score-film.mjsruns16,808 bytes../../scripts/verify-cue.mjsruns4,111 bytes../../scripts/verify-cue.mjsruns4,111 bytes../../scripts/verify-cue.mjsruns4,111 bytesSKILL.mdcore4,507 bytesSKILL.mdcore4,507 bytesSKILL.mdcore4,507 bytesSKILL.mdcore4,507 bytes
Read SKILL.md
# Audio Track
**REQUIRED BACKGROUND:** marketing-studio skill. Work in `${CLAUDE_SKILL_DIR}/../..`.
Read `${CLAUDE_SKILL_DIR}/../../docs/playbook/audio.md` first (endpoints, ducking, manifest contract).
Every film gets this pass; it is not opt-in (CLAUDE.md: a film is not done without
audio, and audio means narration). `node scripts/check-audio.mjs <brand> --project <product>` is the exit
gate for all three recipes that touch video.
Three modes; pick by what the target is:
- **Bespoke film** (`studio/src/films/<brand>/`, e.g. PostflopFilm) — post-render
scoring with `scripts/build-<brand>-film-audio.mjs` + `scripts/score-film.mjs`.
Recipe A0.
- **Video soundtrack** — a directed LaunchVideo composition scored with music andView the complete source on GitHubde-vibe
When your agent uses it
Audit and fix the tells that software was vibe-coded / AI-generated, then give it a small distinctive identity, so it ships looking handcrafted and professional. Use whenever the user says "de-vibe", "does this look AI-generated / vibe coded?", "make this look shippable / handcrafted / professional", "remove the AI slop", "polish before launch", asks why their site "looks like every other AI site", or is about to ship/demo/hand off a project that was built largely with AI assistance — even if they don't use the word "vibe". Pairs naturally before /ship.
What it loads into context
Frontmatter
132 tokensAlways available to the agent
SKILL.md
1,898 tokensWhen the skill is activated
Reference documents
3,660 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Workflow
- Judgment notes
Files
SKILL.mdcore8,379 bytesSKILL.mdcore8,379 bytesevals/evals.jsonasset2,100 bytesreferences/code-tells.mddoc7,527 bytesreferences/design-tells.mddoc7,522 bytes
Read SKILL.md
# De-Vibe
Vibe-coded software has a recognizable fingerprint: security holes nobody checked (wildcard CORS, committed `.env`, client-side-only auth), reliability debris (empty catches, console.log spam, tautological tests), the "AI slop" aesthetic (indigo gradients, Inter everywhere, untouched shadcn defaults, "Elevate your workflow" copy), and repo artifacts that announce how it was built. This skill removes that fingerprint and replaces the generic defaults with a small, deliberate identity — so the shipped product reads as handcrafted, and more importantly, doesn't ship with the real defects that make vibe-coded apps break in public.
Two things this skill is NOT:
- **Not a deception tool.** The point is closing the actual quality gap (the security holes and missing pieces ARE the tells), plus removing tool-attribution noise from what ships. It never fakes provenance, testimonials, stats, or history.
- **Not a full redesign.** The identity pass is bounded: token-level design changes and copy rewrites, not new layouts or features.
## Workflow
Run as four phases: **Audit → Report → Fix → Verify**. Never skip the report — the user decides on the confirm-first items before you touch them.
### Phase 1 — Audit (read-only)
View the complete source on GitHubfrontend-verify
When your agent uses it
Verify frontend changes end to end after editing a web app, instead of manually clicking through pages. Use this whenever you have changed UI code and need to confirm nothing broke: "verify my frontend", "check the site after these edits", "did my UI break", "did my changes break anything", "make sure these routes still work", "smoke test the app", "check for console errors", "validate the pages I touched". Works with Next.js (app and pages router), React, Vite, and any local dev server. Built to be token cheap: it reads console errors and failed network requests first and writes full page state to disk, so it only pulls a snapshot or a screenshot into context when a route actually fails. Use it before saying a frontend change is done.
What it loads into context
Frontmatter
186 tokensAlways available to the agent
SKILL.md
2,404 tokensWhen the skill is activated
Reference documents
1,038 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- What this replaces
- The one principle that matters
- When to take a screenshot
- Setup check
- The flow
- Config shape
- Auth protected routes
- Token rules
- Caveats
- Report template
- Files
Scripts executed separately
scripts/verify-routes.mjs
Files
SKILL.mdcore9,791 bytesreferences/playwright-cli-cheatsheet.mddoc4,089 bytesscripts/verify-routes.mjsruns11,408 bytes
Read SKILL.md
# Frontend Verify
## What this replaces
The slow loop is: edit code, start the dev server, open a browser, click each
page, watch the console, eyeball the layout, repeat. This skill does that pass
programmatically with `@playwright/cli` running headless, and it does it without
dumping every page state into the model context.
## The one principle that matters
Reading a full accessibility snapshot or a screenshot into context on every
route is the expensive part, not running the browser. So the order of operations
is always cheapest signal first:View the complete source on GitHublaunch
When your agent uses it
Take a developed project end-to-end through launch — domain, hosting, payments, email infra, algorithm-researched copy, and multi-platform distribution — with zero copy-paste. Trigger on "launch <project>", "ship <project>", "take <project> live", or "/launch <dir>".
What it loads into context
Frontmatter
66 tokensAlways available to the agent
SKILL.md
2,137 tokensWhen the skill is activated
Reference documents
0 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Sequence
- Failure handling
- Dry-run rehearsal (run this before any real launch)
- Credentials
Files
SKILL.mdcore8,665 bytesSKILL.mdcore8,665 bytes
Read SKILL.md
# /launch — full launch orchestration
You are orchestrating a product launch using two layers:
- **CLI (`launch/`, package `@marketing-studio/launch`)** — everything deterministic: state, validation, posting providers, research fetchers, payload rendering. Run it as `node "${CLAUDE_SKILL_DIR}/../../../dist/index.js" <cmd>` (or `launch <cmd>` if linked) -- the CLI lives in this package, `${CLAUDE_SKILL_DIR}/../../..`.
- **This session** — everything generative or credentialed-through-MCP: DashClaw infra calls, WebSearch synthesis, draft copywriting, and the approval gates. The CLI never holds DashClaw credentials and never sends email/SMS.
Honesty rule: each step below is labeled **[CLI]** or **[session]**. Don't do session work by shelling out, and don't reimplement CLI work inline.
Target `<dir>` is the project directory being launched (sibling of the engine repo).
Humans can drive the same engine visually with `launch ui` (local dashboard, same gates — see docs/ui-dashboard.md); this skill remains the autonomous path.
## SequenceView the complete source on GitHublaunch-video
When your agent uses it
Use when the user wants a full launch video, hero video, or 20–60s product film combining product proof, brand, narration, music, and authored motion.
What it loads into context
Frontmatter
42 tokensAlways available to the agent
SKILL.md
896 tokensWhen the skill is activated
Reference documents
10,075 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Route
- Recipe
Scripts executed separately
../../scripts/build-sfx.mjs../../scripts/check-audio.mjs../../scripts/check-audio.mjs../../scripts/contact-sheet.mjs../../scripts/judge-production.mjs../../scripts/judge-production.mjs../../scripts/judge-production.mjs../../scripts/score-film.mjs../../scripts/score-film.mjs../../studio/src/lib/launchTiming.ts
Files
../../docs/playbook/audio.mddoc10,868 bytes../../docs/playbook/capture.mddoc2,786 bytes../../docs/playbook/remotion.mddoc6,289 bytes../../docs/production-quality.mddoc20,163 bytes../../scripts/build-sfx.mjsruns3,744 bytes../../scripts/check-audio.mjsruns8,112 bytes../../scripts/check-audio.mjsruns8,112 bytes../../scripts/contact-sheet.mjsruns17,952 bytes../../scripts/judge-production.mjsruns12,190 bytes../../scripts/judge-production.mjsruns12,190 bytes../../scripts/judge-production.mjsruns12,190 bytes../../scripts/score-film.mjsruns16,808 bytes../../scripts/score-film.mjsruns16,808 bytesSKILL.mdcore3,923 bytes../../studio/src/lib/launchTiming.tsruns4,624 bytes
Read SKILL.md
# Launch Video
**REQUIRED BACKGROUND:** marketing-studio skill; also read
`${CLAUDE_SKILL_DIR}/../../docs/playbook/remotion.md`,
`${CLAUDE_SKILL_DIR}/../../docs/playbook/audio.md`, and
`${CLAUDE_SKILL_DIR}/../../docs/playbook/capture.md`. Work in `${CLAUDE_SKILL_DIR}/../..`.
Produces a scored film and its direction, shot plan, stage approvals, render evidence,
and review record inside `<product>/marketing/assets/<brand>/`. Read
[`docs/production-quality.md`](../../docs/production-quality.md) before production work.
**A film is not done without audio, and audio means a voice explaining the product.**
Scoring is not optional and `node scripts/check-audio.mjs <brand> --project <product>`
must exit 0 before the word "done". Two postflop cuts shipped silent on 2026-09-01;View the complete source on GitHublogo-reveal
When your agent uses it
Use when the user wants a logo reveal / logo animation / brand intro video for any product (e.g. "/logo-reveal", "make a logo reveal for DashClaw", "animated logo for the landing page").
What it loads into context
Frontmatter
53 tokensAlways available to the agent
SKILL.md
481 tokensWhen the skill is activated
Reference documents
2,334 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Recipe
Scripts executed separately
../../feeders/blender/render.py../../scripts/stage-blender-assets.mjs../../scripts/stage-blender-assets.mjs
Files
../../docs/playbook/blender.mddoc2,295 bytes../../docs/playbook/remotion.mddoc6,289 bytes../../feeders/blender/render.pyruns6,362 bytes../../scripts/stage-blender-assets.mjsruns3,192 bytes../../scripts/stage-blender-assets.mjsruns3,192 bytesSKILL.mdcore1,886 bytes
Read SKILL.md
# Logo Reveal
**REQUIRED BACKGROUND:** marketing-studio skill (engine location, brand onboarding);
also read `${CLAUDE_SKILL_DIR}/../../docs/playbook/blender.md` and
`${CLAUDE_SKILL_DIR}/../../docs/playbook/remotion.md`. Work happens in
`${CLAUDE_SKILL_DIR}/../..`.
Produces a product-owned logo animation under
`<product>/marketing/assets/<brand>/`. The mark's construction, product verb, material,
or environment determines the reveal; a generic glow-and-hold is not the default.
## Recipe
1. Toolchain + brand check per marketing-studio (onboard the brand first if new).View the complete source on GitHubmarketing
When your agent uses it
Use when the user wants the complete marketing asset suite for a product in one run — "/marketing", "build all the marketing assets", "generate everything for the launch", "all the animations and brand assets for X". Not for a single asset (use that asset's own skill) and not for launch copywriting alone (use /launch).
What it loads into context
Frontmatter
75 tokensAlways available to the agent
SKILL.md
5,022 tokensWhen the skill is activated
Reference documents
6,912 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Resume check — before anything else
- Phase 0 — Intake: ONE batched question round, then silence
- Phase 1 — Foundation
- Phase 2 — UI polish (only if opted in)
- Phase 3 — Asset pipeline: STRICTLY SEQUENTIAL
- Execution mode — pick by session model
- Executor-judge mode (Fable session)
- Dynamic workflows — the only two uses
- Phase 4 — Final QA
- Phase 5 — Delivery
- Phase 6 — Close out
- Red flags — stop and re-read this skill
Scripts executed separately
../../launch.py../../launch.py../../launch.py../../launch.py../../scripts/build-postkit.mjs../../scripts/build-postkit.mjs../../scripts/build-storyboard.mjs../../scripts/build-storyboard.mjs../../scripts/check-audio.mjs../../scripts/check-audio.mjs../../scripts/contact-sheet.mjs../../scripts/derive-brief.mjs../../scripts/derive-brief.mjs../../scripts/fetch-results.mjs../../scripts/install-skills.mjs../../scripts/lib/magnetic-sidecar.mjs../../scripts/lint-copy.mjs../../scripts/mission-control.mjs../../scripts/mission-control.mjs../../scripts/mission-control.mjs../../scripts/mission-control.test.mjs../../scripts/publish-bluesky.mjs../../scripts/publish-bluesky.mjs../../scripts/publish-bluesky.mjs../../scripts/score-film.mjs../../scripts/smoke.mjs
Files
../../docs/production-quality.mddoc20,163 bytes../../launch.pyruns4,169 bytes../../launch.pyruns4,169 bytes../../launch.pyruns4,169 bytes../../launch.pyruns4,169 bytes../../scripts/build-postkit.mjsruns36,989 bytes../../scripts/build-postkit.mjsruns36,989 bytes../../scripts/build-storyboard.mjsruns22,693 bytes../../scripts/build-storyboard.mjsruns22,693 bytes../../scripts/check-audio.mjsruns8,112 bytes../../scripts/check-audio.mjsruns8,112 bytes../../scripts/contact-sheet.mjsruns17,952 bytes../../scripts/derive-brief.mjsruns8,751 bytes../../scripts/derive-brief.mjsruns8,751 bytes../../scripts/fetch-results.mjsruns11,362 bytes../../scripts/install-skills.mjsruns4,528 bytes../../scripts/lib/magnetic-sidecar.mjsruns3,536 bytes../../scripts/lint-copy.mjsruns16,741 bytes../../scripts/mission-control.mjsruns78,974 bytes../../scripts/mission-control.mjsruns78,974 bytes../../scripts/mission-control.mjsruns78,974 bytes../../scripts/mission-control.test.mjsruns15,018 bytes../../scripts/platforms.jsonasset1,623 bytes../../scripts/publish-bluesky.mjsruns13,374 bytes../../scripts/publish-bluesky.mjsruns13,374 bytes../../scripts/publish-bluesky.mjsruns13,374 bytes../../scripts/score-film.mjsruns16,808 bytes../../scripts/smoke.mjsruns2,139 bytesSKILL.mdcore21,946 bytesSKILL.mdcore21,946 bytesSKILL.mdcore21,946 bytesSKILL.mdcore21,946 bytesreferences/campaign-evidence.mddoc5,736 bytesreferences/hook-formulas.mddoc3,536 bytes
Read SKILL.md
# Marketing Mega-Pipeline
One command produces a product's full asset suite: brand onboarding, UI polish, logo reveal, product demo, launch video with audio, social clips, and OG assets. The individual asset skills own their recipes; this skill owns sequencing, gates, and run state.
**REQUIRED BACKGROUND:** marketing-studio (engine-repo workflow shape and non-negotiables). All PLAYBOOK rules apply.
**Production route:** read [`docs/production-quality.md`](../../docs/production-quality.md).
Require `--project <product-repo>` and use
`<workspace> = <product>/marketing/assets/<brand>`. Every generated capture, audio file,
prop, public-stage asset, render, report, matrix row, and post kit stays in that product
workspace. Engine-local `out/` is not a product-run path.
## Resume check — before anything else
View the complete source on GitHubmarketing-studio
When your agent uses it
Use when generating any brand video, animation, image, or audio asset (logo reveal, social clip, product demo, launch video, OG image, README GIF, music, voiceover) for any product/repo, or when working inside the marketing-studio engine repo. Required background for /logo-reveal, /social-clip, /product-demo, /launch-video, /og-assets, /audio-track.
What it loads into context
Frontmatter
92 tokensAlways available to the agent
SKILL.md
960 tokensWhen the skill is activated
Reference documents
5,199 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Workflow shape (every asset skill follows this)
- Non-negotiables
- Token discipline
Scripts executed separately
../../launch.py../../launch.py../../launch.py../../launch.py../../scripts/check-audio.mjs../../scripts/check-audio.mjs../../scripts/score-film.mjs
Files
../../docs/PLAYBOOK.mddoc20,881 bytes../../launch.pyruns4,169 bytes../../launch.pyruns4,169 bytes../../launch.pyruns4,169 bytes../../launch.pyruns4,169 bytes../../scripts/check-audio.mjsruns8,112 bytes../../scripts/check-audio.mjsruns8,112 bytes../../scripts/score-film.mjsruns16,808 bytesSKILL.mdcore4,107 bytesSKILL.mdcore4,107 bytesSKILL.mdcore4,107 bytes
Read SKILL.md
# Marketing Studio
Reusable video/animation/image source lives in one engine repo (Remotion + Blender +
Playwright + ComfyUI feeders). Its root is:
${CLAUDE_SKILL_DIR}/../..
Call it ENGINE below. The product repo is PROJECT. Reusable source changes belong in
ENGINE; every generated input, capture, audio file, prop, public-stage asset, review
record, render, and delivery file belongs in
`PROJECT/marketing/assets/<brand>/`. Pass `--project PROJECT` to generators and
renderers. Do not render into ENGINE and copy out later.
**REQUIRED READING before any asset work:** `${CLAUDE_SKILL_DIR}/../../docs/PLAYBOOK.md`View the complete source on GitHubog-assets
When your agent uses it
Use when the user wants OG images, link-preview assets, animated OG loops, README GIFs, or social-card exports for any product (e.g. "/og-assets", "make an OG image and README gif").
What it loads into context
Frontmatter
51 tokensAlways available to the agent
SKILL.md
518 tokensWhen the skill is activated
Reference documents
1,736 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Recipe
Scripts executed separately
../../feeders/comfy/client.mjs../../feeders/comfy/client.mjs../../scripts/lib/workspace.mjs
Files
../../docs/playbook/remotion.mddoc6,289 bytes../../feeders/comfy/client.mjsruns6,638 bytes../../feeders/comfy/client.mjsruns6,638 bytes../../scripts/lib/workspace.mjsruns6,619 bytesSKILL.mdcore2,018 bytes
Read SKILL.md
# OG Assets
**REQUIRED BACKGROUND:** marketing-studio skill; also read
`${CLAUDE_SKILL_DIR}/../../docs/playbook/remotion.md`. Work in `${CLAUDE_SKILL_DIR}/../..`.
Produces product-owned `og.mp4`, `og.gif`, `readme.gif`, and social-card exports under
`<product>/marketing/assets/<brand>/`, optionally backed by an approved ComfyUI texture.
## Recipe
1. Toolchain + brand check per marketing-studio. Background loop staged for the brand
(Blender `background_loop` scene; seam rules in
`${CLAUDE_SKILL_DIR}/../../docs/playbook/remotion.md`) — or run with it null.
2. Optional AI hero: `node feeders/comfy/client.mjs hero --project <product> --brand <brand> [--seed N]` (needs ComfyUIView the complete source on GitHubpolish
When your agent uses it
Performs a final quality pass fixing alignment, spacing, consistency, and micro-detail issues before shipping. Use when the user mentions polish, finishing touches, pre-launch review, something looks off, or wants to go from good to great.
What it loads into context
Frontmatter
66 tokensAlways available to the agent
SKILL.md
1,847 tokensWhen the skill is activated
Reference documents
0 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- MANDATORY PREPARATION
- Pre-Polish Assessment
- Polish Systematically
- Polish Checklist
- Final Verification
Files
SKILL.mdcore8,107 bytes
Read SKILL.md
## MANDATORY PREPARATION
Invoke /frontend-design — it contains design principles, anti-patterns, and the **Context Gathering Protocol**. Follow the protocol before proceeding — if no design context exists yet, you MUST run /teach-impeccable first. Additionally gather: quality bar (MVP vs flagship).
---
Perform a meticulous final pass to catch all the small details that separate good work from great work. The difference between shipped and polished.
## Pre-Polish Assessment
Understand the current state and goals:
1. **Review completeness**:
- Is it functionally complete?View the complete source on GitHubproduct-demo
When your agent uses it
Use when the user wants a product demo video / screen recording with zooms and cursor / dashboard walkthrough clip for any product (e.g. "/product-demo", "record a demo of the app", "Screen-Studio style demo").
What it loads into context
Frontmatter
54 tokensAlways available to the agent
SKILL.md
510 tokensWhen the skill is activated
Reference documents
2,419 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Recipe
Files
../../docs/playbook/capture.mddoc2,786 bytes../../docs/playbook/remotion.mddoc6,289 bytesSKILL.mdcore2,038 bytes
Read SKILL.md
# Product Demo
**REQUIRED BACKGROUND:** marketing-studio skill; also read
`${CLAUDE_SKILL_DIR}/../../docs/playbook/capture.md` and
`${CLAUDE_SKILL_DIR}/../../docs/playbook/remotion.md`. Work in `${CLAUDE_SKILL_DIR}/../..`.
Produces `<product>/marketing/assets/<brand>/demo.mp4`: real app footage with a
timestamp-driven cursor, subject-safe camera framing, and concise captions.
## Recipe
1. Toolchain + brand check per marketing-studio. The product's app must be RUNNING
(ask the user to start it; never start their stack yourself).
2. Capture script: `feeders/capture/record-<brand>-demo.mjs`. For a new product copyView the complete source on GitHubship
When your agent uses it
Use when finished work needs to go out — the user says "ship it", "update docs commit and push", "commit and push", or asks "anything else we need to update?" before a release or at the end of a work session.
What it loads into context
Frontmatter
56 tokensAlways available to the agent
SKILL.md
1,225 tokensWhen the skill is activated
Reference documents
0 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Checklist
- Common mistakes
Files
SKILL.mdcore5,239 bytes
Read SKILL.md
# Ship
Every ship is the same ritual: verify → docs → marketing site → sync surfaces → knowledge → version → secrets → de-vibe spot-check → self-check → commit → push. Work through the checklist in order; report what shipped and what was skipped.
**If the repo has its own ship skill (e.g. `/dashclaw-ship`), use that instead.**
## Checklist
1. **Scope check.** `git status`. If other agents are working in this repo or a scope lock is active, stage only files you changed this session — never `git add -A` blindly.
2. **Verify.** Run the repo's test/lint/build (discover from package.json / pyproject / CI config). Read the output. Failures block the ship — fix first, don't push red.
3. **Docs.** Update every doc the change touches, in this commit and not a later sweep: README run steps, changelog, and internal docs (`docs/`, ADRs, runbooks, architecture notes, the repo's own `CLAUDE.md` if a convention changed). New env vars → `.env.example` + docs. New scripts and APIs get request/response examples.
4. **Marketing site.** If a public surface exists — a `site/`, `web/`, `www/`, or `landing/` dir here, a separate site repo, or a URL in the README — open the pages this change affects and fix drift: feature lists, screenshots, pricing, version numbers, docs pages, changelog/release page. Rendered proof, not a grep. Say "no public site" out loud when there isn't one; never leave it unstated.
5. **Sync other surfaces.** Anything else this repo publishes beyond the code: SDK/CLI version references, skills/plugins/MCP manifests, generated docs, dashboards, package registry metadata. List each surface as checked or n/a.
6. **Knowledge capture.** Write down what this session learned, before it evaporates:View the complete source on GitHubship-it
When your agent uses it
Ship a product end to end — render marketing assets with the marketing studio (/marketing), then run the launch/ flow (/launch) with videos attached to X, LinkedIn, Bluesky and YouTube posts. Run from the product's repo.
What it loads into context
Frontmatter
56 tokensAlways available to the agent
SKILL.md
733 tokensWhen the skill is activated
Reference documents
0 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Steps
- Rules
Files
SKILL.mdcore2,965 bytesSKILL.mdcore2,965 bytes
Read SKILL.md
# /ship-it — develop → public, one command
Run from the product repo you want to ship. Studio root = `${CLAUDE_SKILL_DIR}/../..`
(rendering). Its launch CLI lives at `${CLAUDE_SKILL_DIR}/../../launch` (distribution) —
run subcommands via `node "${CLAUDE_SKILL_DIR}/../../launch/dist/index.js" <cmd>` or
`npx --prefix "${CLAUDE_SKILL_DIR}/../../launch" launch <cmd>`, from the product repo so
its `.launch/` state lands there. This skill is the pipeline.
## Steps
1. **Find the brand + kit.** Brand id = the product's brand in `${CLAUDE_SKILL_DIR}/../../brands/<id>.json`
(ask only if ambiguous). Kit = `<product>/marketing/assets/<brand>/postkit/manifest.json`.
2. **Render if needed.** If the manifest is missing, run `/marketing` first (full pipeline, its own
approval gates). If it exists, show its `generatedAt` and ask: reuse or re-render? Staleness isView the complete source on GitHubsocial-clip
When your agent uses it
Use when the user wants a short social media video / feature announcement clip / X-LinkedIn-TikTok teaser for any product (e.g. "/social-clip", "make a clip announcing the new dashboard").
What it loads into context
Frontmatter
52 tokensAlways available to the agent
SKILL.md
433 tokensWhen the skill is activated
Reference documents
1,736 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Recipe
Scripts executed separately
../../scripts/check-audio.mjs../../scripts/check-audio.mjs../../scripts/score-film.mjs
Files
../../docs/playbook/remotion.mddoc6,289 bytes../../scripts/check-audio.mjsruns8,112 bytes../../scripts/check-audio.mjsruns8,112 bytes../../scripts/score-film.mjsruns16,808 bytesSKILL.mdcore1,780 bytesSKILL.mdcore1,780 bytes
Read SKILL.md
# Social Clip
**REQUIRED BACKGROUND:** marketing-studio skill; also read
`${CLAUDE_SKILL_DIR}/../../docs/playbook/remotion.md`. Work in `${CLAUDE_SKILL_DIR}/../..`.
Produces a scored short-form asset in `<product>/marketing/assets/<brand>/`. Its opening,
aspect-specific composition, and CTA must serve the platform rather than repeat the
launch film's end card by default.
## Recipe
1. Toolchain + brand check per marketing-studio.
2. Put approved capture/source media under the product workspace's `public/<brand>/`
tree using a repeatable product-aware feeder. The SocialClip panel zooms into it —View the complete source on GitHubSkills included
- announce
- audio-track
- de-vibe
- frontend-verify
- launch
- launch-video
- logo-reveal
- marketing
- marketing-studio
- og-assets
- polish
- product-demo
- ship
- ship-it
- social-clip
Repository facts
- License
- MIT
- Created
- Jul 10, 2026
- Last pushed
- Sep 6, 2026
- Forks
- 33
- Open issues
- 1
- Project activity
- Active
Before you install
Network or broad shellAutomated signals, not a guarantee
Checked Nov 5, 2026
Not fully analyzed: some files were too long, unreadable or missing. This never lowers the level.
Show 41 notes
feeders/audio/client.mjs:1Analysis incomplete: Referenced executable target unavailable; not analyzedscripts/check-audio.mjs:1Analysis incomplete: Referenced executable target unavailable; not analyzedscripts/level-sfx.mjs:1Analysis incomplete: Referenced executable target unavailable; not analyzedscripts/level-sfx.mjs:1Analysis incomplete: Referenced executable target unavailable; not analyzedscripts/score-film.mjs:1Analysis incomplete: Referenced executable target unavailable; not analyzedscripts/verify-cue.mjs:1Analysis incomplete: Referenced executable target unavailable; not analyzedscripts/verify-cue.mjs:1Analysis incomplete: Referenced executable target unavailable; not analyzedskills/audio-track/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedskills/audio-track/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedskills/audio-track/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedskills/de-vibe/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedskills/launch/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedscripts/check-audio.mjs:1Analysis incomplete: Referenced executable target unavailable; not analyzedscripts/judge-production.mjs:1Analysis incomplete: Referenced executable target unavailable; not analyzedscripts/judge-production.mjs:1Analysis incomplete: Referenced executable target unavailable; not analyzedscripts/score-film.mjs:1Analysis incomplete: Referenced executable target unavailable; not analyzedscripts/stage-blender-assets.mjs:1Analysis incomplete: Referenced executable target unavailable; not analyzedlaunch.py:1Analysis incomplete: Referenced executable target unavailable; not analyzedlaunch.py:1Analysis incomplete: Referenced executable target unavailable; not analyzedlaunch.py:1Analysis incomplete: Referenced executable target unavailable; not analyzed
- No broad tool permissions
- 5 dangerous shell commandsin 4 files: frontend-verify/references/playwright-cli-cheatsheet.md:22 de-vibe/SKILL.md:68 de-vibe/references/code-tells.md:80 and 1 more
- 163 network referencesin 16 files: scripts/mission-control.mjs:114 docs/production-quality.md:290 scripts/mission-control.test.mjs:150 and 13 more
- No hidden or obfuscated text
- No instruction overrides
- 68 executable scriptsin 27 files: scripts/check-audio.mjs:1 launch.py:1 scripts/score-film.mjs:1 and 24 more
- 32 references to secretsin 13 files: launch.py:25 feeders/audio/client.mjs:273 feeders/blender/render.py:25 and 10 more
- No requests to vote in Hot
Show all 268 signals by file
.claude-plugin/marketplace.json
- Network accessline 3
"owner": { "name": "Wes Sander", "url": "https://github.com/ucsandman" - Network accessline 4
"name": "Wes Sander", "url": "https://github.com/ucsandman" }, - Network accessline 5
"url": "https://github.com/ucsandman" - Network accessline 15
"author": { "name": "Wes Sander", "url": "https://github.com/ucsandman" - Network accessline 16
"name": "Wes Sander", "url": "https://github.com/ucsandman" }, - Network accessline 17
"url": "https://github.com/ucsandman" - Network accessline 19
"source": "./", "category": "productivity", "homepage": "https://github.com/ucsandman/marketing-studio", - Network accessline 20
"category": "productivity", "homepage": "https://github.com/ucsandman/marketing-studio", "tags": [ - Network accessline 21
"homepage": "https://github.com/ucsandman/marketing-studio",
.claude-plugin/plugin.json
- Network accessline 5
"author": { "name": "Wes Sander", "url": "https://github.com/ucsandman" - Network accessline 6
"name": "Wes Sander", "url": "https://github.com/ucsandman" }, - Network accessline 7
"url": "https://github.com/ucsandman" - Network accessline 8
}, "homepage": "https://github.com/ucsandman/marketing-studio", "repository": "https://github.com/ucsandman/marketing-studio", - Network accessline 9
"homepage": "https://github.com/ucsandman/marketing-studio", - Network accessline 10
"repository": "https://github.com/ucsandman/marketing-studio",
docs/PLAYBOOK.md
- Access to secretsline 47
[Credential-related source omitted]
docs/playbook/audio.md
- Network accessline 5
## Audio (ElevenLabs feeder) - Verified endpoints (Context7, do not re-derive): TTS `POST https://api.elevenlabs.io/v1/text-to-speech/{voice_id}?output_format=mp3_44100_128` - Network accessline 5
## Audio (ElevenLabs feeder) - Verified endpoints (Context7, do not re-derive): TTS `POST https://api.elevenlabs.io/v1/text-to-speech/{voice_id}?output_format=mp3_44100_128` - Network accessline 6
- Verified endpoints (Context7, do not re-derive): TTS `POST https://api.elevenlabs.io/v1/text-to-speech/{voice_id}?output_format=mp3_44100_128` with body `{"text", "model_id": "eleven_multilingual_v2"}`; Music - Network accessline 6
- Verified endpoints (Context7, do not re-derive): TTS `POST https://api.elevenlabs.io/v1/text-to-speech/{voice_id}?output_format=mp3_44100_128` with body `{"text", "model_id": "eleven_multilingual_v2"}`; Music - Network accessline 7
`POST https://api.elevenlabs.io/v1/text-to-speech/{voice_id}?output_format=mp3_44100_128` - Network accessline 7
`POST https://api.elevenlabs.io/v1/text-to-speech/{voice_id}?output_format=mp3_44100_128` - Network accessline 8
with body `{"text", "model_id": "eleven_multilingual_v2"}`; Music `POST https://api.elevenlabs.io/v1/music?output_format=mp3_44100_128` with body `{"prompt", "music_length_ms", "model_id": "music_v2"}`. Both take header - Network accessline 8
with body `{"text", "model_id": "eleven_multilingual_v2"}`; Music `POST https://api.elevenlabs.io/v1/music?output_format=mp3_44100_128` with body `{"prompt", "music_length_ms", "model_id": "music_v2"}`. Both take header - Network accessline 9
`POST https://api.elevenlabs.io/v1/music?output_format=mp3_44100_128` with body - Network accessline 9
`POST https://api.elevenlabs.io/v1/music?output_format=mp3_44100_128` with body - Access to secretsline 70
[Credential-related source omitted] - Access to secretsline 70
[Credential-related source omitted]
docs/playbook/capture.md
docs/production-quality.md
- Network accessline 290
[Ordinary Folk’s process](https://ordinaryfolk.co/process) starts sound during concept - Network accessline 290
[Ordinary Folk’s process](https://ordinaryfolk.co/process) starts sound during concept - Network accessline 291
development and combines boards, voice, sound, and music in an animatic before final animation. [Its Webflow Ecommerce case study](https://ordinaryfolk.co/project/webflow-ecommerce) shows real interface as the focal proof while dimensional - Network accessline 291
development and combines boards, voice, sound, and music in an animatic before final animation. [Its Webflow Ecommerce case study](https://ordinaryfolk.co/project/webflow-ecommerce) shows real interface as the focal proof while dimensional - Network accessline 292
animation. [Its Webflow Ecommerce case study](https://ordinaryfolk.co/project/webflow-ecommerce) - Network accessline 292
animation. [Its Webflow Ecommerce case study](https://ordinaryfolk.co/project/webflow-ecommerce) - Network accessline 293
shows real interface as the focal proof while dimensional 2D/3D work supplies context. [BUCK’s Notion case study](https://buck.co/work/notion-think-it-make-it) demonstrates the opposite of a house-template mandate: one bespoke visual concep - Network accessline 293
shows real interface as the focal proof while dimensional 2D/3D work supplies context. [BUCK’s Notion case study](https://buck.co/work/notion-think-it-make-it) demonstrates the opposite of a house-template mandate: one bespoke visual concep - Network accessline 294
[BUCK’s Notion case study](https://buck.co/work/notion-think-it-make-it) demonstrates the - Network accessline 294
[BUCK’s Notion case study](https://buck.co/work/notion-think-it-make-it) demonstrates the - Network accessline 300
The two human-authored dependency PRs were reviewed as a pair. PR #4 selects `nanoid` 3.3.17, which remains affected by [GHSA-2v37-7h3g-55p8](https://github.com/advisories/GHSA-2v37-7h3g-55p8); - Network accessline 300
The two human-authored dependency PRs were reviewed as a pair. PR #4 selects `nanoid` 3.3.17, which remains affected by [GHSA-2v37-7h3g-55p8](https://github.com/advisories/GHSA-2v37-7h3g-55p8); - Network accessline 301
3.3.17, which remains affected by [GHSA-2v37-7h3g-55p8](https://github.com/advisories/GHSA-2v37-7h3g-55p8); the 3.x fix is 3.3.18. PR #3 selects `postcss` 8.5.18, but the later source-map issue - Network accessline 301
3.3.17, which remains affected by [GHSA-2v37-7h3g-55p8](https://github.com/advisories/GHSA-2v37-7h3g-55p8); the 3.x fix is 3.3.18. PR #3 selects `postcss` 8.5.18, but the later source-map issue - Network accessline 302
[GHSA-2v37-7h3g-55p8](https://github.com/advisories/GHSA-2v37-7h3g-55p8); - Network accessline 302
[GHSA-2v37-7h3g-55p8](https://github.com/advisories/GHSA-2v37-7h3g-55p8); - Network accessline 303
the 3.x fix is 3.3.18. PR #3 selects `postcss` 8.5.18, but the later source-map issue [GHSA-fxqj-rqcc-2cmp](https://github.com/advisories/GHSA-fxqj-rqcc-2cmp) affects versions through 8.5.22; the current scoped repair targets 8.5.28. Verify - Network accessline 303
the 3.x fix is 3.3.18. PR #3 selects `postcss` 8.5.18, but the later source-map issue [GHSA-fxqj-rqcc-2cmp](https://github.com/advisories/GHSA-fxqj-rqcc-2cmp) affects versions through 8.5.22; the current scoped repair targets 8.5.28. Verify - Network accessline 304
[GHSA-fxqj-rqcc-2cmp](https://github.com/advisories/GHSA-fxqj-rqcc-2cmp) affects versions - Network accessline 304
[GHSA-fxqj-rqcc-2cmp](https://github.com/advisories/GHSA-fxqj-rqcc-2cmp) affects versions
feeders/audio/client.mjs
- Executable scriptline 1
#!/usr/bin/env node - Executable scriptline 1
Executable file; content unavailable - Network accessline 23
const ROOT = resolve(dirname(fileURLToPath(import.meta.url)), '..', '..'); const API = 'https://api.elevenlabs.io'; - Network accessline 24
const API = 'https://api.elevenlabs.io'; - Network accessline 154
const generate = async (url, body, key, timeout) => { const res = await fetch(url, { - Network accessline 155
const res = await fetch(url, { - Network accessline 170
const generateJson = async (url, body, key, timeout) => { const res = await fetch(url, { - Network accessline 171
const res = await fetch(url, { - Access to secretsline 273
[Credential-related source omitted] - Access to secretsline 274
[Credential-related source omitted] - Access to secretsline 279
[Credential-related source omitted] - Access to secretsline 283
[Credential-related source omitted] - Access to secretsline 286
[Credential-related source omitted]
feeders/blender/render.py
feeders/comfy/client.mjs
- Executable scriptline 1
#!/usr/bin/env node - Executable scriptline 1
Executable file; content unavailable - Network accessline 73
const probe = async () => { for (const port of PORTS) { const base = `http://127.0.0.1:${port}`; - Network accessline 74
for (const port of PORTS) { const base = `http://127.0.0.1:${port}`; try { - Network accessline 75
const base = `http://127.0.0.1:${port}`; try { const res = await fetch(`${base}/system_stats`, {signal: AbortSignal.timeout(2000)}); - Network accessline 76
try { const res = await fetch(`${base}/system_stats`, {signal: AbortSignal.timeout(2000)}); if (res.ok) return base; - Network accessline 77
const res = await fetch(`${base}/system_stats`, {signal: AbortSignal.timeout(2000)}); - Network accessline 98
const info = await ( await fetch(`${base}/object_info/CheckpointLoaderSimple`, {signal: AbortSignal.timeout(10_000)}) - Network accessline 99
await fetch(`${base}/object_info/CheckpointLoaderSimple`, {signal: AbortSignal.timeout(10_000)}) - Network accessline 116
const queue = await ( await fetch(`${base}/prompt`, { - Network accessline 117
await fetch(`${base}/prompt`, { - Network accessline 133
await sleep(POLL_MS); const history = await ( await fetch(`${base}/history/${queue.prompt_id}`, {signal: AbortSignal.timeout(10_000)}) - Network accessline 134
const history = await ( await fetch(`${base}/history/${queue.prompt_id}`, {signal: AbortSignal.timeout(10_000)}) ).json(); - Network accessline 135
await fetch(`${base}/history/${queue.prompt_id}`, {signal: AbortSignal.timeout(10_000)}) - Network accessline 146
const params = new URLSearchParams({filename: img.filename, subfolder: img.subfolder, type: img.type}); const bytes = Buffer.from( await (await fetch(`${base}/view?${params}`, {signal: AbortSignal.timeout(60_000)})).arrayBuffer(), - Network accessline 147
const bytes = Buffer.from( await (await fetch(`${base}/view?${params}`, {signal: AbortSignal.timeout(60_000)})).arrayBuffer(), ); - Network accessline 148
await (await fetch(`${base}/view?${params}`, {signal: AbortSignal.timeout(60_000)})).arrayBuffer(),
launch.py
- Executable scriptline 1
Executable file - Executable scriptline 1
Executable file; content unavailable - Executable scriptline 1
Executable file; content unavailable - Executable scriptline 1
Executable file; content unavailable - Executable scriptline 1
Executable file - Executable scriptline 1
Executable file; content unavailable - Executable scriptline 1
Executable file; content unavailable - Executable scriptline 1
Executable file; content unavailable - Access to secretsline 25
[Credential-related source omitted] - Access to secretsline 25
[Credential-related source omitted] - Network accessline 45
for port in (8000, 8188): # ComfyUI Desktop / classic default try: urllib.request.urlopen(f"http://127.0.0.1:{port}/system_stats", timeout=1) - Network accessline 45
for port in (8000, 8188): # ComfyUI Desktop / classic default try: urllib.request.urlopen(f"http://127.0.0.1:{port}/system_stats", timeout=1) - Network accessline 46
try: urllib.request.urlopen(f"http://127.0.0.1:{port}/system_stats", timeout=1) return True - Network accessline 46
try: urllib.request.urlopen(f"http://127.0.0.1:{port}/system_stats", timeout=1) return True - Network accessline 47
urllib.request.urlopen(f"http://127.0.0.1:{port}/system_stats", timeout=1) - Network accessline 47
urllib.request.urlopen(f"http://127.0.0.1:{port}/system_stats", timeout=1) - Access to secretsline 100
[Credential-related source omitted] - Access to secretsline 100
[Credential-related source omitted] - Access to secretsline 104
[Credential-related source omitted] - Access to secretsline 104
[Credential-related source omitted]
scripts/build-postkit.mjs
scripts/build-sfx.mjs
scripts/build-storyboard.mjs
scripts/check-audio.mjs
- Executable scriptline 1
#!/usr/bin/env node - Executable scriptline 1
Executable file; content unavailable - Executable scriptline 1
#!/usr/bin/env node - Executable scriptline 1
Executable file; content unavailable - Executable scriptline 1
#!/usr/bin/env node - Executable scriptline 1
Executable file; content unavailable - Executable scriptline 1
#!/usr/bin/env node - Executable scriptline 1
Executable file; content unavailable - Executable scriptline 1
#!/usr/bin/env node - Executable scriptline 1
Executable file; content unavailable
scripts/contact-sheet.mjs
scripts/derive-brief.mjs
scripts/fetch-results.mjs
- Executable scriptline 1
#!/usr/bin/env node - Network accessline 7
// published: false}), then filled in by the operator or the launch-engine // after publishing. Shape (array or {posts: [...]}): // [{platform: 'x', url: 'https://x.com/u/status/123', variant: 'hook-2', - Network accessline 8
// after publishing. Shape (array or {posts: [...]}): // [{platform: 'x', url: 'https://x.com/u/status/123', variant: 'hook-2', // published: true}, - Network accessline 9
// [{platform: 'x', url: 'https://x.com/u/status/123', variant: 'hook-2', - Access to secretsline 18
[Credential-related source omitted] - Network accessline 68
[Credential-related source omitted] - Network accessline 69
[Credential-related source omitted] - Network accessline 70
[Credential-related source omitted] - Network accessline 82
const BSKY_PUBLIC = 'https://public.api.bsky.app/xrpc'; - Network accessline 89
let did = parsed.actor; if (!did.startsWith('did:')) { const r = await fetch(`${BSKY_PUBLIC}/com.atproto.identity.resolveHandle?handle=${encodeURIComponent(parsed.actor)}`); - Network accessline 90
if (!did.startsWith('did:')) { const r = await fetch(`${BSKY_PUBLIC}/com.atproto.identity.resolveHandle?handle=${encodeURIComponent(parsed.actor)}`); if (!r.ok) throw new Error(`resolveHandle ${r.status}`); - Network accessline 91
const r = await fetch(`${BSKY_PUBLIC}/com.atproto.identity.resolveHandle?handle=${encodeURIComponent(parsed.actor)}`); - Network accessline 99
if (uris.length === 0) return new Map(); const q = uris.map((u) => `uris=${encodeURIComponent(u)}`).join('&'); const res = await fetch(`${BSKY_PUBLIC}/app.bsky.feed.getPosts?${q}`); - Network accessline 100
const q = uris.map((u) => `uris=${encodeURIComponent(u)}`).join('&'); const res = await fetch(`${BSKY_PUBLIC}/app.bsky.feed.getPosts?${q}`); if (!res.ok) throw new Error(`getPosts ${res.status} ${res.statusText}`); - Network accessline 101
const res = await fetch(`${BSKY_PUBLIC}/app.bsky.feed.getPosts?${q}`); - Network accessline 109
[Credential-related source omitted] - Network accessline 110
[Credential-related source omitted] - Access to secretsline 110
[Credential-related source omitted] - Network accessline 111
const res = await fetch(`https://www.googleapis.com/youtube/v3/videos?part=statistics&id=${ids.join(',')}`, { - Access to secretsline 168
[Credential-related source omitted]
scripts/install-skills.mjs
- Executable scriptline 1
Executable file
scripts/judge-production.mjs
scripts/level-sfx.mjs
scripts/lib/env.mjs
scripts/lib/magnetic-sidecar.mjs
- Executable scriptline 1
Executable file - Network accessline 32
// POST http://127.0.0.1:<port>/tool, bearer token, body {tool, input}. - Network accessline 51
let response, payload; try { response = await fetch(`http://127.0.0.1:${config.port}/tool`, { - Network accessline 52
try { response = await fetch(`http://127.0.0.1:${config.port}/tool`, { method: 'POST', - Network accessline 53
response = await fetch(`http://127.0.0.1:${config.port}/tool`, {
scripts/lib/workspace.mjs
scripts/lint-copy.mjs
- Executable scriptline 1
#!/usr/bin/env node
scripts/mission-control.mjs
- Executable scriptline 1
Executable file - Executable scriptline 1
Executable file; content unavailable - Executable scriptline 1
Executable file; content unavailable - Network accessline 114
function authorizePost(req, res, path) { const expectedHost = `127.0.0.1:${port}`; if (req.headers.host !== expectedHost || req.headers.origin !== `http://${expectedHost}`) { - Network accessline 115
const expectedHost = `127.0.0.1:${port}`; if (req.headers.host !== expectedHost || req.headers.origin !== `http://${expectedHost}`) { rejectJson(res, 403, 'forbidden origin'); - Network accessline 116
if (req.headers.host !== expectedHost || req.headers.origin !== `http://${expectedHost}`) { - Network accessline 1011
<p class="dim">Start a <b>/marketing</b> run for <b>${escapeHtml(brand)}</b>, then reload. This page re-checks every 3s.</p> </div> <script>setInterval(function(){fetch('/state').then(function(r){if(r.ok)location.reload();}).catch(function( - Network accessline 1012
</div> <script>setInterval(function(){fetch('/state').then(function(r){if(r.ok)location.reload();}).catch(function(){});},3000);</script>`; } - Network accessline 1013
<script>setInterval(function(){fetch('/state').then(function(r){if(r.ok)location.reload();}).catch(function(){});},3000);</script>`; - Network accessline 1227
const body={action:ev.submitter?.value||'revise',observations:data.get('observations')||'',...reviewerIdentity()}; status.textContent='Saving…'; try{const r=await fetch('/stage-review/'+encodeURIComponent(stageName),{method:'POST',heade - Network accessline 1228
status.textContent='Saving…'; try{const r=await fetch('/stage-review/'+encodeURIComponent(stageName),{method:'POST',headers:{...MC_HEADERS,'content-type':'application/json'},body:JSON.stringify(body)});const result=await r.json().catch(() - Network accessline 1229
try{const r=await fetch('/stage-review/'+encodeURIComponent(stageName),{method:'POST',headers:{...MC_HEADERS,'content-type':'application/json'},body:JSON.stringify(body)});const result=await r.json().catch(()=>({}));if(!r.ok){status.textCon - Network accessline 1253
const body={action,observations:data.get('observations')||'',...reviewerIdentity()}; const status=form.querySelector('#productionMessage');status.textContent='Saving…'; try{const r=await fetch('/production-review',{method:'POST',headers - Network accessline 1254
const status=form.querySelector('#productionMessage');status.textContent='Saving…'; try{const r=await fetch('/production-review',{method:'POST',headers:{...MC_HEADERS,'content-type':'application/json'},body:JSON.stringify(body)});const re - Network accessline 1255
try{const r=await fetch('/production-review',{method:'POST',headers:{...MC_HEADERS,'content-type':'application/json'},body:JSON.stringify(body)});const result=await r.json().catch(()=>({}));if(!r.ok){status.textContent=result.error||('HTTP - Network accessline 1312
if(actBtn)actBtn.textContent=action==='approve'?'Approving…':'Requesting…'; try{ const r=await fetch('/asset/'+encodeURIComponent(id),{method:'POST',headers:{...MC_HEADERS,'content-type':'application/json'},body:JSON.stringify(body)}) - Network accessline 1313
try{ const r=await fetch('/asset/'+encodeURIComponent(id),{method:'POST',headers:{...MC_HEADERS,'content-type':'application/json'},body:JSON.stringify(body)}); if(!r.ok){const t=await r.text();alert('Action failed: '+t);} - Network accessline 1314
const r=await fetch('/asset/'+encodeURIComponent(id),{method:'POST',headers:{...MC_HEADERS,'content-type':'application/json'},body:JSON.stringify(body)}); - Network accessline 1331
const btns=cardEl.querySelectorAll('button');btns.forEach(b=>b.disabled=true); try{ const r=await fetch('/posted',{method:'POST',headers:{...MC_HEADERS,'content-type':'application/json'},body:JSON.stringify(body)}); - Network accessline 1332
try{ const r=await fetch('/posted',{method:'POST',headers:{...MC_HEADERS,'content-type':'application/json'},body:JSON.stringify(body)}); const j=await r.json().catch(()=>({})); - Network accessline 1333
const r=await fetch('/posted',{method:'POST',headers:{...MC_HEADERS,'content-type':'application/json'},body:JSON.stringify(body)}); - Network accessline 1360
btn.disabled=true;otherBtn.disabled=true; try{ const r=await fetch(path,{method:'POST',headers:MC_HEADERS}); - Network accessline 1361
try{ const r=await fetch(path,{method:'POST',headers:MC_HEADERS}); const body=await r.json().catch(()=>({})); - Network accessline 1362
const r=await fetch(path,{method:'POST',headers:MC_HEADERS}); - Network accessline 1451
async function refresh(){ try{ const r=await fetch('/state',{cache:'no-store'}); - Network accessline 1452
try{ const r=await fetch('/state',{cache:'no-store'}); if(r.status===404){location.reload();return;} // run.json vanished — show the no-run page - Network accessline 1453
const r=await fetch('/state',{cache:'no-store'}); - Network accessline 1489
const server = http.createServer((req, res) => { const url = new URL(req.url, 'http://localhost'); - Network accessline 1490
const url = new URL(req.url, 'http://localhost'); - Network accessline 1611
server.listen(port, '127.0.0.1', () => { const url = `http://127.0.0.1:${port}/`; - Network accessline 1612
const url = `http://127.0.0.1:${port}/`;
scripts/mission-control.test.mjs
- Executable scriptline 1
Executable file - Network accessline 150
try { const path = join(dir, 'posts.json'); const r = applyPosted(path, {platform: 'x', url: 'https://x.com/acme/status/1', variant: 'hook-b'}); - Network accessline 151
const path = join(dir, 'posts.json'); const r = applyPosted(path, {platform: 'x', url: 'https://x.com/acme/status/1', variant: 'hook-b'}); assert.equal(r.status, 200); - Network accessline 152
const r = applyPosted(path, {platform: 'x', url: 'https://x.com/acme/status/1', variant: 'hook-b'}); - Network accessline 155
assert.equal(rows.length, 1); assert.equal(rows[0].platform, 'x'); assert.equal(rows[0].url, 'https://x.com/acme/status/1'); - Network accessline 156
assert.equal(rows[0].platform, 'x'); assert.equal(rows[0].url, 'https://x.com/acme/status/1'); assert.equal(rows[0].variant, 'hook-b'); - Network accessline 157
assert.equal(rows[0].url, 'https://x.com/acme/status/1'); - Network accessline 170
writeFileSync( path, JSON.stringify([{platform: 'linkedin', url: 'https://linkedin.com/p/1', metrics: {likes: 9}}]) + '\n', - Network accessline 171
path, JSON.stringify([{platform: 'linkedin', url: 'https://linkedin.com/p/1', metrics: {likes: 9}}]) + '\n', ); - Network accessline 172
JSON.stringify([{platform: 'linkedin', url: 'https://linkedin.com/p/1', metrics: {likes: 9}}]) + '\n', - Network accessline 173
); applyPosted(path, {platform: 'x', url: 'https://x.com/acme/status/typo', variant: 'hook-a'}); applyPosted(path, {platform: 'x', url: 'https://x.com/acme/status/2', variant: 'hook-b'}); - Network accessline 174
applyPosted(path, {platform: 'x', url: 'https://x.com/acme/status/typo', variant: 'hook-a'}); - Network accessline 175
applyPosted(path, {platform: 'x', url: 'https://x.com/acme/status/2', variant: 'hook-b'}); - Network accessline 178
assert.equal(rows.length, 2, 'correcting a URL must replace the row, not double the platform'); const x = rows.find((r) => r.platform === 'x'); assert.equal(x.url, 'https://x.com/acme/status/2'); - Network accessline 179
const x = rows.find((r) => r.platform === 'x'); assert.equal(x.url, 'https://x.com/acme/status/2'); assert.equal(x.variant, 'hook-b'); - Network accessline 180
assert.equal(x.url, 'https://x.com/acme/status/2'); - Network accessline 191
try { const path = join(dir, 'posts.json'); writeFileSync(path, JSON.stringify([{platform: 'x', url: 'https://x.com/a/1', metrics: {likes: 4}}]) + '\n'); - Network accessline 192
const path = join(dir, 'posts.json'); writeFileSync(path, JSON.stringify([{platform: 'x', url: 'https://x.com/a/1', metrics: {likes: 4}}]) + '\n'); applyPosted(path, {platform: 'x', url: 'https://x.com/a/2'}); - Network accessline 193
writeFileSync(path, JSON.stringify([{platform: 'x', url: 'https://x.com/a/1', metrics: {likes: 4}}]) + '\n'); - Network accessline 194
applyPosted(path, {platform: 'x', url: 'https://x.com/a/2'});
scripts/publish-bluesky.mjs
- Executable scriptline 1
#!/usr/bin/env node - Executable scriptline 1
Executable file; content unavailable - Executable scriptline 1
Executable file; content unavailable - Access to secretsline 10
[Credential-related source omitted] - Network accessline 34
export const BSKY_MAX_GRAPHEMES = 300; export const BSKY_MAX_VIDEO_BYTES = 100 * 1024 * 1024; const ENTRY_HOST = 'https://bsky.social'; - Network accessline 35
export const BSKY_MAX_VIDEO_BYTES = 100 * 1024 * 1024; const ENTRY_HOST = 'https://bsky.social'; const VIDEO_HOST = 'https://video.bsky.app'; - Network accessline 36
const ENTRY_HOST = 'https://bsky.social'; - Network accessline 37
const VIDEO_HOST = 'https://video.bsky.app'; - Network accessline 77
// at://did:plc:xyz/app.bsky.feed.post/3kabc -> https://bsky.app/profile/<handle>/post/3kabc - Network accessline 78
export function postUrl(handle, atUri) { const rkey = String(atUri).split('/').pop(); return `https://bsky.app/profile/${handle}/post/${rkey}`; - Network accessline 79
const rkey = String(atUri).split('/').pop(); return `https://bsky.app/profile/${handle}/post/${rkey}`; } - Network accessline 80
return `https://bsky.app/profile/${handle}/post/${rkey}`; - Network accessline 83
// https://bsky.app/profile/<handle-or-did>/post/<rkey> -> {actor, rkey} - Access to secretsline 103
[Credential-related source omitted] - Network accessline 166
payload = JSON.stringify(body); } const res = await fetch(url, {method, headers, body: payload}); - Network accessline 167
} const res = await fetch(url, {method, headers, body: payload}); const json = await res.json().catch(() => ({})); - Network accessline 168
const res = await fetch(url, {method, headers, body: payload});
scripts/score-film.mjs
- Executable scriptline 1
#!/usr/bin/env node - Executable scriptline 1
Executable file; content unavailable - Executable scriptline 1
#!/usr/bin/env node - Executable scriptline 1
Executable file; content unavailable - Executable scriptline 1
#!/usr/bin/env node - Executable scriptline 1
#!/usr/bin/env node - Executable scriptline 1
#!/usr/bin/env node
scripts/smoke.mjs
- Executable scriptline 1
Executable file
scripts/stage-blender-assets.mjs
scripts/verify-cue.mjs
skills/audio-track/SKILL.md
- Access to secretsline 24
[Credential-related source omitted]
skills/de-vibe/SKILL.md
- Dangerous shell operationline 68
- Untrack (but keep locally) AI-tooling artifacts: `.claude/`, `CLAUDE.md`, `.cursorrules`, `.cursor/`, `.windsurfrules`, `.aider*` — `git rm --cached` + gitignore. Never delete the local files.
skills/de-vibe/references/code-tells.md
skills/frontend-verify/SKILL.md
- Network accessline 110
The config points at a base URL like `http://localhost:3000`. If nothing is - Network accessline 148
playwright-cli -s=fe-verify goto http://localhost:3000/pricing - Dangerous shell operationline 153
playwright-cli -s=fe-verify --raw eval "document.querySelector('h1')?.innerText" - Network accessline 169
{ "baseUrl": "http://localhost:3000", - Network accessline 170
"baseUrl": "http://localhost:3000", - Network accessline 216
playwright-cli -s=fe-verify open playwright-cli -s=fe-verify goto http://localhost:3000/login - Network accessline 217
playwright-cli -s=fe-verify goto http://localhost:3000/login
skills/frontend-verify/references/playwright-cli-cheatsheet.md
- Dangerous shell operationline 22
playwright-cli -s=v --raw eval "<expr>" # read one value from the page - Network accessline 83
playwright-cli -s=v open playwright-cli -s=v goto http://localhost:3000/login - Network accessline 84
playwright-cli -s=v goto http://localhost:3000/login - Dangerous shell operationline 90
playwright-cli -s=v eval "(el)=>el.click()" <ref>
skills/frontend-verify/scripts/verify-routes.mjs
- Executable scriptline 1
#!/usr/bin/env node - Network accessline 20
// Config shape (annotated version lives in SKILL.md): // { // "baseUrl": "http://localhost:3000", - Network accessline 21
// { // "baseUrl": "http://localhost:3000", // "session": "fe-verify", - Network accessline 22
// "baseUrl": "http://localhost:3000",
studio/src/lib/launchTiming.ts
- Executable scriptline 1
Executable file
How the signals fit together
Facts from a static read of the files at the pinned commit. They describe what the code does, not why.
Some files could not be read; the facts below still hold.
Declared and executed: 7 facts
- Contacts api.elevenlabs.io, which SKILL.md, the README and the plugin manifest do not mentionfeeders/audio/client.mjs:24High confidence
- Contacts api.x.com, which SKILL.md, the README and the plugin manifest do not mentionscripts/fetch-results.mjs:69High confidence
- Contacts public.api.bsky.app, which SKILL.md, the README and the plugin manifest do not mentionscripts/fetch-results.mjs:82High confidence
- Contacts www.googleapis.com, which SKILL.md, the README and the plugin manifest do not mentionscripts/fetch-results.mjs:111High confidence
- Contacts bsky.social, which SKILL.md, the README and the plugin manifest do not mentionscripts/publish-bluesky.mjs:36High confidence
- Contacts video.bsky.app, which SKILL.md, the README and the plugin manifest do not mentionscripts/publish-bluesky.mjs:37High confidence
- Contacts bsky.app, which SKILL.md, the README and the plugin manifest do not mentionscripts/publish-bluesky.mjs:80High confidence
Signal confidence: 253 facts
- Access to secrets in prose of documentation: a variable, placeholder or call, not a stored valuedocs/PLAYBOOK.md:47Low confidence
- Network access in prose of documentationdocs/playbook/audio.md:5Low confidence
- Network access in prose of documentationdocs/playbook/audio.md:5Low confidence
- Network access in prose of documentationdocs/playbook/audio.md:6Low confidence
- Network access in prose of documentationdocs/playbook/audio.md:6Low confidence
- Network access in prose of documentationdocs/playbook/audio.md:7Low confidence
- Network access in prose of documentationdocs/playbook/audio.md:7Low confidence
- Network access in prose of documentationdocs/playbook/audio.md:8Low confidence
- Network access in prose of documentationdocs/playbook/audio.md:8Low confidence
- Network access in prose of documentationdocs/playbook/audio.md:9Low confidence
- Network access in prose of documentationdocs/playbook/audio.md:9Low confidence
- Access to secrets in prose of documentationdocs/playbook/audio.md:70Low confidence
- Access to secrets in prose of documentationdocs/playbook/audio.md:70Low confidence
- Access to secrets in prose of documentationdocs/playbook/capture.md:19Low confidence
- Access to secrets in prose of documentationdocs/playbook/capture.md:19Low confidence
- Network access in prose of documentationdocs/production-quality.md:290Low confidence
- Network access in prose of documentationdocs/production-quality.md:290Low confidence
- Network access in prose of documentationdocs/production-quality.md:291Low confidence
- Network access in prose of documentationdocs/production-quality.md:291Low confidence
- Network access in prose of documentationdocs/production-quality.md:292Low confidence
- Network access in prose of documentationdocs/production-quality.md:292Low confidence
- Network access in prose of documentationdocs/production-quality.md:293Low confidence
- Network access in prose of documentationdocs/production-quality.md:293Low confidence
- Network access in prose of documentationdocs/production-quality.md:294Low confidence
- Network access in prose of documentationdocs/production-quality.md:294Low confidence
- Network access in prose of documentationdocs/production-quality.md:300Low confidence
- Network access in prose of documentationdocs/production-quality.md:300Low confidence
- Network access in prose of documentationdocs/production-quality.md:301Low confidence
- Network access in prose of documentationdocs/production-quality.md:301Low confidence
- Network access in prose of documentationdocs/production-quality.md:302Low confidence
- Network access in prose of documentationdocs/production-quality.md:302Low confidence
- Network access in prose of documentationdocs/production-quality.md:303Low confidence
- Network access in prose of documentationdocs/production-quality.md:303Low confidence
- Network access in prose of documentationdocs/production-quality.md:304Low confidence
- Network access in prose of documentationdocs/production-quality.md:304Low confidence
- Executable script in code of a file that runsfeeders/audio/client.mjs:1High confidence
- Executable script in code of a file that runsfeeders/audio/client.mjs:1High confidence
- Network access in code of a file that runsfeeders/audio/client.mjs:23High confidence
- Network access in code of a file that runsfeeders/audio/client.mjs:24High confidence
- Network access in code of a file that runsfeeders/audio/client.mjs:154High confidence
- Network access in code of a file that runsfeeders/audio/client.mjs:155High confidence
- Network access in code of a file that runsfeeders/audio/client.mjs:170High confidence
- Network access in code of a file that runsfeeders/audio/client.mjs:171High confidence
- Access to secrets in a comment of a file that runsfeeders/audio/client.mjs:273Low confidence
- Access to secrets in a comment of a file that runs: a variable, placeholder or call, not a stored valuefeeders/audio/client.mjs:274Low confidence
- Access to secrets in code of a file that runs: a variable, placeholder or call, not a stored valuefeeders/audio/client.mjs:279Low confidence
- Access to secrets in code of a file that runsfeeders/audio/client.mjs:283High confidence
- Access to secrets in code of a file that runs: a variable, placeholder or call, not a stored valuefeeders/audio/client.mjs:286Low confidence
- Executable script in prose of a file that runsfeeders/blender/render.py:1Low confidence
- Access to secrets in prose of a file that runs: a variable, placeholder or call, not a stored valuefeeders/blender/render.py:25Low confidence
and 203 more
Works with
| Agent | Status | Evidence | Install to |
|---|---|---|---|
| Claude Code | Native | Manifest .claude-plugin/marketplace.json | .claude/skills/<skill-name>/ |
| Codex | Compatible | Standard SKILL.md skills/announce/SKILL.md | .agents/skills/<skill-name>/ |
| Cursor | Compatible | Standard SKILL.md skills/announce/SKILL.md | .cursor/skills/<skill-name>/ |
| Gemini CLI | Compatible | Standard SKILL.md skills/announce/SKILL.md | .gemini/skills/<skill-name>/ |
| GitHub Copilot | Compatible | Standard SKILL.md skills/announce/SKILL.md | .github/skills/<skill-name>/ |
| OpenCode | Compatible | Standard SKILL.md skills/announce/SKILL.md | .opencode/skills/<skill-name>/ |
- Native The repository ships a manifest, folder or frontmatter field for this agent.
- Compatible A standard SKILL.md that this agent can read.
- Unknown No evidence either way.
Derived automatically from paths, manifests and frontmatter. Not tested on each agent.