with one click
freshell-demo-creation
// Use when producing screen-recorded demos that need scenario-specific pane layouts, live interaction walkthroughs, and machine-readable timecodes for automated video editing.
// Use when producing screen-recorded demos that need scenario-specific pane layouts, live interaction walkthroughs, and machine-readable timecodes for automated video editing.
Use when preparing a Freshell release — before bumping versions, writing release notes, tagging, etc on GitHub.
Use when reviewing, triaging, or landing pull requests — especially batches of open PRs that need inspection, fixes, and merging. Also triages open issues after the PR queue is clear.
Use when interacting with Freshell panes, panels, or tabs from the CLI for tmux-style automation and multi-pane workflows, outside external-browser automation tasks.
Use when installing, creating, or setting up Freshell extensions — from GitHub repos, local directories, or from scratch as custom panes.
Use when producing screen-recorded demos that need scenario-specific pane layouts, live interaction walkthroughs, and machine-readable timecodes for automated video editing.
| name | freshell-demo-creation |
| description | Use when producing screen-recorded demos that need scenario-specific pane layouts, live interaction walkthroughs, and machine-readable timecodes for automated video editing. |
Produce polished demos that show the full workflow: build, stage, run, and interact. Choose pane layout based on demo story, not a single fixed arrangement. Always record precise timecodes so post-editing can speed up non-critical segments and keep key interactions real-time.
Deliver all of the following:
browser, editor, or terminal, depending on scenario).demo/timecodes.jsonl) with short, meaningful descriptions.# Skill-local logger path
SKILL_ROOT="${CODEX_HOME:-$HOME/.codex}/skills/freshell-demo-creation"
TIMELOG="$SKILL_ROOT/scripts/timecode_log.py"
TL="demo/timecodes.jsonl"
# Initialize timeline
$TIMELOG start --timeline "$TL" --label "my-demo" --reset
Before arranging panes, decide the story you want viewers to follow. Log the chosen layout plan:
$TIMELOG point --timeline "$TL" --event layout_plan --desc "Selected layout profile: <profile-name>"
Common profiles:
When adjusting divider positions, keep all critical panes readable and visually balanced. If you drag dividers, log those drags as timed events.
FSH="npx tsx server/cli/index.ts"
# Start from one code pane id in $CODE_PANE
BOTTOM_JSON="$($FSH split-pane -t "$CODE_PANE" -v --mode shell)"
BOTTOM_PANE="$(printf '%s' "$BOTTOM_JSON" | jq -r '.data.newPaneId')"
RIGHT_JSON="$($FSH split-pane -t "$CODE_PANE" --browser "http://localhost:5173")"
RIGHT_PANE="$(printf '%s' "$RIGHT_JSON" | jq -r '.data.newPaneId')"
$FSH resize-pane -t "$CODE_PANE" --x 40
$FSH resize-pane -t "$BOTTOM_PANE" --y 22
FSH="npx tsx server/cli/index.ts"
# Start with coordinator in $COORD_PANE
RIGHT_JSON="$($FSH split-pane -t "$COORD_PANE" --mode codex)"
AGENT_A="$(printf '%s' "$RIGHT_JSON" | jq -r '.data.newPaneId')"
BOTTOM_JSON="$($FSH split-pane -t "$COORD_PANE" -v --mode codex)"
AGENT_B="$(printf '%s' "$BOTTOM_JSON" | jq -r '.data.newPaneId')"
DOC_JSON="$($FSH split-pane -t "$AGENT_A" -v --editor "/absolute/path/to/doc.md")"
DOC_PANE="$(printf '%s' "$DOC_JSON" | jq -r '.data.newPaneId')"
Follow this exact sequence for every demo.
server_start and server_ready).# Coding segment
$TIMELOG begin --timeline "$TL" --event coding --id feature --desc "Start implementing feature"
# ... code ...
$TIMELOG end --timeline "$TL" --event coding --id feature --desc "Finish implementation"
# Thinking pause segment
$TIMELOG begin --timeline "$TL" --event think_pause --id p1 --desc "Pause to choose next step"
# ... pause ...
$TIMELOG end --timeline "$TL" --event think_pause --id p1 --desc "Resume work"
# Pane drag segment (real-time visual moment)
$TIMELOG begin --timeline "$TL" --event layout_drag --id drag-1 --desc "Start dragging divider"
# ... drag divider ...
$TIMELOG end --timeline "$TL" --event layout_drag --id drag-1 --desc "Stop dragging divider"
# Runtime lifecycle points (when a server/runtime process is part of the demo)
$TIMELOG point --timeline "$TL" --event server_start --desc "Run dev server in bottom pane"
$TIMELOG point --timeline "$TL" --event server_ready --desc "Server reports ready"
# Interaction block (use IDs/names that match your scenario)
$TIMELOG begin --timeline "$TL" --event demo_interaction --id synth-play --desc "Start synth interaction"
# ... interact in primary showcase pane ...
$TIMELOG end --timeline "$TL" --event demo_interaction --id synth-play --desc "End synth interaction"
# Notes for music demos only (gap since previous note is auto-added)
$TIMELOG note-on --timeline "$TL" --note C4 --desc "Press C4"
$TIMELOG note-off --timeline "$TL" --note C4 --desc "Release C4"
$TIMELOG note-on --timeline "$TL" --note E4 --desc "Press E4"
$TIMELOG note-off --timeline "$TL" --note E4 --desc "Release E4"
# Final integrity check
$TIMELOG validate --timeline "$TL"
Use these standards so the editor can cut automatically:
layout_plan, coding, think_pause, layout_drag, demo_interaction, plus scenario-specific events.begin with an end using the same --event and --id.A demo is not complete until both pass:
validate succeeds with no open events.$TIMELOG validate --timeline "$TL"
For schema and required fields, see references/timecode-schema.md.