---
name: Ship It
slug: ship-it
category: Automation
description: Ship It runs the marketing studio render flow and then the launch sequence to publish a product from its repo. Use it when you need marketing assets, dry-run previews, and coordinated posting across social platforms.
github: "https://github.com/ucsandman/marketing-studio/tree/main/skills/ship-it"
language: JavaScript
stars: 225
forks: 31
install: "npx degit https://github.com/ucsandman/marketing-studio/tree/main/skills/ship-it ~/.claude/skills/ship-it"
installs_to: ~/.claude/skills/ship-it
source_path: skills/ship-it/SKILL.md
collection_size: 15
category_size: 1754
collection_url: "https://dirskills.com/collections/ucsandman/marketing-studio"
added: 2026-09-03T06:05:20.673Z
last_synced: 2026-09-03T06:05:20.673Z
canonical_url: "https://dirskills.com/skills/ship-it"
---

# Ship It

Ship It runs the marketing studio render flow and then the launch sequence to publish a product from its repo. Use it when you need marketing assets, dry-run previews, and coordinated posting across social platforms.

**Install:**

```bash
npx degit https://github.com/ucsandman/marketing-studio/tree/main/skills/ship-it ~/.claude/skills/ship-it
```

## README

# /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 the user if ambiguous). Kit = `${CLAUDE_SKILL_DIR}/../../out/<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 is
   the user's judgment call, never a heuristic.
3. **Launch flow.** In the product repo, run the launch sequence — `launch init` (if no
   `.launch/launch.config.json`), then research, copy scaffold/fill, validate. Wire the kit:
   either set `postkitDir` in the config (the dashboard marketing tab does this with a picker) or
   pass `--kit "${CLAUDE_SKILL_DIR}/../../out/<brand>/postkit"` to `launch post`.
4. **Dry-run, then post.** `launch post <dir> --all --dry-run` and show the user the previews —
   X and LinkedIn must show the video upload step. Live posting only after the user confirms,
   through the normal gates (ledger, validation, typed confirmation in the dashboard).
5. **Manual platforms.** TikTok / Shorts / Instagram are manual by design. Point the
   user at the dashboard marketing tab (Open folder per platform) or the kit's `POST.md` checklists.
   YouTube is NOT manual any more: `launch post --all --live` uploads to it whenever the three
   YOUTUBE_* keys are set. Uploads land private unless `YOUTUBE_PRIVACY` says otherwise -- say so
   out loud before any live run, and confirm it the same way as every other api-mode platform.

## Rules

- Never skip the dry-run step. Never post live without explicit user confirmation.
- If the kit manifest promises a video whose file is missing, posting refuses — fix by re-running
  `render-matrix.mjs` + `build-postkit.mjs` in the animations repo, not by unwiring the kit silently.
- Drafts own the copy; the kit contributes media. Do not paste kit captions over validated drafts.
