CHANGELOG.md
Rama main · réplica de lectura del repositorio original.
# Changelog
What changed, written for people who use Clips Studio rather than people who
read the commits. Dates are release dates.
This project is in **alpha**: versions move fast, and things listed as fixed
were often broken in a way that only showed up on somebody else's machine.
---
## Unreleased
### Added
- **Optional Clip updates.** App-wide Approve/Deny cards, private Discord
updates and an Away from desk approval gate, with local-model wording and
plain-text fallback. Includes a configurable attorney joke popup. Off by default.
- **Connect your Twitch account** (new).
In Settings → Connected accounts you register a free Twitch application once (the card
lists the steps), paste its Client ID, then sign in on Twitch's own page with a code.
No Clips Kitty account is needed, and the sign-in is kept encrypted on this PC. Twitch is
asked only for the permissions you tick, and none is ticked to start with. An account
that needs signing in again shows Reconnect, which asks for the same permissions.
- **Watch my channel.** Adds your connected channel to Watched channels with the same
choices as Add a channel (from Settings: your Generate settings, and clips wait for
you). Its new videos are then found through your connection, and
through the public video list, as before, whenever the connection needs reconnecting or
Twitch doesn't answer, so the watch keeps going.
If you disable or uninstall a Gaming detector while the Watch form is open, it
returns to **All games (Clips Kitty)** so adding a channel still works.
- **Viewer nominations.** With the chat permission ticked you can start and stop
collecting !clip, !chaos and !funny from your channel or a channel you watch, with command
counts and a timeline for each stream. After a broadcast ends, Clips Kitty looks
for its matching Twitch recording and keeps checking for up to six hours, including
across restarts. In Connected accounts, use **Bind recording** to check the recording
against your stream clock and confirm the offset. The complete downloaded recording
can then use those mapped nominations. These workflows still need live-account verification.
- **For people who make pipelines:** a pipeline you allow can read your channel's Twitch
details, link to a moment of the Twitch VOD it is clipping, and make a Twitch clip of
that moment, all through Clips Kitty and never with your Twitch sign-in. Links and clips
work when the video is the whole Twitch broadcast, as Watched channels downloads it. A
pipeline can't clip your live stream.
### Changed
- Plugin local-model requests now share their requested timeout between checking
model capabilities and generating an answer. A capability check that uses the
budget no longer starts another full-length request.
- Plugins can reuse validated results in an app-managed cache without changing
their installed files, and can see the runner's actual deadline to finish
optional review before it expires. Unavailable cache storage does not stop a run.
Clips are framed and chosen in two new ways, on for everyone. Either can be turned off
with one line in your settings file: `%LOCALAPPDATA%\Clips Studio\settings.yaml` in the
installed app (`config/settings.yaml` if you run Clips Kitty from its code). Restart Clips
Kitty after you change it.
- **Framing follows the cut, and a clip opens on the person's face.** In an edited video,
a new shot could open framed on where the last shot's person stood, and move to the new
person only about a second later, and many cuts were missed or caught a few frames late.
Now cuts are found to the frame, and the crop moves to the person in the new shot on the
cut itself. A clip usually opens on the person's face, where it used to open on their
body and slide over to the face during the first second. A shot with nobody in it opens
on the centre (or keeps the last framing, with `shot_aware_no_subject: hold` under
`tracking:`) until someone clearly visible appears. Framing takes about a third longer
on a video with many cuts, and a little longer on handheld footage. Only the standard
crop changes: Podcast (which has its own entry below), Gaming / Reaction layouts and Sports
frame their own way. To frame as before, add the line `shot_aware: false` under `tracking:`.
- **Clip selection 2.** The moments found from the sound, the picture and chat are scored
by your AI model eight at a time, so they no longer all fall back to a flat 50 when a
local model runs out of room scoring them at once. A long video's later moments are no
longer crowded out by its first half, and a transcript pick scored below your minimum
score no longer hides a moment it overlaps. A clip's start no longer skips past the line
it was picked for, and a clip that would start partway into a sentence goes back to where
the sentence begins, up to 8 seconds earlier. Videos scored as gaming (Gaming / Reaction,
or Vertical Live's Gaming / reaction choice) and Sports matches choose clips as before,
and so does Longform unless you add `longform_selection: 2` under `scoring:`. To choose
clips as before, add the line `selection: 1` under `scoring:`.
- Podcast mode now frames whoever is talking in each shot (not the person moving their
mouth most), follows a new speaker in a long shot, and snaps on every camera cut.
### Fixed
- **Longform no longer fails with "concat join failed" when a video's title has an
apostrophe** (#197), as in "I'll" or "Let's". Clips of such a video also keep their
end card, which they had quietly been made without, and its story reels join again.
- **A clip no longer plays for a few seconds while its card says a minute** (#213). When
the graphics card stopped decoding a clip partway, the rest was dropped and the clip
was saved anyway. It now finishes on the processor, and a clip that still comes out
much shorter than planned is reported as failed instead of saved.
- **"Use standard processing" on a gaming video that Vertical Live turned away now makes
it with Gaming / Reaction,** the split-screen layout. It used to score the clips as a
game but frame them with the plain crop, facecam and all.
- **A bug report sent from the app now describes the video you picked in it,** not
whichever video was processed last.
- **Basketball clips that cut to a close-up no longer start the close-up off-centre and
jump onto the player.** A close-up that moved fast from its first frame was taken for a
fade, and the crop kept the wide shot's framing over it until the "fade" ended.
- A basketball close-up no longer slides off the player onto a fan or the empty seats at
the side of the picture.
- **Clips no longer open with a black moment on Reels, TikTok, Shorts and other apps,**
and story reels no longer flash a frame of the end card between moments.
- **In Soccer clips the crop now jumps to the new shot on the cut instead of sliding
across it**, a cut straight out of a fast pan included, and on a fade into a replay it
jumps as the fade completes. A fast pan is no longer taken for a cut, which made the
crop jump and start looking for the ball again. Each shot also opens on the play,
where it could open beside it and slide over during its first seconds.
---
## 2.1.0: Basketball, and a Marketplace for new pipelines
Basketball joins Soccer under Sports, and the new Marketplace installs pipelines and
plugins that other people build for Clips Kitty. This release also fixes model downloads
that stopped at 100%, new Kick VODs that read as deleted, and caption corrections in
other languages.
### Added
- **YouTube cookies, for when YouTube keeps saying "confirm you're not a bot".** Under
**Settings → Advanced settings**, choose **From Firefox** (signed in to YouTube there)
or a cookies.txt file exported from a browser signed in to YouTube. The file is copied
into Clips Kitty's data folder, so moving the original doesn't break it, and turning the
setting off deletes that copy. Clips Kitty uses it only when YouTube has refused a
download both the ordinary way and over IPv4; every other download stays signed out. Signed in, YouTube's player needs its JavaScript run,
so the app now carries QuickJS (2 MB) for that one request. Chrome and Edge lock their
cookies on Windows, so they are not offered. (#136)
- **A Marketplace, and Awesome Clips Kitty.** Other developers can now write their own
"find the best moments" step (a pipeline) and list it; you install one from the new
**Marketplace** screen and switch it on for a video with the **Pipeline** option. Every
listing says what it may do, where it runs, what it needs and its licence, and asks you
to confirm before anything is installed. Nothing changes until you install something.
The Marketplace also shows **Awesome Clips Kitty**, the list of integrations, apps and
tools that other people have built with Clips Kitty. It lists only what runs in Clips
Kitty or uses it: a link to another project is not an entry. The list is its own
repository, github.com/ColinGPT9/awesome-clips-kitty, where a developer adds a pipeline
with a pull request of one file. Labels: ✓ Official (made by this project), ✓ Compatible (passed
automated checks; not a security review), ★ Featured and Community. Installs from the
Marketplace can be counted anonymously, with a switch to turn it off; nothing is counted
yet. The developer kit is now MIT-licensed; the app stays AGPL-3.0-or-later.
(Experimental routes: `/plugins`, `/marketplace`, `/marketplace/catalog`,
`/marketplace/counting`, `/plugin-models`; a plan from `POST /plugins/plan` carries
the install screen as `text`.) (#129)
- **New pipelines without waiting for an update, and nothing else to install.** The
Marketplace checks Clips Kitty's online list when it opens, at most once a day, so a
newly listed pipeline or a new version shows up without a new version of the app;
**Check for new pipelines** checks at once. With a pipeline installed, the app also
checks when it starts, so a warning about a harmful version arrives without opening
the Marketplace. Until a release includes it, what the list adds shows as Community. The check fetches one file from GitHub and sends nothing about you or what
you browse; a switch at the bottom of Browse turns it off. Pipelines also run on the
Python inside Clips Kitty now, so a creator never installs Python for one.
(Experimental routes: `/marketplace/online`; `/marketplace/refresh` now needs the
desktop app.)
- **The Marketplace in plain words.** Browse and Installed are the only tabs: installing
a pipeline you're writing, from a folder or a link, is now **For developers**, a link
at the bottom of Browse. The Marketplace and the install screen say what a pipeline is,
where it comes from and what it may do in everyday words, and keep the exact details
one click away under **Technical details**. What you tick before installing, the warning
that a pipeline can do anything you can do on your PC, and what "Clips Kitty hands this
over" and "the developer says so" mean are in all 18 of the app's other languages. A download
that fails says why in one sentence (no connection, files no longer there, a full disk or
a damaged download) and keeps the details in the log. Apps, tools
and the other entries of Awesome Clips Kitty each get one button, to their download
page or website where the list has one, which opens your browser after showing you
the address; entries that need the command line or Python say so and come last.
- **Rate & understand: Marketplace plugins that look at your moments.** Once you have
installed a Marketplace plugin that can rate or understand moments, adding a video shows
a new switch, **Rate & understand**. Clips Kitty (or Sports, Gaming scoring or a
pipeline) still finds the moments. Then up to three plugins can say what happens in
each one, and up to three can give each one a new score, in the order you choose. What
a plugin says happens in a moment goes to the AI that writes the clip's title,
description and hashtags. A plugin's score decides which clips are made and their
order: the last plugin's score counts, and a moment it scores under your minimum score
is set aside (a must-have never is). Clips Kitty does any step you leave to it, and a
video without the switch is made exactly as before. Not with Longform. The clip editor
shows each plugin's score and notes, and the video page says what each plugin did, or
why Clips Kitty made the clips without it. The Marketplace marks what each plugin does
(Finds moments, Understands moments, Rates moments), how long Clips Kitty lets it work
on your moments (10 minutes unless the plugin says otherwise), and when an update
starts doing something new.
**A rating plugin decides what gets posted.** Where a watched channel or the daily
schedule posts only the best few clips, the scores decide which ones go out, so a
rating plugin decides that; elsewhere it decides the order. The job form, the channel's
settings and the Marketplace say so.
**A channel that posts by itself waits for you when a chosen plugin didn't run.** If a
plugin chosen for a video couldn't run, Clips Kitty still makes the clips, without it.
A watched channel that posts automatically then holds that video's clips for you to
check and publish, and a channel that asks first says why. A job told to publish its
clips when it finishes waits too. The command-line daily upload isn't held. In a
channel's settings you can keep its plugins or turn them off; choosing them for a
channel is done through the API for now. For developers: the plugin kit (SDK 1.1.0)
adds `job.rate()` and `job.understand()`, with an example plugin, and
[docs/developers/steps.md](docs/developers/steps.md) explains them.
(New job options: `rate`, `understand`.)
- **Suggest edits: Marketplace plugins that suggest edits for your clips.** Once you have
installed a Marketplace plugin that can suggest edits, adding a video shows a new
switch, **Suggest edits**. After the clips are chosen, up to three plugins, in the order
you choose, can each suggest an edit for every clip: parts to cut, stretches to mute
(their captions are hidden too), the volume, fades, the speed, a hook title or a layout,
with a sentence saying why. The clips are made exactly as they would be without the
switch. Open a clip in the editor to see each suggestion, with the plugin's name, and
**Use** it, **Hide** it, or **Take it back** after using it; Take it back removes only
what the suggestion added, never your own edits. Clips Kitty doesn’t put a suggestion into a clip until you use it in the editor and apply your edits (Apply edits, or Apply edits & upload).
A plugin that couldn't suggest anything never holds a channel's automatic posting, and
the video page says what each plugin suggested. Not with Longform. A suggestion you used
is marked if its clip ever comes out without your edits, so you can apply them
again. For developers: the plugin kit (SDK 1.3.0) adds `job.suggest_edit()`
and an `editor` template, and [docs/developers/steps.md](docs/developers/steps.md)
explains the edit step. Plugins don't post: Clips Kitty posts clips itself.
(New job option: `edit`. New fields: `suggestions` on `render_first` when publishing,
`suggestion` on `PATCH /clips/{id}`, and `plugin_edits` in a clip's `scores`.)
- **A second colour for the second speaker.** Tick **Second speaker in another colour**
in the caption settings, for a whole run or for one clip in the editor, and pick the
colour. When two people talk in a clip, the main speaker keeps the text colour and
everyone else's captions take the second one, and a caption never mixes two people's
words. The main speaker is the voice heard all through the video, so the same person
keeps the same colour in every clip of it. It goes by the sound of the voice, so a
caller or a friend on voice chat counts with nobody on screen, and so does a video
being reacted to or a text-to-speech donation. A clip with one voice, or one where it
isn't clear there are two, looks the same as always, and so does every clip with the
option off. Works best with clear audio and voices that differ: two people who sound
alike talking over each other outdoors are often left one colour. In a video where
the streamer says less than what they are watching, the colours can be the other way
round. Not for translated subtitles. Runs on this PC (two small voice models, about 20
seconds once per video and a couple per clip). (#126)
**Where it gets a caption wrong, fix it by hand.** In the clip editor's Captions tab,
**Fix speakers** marks the other speaker's words. Click a word to switch who says it
(the video jumps to it, so you can hear who it is), shift-click to switch every word
up to it, **Swap speakers** to flip the whole clip, **Back to automatic** to drop your
fixes. Undo (Ctrl+Z) takes a fix back like any other edit. The fix is saved with the
clip and stays on later renders, whatever is heard there next time; captions you
didn't touch go on following what is heard. It is offered once a clip has been
rendered with the option on, so a clip you only just ticked it for needs one Apply
first. On a clip whose caption text you already edited (a muted, censored or retyped
word) a click switches the whole caption, and where two people talk over each other
in such a clip a word said inside another may not switch on its own. Processing the
video again leaves the fixes saved but not burned until you re-render the clip, as
with every other edit.
- **Basketball, the second sport.** Tick **Sports** and choose 🏀 Basketball: dunks,
threes, blocks, steals and game winners each become a clip with the possession before
them and the reaction after. The score bug confirms every basket and its points, and
the quarter and game clock make a game-winning three in overtime count for far more
than a first-quarter one. The broadcast's cutaways to the crowd, the bench and
courtside are found too: merged into the play's clip, or clipped on their own with
**Fan reactions**, **Celebrity reactions**, **Crowd reactions** or **Bench reactions**.
A person is named only when the broadcast captions them. The whole game is clipped, and
each clip's vertical crop is planned around its play: the ball and whoever has it, the
receiver of a pass before the catch, and the shot followed to the basket with the rim,
the net and the backboard in the picture. The crop is one picture that pans with the
play and never zooms in or out, like a House of Highlights clip, the TV scoreboard left
out. It sits clear of the apps' text, between TikTok's, Reels' and Shorts' top bar and
the caption at the bottom with a blurred band above and below it, so neither hides the
basket or the floor (the buttons down the right still sit over its edge, and the crop
keeps the rim left of them); **Crop** in the Sports row makes it full screen instead.
When the shooter and the basket don't both fit, it stays on
the ball's side and pans with it to the rim, and when the ball can't be seen it follows
the player who last had it, or the play. A close-up stays on the person the camera is
on, not a blurred shoulder in front. A clip starts
on the court, not on a close-up, the crowd or an earlier play left over from a condensed
broadcast, and ends when the play is over: before the broadcast cuts to the next
possession, a replay (the network's replay logo included) or another quarter, or before
the camera follows the other team up the court, with everything the announcer says about
the play before then and no glimpse of the next shot as it ends. A trip to the free-throw
line stays in one clip, every attempt of it. A clip can come out a little under your
shortest length rather than show the next play. **Best moments** keeps plays and
reactions, not the commentators talking between them, and two free throws are never
called a basket. A whole game joined from two
broadcasts, each with its score in its own place, is read in both, and a team's own
network, whose camera shows the players closer, is told court from crowd as well as a
national broadcast. A game filmed 9:16 keeps its picture. It runs on the same Whisper and AI
model as everything else, and finds the ball, the hoop and the players with the [E-BARD](https://github.com/GabrieleGiudic/E-BARD)
detection model (CC BY 4.0, credited in the README and NOTICE).
Measured on 32 clips of an NBA Finals broadcast: the ball stayed in the crop in 94% of
the frames checked (49% with the first crop), the rim in 98% of them as the ball reached
it (43%) and the backboard in 96% (32%). See
[docs/SPORTS.md](docs/SPORTS.md#basketball).
### Changed
- **The shape options say which shape they are about.** **Longform (16:9 clips)** makes
16:9 clips; **Vertical Live (already-vertical video)** is only for a video that is
already vertical. With both off, a normal 16:9 video makes 9:16 Shorts, as it always
did. Ticking Vertical Live for a normal video now says to untick it. (#131)
- **The Microsoft Store version tells you when the Store has a newer one.** It used to
say only that the Store keeps it up to date, even when the Store hadn't got to it yet.
Now **Check for updates**, and a quiet check at start, ask the Store which version it
offers. When that is newer than yours, a bar at the top and Settings say which version
is there and which you have, with an **Open the Microsoft Store** button; press Update
on that page. The app still downloads and installs nothing itself in a Store copy, and
the request carries only the app's Store ID.
- **A watched channel's re-sends keep its first choice of clips.** Retry failed and the
re-send of posts a platform rejected now send only clips the video's first publish
chose, even if processing the video again changed the scores or made new clips in
between. A clip you trimmed in the editor since is still one of them. Nothing already
sent is ever sent twice, as before.
- **The box at the bottom offers to install Gemma 4.** Ask Clips Kitty only runs on a
Gemma 4 model, and setup installs a different one on most PCs. The box used to say so
in a line of small grey text. It now says "Install Gemma 4 to use this box" and has an
**Install Gemma 4** button, with the build already chosen for your graphics card and
the size of the download beside it. The percentage shows on the button, and the box
starts working by itself when it finishes. The model that picks your clips stays as it
was (#121).
### Fixed
- **Model downloads no longer reach 100% and then do nothing.** The bar stays below
100% until the model is really installed, and while Ollama checks a big download,
which can take minutes, it says **Checking the download… keep Clips Kitty open**.
Quitting during a download asks first. A download that stopped short now says so, with
**Try again**, which carries on where it stopped instead of starting over; before, it
could be called done, and even chosen as your AI model, with nothing there. The Models
page and setup also catch up on how a download ended if they missed it. A download
nobody has carried on with for a week is cleared from disk when the app starts. Ollama's
own log is kept in `%LOCALAPPDATA%\Clips Studio\data\logs\ollama.log`. (#148, #150)
- **A job on an AI model that isn't downloaded stops at once and says so.** It used to
download and transcribe the video first and then fail with "404 Client Error: Not Found
for url: http://127.0.0.1:11435/api/generate". It now ends before anything is
downloaded with "The AI model … isn't downloaded. Download it on the Models page, or
choose a model you have.", and the queue row has an **Open Models** button. A job queued
while setup is still downloading the model carries on as before, and when another model
is installed the job still uses that one. (#149)
- **A word you correct in the captions is burned into the clip.** A correction to a word
with an accent ("perché", "città"), a hyphen or an apostrophe, or in a non-Latin script,
was never found in the caption line, so the clip kept the old word. A correction is also
kept when you click away from the word instead of pressing Enter, and after **Apply**
the editor shows the re-rendered clip instead of the earlier preview, staying open on
it. Escape in the word box now cancels that word only, not the whole editor. (#147)
- **New Kick VODs download again.** Kick has started giving new VODs ids that the
downloader's Kick support doesn't know, so a public VOD that played fine on Kick was
reported as "That Kick VOD no longer exists". Clips Kitty now looks the VOD up the way
Kick's own site does and downloads its recording, at up to 1080p60. Paste the link from
the channel's Videos tab (kick.com/channel/videos/…); that message now only shows for a
VOD Kick has really deleted. (#161)
- **Cloud AI keys save again.** In 2.0.0, saving a key for OpenRouter, Gemini, OpenAI or
Anthropic failed with an error, because part of the cloud AI support was left out of
the installed app. (#135)
- **Adding a watermark to a clip that is open in the editor works.** It failed with
"Access is denied", and **Update preview** with "file in use", because the clip or its
last preview was still playing. (#137)
- **A clip made with captions off stays without them when you edit it.** Its first edit
used to burn the captions back in. The editor's **Captions** tab also has a
**Captions** on/off switch for each clip now. (#128)
- **The Generate row remembers the rest of its settings.** The caption style, the
**Longform output** you picked from the list, the **Pipeline** and the **Rate &
understand** plugins now carry over to the next video and survive a restart, like the
other switches already did. (#138)
- **Processing a video again keeps your edits.** **Process again** made every clip it
found again from the start: cuts, mutes, a layout, captions you fixed, colours and
branding you had applied in the editor stayed in the editor but were missing from the
clip's file, and a channel that posts automatically could post that file. A clip you
edited is now made again with your edits, on this computer or a render PC, and goes
into a match's story reels with them. Clips you never edited, and new ones, are made
with the settings you chose, as before, even when you set up a Gaming / Reaction split
before processing. A clip you edited keeps its own look. In a Gaming / Reaction job it
keeps its own split, and a split that was found automatically or remembered for the
creator takes a webcam you set up or remembered for this run. A split you set up
before an earlier run or drew for that clip stays as it is, even with Gaming /
Reaction off (not in a match): change it in the clip editor. A split you turned off
for a clip stays off. In a match, your cuts, layout, caption fixes and colour
adjustments are kept, and the caption style, colours and branding are the job's;
**Re-render** a clip to make it with its own. 16:9 Longform clips too. A clip with
music you added renders on this computer even when a render PC is chosen.
- **A model download that failed no longer says it finished.** When Ollama could not
fetch a model (no connection, a name that does not exist, a full disk), the Models
page, setup and the box above all showed the download as done, with nothing installed.
They now say "Download failed" and why.
- **H.265 files no longer fail at transcription.** Adding a file that was not H.264 (an
H.265 export from DaVinci Resolve, a phone or GoPro recording) converted it on the spot,
which takes minutes for a long recording while the button only said "Starting…". If
that was stopped part-way, by closing the app or pressing Generate again, a half-written
copy was left behind and used anyway, and the job failed with "Invalid data found when
processing input". The file itself was never the problem. Now:
- adding an H.265, AV1 or VP9 file takes seconds, and the conversion happens when the
video is processed, where you can see it, for 16:9 clips as well as Shorts;
- a copy is only ever used once it is complete, and one left half-written by an earlier
version is redone when you add the file again (#122).
- **Captions on the seconds you add to a clip.** A clip made longer, in AI Edit or the
editor, came back with no captions on the added seconds, and neither re-rendering nor
changing the font brought them. It happened to a clip whose captions had been saved
before, and opening the Captions panel and pressing Apply was enough to save them.
Saved captions now follow the clip: the added seconds are captioned, your corrected
text stays, and a clip already stuck this way is put right the next time it is
re-rendered (#120).
- **"Sign in to confirm you're not a bot" on a YouTube link.** YouTube decides that by
the address a request comes from, and a PC on both IPv4 and IPv6 has two: refused over
one, the same video is served over the other. Clips Kitty asked only the first way, so
the video failed with advice about cookies. It now asks once more over IPv4, and goes
on that way for the rest of the session. If both are refused, it says so in plain
words: wait an hour, switch off a VPN, or try another network. Nothing signs in and no
cookies are read.
---
## 2.0.0: Soccer, and NVIDIA PCs transcribe again
If videos stopped at "Transcribing" on your NVIDIA PC, this release fixes it. It also
brings Sports (Soccer first), Gaming / Reaction layouts, watched channels that clip and
post on their own, and the option to use your own AI key.
### Added
- **Sports, starting with Soccer.** Tick **Sports** for a match, and choose which moments
to keep (Best moments, All goals, Goals + celebrations, Best saves, Best chances,
Attacking plays, Cards or Penalties, each explained in the list), and optionally the
teams or players to favour. The whole match is always clipped. Each moment becomes one clip with its
build-up and its reaction, and the 9:16 crop follows the ball instead of the biggest face.
Also in a queued video's settings, a watched channel's settings, the API and MCP. It uses
the models you already have: no new download.
- The score box is read through the whole match, so a goal is certain, with the side
that scored and the minute. The crowd's roar dates it, since the score changes after
the ball goes in. On a World Cup final all six goals were found at the right minutes.
- Other moments are named only when the commentary names them and the crowd, the
whistle or the screen agrees; otherwise they're big moments. Replays and celebrations
are grouped with their goal, never clipped twice.
- The clip card names the moment ("Goal · 65'", and the side that scored), and the clip page says what the
match gave and the score read. See docs/SPORTS.md, which also shows how to add a sport.
- Vertical videos too: a match filmed or streamed 9:16 is kept as filmed, with nothing to switch on, and its
goals are found the same way. With Longform, the 16:9 clips and the Highlights reel are the match's
moments as well.
- Club and phone footage, recognised by itself when no score box shows. Club footage is
framed on the ball like a broadcast, but with no score box or commentary nothing marks its goals, so none
are claimed: a choice like All goals keeps the best moments instead, and the clip page says so.
- **Match events**: tell Ask Clips Kitty the match's goals as you have them (from your club app, the match
report or the video's description: "18:16 Goal Player A", "45+2' yellow card") and each becomes a clip,
with the player or team on it. Match minutes are placed by the clock on screen or the list's kick-off
times; a club app's tag gets a clip long enough to hold the attack, the goal and the celebration.
- The Sport menu shows ⚽ Soccer / Football, with Basketball and Cricket listed as coming soon.
Hover a Highlights choice to see what it keeps. For a match streamed 9:16, Soccer is a Vertical Live
content choice.
- **Story reels**: **Also make** a Match recap (every goal, card and save, in match order), a reel per team,
and a reel per player named in two moments or more, by your match events or by the commentary for a name in
Teams or players. Joined from the clips already made, so they take seconds, with one end card at the end and
the moments listed in the description. With Longform, in 16:9 too.
- **Remote rendering (experimental).** Another computer of yours can render the clips,
so the one you use stays free while a long stream is processed. Settings → Advanced
settings (off by default, and invisible until you switch it on): pair a render PC with
a one-time code, then render on this computer, automatically on a render PC when one
is free, or only on a chosen one. Only the rendering moves; the clips it sends back
are identical to local ones. Transfers resume, results are checked, a render PC that
drops out gives its clips back, and nothing needs your router opened (Tailscale for
PCs in different places). See docs/REMOTE-RENDERING.md.
- **The Clip Editor groups your videos by creator.** Pick a creator, then a video from its list, so a
big library stays tidy.
- **Gaming / Reaction, for game streams and reaction videos.** The streamer's webcam and
the game (or the video they're reacting to) laid out together, in one of eleven layouts
like StreamLadder's: Split, Basecam (game on top), Half, Fullscreen, Blurred, Small or
Circle facecam, Game UI, Mosaic, Dual facecam and Duo split. With no webcam, the game on
its own. Tick **Gaming / Reaction** and **Choose a layout** opens on the video's own
frames before anything is processed: pick a layout from cards that show this video in
each, drag and resize the webcam and game boxes, choose Camera or Game on top, drag the
line between them, and see the 9:16 result live. Remembered per creator if you want.
- Faces stay clear of TikTok's, Reels' and Shorts' buttons and captions. The webcam is
placed from where the streamer's head is, and the preview shows the chosen platform's
UI with "✓ Face clear", or what to change. A webcam at the top with no room above the
head is moved down on a blur, never cut off at the top; one under the game stays
right against it, with no blur between the game and the streamer's head.
- A whole game sits right against the webcam: never a band of blur between the
streamer and the game. The blur goes above the two (clear of the platform's top bar)
and below them. No black bars.
- A stream's solid panels (a black chat bar under the game, a speedrun's splits) are
found and kept out of the game, so the Short never ends in a useless bar. Chat drawn
see-through over the gameplay stays: it's part of the stream.
- The editor opens with the webcam and game boxes already on the frame to drag, as in
StreamLadder: **Draw it** is the default, and the webcam box moves onto the webcam
when Clips Kitty finds one.
- On the preview, as in StreamLadder: drag the small or round facecam to move it and any
of its eight handles to resize it, and the same for the Game UI layer. Dual facecam is
two round webcams, always the same size. The Game UI is cut to its space, with no blur
round it.
- Parts snap into line like a design editor: to the middle of the Short, its edges, the
platform's safe lines and each other, with a guide line showing it (Alt to place freely).
**Grid** shows thirds, the middle and the safe box. The boxes on the video frame snap
the same way, to each other and to the chat bar's edge, and show the grid while dragged.
- The game box on the video frame stops at the webcam: its edges show as dashed lines
while you drag, and the game snaps to them instead of going over it, so the streamer
isn't shown in the game too (Alt places it anyway, with a note saying so). The
automatic game area keeps the same distance, so the webcam's border no longer shows
as a line down the game.
- Zoomed to fill, the game box has the shape of the game's space on the Short and follows
it as the webcam's share or the layout changes, so what's inside the box is what renders.
- The layout editor has fullscreen (like a video player, Esc to leave, remembered) and
minimise to a bar in the corner.
- The preview draws TikTok's, Instagram Reels' or YouTube Shorts' own layout over the
Short, measured from each app's feed, with icons in each app's style. The safe areas
the face check uses come from the same measurements.
- When the editor opens, a webcam is suggested: the same person in the same framed spot
across the video. Found automatically when processing, the streamer is whoever TalkNet
says is talking in sync with the audio, across several clips of the video: never the
biggest face, so game characters, portraits and the people in a watched video aren't
taken for the streamer. Tested on 13 streams including World of Warcraft, Zelda, GTA V
and League of Legends (docs/GAMING.md has each result).
- The webcam box stops just inside the webcam's own border: no chat or panel beside it.
- A stream that changes partway is handled clip by clip. An hour of Just Chatting before
the game, or a reaction streamer going full screen on their camera between videos: those
clips are framed like a talking-head clip, even with the webcam drawn or remembered for
the creator, and the rest keep the split. A webcam that moves when the streamer changes
scene is followed to where it is in each clip. The automatic webcam search looks past
full-screen clips, so a long chatting opening no longer leaves the game clips without
the streamer.
- The clip editor's Effects tab has the same editor (Layout → **Gaming / Reaction** →
**Change layout…**) to change one clip.
- In gaming mode the "person on screen" part of the score is left neutral, so top-down
games like League and Dota are no longer scored as having nobody in them.
- For streamers on a real camera; VTubers aren't supported.
- **Gaming streams are scored as gaming streams.** A kill streak, a boss going down or
a goal counts, even from a streamer who says little. Gaming / Reaction scores this
way, and so does a live that was already vertical with **Vertical Live content** set to
**Gaming / reaction** (a row under Vertical Live, like Longform's output), the same scoring
in full (game characters and the people in a watched
video aren't taken for the streamer there either). What is said still counts exactly as on any stream (a reaction is mostly
talk); the game adds to a clip on top of that, up to +12, like creator context does,
and carries the quiet stretches. The AI is told which game it is (Twitch says per part of the stream; Kick
and YouTube give the category, title or tags) and what a highlight is in that kind
of game; chat's reactions mark moments and what kind (hype, laughing, surprised,
scared, a fail, "clip it", in any language and with a channel's own emotes); a
sudden shout or laugh from the streamer marks them too, and so does the game's own
sound (gunfire and explosions in a fight, a crowd or a goal explosion in a sports
game, a crash in a race, a scream in a horror game), heard by a small bundled sound
model even when chat and the streamer are quiet. The screen is read too: a banner
(ELIMINATED, VICTORY ROYALE, "X A MARQUÉ", YOU DIED) names the moment, and a menu,
queue or settings page that chat reacted to is marked down. Last, a local AI model that
takes images (Gemma 3 or 4) looks at a few frames of the best clips: a clear moment
moves up, a menu or a black screen moves down. The picture never goes to a cloud AI.
A menu or no gameplay only costs a quiet clip: a Just Chatting clip full of talk
loses nothing for it.
Each moment becomes a
15-35 s candidate starting just before it, and the clip's score breakdown shows what
marked it. Standard scoring is unchanged.
- **Vertical Live, for streams that were vertical all along.** A YouTube vertical live,
the vertical feed of a Twitch Dual Format or Streamlabs Dual Output stream, or a
downloaded Instagram or TikTok live is already a finished 9:16 video. Tick **Vertical
Live** and Clips Kitty keeps its layout: no face tracking or reframing, one encode of
the whole frame at 1080x1920. The moments are found exactly as before, with your chosen
AI, and clips caption, brand, publish and schedule as usual.
- YouTube vertical lives now download at 1080x1920 in this mode (standard processing
picks a smaller size for vertical video). A video with no vertical version is refused
with what to do instead, never swapped for the horizontal one.
- A file that isn't 9:16 is refused before any work, with **Use standard processing**.
A 9:16 file you add gets "Is it a vertical live?", and can carry its original link.
- Watched channels have the same switch. Videos with no vertical version are skipped,
so a Streamlabs dual-output channel isn't clipped twice.
- In Clips Kitty Web too: a Twitch or Kick VOD is cut from its vertical version.
- Twitch's vertical VODs couldn't be downloaded by link when this was built: download
the vertical recording and add it as a file.
- **Watch a channel and let Clips Kitty do the rest.** Add a YouTube, Twitch or Kick
channel on the new **Watched channels** page. When it posts, the new video joins the
queue by itself, and once the clips are made they are published through WoopSocial,
either straight away or after you press Publish, which is the default. Set it up
once per channel: the clip settings, where the clips go, how many posts a day, and a
line under every caption that can link back to the full video.
- Adding a channel never clips what is already on it. Those videos are listed, one
click from being clipped if you want them.
- A video is only ever clipped once, and a clip is only ever posted to a platform
once, even after a crash or a restart.
- Live streams, premieres and Shorts are waited for or skipped rather than grabbed
half-finished.
- Videos posted while Clips Kitty was closed are found when it opens. You choose
whether to clip only the newest, all of them, the last day's, or none.
- To keep watching on a spare PC, turn on **Keep watching when the window is
closed**. Clips Kitty then stays in the system tray until you quit it from there.
It is off unless you turn it on.
- **See it working.** A live panel at the top of Watched channels shows that
Clips Kitty is watching and what it is doing right now: checking a channel,
a new video found, clips being made with a progress bar, clips scheduled, a
post going live. A green dot beside Watched channels in the sidebar shows it
from every page, and each channel carries a Watching badge.
- Kick has no official way to list a channel's videos, so Kick watching uses the
same unofficial one Kick downloads already rely on, and says so if it stops
working.
- Opening Clips Kitty a second time now brings the running window forward instead
of starting a second copy that cannot work.
- **Hands-off, for an always-on PC.** Choose "Clip and publish automatically" when
you add a channel, tick where the clips go, and leave Clips Kitty running. Every
new video is then queued, clipped and published with nobody at the PC. It keeps
going through the usual hiccups: a failed download is tried again, a publish that
cannot reach WoopSocial waits and tries again, and posts a platform turned down
are sent again later, only those ones. Turn on **Delete each watched video's
download once its clips are published** so the disk does not fill up.
- **Set everything up once.** Before you even press Add, choose how many of each
video's clips to post (the best ones first, or all), whether to post right away
or space them out, posts per day, hours apart
and the time the first post of each day goes out, with a preview of the next
posting times, just like the Publish dialog. The channel then opens its whole
setup for the rest. Add your
own hashtags, like `#creatorname #twitch`; they lead every caption so they are
always kept, and you can leave out the AI's hashtags entirely. Each platform
has its own settings: YouTube visibility, who can watch on TikTok and whether
comments, duets and stitches are allowed, Reel or Story on Instagram and
Facebook, and your Pinterest board.
- **It learns about the creator you watch.** Adding a channel gives it a
profile in Creators straight away, marked Watched, and every video it clips
is learned into that profile. The channel's card shows how much it knows so
far, with a button that opens the profile, and the live panel says what each
new video taught it.
- **PC too old to run the AI? Bring your own API key.** Clips Kitty still runs
everything on your PC by default, free and private. For a laptop with a small
graphics card, or a low-spec mini PC watching channels, **Settings → AI** can
now hand the work to a cloud provider on your own account instead. Ollama stays
first; **OpenRouter** is the recommended cloud option, one key for many models
you can switch between, shown with each model's price; OpenAI, Google Gemini,
Anthropic Claude, xAI Grok, Meta's Muse Spark, DeepSeek and Qwen are there
too, as direct providers under Advanced (a Qwen key's Alibaba Cloud region is
found for you). The provider bills you directly; Clips Kitty has no key, credits or
server of its own. Where local AI struggles (setup on a PC with no graphics
card or a small one, a model too big for the card, a job that failed in the
local AI, Watched channels on a small PC) the app points to OpenRouter. With a cloud model chosen, everything the local model did uses it: clip
picking, titles, creator learning, clip edits, translation and the assistant.
- Transcription is its own choice: Whisper on your PC, or online with your key
through OpenAI, OpenRouter or xAI, with the word timings captions need.
- With OpenRouter, pick the text model and the voice model from its live
catalogue, each showing OpenRouter's current prices (and when they were
fetched), with a refresh. A voice model not yet known to give word timings
is checked with a three-second test clip before it is used.
- **Sign in with OpenRouter**: approve Clips Kitty in your browser and it gets a key of
your own, on your OpenRouter credits, with nothing to copy or paste (OAuth with PKCE).
Pasting your own key is still there, under Advanced. **Copy sign-in link** connects a
different OpenRouter account from a private window.
- The Gemma models come first in the text model list, under the preferred one.
- **★ Preferred** models head each list, one click away: Gemma 4 26B-A4B for text
(about a cent for a two-hour stream) and Whisper large-v3 turbo for voice (about
$0.01 an hour, with word timings). A free (`:free`) model's note offers its paid
version, and a job it stops says it was the free version's limit.
- Online transcription no longer stops at a stretch where nothing is said: a
stream's ten-minute music intro used to fail it as "no word timings". And the
voice detector local Whisper uses now runs on each part first, so the "Thank
you." Whisper makes up in quiet stretches (640 in one stream) is dropped, and a
part where nobody speaks isn't sent or paid for.
- Your key is checked before it is saved, stored encrypted, and never shown
again apart from its last four characters. **Test connection** checks the
key and model without spending anything.
- **Experimental: use a ChatGPT plan you already pay for** instead of an API
key, through OpenAI's own Codex (OpenAI / ChatGPT plan, under Advanced). Sign
in with ChatGPT in your browser; pick a model your plan offers; the card shows
how much of the plan's limit is used. It stops at the limit rather than spend
ChatGPT credits, and Watched channels only use it if you allow them. It needs
a paid plan (OpenAI refuses free accounts outside its own app), and for now
only runs from source. Claude and Google plans can't be used by other apps;
their entries say so, and why.
- If the provider fails (a bad key, no credit left, rate limits) the job says
so plainly. Nothing ever switches to another provider, or back to the local
model, without you choosing it.
- How it works, what it sends and what it costs: `docs/AI-BACKENDS.md`.
- **Ask an AI assistant to do it.** Clips Kitty now speaks MCP, so Claude, Cursor
or any MCP client can queue a stream, follow the job, read back the clips it
chose and export one, in plain language. It needs no API key of any kind,
because the model doing the work is the one already on your PC.
- **Integrations can be told when a job finishes.** Send a webhook address with a
video and Clips Kitty posts to it once, the moment that video is done, so a
dock or an automation can sit quiet instead of asking every few seconds. Add a
secret and the message is signed, so your listener knows it is really us.
- **Thumbnails made from the clip, on your PC.** Press **Make thumbnails** in the
YouTube panel and Clips Kitty looks through the clip for frames where someone
is facing the camera, crops each to 16:9 around them and puts the clip's hook
across the bottom. Pick one like any other thumbnail. It costs nothing and
sends nothing anywhere: the faces, the frames and the type all come from what
is already on your machine. The three fixed suggestions are still there, and a
clip with no usable frame simply offers none.
- **Highlight videos get chapter timestamps.** The description now lists each
moment with the time it starts, so viewers can skip straight to the bit they
want. They are added only when YouTube's own rules allow it: a chapter list
that breaks them is ignored completely, and a list that silently does nothing
is worse than none.
- **Tell Clips Kitty what to do, in a sentence.** There is a box on the dashboard
now. Write something like "clip the newest stream and schedule the clips an
hour apart from tomorrow morning" and a Gemma model running on your PC works
out which steps to take and takes them, showing you each one as it goes.
Uploading is the exception: it can plan a batch of uploads, but the plan comes
back for you to read, and nothing goes to YouTube until you press the button.
The box needs a model that can call tools, which means Gemma 4 or newer; if the
model you have cannot, it says so rather than guessing.
- **Plan a batch of uploads before any of it happens.** Assistants and MCP
clients can ask for a publishing plan: which clips, what each one's title and
description will be, and when each goes out. Nothing is created until the plan
is sent back for execution, so a batch with the wrong description is something
you catch while reading rather than something you undo thirty times.
- **Put the same links under every video.** The YouTube panel has an "Add to
every description" box for your Twitch, your Discord, whatever you always
paste. It goes under each description as the clip is published, once, without
repeating itself when you publish a clip again.
- **Say how you want the clips made, in the same sentence.** The box and any
MCP client can now set what the panel's tick boxes and menus set: captions on
or off, the caption font, size, colour, position and word count, a watermark
by the name you saved it under, podcast footage, longer clips, and the
horizontal longform modes. "Clip this with big yellow captions at the top and
my Main channel watermark" now does all three. A font or colour it does not
have is refused with the list of real ones, rather than quietly rendering
every clip of the stream in the wrong one.
- **Drag the assistant to the height you want it.** There is a grip on its top
edge, and the size is remembered. It never grows past the space there is, so
the box you type into stays on screen.
- **16:9 and 9:16 clips of the same video in one go.** With Longform on, tick
**Also make 9:16 Shorts** beside *Longform output*: the video's vertical Shorts
are made first, then the 16:9 output, in one run. Each clip is its own card, and
the horizontal ones are marked 16:9.
- **Tell it what the clips should be about.** Say it in the box at the bottom when
you ask for a video: "clip this stream, make sure you include when I died to the
boss, prioritize funny moments, and more from the WoW part around 1:35". The clips
are still picked the usual way; the direction only adds to it:
- points for clips about the topic or moment you named (the AI adds the words it
comes up with, so "WoW" also finds "Azeroth"), inside a time you gave ("1:35-1:55",
"around 45 minutes", "near the end"), or with the funny, laughing, hype or
reaction moments you asked for;
- a look at moments there the first pass skipped, across the whole stream;
- a must-have ("make sure", "at least two clips of") that was actually said is kept,
even under the quality bar or a clip cap.
It never lowers a score or removes a clip, so "avoid the intro" is noted rather than
applied. A must-have that was never said is reported ("Couldn't find: ...") and no
clip is made up for it. The video's clip page shows what was understood, and each
clip says what it got extra points for. A video asked for without a direction is
processed exactly as before. Works with every AI setup; on the API and MCP it's `focus`.
### Fixed
- **16:9 clips no longer fail with "error 404".** Longform asked for the AI model named in
settings even when setup had downloaded a different one for your graphics card, so every
run stopped with a 404. It now uses the model you have, as 9:16 clips already did.
Translating clips and the clip editor's chat did the same, and are fixed too (#118).
- **Cancel stops a long video while it's being analysed.** On a long VOD, pressing Cancel
during "Finding the best moments" did nothing until a whole-video pass (its sound and
picture, the chat replay) had finished, which on a 4-hour stream looked like loading
forever. Cancel now stops it within a couple of seconds, decoding and all.
- **One odd answer from the AI model no longer fails a whole video.** When the model
put a line of text where a clip belonged, the video stopped with "'str' object has
no attribute 'get'", ten minutes into a long match. That entry is now skipped and
the rest of the answer kept, like any other entry it can't read.
- **Videos no longer fail at "Transcribing" on NVIDIA PCs** with "Library
cublas64_12.dll is not found". Whisper's engine needs NVIDIA's cuBLAS 12, which
the app stopped carrying when it moved to CUDA 13 for the RTX 50-series; it now
ships with the app, so GPU transcription works with nothing else to install. And
if the GPU's libraries can't be loaded for any reason, the video is transcribed on
the CPU (slower) with a note in the log saying why, instead of failing.
- **Minimum score can be changed in Settings** (Advanced settings). When a video
gives no clips, the app suggests lowering it, but until now it could only be
changed in the settings file.
- **Closing the window closes the app when nothing is being watched.** With "Keep
watching when the window is closed" ticked, Clips Kitty went to the system tray
even with watching switched off or no channels on. It now stays in the tray only
while it's actually watching a channel.
- **Adding a video again for the other format makes its clips.** After 16:9
(Longform) clips of a video, adding it again for 9:16 Shorts finished in two
seconds with nothing made. It now makes the Shorts, and Longform after Shorts no
longer asks "already processed". A file you've really made Shorts of before
now offers **Process again**, as a pasted link does, instead of a silent run.
- **Gemma 4 on your own PC reads the stream again.** With gemma4:e2b or gemma4:e4b
(what setup installs for graphics cards of 6 GB and under) as the AI, the part that
reads what was said came back empty for most of a video, so clips were picked
almost only from sound and movement, with titles like "High-energy moment", and it
took ten minutes to find one. Gemma 4 now answers without its thinking step and
without Ollama's JSON mode, which made it repeat itself until Ollama gave up: on a
13 minute stream, 16-17 moments found in under a minute instead of one.
- **The box at the bottom answers every time on Gemma 4.** About one request in
three came back blank, with nothing done: the app's instructions and tool list
filled Ollama's default 4K context, and Gemma 4 ran out of room while thinking. It
now gets 16K, and a model that still says nothing is reported instead of an empty box.
- **Esc in the Gaming / Reaction layout editor no longer closes the clip editor
behind it.** Opened from the clip editor, Esc closed both; it now leaves
fullscreen first and then closes only the layout editor.
- **Editing a clip can no longer lose it.** Applying edits deleted the clip
before rendering the new version and put it back afterwards, so a render
that failed, or closing the app halfway through one, lost the clip and its
translations for good. The clip is now only replaced once the new version
has rendered.
- **The Dashboard's Donate button lines up with Start posting everywhere
again.** The posting card's text grew, and the Donate button beside it
stayed high; both buttons now sit on one line however long either card is.
- **A watched channel uses your clip settings.** Its clips came out with the
app's defaults, captions included, even with captions unticked: the choice
lived in the Generate bar and never reached the channel, and the channel's
own Clip settings needed a separate Save that was easy to miss. Adding a
channel now starts from your Generate settings, shown in the form, and a
channel's Clip settings and Publishing save themselves as you change them.
- **Watched channels skip YouTube Shorts.** There is nothing to clip from a
Short, so they are no longer listed or queued; only full videos and
finished streams are.
- **Hashtags come out as separate hashtags.** The AI sometimes wrote several
hashtags run together, like `#creatorname#drama#apology`, and they were
posted that way, as one long unreadable tag. They are now split into
`#creatorname #drama #apology`, for new clips and for clips you already have.
- **No more "Clip from:" captions.** When the AI could not write a clip's caption,
the clip was given "Clip from: <the video's title>" and a #clips hashtag. Every
clip of that video then went out with the same caption announcing it was a
repost, and TikTok flagged them as unoriginal content. A clip like that now
gets no caption text beyond its title and your hashtags, and clips that already
had it are published without it.
- **Publishing from the chat box no longer sends everything at once.** "Process
this and publish them all" and "publish all my clips" used to post every clip
in one go, and WoopSocial allows about five YouTube posts a day, so most were
rejected. Unless you say how fast, clips now go out five a day, an hour
apart, after anything already scheduled, and the plan you are shown before
saying yes lists those exact times. Hashtags you asked for in the chat now
reach the posts too; the confirm button used to drop them.
- **WoopSocial posts now show what really happened to them.** Every post sent
through WoopSocial stayed at "processing" for good, because Clips Kitty was
reading the wrong field of WoopSocial's reply. Posts that went out now show as
published with their link, and ones that did not show as failed with the
reason in plain words, such as WoopSocial's five-a-day YouTube allowance or
TikTok's posting limit. Posts you already sent correct themselves the next
time Clips Kitty checks, within a few minutes of opening it.
- **Hashtags now actually appear under your videos.** Clips Kitty has always
chosen hashtags for a clip, but they were being sent to YouTube's keyword
field, which nobody sees, and the description went up without them. They are
now written into the description, where they show above the title and are
searchable. This reaches clips you made months ago, because it happens when
the clip is published rather than when it was created.
- **Your channel name is always the first hashtag.** Descriptions were missing
the one hashtag that matters most for finding your other videos. Each clip now
carries at most five, and the creator's name leads them, so the cap can never
cut it off.
- **An age-restricted video says so.** YouTube will not hand these over to
anyone who is not signed in, and Clips Kitty downloads without an account. It
used to fail with a wall of yt-dlp text about exporting cookies, which read
like a crash. It now says what happened and what will work instead. The same
plain wording now covers failures during the first check of a link, which is
the likeliest moment to fail and the one place it was missing.
- **The activity list follows what is happening.** New lines were being added
at the top, so the newest event was never where you were looking. It now
reads downwards with the newest at the bottom and scrolls to keep up, unless
you have scrolled up to read something, in which case it leaves you alone.
---
## 1.2.0: every clip now ends with a Clips Kitty end card
### Added
- **Every clip ends with a short Clips Kitty end card.** A 2.9-second card with
the Clips Kitty mascot is added to the end of each clip you make, so people
who watch your clips can find the app that made them. It is joined on without
re-encoding, so the clip itself is untouched.
- **Korean is now fully translated**, thanks to
[@doeil1614-ops](https://github.com/doeil1614-ops). Korean was listed as a
finished language and was not: 68 of the app's phrases were falling back to
English. All of them are translated now, and the existing wording was reviewed
by a native speaker, so clips are called "하이라이트 영상" (highlight videos)
where that is what Korean creators say. If something still reads oddly,
[#45](https://github.com/ColinGPT9/clips-studio/issues/45) is the place to say
so.
- **Publish to YouTube from the editor.** Finish a clip, press **YouTube**, fill
in the title, description, tags, thumbnail, playlist, audience and visibility,
and press Upload. Clips Kitty renders your unsaved edits and uploads straight
to your channel. No exporting the file first, no hunting for it on disk, no
separate publishing screen. You never leave the editor.
**Scheduling uploads the video now** and asks YouTube to publish it later, so
you can close Clips Kitty and switch your computer off. There is no timer in
this app and nothing to leave running.
It is **off until you turn it on** in Settings, and it uses your own free
Google API key rather than a shared one, which is what stops every user in the
world drawing from the same daily upload allowance. If you never enable it, the
editor looks exactly as it did.
One thing worth knowing before you rely on it: until your Google Cloud project
passes YouTube's free audit, **YouTube locks every video uploaded through an
API to private, permanently**, and it cannot be undone in Studio. That is
YouTube's policy, not a bug, and no software can work around it. Clips Kitty
checks after every upload and tells you if it happened instead of claiming
success. Uploading as unlisted or private is unaffected. See
[README "Posting publicly"](README.md#posting-publicly).
This is new, and few people have tried it yet. If you set it up, tell us how it
went through the Feedback Hub, whether it worked or not.
- **Star the clips you have exported, and export a whole video at once.** Each
clip in the Clip Editor has a star next to its delete button. Exporting a clip
stars it, and you can star or unstar any clip by hand. **Export all** saves
every clip from a video or stream that is not starred yet, so nothing gets
exported twice. Clips you exported before this update start out starred, from
the app's export history.
- **"No clips" explains itself.** When a video produces nothing, the app now
says so where the clips would have been, with the numbers behind it: how many
moments were considered, the best score any of them reached, and the
threshold they were measured against.
When the reason is that nobody was on screen: gameplay, top-down games,
anything without a person in frame. It says that too. Part of a clip's score
is whether someone is visible, so that footage scores zero on it rather than
merely low, lands under the threshold, and comes back empty. That is working
as designed, and until now the app gave no hint of it: the screen just said
"No clips for this video yet", which reads like a fault.
It only names that cause when the detector actually looked and found nobody.
A quiet talking-head video that simply did not score well is told apart from
gameplay and gets the plain numbers instead: being confidently wrong about
someone's footage would be worse than saying nothing.
- **Reasoning models find clips.** DeepSeek-R1, OpenAI's gpt-oss and NVIDIA's
Nemotron 3 Nano could finish a video with no clips and no error: Ollama either
spent their answer on thinking or blanked it while they reasoned. Each is now
sent what it needs, and all three are listed on the Models page. The models
setup installs are sent exactly what they were before.
- **Streamer tools can hand a finished stream to Clips Kitty.** A new supported
API, `/integrations/streams`, takes a stream's platform, channel and start and
end times.
- **Finds the VOD:** looks up the one Twitch or YouTube publishes afterwards,
and queues it once.
- **Asks when it can't look:** Kick, or no channel name, gets a request for the
link.
- **Never starts other waiting videos** along with it.
- **Reports progress and time left** in the same terms the app shows.
The OBS plugin is the first thing built on it. `/health` now also reports
`app_version` and `api_version`, so a tool can tell when Clips Kitty needs
updating.
### Fixed
- **The local API only answers requests addressed to this computer.** A web page
could previously reach it by pointing its own domain at 127.0.0.1 (DNS
rebinding). Requests carrying any other host name are now refused.
- **Bug reports lost the one field that mattered.** The reporter is required to
say which video they were processing, and the answer was then dropped before
the report was built. It now appears, and the question is a list of your
recent videos rather than a text box.
- Reports also carry the video and the run summary automatically, so they are
useful even when the description is three words. Previously the video was
guessed from "most recently updated", which found nothing at all if the
reporter had deleted the video first, as they usually have.
- **Editing a clip you had translated no longer fails the render.** Translating a
clip in the Subtitles tab and then pressing "Apply edits" failed the job with a
database error, mentioning nothing you had actually done. Re-rendering replaces
the clip's row, and the translation still pointed at the old one. Translations
now follow the clip across a re-render, and so do publishing records.
- **Your YouTube sign-in is no longer stored in readable form.** The saved token
used to sit in plain JSON in the data folder. It is now encrypted against your
Windows account, so copying the folder to another PC or user does not carry it
over. Existing sign-ins are moved across automatically the first time.
- **`python main.py auth` works in the installed app.** It looked for your
credentials file relative to whatever folder it happened to be started from,
which for an installed copy is not where the file is.
- **A blocked YouTube sign-in now says how to fix it.** If your Google Cloud
project is still set to Testing, Google refuses the sign-in, and the app used
to tell you that you had declined the permission request. It now says to open
Google Auth Platform, then Audience, and press Publish app.
- **Updates no longer offer an older version.** An installed copy could offer to
"update" itself to a version older than the one it was running whenever the
update feed was behind it.
- **Downloading an update shows real progress.** After a small first step, the
bar used to sit at 100% for the whole multi-gigabyte download, which looked
frozen. From this version on it counts through the app files as they arrive.
- **AI models from older versions are found again.** Since 1.1.3 the app kept its
models in a different folder from the rest of its data, so people coming from
0.1.x downloaded their model a second time. It now keeps using whichever folder
already has your models.
---
## 1.1.4: setup stops asking for a model you never chose
### Fixed
- **Setup no longer asks for a model you were never meant to install.** On a PC
without a graphics card, setup downloads the smaller AI model that suits it,
and then told you a *different* model was missing, with a red error, directly
under a line confirming a model was installed. The download had worked. The
check was asking the wrong question: it wanted one specific model rather than
any model that runs.
It now checks whether an AI model is available at all, and names the one it
will actually use. Downloading a model from setup also selects it, unless you
already have a working one chosen, so picking a bigger model to try later
will not switch you over without asking.
**This affected every PC whose recommended model was not the shipped
default**, which is any machine without an 8 GB graphics card. If setup told
you `gemma:7b` was not installed straight after a download finished, this was
why, and there was no way past it.
- **A failed YouTube download now says what went wrong.** Pasting a YouTube
link could fail with a wall of technical text ending in `HTTP Error 403:
Forbidden`. That looks like a broken app and reads like a broken link, and it
is neither. YouTube hands over the video's details and then refuses to send
the actual data to your network, which is Google rate-limiting the connection
itself. It usually clears on its own within an hour, and Twitch, Kick and
local files keep working while it does. The app now explains that in plain
English instead of printing the error.
**What the app cannot do is prevent it.** Nothing in Clips Kitty can persuade
Google to serve a connection it has decided to throttle. If it keeps
happening, switching off a VPN or moving to a different network is what
actually fixes it. Reported by a user through the in-app feedback hub
([#81](https://github.com/ColinGPT9/clips-studio/issues/81)).
- **RTX 50-series cards no longer crash every job.** On a GeForce RTX 50 card
processing failed part-way through with `CUDA error: no kernel image is
available for execution on the device`, every single time. Clips Kitty was
built against a version of CUDA that predates those cards, so it could see
the GPU, report it as working, and then have no code it could actually run on
it. It now ships CUDA 13, which supports them properly. Reported by a user
through the in-app feedback hub
([#83](https://github.com/ColinGPT9/clips-studio/issues/83)).
- **A GPU that cannot be used falls back to the CPU instead of failing.**
Whichever version of CUDA the app ships, some graphics card sits outside it.
Until now that meant a job died in the middle; it now finishes on the CPU and
says which card it could not use and why. The startup check reports this too,
rather than calling the GPU fine right up until the crash.
### Security
- **Voice files are now found by listing the folder rather than by building a
path from the requested name.** No release was vulnerable. The name was
already checked against a strict pattern that rejects anything resembling a
path, but the check was a rule about the text, and this is a property of
where the value comes from, which is the stronger of the two. A related
pattern that only rejected a name ending in a newline was tightened at the
same time.
### Changed
- **GTX 10-series and older cards now run on the CPU.** Supporting the RTX
50-series meant moving to a newer CUDA, and that does not reach back to cards
that old. **GTX 16-series and every RTX card are unaffected**. An RTX 2060 is
the oldest card that still uses its GPU. On the machines this does affect,
everything still works and produces identical clips, just more slowly, and
video encoding uses the GPU exactly as before. No version of CUDA supports
both those cards and current ones, so it was a choice between the two.
- **The YouTube downloader is six weeks newer** (yt-dlp 2026.8.19). YouTube
changes how it serves video often enough that this is the one component worth
keeping current, and the shipped copy had fallen behind. Older copies
gradually lose access to formats as YouTube moves on.
---
## 1.1.3: the app is now called Clips Kitty
> **Same app, same data, nothing to do.** Your clips, settings and creator
> profiles stay exactly where they are and open as normal. Only the name
> changed.
**Why:** the old name was too close to existing software to be listed on the
Microsoft Store. The clip editor page had the same problem and is now called
**Clip Editor**.
Everything that is a link stayed a link: the GitHub repository, this website
and the download addresses are all unchanged, so nothing anyone has bookmarked
or shared has broken.
**The version jumped from 0.1.2 to 1.1.3**, which looks odd and is deliberate.
The Store will not accept a version starting with 0, so every release used to
carry two numbers (0.1.2 in the app and 1.1.2.0 on the Store) and somebody
had to remember the mapping. 1.1.3 is above the 1.1.2.0 already published, so
from here the app version and the Store version are the same number. This is
still alpha software; the leading 1 is a Store requirement, not a claim.
### Fixed
- **Processing no longer needs to reach GitHub.** Every video tried to download
a 7 MB detection model, even though that file was already inside the
installer. If the download failed, so did the job: "Download failure … Retry
limit reached". It now uses the copy it shipped with.
**This affected 0.1.2**, so if a video failed with a download error, this was
why. It was unpredictable rather than universal: the app looked for the file
in whatever folder Windows happened to start it from, so it worked or failed
depending on where the shortcut pointed, and it always worked when run from a
developer's own copy of the source. That is why it survived to a release.
- **A video whose details were lost keeps its name.** Reprocessing a video
after the database had been reset or moved showed the raw ID instead of the
title, and no channel at all. The empty channel was the worse half: creator
profiles are matched on it, so catchphrase learning and preference history
quietly did not run for that video. It now re-fetches the title and channel
without re-downloading the video, and still works offline.
- **The Models page headings no longer run together.** "Recommended" was wider
than its column and collided with the next heading, reading as
"RECOMMENDEDWHY". The column is now labelled "Model", which is what it holds.
### Added
- **Russian is now fully translated**, thanks to [@4nmus](https://github.com/4nmus),
the first contribution to Clips Studio from outside. Russian was listed as a
finished language and was not: 92 of the app's 208 phrases were quietly
falling back to English. All 92 are translated now, and 56 of the existing
ones were rewritten by someone who actually speaks Russian rather than by a
machine. If you use the app in Russian and something still reads oddly,
[#60](https://github.com/ColinGPT9/clips-studio/issues/60) is the place to say so.
- **Brazilian Portuguese is now fully translated**, thanks to
[@espinafr](https://github.com/espinafr), the second contribution from
outside. Portuguese was listed as finished and was not: 133 of the app's 208
phrases were falling back to English. All of them are translated now, and 30
of the existing ones were rewritten by someone who speaks the language. The
most visible change is that clips are "cortes" rather than "clipes", which is
what Brazilian editors actually call them. If something still reads oddly,
[#59](https://github.com/ColinGPT9/clips-studio/issues/59) is the place to
say so: two phrases are already known to need a second opinion.
- **Clips Studio is coming to the Microsoft Store.** Same application, same
local processing; the Store version is updated by the Store rather than by
the in-app updater, and its donate button opens your browser. The standalone
installer is unchanged and stays the main way to get it.
---
## 0.1.2 (2026-08-10)
### Fixed
- **Your clip settings are remembered again.** Turning captions off, closing
the app and reopening it brought captions back on. Five settings behaved this
way: captions, 60s+ clips, podcast mode, longform and its mode. They were
read from storage on startup but never actually saved.
- **The Watermark tickbox works.** It silently refused to stay ticked when no
branding profile existed yet. It now explains that a profile has to be
created first, rather than looking broken.
- **A failed render says what went wrong.** A memory failure used to print
pages of encoder output for every affected clip. It now says so in one
sentence, once, however many clips were hit.
### Changed
- **The Models page makes sense.** It had one heading, "Your hardware", over
rows like "Multilingual" and "Newer Gemma", which are not hardware, and a
"Why" column carrying licences and warnings at the same time. There are now
two tables: what your machine can run, and what to pick for a particular job.
`gemma3:4b` also appeared twice; it is one row now.
- **More models to choose from**, all free to run locally and all usable on
clips you earn from. `gemma4:e2b` and `gemma4:e4b` are built for ordinary
local machines and are recommended alongside the Gemma 3 line. `e2b` suits a
low-power or older PC, `e4b` anywhere `gemma3:4b` fits. Qwen3 for translation
and multilingual work, and Mistral Nemo or Phi-4 for anyone who wants a
plainly permissive licence.
---
## 0.1.1 (2026-08-09)
The release that made 0.1.0 usable. Both bugs were packaging mistakes, and both
were invisible on a development machine, which is exactly how they reached a
release.
### Fixed
- **No clip could be produced, from any source.** Every job died partway with
`No module named matplotlib`. The bundle excluded a library that the tracking
model needs in order to load at all.
- **YouTube downloads failed** with `ffmpeg is not installed`. FFmpeg ships
inside the app, but the downloader looked for it on the system instead of
being told where it lived, so it could not join YouTube's separate video and
audio streams. Twitch and Kick were unaffected, because their recordings
arrive as a single stream, which is what made it look like a YouTube
problem rather than a packaging one.
---
## 0.1.0 (2026-08-08)
First public alpha.
- Paste a Twitch VOD, Kick VOD or YouTube link and get vertical clips with
word-synced captions and written titles.
- Everything runs on your own computer. No uploads, no subscription, no cap on
how many clips you make.
- One installer. It carries the app, the engine, FFmpeg, the AI runtime and the
tracking and transcription models. The only thing fetched afterwards is the
language model, sized to your graphics card on first launch.
- Editor for fixing anything the AI got wrong, multilingual captions, creator
profiles that learn from your corrections, and a queue that runs unattended.