Short version: give it clean audio, tell it the right language, and read the report that explains every moment it chose not to clip.
Resolution and frame rate are read from the file itself — nothing is assumed. A phone capture is handled exactly as well as a studio stream.
| Property | Accepted |
|---|---|
| Container | MP4, MKV, MOV, WEBM |
| Video codec | H.264, H.265, VP9, AV1 |
| Frame rate | 24–120 fps, constant. Variable frame rate is rejected. |
| Audio | One track, 32 kHz or higher, mono or stereo |
| Duration | Up to 12 hours |
| Links | Twitch and YouTube VODs — your own content only. Kick blocks downloads from our addresses, so Kick recordings are uploaded as files. |
Variable frame rate is the one hard rejection. VFR files lie about their timing grid, which makes frame-accurate cutting impossible — we would rather refuse than deliver clips with drifting audio.
| Setting | What it changes |
|---|---|
| Language | Selects the vocabulary bias. Wrong language does not degrade gracefully — it produces confident nonsense. Set it correctly. |
| Shorts produced | Not a setting. Every moment that clears the hook and safety bars becomes a short — none are discarded to hit a number, and none are invented to fill one. |
| Focus on | Multiplies the score of moments where that voice profile is speaking, up to 1.6×. Others still appear. |
| Clip length | Content-driven adapts to the conversation. The fixed options override that and generally retain worse. |
Every delivered clip carries the measurements that selected it, and every rejected moment carries its reason. The four values you will see:
| Value | Meaning |
|---|---|
| laughter | How much the room is laughing at this point, relative to how this particular recording normally sounds. |
| reactions | How densely people are reacting around this moment. A single exclamation is noise; a run of them is a moment. |
| events | Recognised events near this point, from the audio and — where the game is supported — from the picture. |
| speaker | Which voice profile matched, if any. Blank means the engine would rather say nothing than guess. |
The single biggest factor in output quality is not your microphone — it is cross-talk. Background noise we can remove; two people speaking simultaneously we cannot separate.
Not self-serve yet. There is no upload path for enrolment — send us the audio and we build the profile by hand. The guidance below is what we measured, and it is what we follow when we do it for you.
Record two to three minutes of one person talking with nobody else audible. A solo intro works; so does any stretch where you are alone in the call.
What matters is solo, not clean. We measured this: noise reduction made almost no difference to profile quality, while the length of the sample mattered enormously. Speaker voice profiles need continuous speech to settle, so a two-minute monologue beats twenty scattered ten-second clips.
Each additional profile improves every existing one, because the engine can compare against a named person rather than an anonymous group.
Check the rejection log on the results screen. The four common reasons:
| Reason | What to do |
|---|---|
| content gate | The passage contains a term on the safety list. This is deliberate and cannot be overridden per clip — edit your safety rules if the list is too broad for you. |
| weak hook | No line in the moment scored high enough to make a title. Usually the moment is visual rather than spoken. |
| dull | Tactical chatter with no reaction density. Working as intended. |
| no clean boundary | The moment could not be cut without breaking a sentence, so it was left out rather than clipped badly. |
Everything the workspace does is available programmatically: submit a recording, follow the stages, collect the clips. The interface and the API run through the same code, so there is no second implementation to drift.
POST /api/jobs
Cookie: cf_session=<session>
Content-Type: application/json
{
"sourceId": "3f2504e0-4f89-41d3-9a0c-0305e82c3301",
"language": "sv"
}
→ 200 { "jobId": "8f2a1c04-…" }
Note what the request does not carry: a number of clips. The engine decides that from the moments it finds. Asking for ten guarantees either four are padding or six good ones were discarded.
GET /api/jobs/8f2a1c04-…
→ 200 {
"job": { "state": "done", "stage": null, "progress": 100,
"billedMinutes": 115, "clipCount": 9 },
"clips": [
{ "idx": 1, "title": "…", "seconds": 41.2, "score": 18.4,
"url": "…expiring link…",
"why": { "hook": "…", "speakers": ["…"], "parts": [ … ] } }
],
"rejections": [
{ "at": "20:03", "atS": 1203.4,
"reason": "The opening line said nothing on its own, so it would not hold a viewer." }
]
}
The rejections array is the part worth building against: every
discarded moment carries a timecode you can scrub to in the source and a reason
in plain words. Download links are minted per request and expire, so fetch them
when you need them rather than storing them.
ViggeClips speaks the Model Context Protocol, so an assistant can drive the clip factory directly: hand it a recording, watch the stages, collect the clips, and explain the result — without anyone opening a browser.
{
"mcpServers": {
"clipforge": {
"command": "npx",
"args": ["tsx", "F:/scalelistuniverse/platform/src/mcp/server.ts"],
"env": { "CF_MODE": "local" }
}
}
}
| Tool | What it does |
|---|---|
credit_balance | Minutes of source video still available |
list_jobs | Recent jobs. Read-only. |
job_status | Live stage, clips, and every rejection with its reason |
submit_job | Queues an uploaded recording |
get_clips | Download links for a finished job |
add_link | Adds a VOD from a link — requires an explicit rights confirmation |
engine_notes | How the detectors choose, for explaining a result |
Three rules govern what an assistant may do, because an assistant is a client that will cheerfully fill a missing argument with its best guess:
| Limit | Value |
|---|---|
| Max source duration | 12 hours |
| Max file size | 60 GB |
| Concurrent jobs | 1 free · 2 Creator · 5 Studio |
| Minimum billed per job | 10 minutes |
| Result retention | 30 days |
| Source retention | Deleted on collection |
| Typical turnaround | ≈ 0.57× stream length (115-min stream → 65 min), measured on an RTX 3060 Ti |