{
    "type": "project",
    "title": "Reelify",
    "canonical": "https://www.dealmobile.co.uk/projects/reelify",
    "path": "/projects/reelify",
    "url": "https://www.dealmobile.co.uk/projects/reelify",
    "markdown": "https://www.dealmobile.co.uk/projects/reelify.md",
    "json": "https://www.dealmobile.co.uk/projects/reelify.json",
    "summary": "A local Python pipeline that scores the motion in each frame of a screen recording, cuts the idle parts, speeds up the rest to fit a target length and can caption keyframes with a local vision model.",
    "published": "2026-10-20T10:43:31+01:00",
    "modified": "2026-10-25T18:32:07+00:00",
    "image": {
        "url": "https://www.dealmobile.co.uk/sites/default/files/content/images/products/reelify.png",
        "alt": "A 30 second recording shown as a bar of idle, active and idle stretches, with an arrow labelled reelify process pointing to a 5.7 second summary and a frame from it."
    },
    "fields": {
        "featured": false,
        "kind": "experiment",
        "licence": "MIT",
        "links": [
            {
                "title": "Source on GitHub",
                "url": "https://github.com/tomgould/Reelify"
            }
        ],
        "stack": [
            "Python",
            "OpenCV",
            "FFmpeg",
            "pytest"
        ],
        "started": 2026,
        "status": "experimental",
        "tagline": "An experiment that turns long screen recordings into short summary videos, by cutting idle time and speeding up what’s left to fit a target length."
    },
    "body": {
        "html": "<p>Reelify takes a long screen recording, such as an hour of someone working through a task, and turns it into a short video of the parts where something happens. I built it as an experiment, to see how far a pipeline that runs entirely on my own machine could go. It works for personal use, but it comes with no stability guarantees, and its behaviour may change between commits.</p>\n<h2 id=\"what-it-does\">What it does</h2>\n<p><code>reelify process input.webm</code> produces <code>input_summary.mp4</code>, with the idle gaps removed. Nothing is sped up unless you give it a target length with <code>--max-duration</code>: then, if what’s left is longer, all of it is sped up by the same amount, to at most eight times normal speed. <code>reelify analyse input.webm</code> writes a JSON file instead, with the segments, activity scores and a caption for each keyframe.</p>\n<p>The pipeline runs in five stages:</p>\n<ol>\n<li>Analyse: FFmpeg pipes out small greyscale thumbnails of every fourth frame, and each one is scored by how much it differs from the one before.</li>\n<li>Classify: split the recording into active and idle chunks, keeping a short margin around activity so cuts don’t clip it.</li>\n<li>Speed map: drop the idle chunks, and if there’s a target and what’s left is still longer, speed it up evenly, to at most eight times normal speed.</li>\n<li>Encode: cut and retime each segment with FFmpeg, then join them.</li>\n<li>Enrich, optionally: pick keyframes with PySceneDetect and caption them with a vision model.</li>\n</ol>\n<h2 id=\"how-its-built\">How it’s built</h2>\n<p>It’s a Python 3.10 command-line tool built with Typer. FFmpeg does the encoding. By default the captions come from a vision model running locally in LM Studio, Qwen2.5-VL-7B, so nothing leaves the machine. Google’s Gemini Flash can be used instead, but only when it’s switched on explicitly with an environment variable and an API key. An optional extra transcribes speech with Whisper and burns in subtitles.</p>\n<p>A code review found some slow spots, and the fixes are in the history. The margin padding around active frames went from a nested loop to two linear passes over the frames, one forwards and one backwards, and segments are now encoded in parallel. The review also caught a temporary-file race. It moved FFmpeg’s seek after the input as well, which broke sped-up segments: there the seek is measured after the speed change, so they were cut from the wrong part of the video. The seek is back before the input, where FFmpeg makes it frame-accurate because every segment is re-encoded, and the tests now check which frames each segment comes out with.</p>\n<h2 id=\"how-to-use-it\">How to use it</h2>\n<p>You need Python 3.10 or later and FFmpeg installed, plus LM Studio if you want local captions.</p>\n<pre><code class=\"language-bash\">pip install -e .\nreelify process recording.webm\nreelify process recording.webm --max-duration 120\n</code></pre>\n<p>The second command also speeds up what’s left after the cuts, if it needs to, aiming for two minutes or less.</p>"
    },
    "markdown_text": "---\ntitle: Reelify\ncanonical: 'https://www.dealmobile.co.uk/projects/reelify'\nurl: 'https://www.dealmobile.co.uk/projects/reelify'\ntype: Project\nsummary: 'A local Python pipeline that scores the motion in each frame of a screen recording, cuts the idle parts, speeds up the rest to fit a target length and can caption keyframes with a local vision model.'\n---\n\n# Reelify\n\nAn experiment that turns long screen recordings into short summary videos, by cutting idle time and speeding up what’s left to fit a target length.\n\n![A 30 second recording shown as a bar of idle, active and idle stretches, with an arrow labelled reelify process pointing to a 5.7 second summary and a frame from it.](https://www.dealmobile.co.uk/sites/default/files/styles/almanac_shot_md/public/content/images/products/reelify.png.webp?itok=5fV1E8Fa)\n\n- **Kind:** Experiment\n- **Status:** Experimental\n- **Started:** 2026\n- **Licence:** MIT\n- **Stack:** Python, OpenCV, FFmpeg, pytest\n- **Links:** [Source on GitHub](https://github.com/tomgould/Reelify)\n\nReelify takes a long screen recording, such as an hour of someone working through a task, and turns it into a short video of the parts where something happens. I built it as an experiment, to see how far a pipeline that runs entirely on my own machine could go. It works for personal use, but it comes with no stability guarantees, and its behaviour may change between commits.\n\n## What it does\n\n`reelify process input.webm` produces `input_summary.mp4`, with the idle gaps removed. Nothing is sped up unless you give it a target length with `--max-duration`: then, if what’s left is longer, all of it is sped up by the same amount, to at most eight times normal speed. `reelify analyse input.webm` writes a JSON file instead, with the segments, activity scores and a caption for each keyframe.\n\nThe pipeline runs in five stages:\n\n1. Analyse: FFmpeg pipes out small greyscale thumbnails of every fourth frame, and each one is scored by how much it differs from the one before.\n2. Classify: split the recording into active and idle chunks, keeping a short margin around activity so cuts don’t clip it.\n3. Speed map: drop the idle chunks, and if there’s a target and what’s left is still longer, speed it up evenly, to at most eight times normal speed.\n4. Encode: cut and retime each segment with FFmpeg, then join them.\n5. Enrich, optionally: pick keyframes with PySceneDetect and caption them with a vision model.\n\n## How it’s built\n\nIt’s a Python 3.10 command-line tool built with Typer. FFmpeg does the encoding. By default the captions come from a vision model running locally in LM Studio, Qwen2.5-VL-7B, so nothing leaves the machine. Google’s Gemini Flash can be used instead, but only when it’s switched on explicitly with an environment variable and an API key. An optional extra transcribes speech with Whisper and burns in subtitles.\n\nA code review found some slow spots, and the fixes are in the history. The margin padding around active frames went from a nested loop to two linear passes over the frames, one forwards and one backwards, and segments are now encoded in parallel. The review also caught a temporary-file race. It moved FFmpeg’s seek after the input as well, which broke sped-up segments: there the seek is measured after the speed change, so they were cut from the wrong part of the video. The seek is back before the input, where FFmpeg makes it frame-accurate because every segment is re-encoded, and the tests now check which frames each segment comes out with.\n\n## How to use it\n\nYou need Python 3.10 or later and FFmpeg installed, plus LM Studio if you want local captions.\n\n```bash\npip install -e .\nreelify process recording.webm\nreelify process recording.webm --max-duration 120\n\n```\n\nThe second command also speeds up what’s left after the cuts, if it needs to, aiming for two minutes or less.\n\n---\n\nIndex of this site: [llms.txt](https://www.dealmobile.co.uk/llms.txt)\n"
}