channel
Skill1 starsChanged 3 months agoApache-2.0View on GitHub
Creates channel profiles and reusable character sheets; stops before episodes. Use when the user asks to "채널 만들어", "채널 추가", "채널 목록", "프로파일 수정", "add a channel", "set up a content channel", "캐릭터 만들어", "캐릭터 시트 수정", or wants to create or update the channel directory under data/. For full workspace defaults (SNS, genre, style, video ratio) use project-init. Writes data/[slug]/profile.md — target audience, tone, pinned voice IDs, visual theme, target platforms, fact-check policy — the identity file every storyboard, produce and publish run opens first; engines, SNS targets, visual style and ratio live in .social-flow/models.json.
2 other projects use a version of this.
Adopted by
Most recently taken up by
- hurleywgly/skillstheir own version, first seen Nov 8, 2026
- bks-lab/open-bridgetheir own version, first seen Oct 30, 2026
Other versions2 projects use a version of this.
Word for word · 0
None found.
Edited · 0
None found.
Wrote their own version · 2
- bks-lab/open-bridge★ 13same name
- hurleywgly/skills★ 1same name
How matches are found. Word for word: the exact same text. Edited: shares passages with this file (“99% same” means 99% of its five-word phrases also appear here; 10% or more counts). Their own version: similar meaning, or, weakest, the same name. We can’t tell which project had it first. Projects are counted among the 200 most-starred candidates, and mentions are links to the repository we found, up to 50 per site, so both counts are a floor.
In this repository30 other files it gives its agents.
- AGENTS.mdAGENTS.md
- CLAUDE.mdCLAUDE.md
- autoproduceSkill
- brandingSkill
- compose-blenderSkill
- datagoSkill
- edit-speechSkill
- generate-cut-imagesSkill
- generate-cut-videosSkill
- grow-instagramSkill
- grow-threadsSkill
- grow-youtubeSkill
- ingestSkill
- inspect-contentSkill
- introSkill
- platform-guideSkill
- produceSkill
- project-initSkill
- publishSkill
- review-cameraSkill
- review-contextSkill
- review-cut-imagesSkill
- review-cut-videosSkill
- review-recentSkill
- setup-instagramSkill
- setup-threadsSkill
- setup-youtubeSkill
- storyboardSkill
- topic-scoutSkill
- upscale-videoSkill
The file
Show its rules and text
We split this skill into the rules it gives an agent
19 rules. About 0 are common, 9 are distinctive, and 10 are very specific to this project.
≈0
Common · estimate
Many files like this have a rule of this kind.
≈9
Distinctive · estimate
This author's own choices. Worth a look.
10
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Distinctive: line 14
Follow production order. Project setup precedes all episode work.
- Distinctive: line 21
HITL records: Keep channel answers in profile.md.
- Distinctive: line 29
When project-init authors a new profile, use the choices already collected there, especially the speech engine and target platforms.
- Distinctive: line 68
If it already exists, stop and point to update.
- Distinctive: line 95
If the working directory already has model settings, use its speech engine/model when proposing a new voice instead of the default above.
- Very specific: line 129
When branding·intro·outro install finalized assets, they add rows via references/resolve-asset.py --ensure.
- Very specific: line 132
Create the episode slot data/<slug>/episodes/.
- Very specific: line 147
If accounts must be opened from scratch, point to the per-platform setup skills — they run account opening, branding, and API token …
- Very specific: line 165
Read data/<slug>/profile.md (if missing, show the list and re-confirm).
- Distinctive: line 176
If the channel copy (description·bio) changed, run the same optional check as add step 5 again (style diagnostics as suggestions.
- Very specific: line 211
Run it in the background (run_in_background) so the session stays free, then hand the URL to the user.
- Very specific: line 219
Stop it when the user is done (pkill -f references/serve.js) — a listener left behind is one more process the next session has to notice.
- Very specific: line 232
Every confirmed character sheet includes its selected tts in the identity JSON.
- Very specific: line 233
Before the voice audition (requested character work), the draft keeps tts: null.
- Distinctive: line 244
Keep dialogue speaker IDs attached to their characters.
- Very specific: line 255
When the user requests speech accuracy, run stt_local_transcribe without supplying the expected text as context, compare the transcript …
- Distinctive: line 262
After creating or updating character identity, panels or voice, run:
- Very specific: line 277
Keep changing scores, thresholds and pending/passed state in this record, not in identity.md.
- Distinctive: line 328
Do not claim an age correction after changing only turn style with the same voice ID.
≈ “Common” is an estimate: at least 1 in 5 of the 350,495 skill files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
Follow production order. Project setup precedes all episode work. Complete each artifact stage before the next; pending media cannot complete a visual stage. Preserve actual spending authorization.
Automatic execution policy: Read automation guidance first. Creative rules and review findings guide improvements; scores, review/hash/freeze records, CTA choices and intermediate approval steps do not block authorized work. Preserve actual external-action authorization and stop at the artifact the user requested. This policy supersedes older quality-gate wording below.
HITL records: Keep channel answers in profile.md. Preserve actual provenance in local files and reuse existing authorization. This adds no approval gate.
Channel management — data/[channel]/profile.md
For an entire project setup use project-init, which
collects shared preferences and creates this layout with project_manage. A
channel-only request still follows this skill without forcing full project setup.
When project-init authors a new profile, use the choices already collected there,
especially the speech engine and target platforms; do not ask them again.
A channel is the top-level unit of the social-flow pipeline — one content channel
(brand) the user runs maps to one directory under data/, and its output gets
published to accounts on multiple SNS platforms (Threads·Instagram·Facebook·YouTube).
Each channel has a data/<slug>/ directory and a profile.md (the channel profile);
every storyboard/production/publish run that follows loads this profile as its
first step and inherits tone, voice, theme, platforms, and verification policy.
data/
└── <channel slug>/
├── profile.md # channel profile (SoT)
├── assets/ # channel-shared assets — catalog.md + branding/ intro/ outro/ …
├── growth/ # growth-loop state
└── episodes/<topic slug>/ # episodes (created by the storyboard skill)data/README.md and references/assets-catalog-template.md are the source of
truth for the assets/ kind slots and catalog conventions. Keep only what gets
reused in two or more episodes; single-episode artifacts go in the topic's .work/.
Argument parsing
[add|list|update|serve|character] [channel-name]
add <name>— create a new channel (procedure below)list— Glob fordata/*/profile.mdand report channel, description, and publish platforms as a tableupdate <name>— read the existing profile.md and edit only the fields the user specifiescharacter <channel> <id>— create or update the reusable character withcharacter_managefollowing character-identity.md: the basics (name, gender, species, age, role, summary, height) are required arguments and every other field is optional. Read the existing identity first and pass only the optional fields that change. The tool exports the sheets; run--checkafter changes.serve— open the channel browser in the browser (procedure below)- With no argument, show the current state via
list, then ask what to do next
add procedure
- Pick the slug — convert the channel name to a kebab-case English slug and
propose it (e.g. "베트남 생활" ("Vietnam life") →
vn-life). It's used in directories and paths, so avoid Korean slugs. If it already exists, stop and point to update. - Collect the core info — confirm the following with AskUserQuestion (at most
4 at a time; don't re-ask anything the user already gave):
- Target audience (who watches, and in what moment)
- Tone (polite explanatory (존댓말) / casual punchy (반말) / documentary
narration, etc.) — the register decided here is the source of truth for every
output that follows. The style check doesn't change this register; it only
strips AI tells (platform-guide
references/korean-style.md) - Publish platforms (threads / instagram / facebook / youtube)
- Fact-check policy (informational=research required / creative·daily-life=skip)
Assign the TTS voice — use
tts_list_voicesfor Gemini ortts_elevenlabs_voicesfor the ElevenLabs account. Follow the saved speech model; ElevenLabs permitseleven_v4only. Local TTS is removed. Pin the voice ID and identity settings. Keep line-specific emotion innarration[].acting, not the character's identity. Follow acting prompts. Change the identity voice only when the user requests it. A new character's voice is auditioned only when the user requests character work (character, or an explicit voice request): generate real samples with distinct voices (three is the usual audition), one shared Korean sample and the selected engine/model, show the playable candidates, wait for the user's selection, then save the selected voice settings/reference audio to the identity and sheet. Duringaddand project-init the voice stays pending and no sample is billed. Pending drafts must not label a candidate as confirmed.If the working directory already has model settings, use its speech engine/model when proposing a new voice instead of the default above. Do not start full media-model setup for a channel-only request. Preserve existing pinned voices; resolve conflicts when the user starts episode production.
- Fix the visual theme — propose colors that fit the THEME contract of
video-template.html(accent/accent2/ink/brand). The default is dark cinematic (ink navy + blue→violet gradient); channel personality comes from the accent color and the background mood prompt. Create profile.md — copy
references/profile-template.mdand fill it with the collected values. Leave no section empty — for unknown values, ask the user or use a well-grounded default and mark it(default).Settle the motion contract as part of the visual theme — whether the channel permits still-led episodes, which true-motion kinds count, the longest permitted still run, whether each moving shot needs a visible
action, and the paid generated-video cap. Keep the template'soffdefaults only when the channel made no motion promise. Ken Burns, caption changes and swapping still images never count as true motion.Two more front-matter choices sit next to it.
shortform_outroisonunless the channel deliberately ends its shorts on the CTA's last frame, andlength_min_seconds/length_max_secondsnarrow the short-form band. Leave the length keys out unless the channel has a reason to hold a tighter band — omitted, the format's own band applies.Channel copy (description·bio) is outgoing copy — the setup skills upload this text as the platform bio verbatim. After writing it, run check-style (
--surface screen) and use its findings as suggestions. On the user's request, or when a line reads off and you want an independent read, delegate to the growth-post-reviewer agent as astandalonesurface and fold the useful findings into the copy with the user; a score decides nothing here.Shared-asset catalog — copy
data/<slug>/assets/catalog.mdfromreferences/assets-catalog-template.md. Don't create empty kind folders. When branding·intro·outro install finalized assets, they add rows viareferences/resolve-asset.py --ensure.Create the episode slot
data/<slug>/episodes/. Topic directories are opened under it by storyboard.Point to the SNS token directory — publishing credentials live in the per-channel directory
~/.config/social-flow/<slug>/(same slug as data/<slug>— the publish tools'channelargument points at this directory. When a channel is specified there is no fallback to default tokens):mkdir -p ~/.config/social-flow/<slug> && chmod 700 ~/.config/social-flow/<slug>For token issuance and file conventions, point to the publish skill's
references/token-setup.md, and after setup have the user confirm the accounts to publish to viasns_account_check(channel=<slug>). If accounts must be opened from scratch, point to the per-platform setup skills — they run account opening, branding, and API token issuance together with the user via ego lite:/social-flow:setup-threads <channel>·/social-flow:setup-instagram <channel>·/social-flow:setup-youtube <channel>. Storyboarding and production work without tokens — they only need to be ready by publish time.- Report — show the full generated profile.md and point to the next steps:
if there's no profile image (logo) yet, first
/social-flow:branding <channel>(4 candidates → HITL direction pick → review on request); once the logo is fixed, optionally/social-flow:intro <channel>(a channel intro video where the character acts — 4 concepts HITL → generation with the saved video model), then pick a market-validated topic with/social-flow:topic-scout <channel>and go to/social-flow:storyboard <channel> <topic>.
update procedure
- Read
data/<slug>/profile.md(if missing, show the list and re-confirm). - Edit only the fields the user specifies — in particular, warn on TTS voice
and THEME color changes: they clash with the tone of already-published
videos, and the channel-shared outro (
assets/outro/) must be rebuilt too. Warn onshortform_outroand the length band for a different reason — they change what gets made from here on. Flippingshortform_outrotooffdrops the spliced tail from every future short (the outro file stays on disk; it just stops being used), and narrowinglength_min_seconds/length_max_secondsmoves what the length check measures against, so a board that drew no flag last week comes back flagged today (check-scenes.jsand the approval strip warn outside the band; only the 180s platform cap fails). Neither touches an episode that is already built. If the channel copy (description·bio) changed, run the same optional check as add step 5 again (style diagnostics as suggestions; a reviewer read on request). - Report before/after as a table.
serve procedure
references/serve.js serves the offline library over HTTP on this machine. The root
lists channels; each channel has 스토리보드 · 캐릭터 in the left nav. The current
library follows the static layout described below.
The previous browser remains at /legacy. Its storyboard list is a card per episode —
cover (the first scene's image as scenes.js names it), title, frontmatter status, the stage
episode-state.js derives, format, image count and blockers — grouped by playlist tabs:
전체 · one tab per distinct series: frontmatter line (the same line pundago's site reads;
a (n/m) tail becomes the card's episode marker) · 재생목록없음 for episodes without
one. The legacy browser at /legacy opens the episode's own storyboard.html in place (it only references
./scenes.js, images/ and ../../../assets/characters/…, so it renders the same as
from file://). The character list shows every panel image in
assets/characters/<id>/ and the catalog note; the detail page renders identity.md,
swaps the main panel from thumbnails, and plays voice.wav.
Legacy panels come back face → front → back — the order the reference set goes into a
generation call (../produce/references/video-model-selection.md §The character panels), so the card
thumbnail and the detail page's opening panel are both the face. Naming isn't uniform
across channels, so the rank is read off the filename: face/head is the face,
back/rear is the rear, everything else (body, front, real, three-quarter)
is a front view. Within one rank the shorter name wins — a variant earns its length from
a suffix, so head-closeup.png leads head-closeup-pre-led.png and a card shows the
canonical panel rather than an old take.
node "$CLAUDE_PLUGIN_ROOT/skills/channel/references/serve.js" data --open # http://127.0.0.1:8390/
node "$CLAUDE_PLUGIN_ROOT/skills/channel/references/serve.js" data --port 8400- Run it in the background (
run_in_background) so the session stays free, then hand the URL to the user. If the port is taken, pass--port. - The home page exports the offline library for every channel. Opening a generated
index refreshes that channel; ordinary media requests only read files.
/legacyretains the previous API browser. A conflicting hand-authored index is reported. - It binds
127.0.0.1on purpose.data/holds research notes, growth state and.work/intermediates, so--host 0.0.0.0(other machines, a cloudflared tunnel) is the user's call, never a default. Path segments starting with.are never served. - Stop it when the user is done (
pkill -f references/serve.js) — a listener left behind is one more process the next session has to notice.
Local review HTML (required after character edits)
For every new or updated character, follow character-identity.md. Required: the basics, the three sheet panels and the selected voice below; every other identity field is optional. For dramatic characters, apply character depth when filling existing personality, relationship and acting fields. Name tendencies in traits, then connect them to choices and costs in flaw, fear and relationships. Preserve existing canon and keep episode-specific pressure separate from the shared identity; no extra JSON keys are required.
Export the bundled sheet before any episode candidates or scene images, including drafts with pending media. Make each panel with character_panel; it follows the panel specifications for purpose, canvas ratio and subject size and builds the prompt from the identity. Never hand-author the review HTML.
Every confirmed character sheet includes its selected tts in the identity JSON.
Before the voice audition (requested character work), the draft keeps tts: null; do not
substitute the following example as a confirmed voice. After selection, the block includes:
{"tts":{"engine":"gemini","model":"gemini-3.8-flash-tts","voiceId":"Charon","language":"ko","speed":1}}This is an example, not a default for the cast. Choose and pin each character's
voice; include model/stylePrompt when the engine uses them. Silent characters still
need a voice configuration for reuse. Narrator settings do not substitute for a
character voice. Copy this exact tts into SB_DOC.characters.
Keep dialogue speaker IDs attached to their characters; voice settings alone do not
author dialogue or lip sync. Missing or invalid settings produce content diagnostics and
prevent the sheet from displaying a review pass; template freshness is checked separately. Existing sheets need migration,
not an invented voice.
For a new character or a changed voice, generate voice.wav from a short Korean
sample (or the explicitly selected language) using that exact configuration. Save
sample.txt, the generation request/result and the WAV SHA-256 next to the sheet.
A failed or unavailable engine means the voice is pending, not ready. Do not silently
substitute the channel narrator, another engine or a stock sample. Reuse an existing
sample only when its text, voice settings and hash still match.
When the user requests speech accuracy, run stt_local_transcribe without supplying
the expected text as context, compare the transcript with sample.txt, and save the
transcript, normalization method and character error rate. Fix omissions or incorrect
words and rerun the check. Transcription checks wording; it does not establish acting,
timbre or pronunciation quality. Report those limits and never invent a listening pass.
A voice setting alone does not prove that the generated sample speaks correctly.
After creating or updating character identity, panels or voice, run:
node "$CLAUDE_PLUGIN_ROOT/skills/channel/references/review-library.js" "data/<channel>"
node "$CLAUDE_PLUGIN_ROOT/skills/channel/references/review-library.js" "data/<channel>" --checkDeliver data/<channel>/assets/characters/index.html for the complete cast and
assets/characters/<id>/index.html for each sheet. They open directly with file://;
no HTTP server is needed. Each sheet shows the required basics, three
required image slots (front/body, back, face), optional extras, voice.wav and the
specification cards for the optional fields that are present. Keep identity.md and media as the source; do not edit
exported HTML. Named voice/appearance/role fields are read from identity.md.
Optional review.json exposes independent review separately from image availability:
Keep changing scores, thresholds and pending/passed state in this record, not in
identity.md. The identity document defines the character; duplicate status prose
can contradict a later review or user threshold change and invalidate its input hash.
score (0–100), iteration (positive integer), critical (nonnegative integer),
and inputHashes mapping identity.md/body.png/back.png/face.png to their reviewed
SHA-256 values. Include voice.wav, sample.txt and voice-accuracy.json whenever
present; adding, removing or changing one invalidates the review. Record what the
review actually assessed and any listening limitations. Optional threshold (integer 1–100, legacy default 95) records the
user's chosen passing score; do not lower it without their instruction. Write only
an actual review result. A score at or above that threshold with zero critical
defects displays a pass only while all reviewed hashes match. Changed inputs
display a request for re-review; missing/invalid records display draft status.
The same export updates storyboards/index.html and
storyboards/<episode>/index.html. The latter uses the canonical storyboard
renderer and relative references to episodes/<episode>/storyboard/; it never
moves production data or duplicates media. Re-export after changes, including
SB_DOC edits, and run --check before delivery. Hand-authored index.html files and
output symlinks are refused, never overwritten. Keep the channel folder together
when copying it to another machine. Design source and limits:
local-review-design.md.
Rules
- profile.md is the SoT for identity, tone, theme and pinned voice IDs — don't keep
them in session memory or other files. Engines, SNS targets, visual style and video
ratio live in
.social-flow/models.json(project-init). The storyboard/produce/publish skills read both first. - Platform signatures stay within platform grammar — define hashtags·CTA within the platform-guide skill's playbook limits (Threads hashtags ≤1, YouTube 3~5, etc.).
- Channel deletion is not provided — the directory holds publish history, so
deleting is irreversible. If the user wants it, point to adding
status: archivedat the top of profile.md.
Additional Resources
Reference Files
references/profile-template.md— standard profile.md template (section structure, THEME contract, voice examples)references/assets-catalog-template.md—assets/catalog.mdstarter (kind+id table)references/resolve-asset.py— resolve shared assets via catalog + well-known paths (--ensureadds a row,--selftest)references/review-library.js— exports offline character sheets, both indexes and episode review pages;--checkdetects stale outputreferences/serve.js— the channel browser over HTTP:/api/channels,/api/channels/<slug>/storyboards,/api/channels/<slug>/characters[/<id>], and/files/<slug>/…static fromdata/(dot segments refused, Range for audio/video). Zero dependencies,--selftest
Character voice age and identity changes
For character samples or a request to sound older/younger, follow Gemini voice design. Route sample-only edits to the character identity and sheet; do not rebuild episode media unless requested. Do not claim an age correction after changing only turn style with the same voice ID.
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

