Repository navigation
Releases: AhsanAyaz/ossclip
Release list
0.1.38: the preview survives sound effects
Two editor fixes.
- The preview no longer dies after the 6th sound effect. Each sfx cue's Sequence is now bounded (declared duration, or a 10s fallback, clamped at the end of the composition), so started audio unmounts instead of exhausting the Player's 5 shared audio tags. The editor Player also no longer carries a duplicate sfx track; the editor previews sound effects through its own lane scheduler.
- The zoom slider works on kept-retake blocks. It used to snap back to 1x and commit that over your framing; the stage preview is now re-applied after kept takes are carved.
Full changelog: v0.1.37...v0.1.38
0.1.37: transcribe anywhere — remote whisper servers
Remote transcription
- New OpenAI-compatible remote transcription backend:
--whisper-backend
lets you point ossclip at a remote Whisper server (Groq's free tier or a
self-hostedspeachesinstance) instead of running Whisper locally. - Audio is packaged as an opus sidecar for upload, with correct behavior
around Groq's 25MB upload cap under both readings of the limit. - Remote transcription results are cache-keyed alongside local runs, so
re-runs and--scenesreplays stay consistent. ossclip doctorandossclip setupare now aware of the remote backend
and report on it accordingly.- The editor can re-transcribe an individual span using the remote backend.
- New troubleshooting note for corporate TLS-inspection environments that
intercept the connection to the remote Whisper server.
Docs
- Big documentation refresh: the Pages site swept back to current, a new
publish section, and new color-grade / SFX sections. - npm README brought in line with current CLI behavior.
--collapse-retakesdocs corrected — it's a legacy no-op, now says so
everywhere it's mentioned.
Verification
- 201 test files / 3700 tests green (
pnpm test), full workspace
typecheck clean, and the editor's 68-test Playwright e2e suite green.
0.1.36: videos get color grading
Color grading. Six parametric presets — talking-head, teal-orange, filmic-fade, cwa, punchy, mono — preview live in the editor through an SVG filter in the composition, so what you see is what renders. Third-party .cube LUTs dropped in ~/.ossclip/luts are applied with ffmpeg's lut3d (tetrahedral) into a hash-keyed mezzanine. Set it once with colorGrade in ~/.ossclip/config.json, per run with --color-grade <look> / --no-color-grade, or per video in the editor's Color panel with intensity, exposure, temperature, saturation and contrast.
Crash fix: a rounded cut could blank the player. Deleting a chunk rounds its source window to 3 decimals while spans keep full float precision, so the subtraction could leave a sub-frame keep sliver. Both of its ends rounded to the same frame and Remotion threw trimAfter prop must be greater than trimBefore prop — blanking the entire preview and failing renders of that project. Fixed at the source (sliver absorption in the cutlist subtraction) and defensively in EdlVideo; pinned by unit, pipeline and Playwright tests.
Per-take audio volume. 0–400% gain on any take or scene: a slider in the Inspector's Audio section, a badge on the timeline block, honoured in both the preview (WebAudio) and the render — for the clip that was recorded quieter than the rest.
Editor. A deleted scene's window is now edited as the take it became, with Restore riding that take's panel. Clicking empty space deselects the timeline block and clears the transcript selection and its menus. The side panel resizes by its left edge. Dismissed notices survive a refresh. Span-seam dropouts are reduced by a longer premount that stalls visibly instead of playing silence over black.
Cover fix. A render without --produce no longer downgrades the cover to a bare frame — it keeps the project's existing headline.
0.1.35: videos get sound effects
Videos get sound effects.
--sfxpipeline: an LLM places sound effects over a metadata-described
sound library, gated by a deterministic density check so a clip doesn't
drown in cues, then mixed into the composition in Remotion before loudnorm
runs.- Sound packs: a bundled CC0 starter pack ships with the CLI; drop your
own packs in~/.ossclip/sfxand they're picked up alongside it. Pass
sfxBundledPack:falseto run the picker on your packs alone. - Full editor authority: a dedicated SFX lane in the timeline — drag,
swap, gain, and mute per cue — with in-player preview synced to the
player's own clock. Scene-anchored placements follow the scene through
retimes and edits instead of drifting. - Wizard support: sound effects are pickable from the interactive wizard,
not just a CLI flag. - Edit-port conflict ladder:
ossclip editon a busy port now attaches,
asks, or hops instead of dying on a rawEADDRINUSE— probed via
/api/health.
0.1.34: publish ships what each platform can actually take
Publish now ships what each platform can actually take, not the raw master.
- Delivery encode for publish: platforms get a purpose-fitted encode instead of the master file, fixing real-world upload failures on Instagram, Facebook, and LinkedIn.
- Per-platform size-fitted media: encodes are sized to each platform's limits (e.g. Instagram ≤95MB) instead of one-size-fits-all output.
- Duration-cap refusals: Threads, TikTok, and Instagram now refuse up front when a clip exceeds the platform's duration cap, instead of failing mid-upload.
- Encode progress + ETA: both the CLI and the editor show percent complete and estimated time remaining during encode, replacing the plain spinner.
- Caption regenerate in the editor: captions can be regenerated in place, one at a time or in a batch, using an author-voice prompt.
- On-demand caption-pack generation: caption packs can now be generated directly from the publish panel, without a full
--youtubererun.
A field session on release day took a real publish from 1-of-6 channels succeeding to 7-of-7.
0.1.33: review every cut on the timeline, and keep the takes the AI got wrong
Review every cut on the timeline, and keep the takes the AI got wrong
- Cut review, live on the timeline: the producer's removals (silences, pauses, fillers, retakes) show up as labeled markers above the ruler. Click a marker to keep that take — it plays immediately as its own editable block. Right-click → "Not a retake — remove marker" when the classification was wrong. Decisions survive re-renders.
- Kept retakes re-transcribe: keeping a retake re-transcribes just that stretch so its captions line up with the real audio, and caption edits follow automatically.
- Audio-first caption timing: a waveform view of the selection (±10s) with pan, resize, and loop — captions go where you put them, overlaps are flagged, never auto-rippled.
- Everything lands where you put it, before render: splits (⌘B), cuts, and scene drags/trims now work inside kept material and are source-anchored.
ossclip publish: push the finished short + per-platform captions to your own self-hosted Postiz instance (LinkedIn, Instagram, TikTok, X, Facebook, YouTube), now or scheduled. The editor has a new Publish panel.--cover-in-video: overlays the cover on the short's first frames, for platforms that ignore uploaded thumbnails.- Fixes: zoomed timeline drags no longer teleport, ⌘B works with a focused field, pathological whisper stamps no longer squat/flash captions on screen.
Full changelog: v0.1.31...v0.1.33
0.1.31: your edits follow their words, and the cover picks the frame you're looking at
Two edit-durability fixes: your scene edits stop landing on the wrong scene after a re-plan, and the cover panel stops spending the playhead on the wrong clock.
Scene edits survive a re-plan (#13)
Scene overrides were keyed by positional id (scene-3), and a re-plan that renumbers hands that id to a different moment — so the edit applied silently to the wrong scene. A shrunk plan at least warned; a same-size renumber said nothing.
Measured across real planner runs on the same transcript: every surviving moment matched by word-anchor at 100% overlap, while 8 of 11 ids shifted. One run had scene-4 meaning a terminal mock in one plan and a flow diagram in the next.
- Edits now carry the word anchor of the moment you edited, stamped at save time from what the editor had on screen.
producere-keys edits by anchor before anything reads the keys — no pass ever joins a stale id.- An edit whose words left the plan while its id now names a different moment is parked, not applied to the impostor, and is rescued when a later plan has its words again.
edit for X droppednow means both identities missed.
Pre-existing overrides.json files keep their previous behaviour exactly.
Cover panel spends the playhead on the right clock (#14)
"Use current playhead" captured seconds on the finished video's clock, "Original take" spent them on the source clock, and nothing converted — a real frame, from the wrong moment, every time.
- The seconds field now means one thing: seconds on the selected video's clock, matching
ossclip cover --at. - The panel converts at the two gestures that cross clocks, and says so when a chosen instant was cut away.
- The field survives Apply, so you can see and iterate on what was used.
- New Preview button renders a candidate frame without destroying the current cover.
Findings §155 and §156.
Full changelog: v0.1.30...v0.1.31
0.1.30: re-renders stop rewriting your cut, and every component is editable
Four fixes and a feature, all found by using 0.1.28/0.1.29 on real footage.
Re-rendering no longer rewrites your cut
The one that cost real work. A fallback-planned project could never read its own plan back — the beat sheet was written under the provider that answered and looked up under the provider you asked for, so a warm workdir never got a warm plan. Every re-render re-planned from scratch, produced a different plan, and dropped editor edits anchored to scenes the new plan no longer had (⚠ edit for scene-11 dropped).
Measured on the fixture: a cold run 134s, the re-run 1s, with no LLM call at all.
A cached run stops restamping who planned the video
production.json is rewritten by every produce and its producer stamp rebuilt from that run's usage — empty on a cached run, so it fell through to the provider you asked for and quietly overwrote a truthful antigravity → claude-cli with antigravity. A run that answered nothing now keeps the stamp already on disk.
A take with no face can regenerate its cover again
produce writes face: null when the detector found nobody — a measurement, not missing data. The cover's own copy of that shape rejected an explicit null, so every screen recording, slide deck and voiceover project could write a project whose cover it could never regenerate. The video rendered fine; only the cover path failed, which is how it survived to a release.
Every component's props are reachable from the Inspector
ScreenshotFrame rendered an edit id naming no prop at all, so you could select the screenshot and never change it — no error, just an absent control. Fixed, and guarded by a test that walks every component's edit ids and asserts each resolves to a real prop.
Booleans now have controls too (inverted, kenBurns, emphasizeLast), derived from each component's own schema rather than hand-listed — so a component that gains one is editable the day it lands. It reads the schema's default, so kenBurns shows as on when unset rather than describing your scene wrongly.
agy stops discarding a generation over a length we already truncate
agy validates server-side after generating and regenerates on a miss, so a hook sixteen characters over its limit threw away the whole attempt — over a length ossclip already truncates at a word boundary. Its copy of the schema no longer carries those caps.
To be clear about scope: this is not why agy times out. That theory was tested and refuted — the hang is upstream and prompt-triggered. §151 records the disproof.
Full changelog: v0.1.29...v0.1.30
0.1.29: the wizard can review, and a hung agy costs 90 seconds
Two fixes found by using 0.1.28 for real.
The wizard can reach --review
--review shipped in 0.1.28 as the headline feature, but nothing in the interactive wizard could emit it — so ossclip with no arguments, the entry point a first-time user takes, could only render first and offer the editor afterwards. That is the opposite of what --review is for: the render is the expensive step, and reviewing exists so it happens once, on a cut you already agreed with.
It is now the wizard's last question, because it decides what happens after every answer above it:
? Render now, or review the cut first?
❯ Review the cut first (opens the editor; render from its button)
Render now (straight to a finished file)
This is the one place a wizard default differs from the CLI's, and it costs nothing: a run that chooses to render still teaches ossclip produce <file>, and one that chooses to review teaches the flag that did it.
A hung agy costs 90 seconds, not 10 minutes
A field run on a 96.5-second video, 266 words:
⚡ NEURAL SCENE PLANNER (605.9s)
llm usage (antigravity → claude-cli, 692s)
605.9s is the agy print-timeout elapsing, near enough exactly. The run spent 692 seconds to do about 86 seconds of work. The fallback added in 0.1.28 worked — it just started ten minutes too late.
The budget had been reasoned about backwards. 10m was chosen as "long enough not to cut off a slow call", but every healthy agy call measured lands in 17–46s, and what rescues a hung one is the fallback, which costs seconds. So the only question that number answers is how long before we give up and recover. It is now 90s — twice the slowest healthy call on record, and below agy's own 5m0s default, which had been overridden upward.
The wait was also illegible: a hung agy looks exactly like a working one, so the spinner sat unchanged for ten minutes and read as a freeze. It now names the budget after 30 seconds of silence — late enough that a healthy run never sees it.
If you use --produce with Antigravity, this is the upgrade worth taking.
Full changelog: v0.1.28...v0.1.29
0.1.28: review the cut before it renders, and Windows installs and renders again
Review the cut before it renders
--review opens the editor instead of rendering, so the cut is something you approve rather than something you discover afterwards. Every removal produce proposed shows on the timeline, labeled with why it was made. Decline them per category or per span, and a vetoed removal plays immediately — the preview re-cuts its own clock instead of waiting for a render. The transcript, the ghosts and the cover playhead all speak that same live clock. Render once, from the editor's button, when the cut is the one you want.
Windows and Linux install and render again
Two bugs that between them left non-macOS users unable to use ossclip at all, both reported by @MuhammadAliashraf with line-accurate diagnoses.
ossclip setupcould not install ffmpeg on any platform it provisions for (#6). The pinned BtbN build had been rotated away upstream. It is now pinned to a month-end autobuild — those are retained indefinitely, while the dailies are pruned after about two weeks — and a dead pin now says so and prints the manual install for your platform instead of a bare HTTP 404.- Every render on a Windows or Linux machine without an NVIDIA card died at 100% (#7). Remotion's
"if-possible"hardware acceleration selectsh264_nvencfrom the platform alone, with no capability probe, and the encoder is opened at the stitch — so the failure landed after every frame had already been paid for. Hardware acceleration is now gated to macOS, where it was measured; everywhere else this is Remotion's own default.
LLM reliability
A timed-out agy call now fails after a single attempt and falls back to the next provider, saying so out loud rather than silently substituting the model that planned your video. --llm-effort reaches agy, and a changed effort is a different plan. The repair, pack and thumbnail caches file under whoever actually answered, so a fallback run no longer forks the transcript lineage every later run reads from.
CI
Windows now renders in CI, which nothing did before. The weekly setup canary stopped caching the very pin it was watching — it had been passing green against a dead URL for weeks — and pnpm check:urls now probes every pinned download in seconds. An editor test that had been reported "flaky" on main for weeks turned out to be a real bug behind a retry: starting a render inherited a collapsed log from a finished run, so you got a spinner and no output.
Full changelog: v0.1.27...v0.1.28