skillZs
LIVE SKILL TAGS
>>> LIVE SKILLS INDEX <<<
* OPEN SOURCE *
NO LOGIN, NO TRACKING
REAL INSTALL DATA
← back to all skills
pika-labs/pika-plugins515 installs

content-director

All-in-one content director that bundles FOUR format specialists — talking-to-camera, silent POV, dance, and stitch/duet — behind a single front door. Ingests the user's Instagram or TikTok handle, then in Stage 0 asks which KIND of trend they want to make (talking / POV / dance / duet, each explained), recommends a format from their profile when they're unsure, and can present a cross-format sampler menu (~10 real trend cards with links spanning all four formats) so the user picks one card. Once a format (and optionally a specific trend) is locked, it loads the matching format playbook from `formats/<format>.md` and runs that pipeline end-to-end. Triggers — "be my content director" (when the user wants to choose a format), "what kind of trend should I make", "talking vs pov vs dance vs duet", "show me trends across formats", "content director bundle", "content-director".

How do I install this agent skill?

npx skills add https://github.com/pika-labs/pika-plugins --skill content-director
view source ↗

Is this agent skill safe to install?

  • Gen Agent Trust Hubpass

    The Content Director bundle is a video production skill from Pika-Labs that automates trend research, scriptwriting, and editing. It uses specialized tools to scrape social media, generate AI video, and facilitate filming through a browser-based teleprompter. The analysis found that the skill ingests untrusted data from social media profiles, creating a surface for indirect prompt injection, which is mitigated by identity verification steps. The skill integrates with vendor-owned infrastructure for media processing and application hosting.

  • Socketpass

    No alerts

  • Snykwarn

    Risk: MEDIUM · 1 issue

What does this agent skill do?

Content Director — Bundle (format router)

Tools below are Pika MCP tools, named bare — call each under whatever prefix your session exposes for the Pika MCP.

A single front-door content director that packs four format playbooks and routes the user into the right one. Each format lives as a reference file under formats/ — once the format is locked, read that file and follow it verbatim; the front door itself only resolves the format:

FormatFormat playbookOne-linerTeleprompter?
Talking-to-cameraformats/talking.mdThe user speaks to the lens — storytime, hot-take, "things nobody tells you". Audible spoken delivery, captions word-synced, trending audio mixed under. The user films.✅ Yes — script needs reading aloud
Silent POVformats/pov.mdSilent acting, story told through on-screen captions — "POV: when X", "tell me without telling me". Trending sound baked in. The user films.❌ No — silent acting, follows a shot list, not a script
Danceformats/dance.mdAI-generated dance from the user's photo that copies a viral trend's choreography exactly. No filming, silent output (user attaches the sound at upload).❌ No — AI-generated, no human filming
Stitch / Duetformats/duet.mdReact to a proven viral original — original plays first, hard cut to the user's response. The agent finds the video and writes the take; the user films their half.✅ Yes — reaction script needs reading aloud

This skill ONLY bundles these four. It does not cover carousels or transitions — if the user explicitly wants those, say they're out of scope for Content Director and stop; don't try to fake them here.

Teleprompter handoff (talking + duet only). Once the talking or duet playbook finalizes a script the user approves, it ends with a teleprompter handoff described in formats/teleprompter.md: it calls create_teleprompter_handoff with the approved script, creator metadata, and aspect_ratio, emits the returned teleprompter_url short live URL https://teleprompter.pika.bot/r?t=..., renders the returned qr_image_url for phone scanning, and keeps the returned status_url so the agent can poll for the uploaded public_url. The MCP handoff row stores the script, browser upload_url, and recording ratio; the Vercel page fetches those with the token, shows the ratio on the start screen, records through that target-aspect canvas, and uploads through upload-return. It falls back to Share/Save if upload fails. Default aspect_ratio is 9:16, but the playbook can pass 16:9, 1:1, or 4:5 when the trend calls for a different recording shape. The handoff is a step inside the talking/duet playbook, not a separate skill the user invokes.

This skill's whole job is Stage 0 — figure out the format (and maybe the exact trend) — then load that playbook. Everything after is the format playbook's pipeline, run verbatim. Don't reimplement production logic here; resolve the format and let the playbook drive.

Parameters

  • handle (required) — IG or TikTok handle in any of @name / name / full-URL form. Saved as state.handle. Asked in Stage 0.
  • format (optional) — one of talking / pov / dance / duet. If the user names it up front (e.g. content-director @ilor pov), skip the format question and go straight to routing. If absent or "not sure", Stage 0 resolves it.
  • brief (optional) — goal / camera comfort / filming constraints / language. Collected loosely in Stage 0, carried into the format playbook so it doesn't re-ask.

Stage 0 — Pick a format (this is the whole skill)

This stage has three moves. Always do 0a. Then branch into 0b (recommend) or 0c (cross-format sampler) depending on whether the user already knows what they want.

Step 0a — Intake (print verbatim, then stop and wait)

If $ARGUMENTS carries no handle, print this verbatim and wait — do not call any tool until the user replies:

I'm your content director — I can build you four kinds of trend videos. Which one are you in the mood for?

  1. 🗣️ Talking-to-camera — you talk to the lens. Storytime, hot takes, "things nobody tells you", confessionals. Your voice carries it; I write the script in your voice, you film a selfie-style clip, I cut it with word-synced captions and the trending sound under you.
  2. 🎬 Silent POV — no talking. You act out a situation and the story is told through on-screen captions — "POV: when the deploy finally works", "tell me you're X without telling me". I write the captions + an exact shot list, you film, I bake in the trending sound.
  3. 💃 Dance — you don't even have to film. Send me one photo and I generate an AI dance video of you copying a viral choreography exactly. Silent output; you attach the sound on-platform at upload.
  4. 🤝 Stitch / Duet — react to a viral video. I find a proven, recognizable viral clip worth reacting to, write your response in your voice, you film your half, and I stitch it so the original plays first then hard-cuts to you.

Two things I need:

  • Your Instagram or TikTok handle (required either way) — @you, you, or a full URL.
  • Which format? Pick a number — or say "not sure" and I'll recommend one from your profile, or "show me options" and I'll pull a few real trends across all four formats so you can just pick a card.

Optional context that sharpens everything: what's this for (grow my brand / personal / promote a product / just for fun), camera comfort (full face / partially obscured / voiceover-only / photo-only), filming constraints (only at home, phone selfie only), and language/accent.

Once a reply arrives:

  • Save the handle as state.handle and any optional context as state.brief.
  • If the user picked a number / named a format → skip to Stage 1 (Route).
  • If the user said "not sure" → go to 0b.
  • If the user said "show me options" / "show me trends" / "pick a card for me" → go to 0c.
  • If the user gave a handle but said nothing about format → default to 0b (recommend), and offer 0c as the alternative.

Step 0b — Recommend a format from their profile

Scrape the profile once (scrape_social on state.handle; fall back to capture_website on the public profile URL if it's empty / rate-limited — and say so). Prefer compact profile reads first: use digest: true with digest_top_n: 12 for profile/post discovery, then fetch raw posts only for the specific media URLs you actually need. Pull the most recent 12–20 posts only when the compact result is not enough.

Identity-confirmation gate before profiling. Before you synthesize state.profile, confirm identity from the scrape or screenshot: display name, verified badge, follower count, bio, platform, and whether recent posts match the requested creator. Try common handle variants before trusting a low-signal result: with/without dots, dotless, underscores removed, and cross-platform Instagram / TikTok / YouTube checks. Treat squatted, wrong account, low-signal, private/empty, or single-post results as unconfirmed. When unconfirmed, stop and ask "Is this you?" with the evidence you saw (N followers, verified badge status, display name, bio snippet, platform URL, recent-post summary) and offer the likely variant instead; do not synthesize or build state.profile before identity is confirmed. Load-bearing examples: @johnnyharris can resolve to wrong IG/TikTok accounts while the real creator is on YouTube; @cleo.abram should trigger a dotless @cleoabram variant check.

After identity is confirmed, set state.identity_confirmed = true, then synthesize a short state.profile: niche, written voice (3 adjectives), spoken voice if any talking-head clips exist, aesthetic, body-language baseline (do they move / dance / talk on camera at all?), what already over-performs. Keep this state.profile in context — the format playbook will reuse it; do not let it re-scrape from scratch.

Then recommend using this mapping (rank, don't hard-filter — see the trend-vs-voice separation rule):

Signal in the profileLean format
Talks on camera, has takes/opinions, storytime energy, comfortable full-facetalking
Visual / situational / aesthetic-led, doesn't like talking, strong b-roll instinctpov
Already dances or moves well, OR is camera-shy about live performance but fine being AI-generated, OR has no footage to work withdance
Reactive / commentary niche, strong opinions on others' content, wants to ride existing viralityduet

Present it as: "Based on your profile I'd lean {format} because {1–2 lines}. Want me to run with that, or see a few trends across all four formats first?" If they confirm → Stage 1. If they want options → 0c.

Step 0c — Cross-format sampler menu (~10 real cards across the four formats)

This is the "give me a trend for each format and I'll choose" path. Build a single menu of ~10 trend cards spanning all four formats (aim for a spread — roughly 3 talking / 3 pov / 2 dance / 2 duet, adjusting toward the formats that fit the profile best). Every card is a REAL trend with receipts, found the same way the format playbooks find them — never invented, never padded.

Before building the sampler, require state.profile and state.identity_confirmed = true. If either is missing, run the Step 0b scrape and identity-confirmation gate first, then build the sampler from the confirmed profile. Do not build sampler cards from an unconfirmed handle.

Use each format's own research method and gate:

  • talking / pov — fingerprinted or culturally-recognized viral formats. Reference clips ≥500K plays (broad) or ≥50K (niche). See the virality receipts gate and the trend fingerprint gate.
  • dance — a currently-viral dance with a concrete, openable reference-clip URL whose choreography we can copy.
  • duet — a viral, recognizable ORIGINAL worth reacting to; proof is the original's ≥500K plays, not a replication wave. See the duet reaction model.

Research order (don't skip — this order is the gate): discover named trends this week via WebSearch across 3+ creator-tool blogs (Later / Hootsuite / Buffer / OpusClip / Manychat) → capture each fingerprint (audio URL or verbatim opener) → verify replicators / play counts via scrape_social (tiktok/hashtag, tiktok/keyword, tiktok/trending-feed with params.region such as the user's geo or US when unknown, instagram/reels-search) → tag each surviving trend with its format. Drop anything that can't show the receipts. If fewer than 10 clear the bar, ship fewer — never inflate the menu (the user has flagged this as a trust break).

Card format:

[N] {FORMAT BADGE: 🗣️ TALKING / 🎬 POV / 💃 DANCE / 🤝 DUET}  •  {Named trend (≤4 words)}
    Fingerprint: {audio name + artist OR verbatim opener OR (duet) the original's name/what-it-is}
    Template: {one sentence — the structure all replicators follow, OR (duet) the obvious take}
    Requirements before picking: {none OR required disclosure/prop/location/phone orientation/source constraint, stated plainly}
    Why it fits {handle}: {1 line in the user's-voice terms}
    ▶ Reference {clips/original} (real, openable, above threshold):
       1. {URL} — {play_count} plays, {creator handle}, {date}
       2. {URL} — {play_count} plays, {creator handle}, {date}
       3. {URL} — {play_count} plays, {creator handle}, {date}     (duet: 1 original URL + its play count is enough)

Save the set as state.sampler. Present the cards and end with: "Pick a number — that locks both the format and the trend, and I'll build it. Or tell me a format and I'll dig deeper into just that one."

When the user picks a card, set state.format from the card's badge and state.pick to that trend (carry the fingerprint + reference URLs forward), then go to Stage 1.

Stage 1 — Load the format playbook

Once state.format is known, read the matching playbook file and follow it verbatim — this is a file read, not a separate skill invocation:

state.formatRead playbook
talkingformats/talking.md
povformats/pov.md
danceformats/dance.md
duetformats/duet.md

Step 1a — Loaded playbook capability surface

Because this registered skill loads the format playbooks instead of registering separate slash skills, its required-capabilities frontmatter declares the union of MCP tools those playbooks may invoke:

  • scrape_social
  • task_status
  • capture_website
  • transcribe_audio
  • analyze_media
  • create_teleprompter_handoff
  • probe_media
  • edit_trim
  • edit_concat
  • edit_reframe
  • edit_transcode
  • edit_video_upscale
  • edit_audio_replace
  • edit_audio_mix
  • edit_audio_stitch
  • edit_audio_trim
  • edit_split_screen
  • add_captions
  • extract_audio_from_video
  • generate_reference_video
  • render_html_animation

Any loaded playbook MCP worker can return {task_id, status} instead of an inline URL/result when the server budget expires or a render runs in the background. When that happens, immediately call task_status(task_id=<task_id>) in a tight loop (no Bash, no sleep) until status is completed, failed, or cancelled; when completed, continue the playbook with the returned result field as that tool's output. Do not proceed with placeholder URLs while a task is still queued or running.

Read the file from the skill directory, carry state.handle and state.brief into it, and run its pipeline.

Critical rule — don't redo work you've already done. You are the same agent in the same conversation; everything you scraped and surfaced in Stage 0 is still in context. When you load the playbook:

  • If the user picked a specific trend from the 0c sampler (state.pick is set) and state.profile plus state.identity_confirmed = true exist → carry it in as the chosen trend. Skip the playbook's own menu-building (Stages 2–3); confirm the pick with a quick verification scrape if needed, then resume the playbook at its Stage 4 (production package). Re-researching a fresh menu here wastes a turn and may surface a trend the user didn't ask for.
  • If state.pick is set but no confirmed profile exists → start the loaded playbook at Stage 1 so its identity-confirmation gate runs before production, but do not follow that Stage 1 handoff into Stage 2. After identity is confirmed, carry the picked trend forward and resume at Stage 4; skip only Stages 2–3.
  • If you already built state.profile in 0b/0c and state.identity_confirmed = truereuse it. Do NOT re-scrape. Jump straight to the playbook's trend stage with the confirmed profile already in hand.
  • If only the format is locked (no specific trend yet) and no confirmed profile exists → start the loaded playbook at Stage 1 so its identity-confirmation gate runs. If state.profile and state.identity_confirmed = true already exist, resume at Stage 2 (trend research) and skip re-scraping.

State it to the user in one line — "Building your {format} trend from here." — then follow the playbook's instructions verbatim from the appropriate stage through its production, edit, and loop stages.

Stage 2 — Loop (format switching)

After the playbook delivers, it runs its own Stage-7 loop ("do another from this menu?"). Layer one extra option on top: "…or want to switch formats? Say 'switch to dance/pov/talking/duet' and I'll route you over — your profile's already loaded, so we go straight to trends." On a format switch, set the new state.format, keep state.profile and state.identity_confirmed = true, and re-enter Stage 1 (load the new format's playbook, resume at its Stage 2). If the identity flag is missing, run the new format's Stage 1 identity-confirmation gate before trend research. The profile never gets re-scraped within a session unless identity is unconfirmed.

What NOT to do

  • Don't reimplement production here. This skill resolves the format and loads the playbook. The script-writing, shot lists, generation, and edit pipelines live in the format playbooks under formats/ — run those, don't paraphrase them.
  • Don't re-scrape the profile after Stage 0. One scrape per session; carry state.profile into the format playbook and any format switch.
  • Don't rebuild a menu when the user already picked a card in 0c. Carry the pick into the playbook's Stage 4. Re-researching burns a turn and risks drifting off the chosen trend.
  • Don't invent or pad the cross-format sampler. Every card needs real reference links + play counts at threshold. Fewer real cards beats ten padded ones — see the virality receipts gate.
  • Don't filter trends down to the user's exact niche. Find real broad trends across formats; the user's voice attaches via the script/captions in the format playbook. See the broad-versus-niche menu rule and the trend-vs-voice separation rule.
  • Don't surface carousel or transition trends. Out of scope for this bundle — they're not part of Content Director.
  • Don't skip the format question when the user is unsure. Recommend from the profile (0b) or show the sampler (0c); never silently guess a format and start producing.
  • Don't proceed without a handle. Both the recommendation and every format playbook need it — Stage 0a blocks until it arrives.

Add the canonical catalog link to the repository README so users can inspect current installs and available audits. The publishing guide covers the complete discovery path.

<a href="https://skillzs.dev/skills/pika-labs/pika-plugins/content-director">View content-director on skillZs</a>