|
| 1 | +# Why I Built Argus for Local-First Video Search |
| 2 | + |
| 3 | +I run a video agency, and one of the most annoying problems in the workflow has nothing to do with cameras, editing, or rendering. It is the simple fact that B-roll piles up fast and the value of that footage drops the moment it becomes hard to search. |
| 4 | + |
| 5 | +We all know the pattern. A project wraps up, the footage gets copied to a share or NAS, and then later on someone asks: |
| 6 | + |
| 7 | +- do we have more warehouse footage? |
| 8 | +- where is that wide shot of the product press? |
| 9 | +- didn’t we already shoot a clean establishing clip for this client? |
| 10 | + |
| 11 | +At that point, someone ends up scrubbing through folders of MP4 files by hand and hoping the filename tells enough of the story. It usually does not. |
| 12 | + |
| 13 | +That is the reason Argus exists. |
| 14 | + |
| 15 | +Argus is a local-first tool that scans a video folder, samples frames, runs local captioning and tagging, and builds a searchable SQLite database and browser UI. The key part for me was keeping it simple and private. I did not want to ship footage off to a cloud API just to figure out whether a clip contains a warehouse aisle, a person at a heat press, or a product close-up. |
| 16 | + |
| 17 | +## Why I Built It This Way |
| 18 | + |
| 19 | +There are lots of AI workflows that look impressive in a diagram and become miserable the minute you try to use them with real media libraries. |
| 20 | + |
| 21 | +I wanted a few things: |
| 22 | + |
| 23 | +1. It had to run locally on a Mac. |
| 24 | +2. It had to work with silent clips because a lot of B-roll has no useful audio anyway. |
| 25 | +3. It had to be cheap enough to run whenever I wanted. |
| 26 | +4. It had to be easy to open source. |
| 27 | +5. It had to give me results I could inspect instead of burying everything in a black box. |
| 28 | + |
| 29 | +So the current Argus flow is intentionally straightforward: |
| 30 | + |
| 31 | +1. Point it at a source folder. |
| 32 | +2. Let it scan the clips. |
| 33 | +3. Extract a few representative frames from each video. |
| 34 | +4. Caption those frames locally with Ollama. |
| 35 | +5. Store the results in JSON plus a local SQLite index. |
| 36 | +6. Search the library in a browser on `localhost`. |
| 37 | + |
| 38 | +That may not be the fanciest architecture in the world, but it is practical and easy to reason about. |
| 39 | + |
| 40 | +## What Argus Does Right Now |
| 41 | + |
| 42 | +The current version is focused on the first usable workflow: |
| 43 | + |
| 44 | +- scans folders recursively for video files |
| 45 | +- extracts media metadata with `ffprobe` |
| 46 | +- samples frames with `ffmpeg` |
| 47 | +- captions frames locally with Ollama |
| 48 | +- builds a SQLite index for search |
| 49 | +- exposes a simple local browser UI |
| 50 | + |
| 51 | +It also works well with mounted network shares. If your footage lives on a NAS over SMB, you can mount the share in macOS and point Argus at the mounted path under `/Volumes/...`. |
| 52 | + |
| 53 | +## Quick Install Guide |
| 54 | + |
| 55 | +If you want the shortest path from zero to a working local search experience, this is it. |
| 56 | + |
| 57 | +### Prerequisites |
| 58 | + |
| 59 | +You will need: |
| 60 | + |
| 61 | +- macOS |
| 62 | +- Python 3.11 or newer |
| 63 | +- [FFmpeg](https://ffmpeg.org/) |
| 64 | +- [Ollama](https://ollama.com/) |
| 65 | +- the `gemma3` vision model pulled locally |
| 66 | + |
| 67 | +### Install Argus |
| 68 | + |
| 69 | +From the repository root: |
| 70 | + |
| 71 | +```bash |
| 72 | +git clone https://github.com/discoposse/argus.git |
| 73 | +cd argus |
| 74 | +python3 -m venv .venv |
| 75 | +source .venv/bin/activate |
| 76 | +python3 -m pip install -e . |
| 77 | +brew install ffmpeg |
| 78 | +ollama pull gemma3 |
| 79 | +``` |
| 80 | + |
| 81 | +### Verify Your Local Dependencies |
| 82 | + |
| 83 | +Before the first run, do a quick dependency check: |
| 84 | + |
| 85 | +```bash |
| 86 | +argus doctor --model gemma3 |
| 87 | +``` |
| 88 | + |
| 89 | +You should see `ffprobe`, the Ollama API, and the `gemma3` model all come back as available. |
| 90 | + |
| 91 | +## First Run |
| 92 | + |
| 93 | +The easiest path is the one-command pipeline: |
| 94 | + |
| 95 | +```bash |
| 96 | +argus run /path/to/source/folder --output-dir ~/ArgusOutput |
| 97 | +``` |
| 98 | + |
| 99 | +If your source footage is on a mounted NAS share, it looks like this: |
| 100 | + |
| 101 | +```bash |
| 102 | +argus run /Volumes/StudioNAS/Footage --output-dir ~/ArgusOutput |
| 103 | +``` |
| 104 | + |
| 105 | +A quick note here because it matters: use the mounted filesystem path, not the raw `smb://` URL. Argus expects normal filesystem paths. |
| 106 | + |
| 107 | +Once the run completes, launch the local browser UI: |
| 108 | + |
| 109 | +```bash |
| 110 | +argus serve --output-dir ~/ArgusOutput --open-browser |
| 111 | +``` |
| 112 | + |
| 113 | +That gives you a simple local search interface where you can: |
| 114 | + |
| 115 | +- search by clip content |
| 116 | +- search by tags |
| 117 | +- search by visible on-screen text |
| 118 | +- copy the source path |
| 119 | +- reveal the source file in Finder |
| 120 | + |
| 121 | +## Why This Is Useful Even in the Early Version |
| 122 | + |
| 123 | +The main value is not that Argus magically understands everything in a clip. The value is that it removes the blank space between “I know we shot this somewhere” and “here is the actual file path.” |
| 124 | + |
| 125 | +That changes the workflow a lot when you have a large archive. |
| 126 | + |
| 127 | +Instead of searching by memory, you can search by likely content. |
| 128 | +Instead of opening random folders, you can search for visual descriptions. |
| 129 | +Instead of relying on naming conventions that fell apart six projects ago, you can search the actual clips. |
| 130 | + |
| 131 | +That is a much better starting point for building a real internal footage library. |
| 132 | + |
| 133 | +## What Is Next |
| 134 | + |
| 135 | +There is still plenty to do. |
| 136 | + |
| 137 | +The current roadmap includes: |
| 138 | + |
| 139 | +- improving clip summaries and tag quality |
| 140 | +- making the browser workflow more useful for review |
| 141 | +- refining search and filtering |
| 142 | +- exploring native Blackmagic RAW support through a dedicated adapter |
| 143 | + |
| 144 | +For now, though, the important thing is that the first real workflow already works. I can point Argus at a folder of footage, let it grind away locally, and come back to a searchable library without sending any of that media to a cloud service. |
| 145 | + |
| 146 | +That is exactly the kind of tool I wanted to exist, so I built it. |
| 147 | + |
| 148 | +## Project Links |
| 149 | + |
| 150 | +- Github repo: [https://github.com/discoposse/argus](https://github.com/discoposse/argus) |
| 151 | +- Usage guide: [https://github.com/discoposse/argus/blob/main/docs/USAGE.md](https://github.com/discoposse/argus/blob/main/docs/USAGE.md) |
| 152 | + |
| 153 | +If you give it a try and have ideas for where it should go next, open an issue or a PR. This is one of those projects that gets better the more real-world footage libraries it gets tested against. |
0 commit comments