Volvo EbalAI systems and automation
Built for myself

The ones with my name on the failure.

Client work proves I can deliver. These prove what I do when nobody is watching, and each one carries the failure it taught me.

Database Reactivation

database-reactivation.pages.dev
An AI SMS agent that texts a CRM's dead leads, qualifies replies and books calls.
n8nGPT-4o-miniGoHighLevelCloudflare Pages
Incident

A regex crossed a template literal and the headline split on the letter s

Inside a JS template literal \s collapses to s, so the shipped code was split(/s+/). It threw nothing and looked almost right. Now I grep the emitted file, not the source, whenever a build writes code.

An offline paint-by-number game, built for my wife and daughter, that never runs out.
Cloudflare PagesCanvasService worker
Incident

A non-interactive deploy insists you are not logged in

wrangler whoami finds the login, then wrangler pages deploy claims there is none, because different code paths look in different directories. Every project I have deployed since imports one helper that reads the stored token rather than copying it.

Phone Bridge

Scan a QR and the phone sends files into a folder on the PC, realtime, no app.
NodeWebSocketsQR pairing
Incident

A token in a URL granted access on its own, and 900 MB was a silent ceiling

The QR image sat on a path that leaked the pairing token, so the token alone let a device in. Now a token only gets a phone to pending and an approve click grants access. Separately, uploads died near 900 MB with nothing logged: Node's default requestTimeout, not anything about size.

Video editor

Raw clips in, captioned vertical cut out, edited locally with no upload.
ffmpegfaster-whisperNode
Incident

ffmpeg dropped the alpha channel and rendered a black box, exit code 0

Transparent overlays came out as opaque rectangles with a successful exit code, because the default vp9 decoder discards alpha. Nothing in the output said so, which is why the pipeline now inspects a frame instead of trusting the exit code.

Pomodoro Cat

A focus timer whose break you cannot skip: a cat walks in and naps across the whole screen, over the live desktop, blocking input until the rest is over.
ElectronCanvasRuntime chroma key
Incident

The cat was filmed against black, and its own stripes keyed out as holes

A matte on black looks like the obvious choice until the subject is a dark tabby: every stripe reads as background and the key eats the animal. Reshot against green, and the transparency is now computed per pixel at runtime rather than baked into a file, because the alpha channel did not survive the encode either.

Also shipped

Smaller tools that do one job and are finished. No incident report on these because none of them broke in a way worth writing down.

SnapVault

ReactVercel
snapvault-rho.vercel.app →
Backs up an iPhone's photos and videos so the storage can be cleared. Installs to the home screen from Safari, so it behaves like an app without being one.

Video Downloader

Chrome MV3NodePython
A Chrome extension, a local download server and a command-line tool that pull video out of Skool, YouTube, TikTok, Facebook and Instagram.

Video QA reviewer

PythonffmpegPlaywright
Points at a folder of review links, downloads each video, runs the technical checks and a visual review, then posts a per-video report into Slack.

MLS prospecting agent

PythonExcel exportTelegram
Runs daily across fifteen zip codes, finds new property listings whose photography is thin, scores them, drafts a personal email to each agent and exports the day as a dated spreadsheet.