What This Does
Processes timestamped conversation transcripts and generates structured output for publishing.
Input
A timestamped transcript of a conversation (paste or file path).
Podcast Profiles
Different podcasts have different output formats. Always specify the podcast when invoking the skill (e.g. /ce tgs, /ce nonzero, /ce kosmo). If no podcast is specified, ask which one.
Kosmopolitika
Read the editorial policies at
~/.claude/skills/ce/policies/global.mdand~/.claude/skills/ce/policies/kp.mdbefore producing output.
Dashboard: KP view in admin at localhost:8070. Episodes tab shows CE output; Ideas tab shows searchable idea cards.
Episode file path: ~/Documents/Projects/Kosmopolitika/Episodes/{episode-slug}/ce.json
Transcript path: ~/Documents/Projects/Kosmopolitika/Episodes/{episode-slug}/transcript-final.txt
Ideas database: ~/Documents/Projects/Kosmopolitika/ideas.json
KP Episode JSON schema:
{
"episode_id": "2025-10-16-slug",
"title": "Episode Title",
"date": "YYYY-MM-DD",
"speakers": ["Nikita", "Boris"],
"description": "One-paragraph summary",
"titles": ["Title option 1", "Title option 2"],
"thumbnails": ["Visual concept description 1", "Visual concept 2"],
"references": {
"people": [{"timestamp": "HH:MM:SS", "name": "Name", "context": "brief context"}],
"texts": [{"timestamp": "HH:MM:SS", "name": "Name", "context": "brief context"}],
"concepts": [{"timestamp": "HH:MM:SS", "name": "Name", "context": "brief context"}],
"events": [{"timestamp": "HH:MM:SS", "name": "Name", "context": "brief context"}]
},
"ideas": [
{
"id": "kebab-case-id",
"timestamp": "HH:MM:SS",
"label": "Short label",
"summary": "Detailed description of the idea",
"match_status": "pending",
"is_new": true
}
],
"clips": {
"short": [{"timestamp": "HH:MM:SS-HH:MM:SS", "description": "..."}],
"medium": [{"timestamp": "HH:MM:SS-HH:MM:SS", "description": "..."}],
"long": [{"timestamp": "HH:MM:SS-HH:MM:SS", "description": "..."}]
},
"cold_opens": [
{"timestamp": "HH:MM:SS-HH:MM:SS", "quote": "Verbatim quote", "type": "hook / hook+orient", "selected": true}
]
}
Workflow when /ce kosmo is invoked:
1. Read the full transcript at ~/Documents/Projects/Kosmopolitika/Episodes/{slug}/transcript-final.txt.
2. Read the ideas database at ~/Documents/Projects/Kosmopolitika/ideas.json for cross-referencing. Ideas that recur from previous episodes get match_status: "pending", is_new: false. Genuinely new ideas get is_new: true.
3. Produce all output fields.
4. Self-check: compression test on titles, verbatim check on cold opens, timestamp accuracy.
5. Write to ~/Documents/Projects/Kosmopolitika/Episodes/{slug}/ce.json.
6. Tell Nikita: "CE ready. Refresh the dashboard."
Nonzero
Read the editorial policies at
~/.claude/skills/ce/policies/global.mdand~/.claude/skills/ce/policies/nonzero.mdbefore producing output.
Output differs from default. When /ce nonzero is invoked, produce this instead:
- Five title + thumbnail ideas. Thumbnail text: 3-5 words, complementary to (not repeating) the title.
- Three descriptions. 1-2 sentences each, different angles. The dashboard lets Nikita select one as the primary.
- Chapter titles (~10). Timestamped topic shifts for the free section. Each gets a
descriptionfield (1-2 sentences for the editor). - Overtime. Marker where overtime is first mentioned + what's discussed before the actual start. Overtime topics as timestamped bullets (~10 words each, navigational labels).
- Cold Opens. 5-10 for the free section, 5-10 overtime teasers.
- Name corrections. A
name_correctionsdict mapping transcript misspellings to verified names. - No references list, no key ideas list, no clip suggestions.
Dashboard: Episodes as JSON in ~/Documents/Projects/Nonzero/ce-dashboard/episodes/. Admin at localhost:8070 (Nonzero view). Dashboard code: ~/Documents/Projects/Meta/admin/admin.html.
Nonzero Episode JSON schema:
{
"title": "",
"date": "YYYY-MM-DD",
"guest": "Guest Name",
"published": false,
"youtube_url": "",
"titles": [
{"title": "Episode title", "thumb": "3-5 word thumbnail text"}
],
"descriptions": ["Description 1", "Description 2", "Description 3"],
"selected_description": 0,
"tweet": "Auto-synced from descriptions[selected_description]",
"chapters": [
{"timestamp": "HH:MM:SS", "text": "Chapter title", "description": "1-2 sentence editor description"}
],
"overtime_marker": "Free text: when overtime starts and what's previewed before it begins",
"overtime_topics": [
{"timestamp": "HH:MM:SS", "text": "~10 word navigational label"}
],
"cold_opens": [
{"timestamp": "HH:MM:SS-HH:MM:SS", "duration": "XXs", "type": "hook / hook+orient", "selected": true, "quote": "Verbatim contiguous quote"}
],
"overtime_teasers": [
{"timestamp": "HH:MM:SS-HH:MM:SS", "duration": "XXs", "type": "hook / hook+orient", "selected": true, "quote": "Verbatim contiguous quote"}
],
"name_corrections": {"misspelled": "Correct Name"}
}
Key field names: Title thumbnail = thumb. Chapter title = text. overtime_topics and overtime_teasers are flat top-level arrays. The tweet field exists for backward compat; always write descriptions (array of 3) and selected_description (index).
Workflow when /ce nonzero is invoked:
1. Read the editorial policies at ~/.claude/skills/ce/policies/global.md and ~/.claude/skills/ce/policies/nonzero.md. Every time.
2. Read the full transcript (every line, no skimming).
3. Produce all output fields.
4. Self-check before writing. Run compression test on every title. Verify cold open quotes are verbatim and contiguous. Check chapter titles against the transcript.
5. Write to episode JSON at ~/Documents/Projects/Nonzero/ce-dashboard/episodes/{date}-{slug}.json. Preserve published and youtube_url if file exists.
6. Tell Nikita: "CE ready. Refresh the dashboard."
Don't output CE to the conversation first. Write to JSON directly.
TGS (The Glenn Show)
Read the editorial policies at
~/.claude/skills/ce/policies/global.mdand~/.claude/skills/ce/policies/tgs.mdbefore producing output.
This is editing, not annotation. TGS CE produces an edit plan for editorial surgery on a 2-hour livestream to extract multiple video products. No references, no key ideas, no clip suggestions.
Two dashboards exist: - Shared admin at localhost:8070 (TGS view) is Nikita's local workspace. Reads/writes the same episode JSON files directly. - Deployed dashboard at tgs.psychopolitica.com is the collaborator-facing view (auth: tgs/revenge). Data must be pushed there via API. - The CE skill writes locally first, then pushes to the deployed dashboard.
Dashboard code: ~/Documents/Projects/Meta/admin/admin.html (shared admin) and ~/Documents/Projects/TGS/ce-dashboard/ce-dashboard.html (standalone).
TGS Episode JSON schema:
{
"episode": "2026-03-27-Cherry",
"date": "YYYY-MM-DD",
"stream_duration": "HH:MM:SS",
"guests": "Guest Name",
"nikita_notes": "editorial direction",
"videos": [
{
"label": "Video name (shown as heading)",
"working_title": "Shown in header bar",
"runtime": "XX-YY min",
"description": "1-2 sentence summary",
"material": "HH:MM:SS-HH:MM:SS",
"titles": ["Title as string", "Another title"],
"thumbs": ["Thumb text as string", "Another thumb"],
"tweets": ["Tweet as string", "Another tweet"],
"cold_opens": [
{"timestamp": "HH:MM:SS-HH:MM:SS", "type": "hook / hook+orient", "selected": true, "quote": "Verbatim quote"}
],
"edit_map": [
{"timestamp": "HH:MM:SS-HH:MM:SS", "action": "keep/cut", "description": "What's in this block", "note": "Optional editor note"}
]
}
]
}
TGS field names differ from Nonzero. Titles and thumbs are flat string arrays (not objects). Videos use label/working_title. Each video has its own edit_map. Never include the guest's name in a title.
Workflow when /ce tgs is invoked:
1. Check ~/Documents/Projects/TGS/ce-dashboard/episodes/ for episodes needing an edit plan (transcript exists, videos array empty). If none locally, fetch from deployed site: curl -s -u "tgs:revenge" "https://tgs.psychopolitica.com/api/episodes".
2. If the transcript is on Railway but not local, fetch both:
curl -s -u "tgs:revenge" "https://tgs.psychopolitica.com/api/episode?id=EPID" > ~/Documents/Projects/TGS/ce-dashboard/episodes/EPID.json
curl -s -u "tgs:revenge" "https://tgs.psychopolitica.com/api/transcript?id=EPID" > ~/Documents/Projects/TGS/ce-dashboard/episodes/EPID.transcript.txt
3. Read Nikita's notes from the episode JSON (nikita_notes field). Follow them.
4. Read the full transcript (every line).
5. Work in iterative passes, segment by segment. Editing analysis first, titles and thumbs after.
6. Write the result to the episode JSON (preserve metadata, replace videos array).
7. Push to Railway API so collaborators see it immediately:
python
# Build JSON with _episode_id, then POST:
curl -s -u "tgs:revenge" -X POST -H "Content-Type: application/json" \
-d @- "https://tgs.psychopolitica.com/api/save" < <(python3 -c "
import json; d=json.load(open('episodes/EPID.json')); d['_episode_id']='EPID'; print(json.dumps(d))")
8. Git commit and push (auto-deploys to Railway via GitHub integration):
cd ~/Documents/Projects/TGS/ce-dashboard && git add episodes/ && git commit -m "CE: ..." && git push
9. Also save the edit plan markdown to ~/Documents/Projects/TGS/TGSL/{date}-{GuestLastName}/. Use the existing directory name if one exists; check with ls first.
10. Tell Nikita: "Edit plan ready. Refresh the dashboard."
Nikita may also feed live notes during the stream (editor notes, camera choices, segment observations). These will be in the nikita_notes field or mentioned in the conversation. Remember them.
Output (an edit plan) with:
- Global editor notes. Camera instructions, color correction, name tags.
- Multiple video products. A 2-hour stream typically yields 3-4+ videos.
- Per video: cold opens, edit map, estimated runtime, then titles and thumbs.
- Titles and thumbs. 5 pairings per video. Thumb text (4-5 words) complements the title.
- Tweets. 5 per video, in Glenn's voice.
- Summary table. Video name, estimated runtime, one-line description.
Quick Commands
process-- Run full analysis on provided transcriptrefs-- Just extract references with timestampsideas-- Just extract key ideas with timestampsclips-- Just suggest clipstitle-- Just generate title/thumbnail ideas