$ loading▍
$ loading▍
// journeys
Not case studies — the real path. The problem that started it, what I tried first, what broke, and what I changed to get it working. Longer-form write-ups than work/, one project at a time.

Solo build — a pumpkins.dev product
The first version looked the part — a secret key, a recovery kit, an unlocking sequence — while cards sat in MongoDB as plain text. The real version derives keys and encrypts every card in the browser, so vault.pumpkins.dev couldn't read your data even if it wanted to.

Solo build — for my sister
She needed to refresh the NHS Scotland jobs page every minute to catch new postings before they closed. I built a free crawler-and-notifier pipeline so she doesn't have to.

Solo build — for Webnevisan
Testing every port on a laptop first meant knowing exactly which ports it had and where. System APIs couldn't answer that reliably, so I scraped the web for it, got blocked, and ended up training a vision model to read ports straight from photos.

Solo build — started as my own pipeline, now a pumpkins.dev product
Between Electron builds and everything else across my projects, GitHub Actions' generous 2,000 free minutes still ran out. CID is the self-hosted, Electron-based CI/CD tool I built instead — now one of pumpkins.dev's own products.

Solo build — a tool for my own machine, now open source
MySQL auto-starts as a Windows service whether or not I'm about to use it, and turning it off meant digging through services.msc every time. A native tray icon fixed both — for less overhead than the process it's replacing the hassle of stopping.

Front-end & DevOps-assistant — employee at Webnevisan, on the Aram Space platform (aramspace.com)
Building the Aram Space frontend at Webnevisan was the fun part. Getting it running reliably on Azure — which the client required — is what actually taught me Docker, after Azure's own forced Node version kept quietly breaking the app.

Solo build — employee at Webnevisan, on the same laptop-testing app as the port-detection work
Verifying a laptop's mic and speakers with no human listening or talking meant designing one test that proves both at once — a serial-number-derived phrase, spoken through one speaker channel at a time, checked by an offline, grammar-constrained speech recognizer.
Tell me what you're building and where you're stuck. I typically reply within a day.