Vibe coding CamReview: a trail cam app I actually use

I built a small app called CamReview to review trail camera photos and videos.

Not “fast” in the benchmark sense. Fast in the only way I care about: I can sit down with my phone, thumb through a couple hundred captures, keep the good ones, trash the junk, and move on with my life.

And yes, I vibe coded a lot of it.

This post is what it felt like when the target wasn’t a demo or a portfolio piece, but a tool I use on my own files.

Trail cam review is a slog (and the tools don’t help)

Trail cameras produce a specific kind of annoyance:

Most tools for dealing with this fall into a few buckets:

I wanted something simpler.

My constraints (the whole point)

CamReview v0 has a few non‑negotiables, and the constraints basically are the product:

It also has some explicit non-goals:

If a feature didn’t help the core loop, it didn’t make the cut.

The shape of the app (boring on purpose)

CamReview is intentionally boring:

You point it at a mediaRoot folder, start the server, and open it on your phone over LAN (or Tailscale).

That’s it.

Mobile vs desktop: same data, different vibe

I didn’t want “a mobile version” and “a desktop version.” I wanted one app with one set of state.

So the split is simple:

Both share the same queue, metadata, and safe-delete behavior.

The part I’m proud of: safe deletes + trust

The most important thing in a personal media tool isn’t the UI.

It’s trust.

Delete in CamReview doesn’t delete. It moves files immediately into a dated folder under mediaRoot:

Once you trust the tool not to hurt you, you start moving faster.

That’s the whole game.

Video on phones is weird (so I made a fallback)

A big surprise was how finicky video playback can be on mobile browsers.

So CamReview has a pragmatic fallback:

It may look choppier, but it stays reliable.

Optional AI: helpful, never required

CamReview has optional AI features (desktop-only) via OpenRouter:

But the key word is optional.

If AI is down, expensive, or annoying, the app still does the thing.

What vibe coding felt like

Vibe coding shines when:

CamReview fit that.

But it also punished sloppy thinking.

The easiest failure mode was “building UI instead of building product.” AI makes that dangerously easy: it removes friction that normally whispers, this is not worth your time.

So I tried to keep asking:

If not, it’s bike shedding.

What’s next

The next version is going to split into two pages:

If I can make “find the interesting day” as frictionless as “keep/delete,” the whole thing levels up.


If you want to check out the code, it’s on GitHub: https://github.com/danmaps/camreview