← Back to VideoWorks

Why I built this

I edit short videos on my phone like everyone else, and the deal on offer kept getting worse. The capable apps moved captions, 4K export, and even a clean export without a watermark behind subscriptions. The free web editors wanted something else instead: my footage, uploaded to their servers, kept on their schedule, deleted after a few days unless I paid.

The gap VideoWorks fills: private, free, no-watermark video editing — the combination the incumbents paywall or make you upload your footage to get.

Modern browsers can decode, edit, and export video on the device itself, using the same media hardware the native apps use. So VideoWorks runs entirely in your browser tab. Your clips never leave your device, there is no account to create, nothing is metered, and the export is yours, full quality, with no watermark — because there is no server in the middle to pay for.

It is built for people who make reels and short videos on their phones, for families whose footage is private by nature, and for anyone who would rather their videos stayed theirs. It will not do everything the big apps do — it has no licensed trending-music library and no cloud AI — and the app says so plainly where that matters. What it does, it does on your device, for free.

VideoWorks is built build by build, in the open, next to its sibling PhotoWorks. The shell, private on-device import, fast editing proxies, and real playback arrived in Builds 1–4; Build 5 makes the timeline a real editor — trim, split, ripple, and undo; Build 6 adds text and titles on their own lane, styled live over the video; Build 7 renders the whole timeline to a real MP4 on the device, text burned in; Build 8 frames every clip — contain or cover, scaled and moved, over black or a blurred backdrop, identical in preview and export; Build 9 gives the app its design system and an app-feel home — poster-grid library, sheet-based creating, a tab bar; Build 10 rebuilds the editor itself on that system — a pinned, centred stage that never moves, a contextual tool dock, and ribbons that open beneath the preview instead of covering it; Build 11 adds a picture-in-picture overlay lane — a second video composited over the first, draggable on the stage, mixed into the export; Build 12 adds the audio lane — music and voice clips with volume and fades, audio files imported as first-class media, all mixed into the export alongside the main sound; Build 13 gives every clip its own colour grade — exposure, contrast, saturation, temperature, tint and vibrance, plus one-tap looks — graded with the same math in the preview and the export; Build 14 retimes any clip — 0.25× slow motion to 4× fast-forward, with preset chips and a rate slider, the timeline, preview and export all agreeing on the new duration; Build 15 holds a moment still — park the playhead, tap Freeze, and the frame becomes its own clip with an adjustable hold — and runs time backwards, rendering a real reversed copy of a clip (up to 15 seconds of source) on the device; Build 16 completes the sound picture — every clip gets its own volume and fades, overlays get a sound level of their own, and music can duck itself under the voices automatically, preview and export agreeing; Build 17 finishes the soundtrack at export — loudness normalization levels the mix to about −14 LUFS (approx) so a reel posts at the loudness the platforms expect, and any clip, overlay or audio item can have its steady background noise (fans, hiss, hum) cleaned by RNNoise, on-device, when it exports; Build 18 listens for the beat — a steady tempo in any imported sound is detected from its waveform, badged on its row, drawn as markers under the ruler, and every drag and trim can snap to it, so cuts land on the beat; Build 19 makes things move — overlays and clip framing take keyframes, captured at the playhead from the Position and Frame panels, marked as gold diamonds on the timeline, eased in or out, and sampled identically by the preview and the export, so a picture-in-picture can glide, grow and fade exactly as staged; Build 20 adds chroma key — film a subject against a green screen, drop the clip in as an overlay, and the backdrop keys away live on stage and in the export, with similarity, softness and spill controls; Build 21 adds captions — a captions lane with cues you can type, drag and trim, .srt/.vtt import and export, captions burned into every MP4 with the .srt saved alongside it, and auto-captions that listen to the timeline and write the words for you, recognised entirely on the device by Whisper; Build 22 adds cleanup — the pauses between sentences are found from each clip's waveform and cut in one tap, filler words (um, uh, erm) are cut from the auto-captions' word timings, and every lane — captions, text, overlays, keyframed animations — moves with the cut, with Undo bringing it all back; Build 23 adds transitions — neighbouring clips can now dissolve, dip to black or white, or slide into each other, the incoming clip starting a little early so the two share the junction, with the timeline, the stage preview and the export all laying out that overlap from one shared timing law, and the soundtrack crossfading (or dipping to silence) exactly where the picture does; Build 24 adds the reels kit — a cover picker that renders a still of the programme at any frame you scrub to, through the very same compositor the export uses (texts in, the caption band left out), saved as the project's poster and a downloadable JPEG, plus hook starters: plain opening lines that drop onto the timeline in the Hook style with one tap, ready to edit into your own words. Build 25 adds templates — save a project's layout once (its frame shape, each clip's length as an empty slot, and all its text and captions; never the clips themselves) and reuse it with your own clips: slots sit on the timeline as dashed placeholders that hold their place in the preview, fill with one tap from the media bin, and hold the export until every one is filled, and templates travel between devices as small .vwtemplate.json files; Build 26 gives captions their stage presence — one-tap style presets (Classic, Bold pop, Minimal, Karaoke) and karaoke highlighting that lights each word in your choice of colour as it is spoken, on the stage and burned into the export, using the word timings the on-device recogniser already writes (a typed caption without timings simply shows whole, nothing is faked); Build 27 adds the teleprompter camera — tap Record in the media panel and the phone becomes the studio: your script scrolls over the camera preview at your pace while you record (up to five minutes, with a three-second countdown if you want one, a mirror you can switch off, and a flip to the other camera when the device has one), the recording is exactly what you saw on screen, mirror included, and the finished take lands in the project's media like any imported clip — recorded, stored and edited entirely on the device; Build 28 adds overlay masks — a picture-in-picture can be trimmed to a rectangle or ellipse window with softened edges, faded out along a line like a graduated filter, or inverted so everything but the shape shows, the mask computed from one shared geometry so the stage and the export agree exactly; Build 29 adds auto-reframe — switch the frame shape for another platform and Smart reframe looks at each clip entirely on the device, finds the faces in it, and re-aims every clip's crop at the subject instead of blindly centre-cropping (with Track subject, a moving face becomes framing keyframes that follow it), reporting in plain counts how many clips it aimed at a face, how many it centred because no face was seen, and how many it left alone; Build 30 adds photo slideshows — photos import as first-class media and join the timeline as stills that hold for their set duration, and the Slideshow action turns a handful of picks into a show in one tap: a fixed time per photo, an optional Ken Burns drift that slowly zooms each photo in or out, and an optional beat match that times every slide change to a whole number of beats from the music on the Audio lane, so the pictures change exactly when the song does; Build 31 adds background effects — every clip can keep its person and blur what is behind them, or replace the background with a solid colour, segmented entirely on the device by a small vision model, previewed live on the stage as an approximation and rendered into every frame of the export; Build 32 adds face privacy — every clip can blur or pixelate the faces in it, found on the device by a small face detector (nothing is uploaded), checked every fifth of a second and followed smoothly as people move, previewed live on the stage as an approximation and rendered into every frame of the export, on top of any background effect the clip already carries; Build 33 adds face stickers — any overlay can follow the largest face in the shot instead of sitting still, with size and height controls, so the built-in sunglasses, star and heart (drawn as vector art, identical on the stage and in the export) ride the face as it moves, and stay quietly absent whenever no face is there; Build 34 adds tap-to-track — tap any object in a clip and VideoWorks follows it entirely on the device with template matching, writing the path as ordinary keyframes: an overlay can ride the object, or the clip's framing can keep it centred as it moves, tracked forward from the tap for up to thirty seconds, and when the object is lost the app says plainly where the track stopped and the keys end there; Build 35 adds pose effects — every clip can draw the person's skeleton, or dots on their joints, or both, over the body as it moves, found on the device by a small pose model (nothing is uploaded), in your choice of colour and line width, previewed live on the stage as an approximation and rendered into every frame of the export; Build 36 adds stabilization — a clip's camera shake is measured entirely on the device, block by block, smoothed, and cancelled with ordinary framing keyframes plus a small zoom so the edges stay hidden, the very keyframes the preview and the export already share, with the biggest correction it made and any moments too shaky to fully correct reported in plain words; Build 37 completes the background family — a clip's background can now be a chosen photo or video from the media bin, filled to the frame behind the person (a video loops silently and restarts with each clip), and an overlay can have its OWN background removed on the device, so its person sits directly over the main video, combining with chroma key and shape masks in one fixed order — and if a chosen background picture has gone missing, the export never breaks: that clip exports unchanged and the notes say so; Build 38 redesigns the stage itself — an empty timeline now shows a proper import workspace inside the frame (drop a file anywhere in the editor, or tap Choose), the safe-area guide becomes one thin outline with a small plain-words label, warnings move off the picture into a slim banner above the transport, and the timeline's empty lanes fold away to thin strips so the preview gets the room back (on a phone the frame grows from about 164 to about 289 pixels tall); Build 39 is a fixes build, earned by putting real videos through the app end to end on desktop and phone: a proxy whose sound a browser cannot convert now keeps the source audio untouched or re-encodes it as Opus exactly like the export does (and the media row says which happened, in plain words), so previews stop going silently mute; the home cards show a real poster — the chosen cover, else the first clip's own filmstrip frame — and the length the timeline actually runs today, speed and transitions counted; media rows give their badges a line of their own so names and details stop colliding; and the safe-area guide now starts off, one tap away in the Aspect panel when you want it; Build 40 adds glow — the brightest parts of a shot bloom softly into the dark around them, drawn entirely on the device with one shared bloom so the preview and the export agree. That completes Phase 4 (Builds 31–40), the on-device intelligence phase: backgrounds blurred, replaced with a photo or video, or removed from an overlay; faces kept private, or followed by stickers that ride them; a body's skeleton traced as it moves; any object followed by a tap; shaky footage steadied — every bit of it computed on the device with nothing uploaded, and every effect plain about what it could not do; Build 41 opens the final phase with export formats — the same timeline now renders to WebM (VP9 where the browser can, VP8 where it cannot, with the codec named honestly in the result) for the web, to an animated GIF (at most fifteen seconds, its palette learned from frames across the whole clip by an encoder written for this app, silent and looping as GIFs are), or to sound alone as M4A or uncompressed WAV, mixed by the very same audio pass the video exports use — and the exports list badges every file with its format so nothing is a guessing game; Build 42 adds project files — a whole project, media included, saved as one file from the project menu and opened again on any device or browser from Home’s Import project, with the file’s size stated honestly before it is packed (the original videos, not the smaller working copies, which are device caches and simply rebuild on the other device), every byte checksummed and verified before a single thing is written; Build 43 makes the app behave like a desktop citizen — on a browser that supports it, a project file can be opened straight from the computer and saved back to the very file it came from, exports ask where they should land, dropping files anywhere on Home imports a project or starts a new one from the media dropped, and a proper keyboard set (play and shuttle keys, frame steps, split, undo, save, export) joins a shortcuts sheet that lists them in plain words; Build 44 hardens the app for phones — the first save asks the browser to keep VideoWorks’ storage and the Device tab reports what was granted, while the import sheet warns with real numbers when free space is tight; an export holds the screen awake for its run and says plainly to keep the app open on iOS; every export and every project file can be shared with one tap where the device supports it; Home offers an install hint to iPhone users, once per device; and when the on-screen keyboard opens over a caption or text field, the field scrolls into view inside its panel while the preview stays exactly where it was; Build 45 takes VideoWorks to the front door — a place in the App Launcher beside PhotoWorks, the twelfth card on the homepage, and pages that introduce themselves properly wherever a link travels (an honest summary, a real preview picture composed from its own icon, machine-readable facts for search engines — every claim one the app can back), with this story audited against the rule it was written under; Build 46 adds smooth slow motion — a slowed clip no longer steps through repeated frames in the export: the motion between each pair of real frames is measured on the device, block by block, and the in-between frames are synthesized by warping both neighbours toward each other, falling back to a plain blend wherever the motion cannot be measured or something appears or vanishes mid-frame, with the export notes saying plainly which clips smoothed and which were too fast-moving to blend cleanly; Build 47 adds batch export and project housekeeping — the export sheet can queue several formats from one set of choices and renders them one after another (each finished file lands in the Exports list the moment it is done, so cancelling late never loses finished work), projects can be duplicated in one tap (the copy uses the very same media files, so it costs no extra storage), deleting a project now frees exactly the media nothing else uses and never pulls a shared file from under a project that still needs it, every home card states its media size plainly, and the Device tab can clear out every finished export on the device in one go, since an export can always be rendered again; Build 48 is the care pass — every button and chip in the app is audited and raised to a full-size touch target wherever the layout allows (the few that stay smaller sit in the timeline’s height-capped toolbar, where the preview’s size is the budget, and each keeps a full-size equivalent one tap away), every sheet now takes the keyboard’s focus when it opens, hands it back when it closes, and keeps Tab cycling inside while it is up, a visible focus ring arrives in the app’s accent colour, reduced-motion and 200% zoom behaviour are verified rather than assumed, and the app’s speed is measured end to end — cold load, a thirty-project library, a twenty-clip timeline, a minute-long proxy — with the numbers published in the build log; Build 49 is the close-out — the app gains a plain in-app sheet, ‘What VideoWorks can do’, listing every feature and the honest limits in one place, this story is completed through the whole building programme, and the entire test battery is run from scratch against the shipped tree before the build deploys. That completes Phase 5 (Builds 41–49), the finishing phase: the same timeline rendering to MP4, WebM, an animated GIF or sound alone; whole projects travelling as single files that open on any device; desktop file handling, save-back to the file a project came from, and a full keyboard set; phone hardening for storage, sharing, install and screen sleep; a seat in the app launcher and pages that introduce the app honestly wherever a link travels; slow motion smoothed at export by measured motion; batch exports that lose nothing finished when they are cancelled; and housekeeping that can duplicate a project for free and delete one without ever pulling a shared file from under a project that still needs it — the delete fix closing a real leak the audit found, in which a deleted project’s media files were never actually freed at all — closing with a measured pass over touch targets, keyboard focus and speed. Build 50 is the final test — the whole programme proven end to end on a real video downloaded from the internet, every feature exercised in one sitting on desktop and in a phone-sized browser, every export checked file by file; what it found is written up in the build log, and the rest of the engine keeps arriving one verified build at a time. Build 51 is the visual sweep that followed — every screen re-read with fresh eyes on desktop and phone, and the handful of things it caught put right: timeline items that overlap in time now stack in their lane instead of painting over each other, the phone's time readout fits beside its buttons, the darkest sticker sits on a light plate in the picker so it can actually be seen, and a running export's close button now looks as disabled as it is. Build 53 bends the editor to the room it is in: either side panel drags wider or narrower, collapses away to a slim rail, or follows one Layout slider through Compact, Balanced and Roomy — and the choice is remembered on the device. Build 54 shortens the timeline dock and makes it adjustable: a handle on the dock's top edge drags the whole lower zone taller or shorter (double-click to reset, remembered on the device), and the lanes now fill whatever height results exactly — stretching when the dock is tall, scrolling inside it when it is short — so the empty void under the last lane is gone in both directions. Build 55 makes the safe-area guide provably plain: the widest set is just "All apps", the on-stage label is only "Safe area", and the guide starts off on every project you open, sample included, until you pick a zone. Build 56 puts import first: a new project opens on the choice of what media to bring in, never on placeholder clips — the sample timeline is now something you ask for, and projects made before this change keep the sample they were built on. As amended, imports land directly on the timeline in the order picked (with a + button on the timeline itself for more), the media bin is never buried behind the timeline — importing expands a collapsed panel, and the narrow-screen Media ribbon lands straight on the new row — and a repeat import says so in the banner, where you are looking, instead of going quiet. Build 57 makes the timeline follow your attention: the lane under the cursor grows while the others shrink to make room, the dock itself never changing height, so the preview stays exactly where it was — hover on a desktop, tap on a phone, keyboard focus counted the same. Build 58 adds a Reels section inside VideoWorks: a "Make a reel" entry that starts a short vertical project at 9:16, 1080×1920 and 30 frames a second, with one short onboarding sheet (hook first, captions, cover) shown once per reels project. The section is built to lift out later — reels mode is a project flag plus one dedicated module, the project format unchanged — and "Reels" is used only descriptively, never as a brand name. Build 59 adds reel templates: four hook-first layouts stored as data (Hook-beats-close, Listicle, Before-and-after, Quick hit), each laying out labeled slots on the timeline — lengths and beat names, no footage — filled with your own clips, with export held until every slot is filled; templates travel as the same small .json files as ordinary templates, so the set grows by import, not by code changes. Build 60 gives reels captions their presets: one tap applies Classic, Bold pop, Minimal or Karaoke to a reels project's captions, and a template segment (a Hook slot, say) renders its own preset over its stretch — size and weight from the segment, karaoke highlighting following the project preset everywhere — with stage and export agreeing because both resolve through the same law, and a typed caption without word timings simply showing whole, nothing faked. Build 61 gives reels covers their grid preview: pick any timeline frame as the cover through the same compositor the export uses, save it as the project's poster and a downloadable JPEG, and see beside it how profile grids would crop it — the published cover size (420×654) stated as fact, the square, 4:5 and 3:4 grid crops shown side by side as the disputed claims they are, with the guidance to keep the title and face in the centre square every crop agrees on. Build 62 finishes the Reels section's export: one tap pins MP4, 9:16, 30 frames a second — 1080×1920, H.264 video with AAC audio, no watermark — through the ordinary export pipeline, with a loop-seam preview that plays the last second into the start so a looping reel can be checked before it ships, and honest copy that VideoWorks has no licensed trending music: cut here, add the trending track inside Instagram after posting. Build 63 fixes a small thing the final test caught: after saving a reel cover, the sheet now scrolls so the grid crops are actually in view — on shorter screens they sat below the fold, and the whole point of staying in the sheet was to see them at once.

The final test

For the last build there was nothing new to add. Instead, a real video was downloaded from the internet — fifteen seconds of 1080p film with sound — and put through everything VideoWorks can do, in one continuous session, on a desktop browser and again in a phone-sized one: imported, trimmed, split, reversed, slowed down and sped up, frozen, graded, captioned, keyed, stabilised, tracked, reframed, and exported as an MP4, a WebM, a GIF and sound alone, then saved as a single project file, deleted, and opened again unchanged. The desktop MP4 took about 86 seconds in the test rig; the phone-sized export about 8 seconds (a test-rig number, not a phone number — a real iPhone still owes its own timing, as do the last few checks listed in the build log). What the test found, and what it could not prove from a desk, is written down honestly in the Build 50 entry of the build log.