agentleFS
jamdotdevjamdotdev/jam-plugin/skills/video-to-jam/SKILL.md

video-to-jam

Skill11 starsChanged 10 days agoMITView on GitHub

Turn a video file someone already has (an MP4, a Loom download, a long call or screen recording) into Jams (shareable jam.dev recordings with a transcript), one per issue, cut where the speaker moves to a new problem, each titled and filed in a folder. Use when the user says "upload these to jam", "turn this recording into jams", "split this video by bug", "make these jams instead of mp4s", or has a recording too long for one Jam.

1 other project uses a version of this.

Adopted by

Most recently taken up by

  • Other versions1 project uses a version of this.

    Word for word · 1

    1. jamdotdev/skills★ 11100% same

    Edited · 0

    None found.

    Wrote their own version · 0

    None found.

    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 repository13 other files it gives its agents.

The file

We split this skill into the rules it gives an agent

11 rules. About 0 are common, 7 are distinctive, and 4 are very specific to this project.

  • ≈0

    Common · estimate

    Many files like this have a rule of this kind.

  • ≈7

    Distinctive · estimate

    This author's own choices. Worth a look.

  • 4

    Very specific

    Tied to their project's names, files or tools. Probably skip.

  • Common
  • Distinctive
  • Very specific
  1. Very specific:

    If jam is not on PATH, stop and ask the user to install it from https://jam.dev/docs/cli, then continue.

    line 23
  2. Distinctive:

    No audio track: find scene changes with ffmpeg and ask the user where each issue starts.

    line 63
  3. Distinctive:

    Start each clip in the pause before its first sentence, as early as you can without catching the previous sentence, and end it 1 second …

    line 71
  4. Distinctive:

    Write the payload to a file so no transcript text reaches a shell argument:

    line 89
  5. Very specific:

    Use absolute paths in the payload.

    line 113
  6. Distinctive:

    Keep a manifest of clip to Jam link as you go.

    line 120
  7. Distinctive:

    Add a row for the full recording when step 2 uploaded it.

    line 148
  8. Very specific:

    When this skill, a Jam MCP tool, a jam command or a Jam doc was wrong, stale or confusing, or worked unusually well, tell Jam.

    line 153
  9. Very specific:

    Call the submitFeedback MCP tool with body, category and subject.

    line 157
  10. Distinctive:

    When MCP is unavailable, use the CLI:

    line 159
  11. Distinctive:

    No secrets, customer data, source code, stack traces or recording content.

    line 167

≈ “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.

Keep what fits and drop the rest. Your version, ready for your agents.
Files
SKILL.md

video-to-jam

One video in, one Jam per issue out, plus a table of clip, time range and link. A 40-minute call where someone walks through ten bugs becomes ten short Jams that each say one thing.

These Jams carry the video and its transcript only. A video file has no console or network capture; say so rather than implying it.

Set up the CLI

command -v jam >/dev/null || echo "jam is not installed"
export PATH="$HOME/.local/bin:$PATH"
jam auth status --json || jam auth login

If jam is not on PATH, stop and ask the user to install it from https://jam.dev/docs/cli, then continue. Do not install it yourself.

Exit code 3 means not signed in. With no browser (CI, a cloud agent), ask the user to set JAM_TOKEN to a personal access token from https://jam.dev/s/settings/mcp as a secret. Never write a token to a file. jam agent-context prints every command and flag.

Also check ffmpeg and ffprobe are on PATH. If not, ask the user to install them.

1. Inspect the file

ffprobe -v error -show_entries format=duration:stream=codec_type,width,height -of json input.mp4

Note the duration, resolution and whether there is an audio track. Ask before uploading a recording of a call with people outside the team.

2. Get a transcript

Transcribe on this machine, so only the clips leave it. Use the project's transcription tool if it has one; otherwise Whisper:

ffmpeg -i input.mp4 -vn -ac 1 -ar 16000 audio.wav
uvx whisper-ctranslate2@0.5.8 audio.wav --model small --output_format vtt --output_dir .   # writes audio.vtt

uvx runs it without a lasting install; the whisper CLI takes the same flags. The first run downloads the model.

With no local transcriber, Jam can transcribe the video, but only after the whole recording is uploaded, off-topic parts included. Ask first, and name the folder it would land in. On a yes, find or create that folder and upload the file with step 5's commands and payload, titled <file name> (full recording), then read jam get transcript "$FULL_ID" --json (WebVTT in the transcript field).

No audio track: find scene changes with ffmpeg and ask the user where each issue starts.

3. Find the cut points

Walk the transcript and start a new clip where the speaker moves to a new problem: "next bug", "another thing", "the other issue", "okay, now". Give each clip a start, an end, a short title and the sentence that names it. Start each clip in the pause before its first sentence, as early as you can without catching the previous sentence, and end it 1 second late. Cue times can lag the first word by a few tenths of a second, so never start on the cue itself.

Show the cut list, then go ahead unless the user asked to review it first.

4. Cut the clips

Re-encode so cuts land on the exact second. Neighboring clips may overlap by a second or two; that is fine.

ffmpeg -ss 724 -to 870 -i input.mp4 -c:v libx264 -preset veryfast -crf 23 -c:a aac clip-03.mp4

5. Create one Jam per clip

Write the payload to a file so no transcript text reaches a shell argument:

{
  "kind": "video",
  "url": "",
  "title": "Pro price cut off on the pricing page",
  "description": "From onboarding-call.mp4, 12:04 to 14:30. Video and transcript only.",
  "videoPath": "/abs/path/clip-03.mp4",
  "screenDimensions": { "width": 1920, "height": 1080 }
}
jam list folders --query "Onboarding call, Oct 9" --json   # reuse it on a rerun
jam create folder "Onboarding call, Oct 9" --json          # otherwise; returns its id
jam create jam @clip-03.json --folder "$FOLDER_ID" --json  # returns the Jam's id and url

jam create folder makes a new folder on every call, even with a name that exists, so look first and pass the id afterwards. Creating a folder can upgrade a Viewer to a Creator, which can change seat billing; on a Viewer account, ask first.

Use absolute paths in the payload. Take screenDimensions from step 1's width and height. Set url to the page shown when you know it. When the user names a Playwright trace that covers the same span, add "playwrightTracePath" and the Jam gets that trace's console, network and clicks. Say first that the trace's cookies, headers and request bodies go into the Jam too.

Keep a manifest of clip to Jam link as you go. Upload one clip at a time. On a rate-limit or upload error, stop, wait, and resume from the first clip with no link, so a rerun never makes duplicates.

6. Check them

jam get jam "$ID" --json
jam get transcript "$ID" --json

Jam transcribes each clip after upload. Until then, jam get transcript exits 4 with "Captions are not available for this video"; retry every 30 to 60 seconds. Each transcript should open on the sentence that names the clip's issue and close on that issue's last sentence. When it starts or ends mid-sentence, the cut is off: re-cut that clip, upload it, and list the bad Jam for the user to delete.

After

Return the table:

| # | Clip | From | Jam |
|---|------|------|-----|
| 3 | Pro price cut off | 12:04 to 14:30 | https://jam.dev/c/... |

Add a row for the full recording when step 2 uploaded it. Delete local clips only when the user says so.

Send feedback to Jam

When this skill, a Jam MCP tool, a jam command or a Jam doc was wrong, stale or confusing, or worked unusually well, tell Jam. Send it yourself: Jam's agents read it, so it needs no approval.

Call the submitFeedback MCP tool with body, category and subject.

When MCP is unavailable, use the CLI:

jam feedback "<what you were doing, what you expected, what happened, the mistake>" --category <skills|mcp|cli|docs> --subject <skill name, tool name or command>
  • Jam surfaces only, not the user's code or other tools.
  • At most once per session, and never for a slip you corrected yourself.
  • No secrets, customer data, source code, stack traces or recording content.

Download now (ZIP)

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
What did you use it for? e.g. Reviewing pull requests in a Rails app

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.