Skip to content

Repository files navigation

Gerty

A browser-based, open source, free to use video editor.

  • No login, no personalised tracking, no ads, no scraping your data, no AI, no bullshit.
  • Code is fully open source
  • Import images, video clips, audio clips
  • Add custom arrows, shapes, text, all with animated effects, keyframing
  • Add video-wide effects, like a camera zoom, sepia, vignette, film grain, etc.
  • Preview the video in real time. Export to MP4, with customisable quality/size

"What it lacks in features, it makes up for in not being dogshit" - me

https://gerty.tomg.cool/ 👈 use it right now

VideoEditor-Demo.mp4

What you can do

  • Bring in your media - drop in images, video clips and audio. Everything stays on your machine; nothing is uploaded.
  • Build on a timeline - stack clips on layers, move and group them, trim their ends, and split a clip in two at the playhead.
  • Annotate - arrows, text boxes, rectangles, circles and freehand pen, all fully stylable.
  • Animate anything - keyframe an object's position, size, rotation and opacity; add on-appear / on-exit transitions; give text a type-on reveal and arrows a draw-on.
  • Add a camera - screen-recorder-style zoom and pan push-ins that glide across the frame, with their own keyframes.
  • Grade and stylise - a deep effects menu: black & white, sepia, vignette, film grain, old film, hue shift, contrast, bleach bypass, light leaks, chromatic split, plus GPU shader looks like gradient maps, duotone, CRT, VHS, halftone and comic ink.
  • One-click presets - drop a whole graded look on a clip: Cinematic (teal & orange), Cinematic Cool, Super 8, Retro TV, Film Noir, Comic Book and more. Every preset is just a starting point you can tweak.
  • Mark the beat - tap M while it plays to drop markers, then snap edits to them.
  • Preview live, then export - real-time preview, then export to MP4 (H.264 + AAC) at a resolution and quality you choose, with a file-size estimate before you commit.
  • Save your work - export a project to a .gerty file and re-import it later to pick up where you left off.

Keyboard shortcuts

Key Action
Space Play / pause
V Toggle camera Live / Frame view
M Drop a marker at the playhead (works while playing)
, / . Jump to previous / next marker
S Split the selected audio/video clip at the playhead
H Hide / show the selected object or zoom
Delete / Backspace Delete the selection
Ctrl+Z Undo
Ctrl+Y / Ctrl+Shift+Z Redo
Enter / Escape Finish the current drawing / deselect

Privacy

There is no backend. Your media never leaves the browser - imported files live in your browser's own storage (IndexedDB) and rendering, editing and export all happen locally on your device.


Running it locally

npm install
npm run dev

Then open the printed local URL. To make a production build:

npm run build    # type-check + bundle to dist/
npm run preview  # serve the production build locally

Tech stack

  • React 19 + TypeScript, bundled with Vite
  • Tailwind CSS v4 for styling
  • Canvas 2D for the shared preview/export compositor, with a WebGL (regl) post-process pass for per-pixel shader effects
  • WebCodecs + mp4-muxer for in-browser MP4 export (with a MediaRecorder → WebM fallback on browsers without WebCodecs)

A single pure renderFrame compositor drives both the live preview and export, so what you see is what you get. For a full architecture tour, see CLAUDE.md.


Known limitations & long-term to-dos

A candid running list of rough edges and deferred work. None of it blocks day-to-day use - these are the known trade-offs, kept here so they don't get lost.

Performance

  • Export runs on the main thread, so the UI freezes for the duration of an export and it can't be cancelled. Moving it to a worker is the single biggest open item (spec 09).
  • During playback the whole UI re-renders every frame (globalTime is React state). Fine for most projects, but it can get janky on video-heavy ones. The canvas already renders on its own rAF loop; throttling the Timeline / Properties panels is the remaining step.
  • No devicePixelRatio handling - the canvas backing store is the raw project size and CSS scales it, so the preview can look a little soft on HiDPI displays.

Audio

  • Preview preserves pitch when a clip's speed changes, but export does not yet (pitch shifts with the rate). See spec 11.
  • General audio polish - fades, finer volume control - is still open (spec 15).

Auto-captions & text-to-speech (in-browser ML)

  • Watch Cloudflare R2 Class B (read) operations. The Whisper caption model and the pocket-tts voices are self-hosted in R2 (gerty-models.tomg.cool). Egress is free, but every model-file fetch is a Class B op, so a wave of first-time caption/TTS users drives that number up. Weights are browser-cached after first load, so repeat use is cheap.
  • Both the caption and TTS workers run single-threaded (numThreads = 1) for first-run reliability; revisit multi-threading for speed once it's proven stable across browsers.
  • Caption accuracy rides on distil-small.en. Swapping MODEL_ID in captions.worker.ts for a larger Whisper is a one-line change if transcripts are too rough (bigger download, better accuracy).
  • Caption cues are edited from the Properties panel; dragging cue bars directly on the timeline is deferred.

Editor UX

  • Resize handles for objects dragged outside the canvas bounds aren't drawn - this needs a canvas→HTML overlay refactor (spec 05).
  • Objects can only be edited in the camera's Frame view, not while zoomed in Live view; adding zoomed editing would require inverting the camera transform for hit-testing (spec 13).

License

Licensed under the GNU General Public License v3.0. You are free to use, study, share and modify this software; if you distribute a modified version, it must also be free software under the same license.

About

A free browser-based video editor. - No login, no personalised tracking, no ads, no scraping your data, no AI, no bullshit. "What it lacks in features, it makes up for in not being dogshit"

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages