Skip to main content

I'm Justin

I'm a developer.
And a writer.

I build useful things, write about what I learn, and explore the messy, interesting parts of being human.
I build useful things, write about them, and explore what’s next.
Image
Cartoon illustration of Justin shrugging with open hands.

Latest articles

All articles

I needed to serve a separate frontend app, a Vite build, at /editor on the same domain as a Drupal site.

A simple lo-fi stream player embedded on a site — no third-party widget, no branding, no <iframe> from a service that might go away or plaster ads over it.

There’s a particular kind of frustration that only developers who do lots of client work understand: the moment you switch from one project to another and realize you can’t remember where anything lives.

My wife has a lot of essential oils. Like, a lot. Shelves of them. A dedicated cabinet. More arriving in the mail with some regularity. However, she has always had an issue about which oils she has and how much she has left.

If you've ever placed the same reusable block in multiple regions of a Layout Builder page and found that only the first instance renders while every subsequent placement shows nothing. You've hit a known Drupal core issue.

You've installed the robotstxt module, made your changes in the Drupal admin at /admin/config/search/robotstxt, cleared cache, run cron — and the live robots.txt file still showing old content.

Projects

All projects

Lo-fi audio player

A lo-fi stream player with custom SVG controls: play/pause, volume and a live indicator, with no third-party widget or branding.

Project context file

One YAML file per client project that records where everything lives: staging URLs, SSH aliases, boards, design files and contacts.

Essential oils tracker

A small web app for keeping track of which essential oils are on the shelf and how much of each is left.

Writings

The other half: fiction, poetry and longer pieces.

All writings