Justin Hooker
Full-time pirate. Part-time architect. Wannabe designer.
I’m a product engineer. I work front end, back end, and the messy middle nobody owns. I got here by accident: the tools I needed didn’t exist, so I built them. Now I go looking for problems I don’t know how to solve yet.
The Process:
Make it possible.
Pirate
Make it reliable.
Architect
Make it fun (or efficient. Fine.)
Designer
Those steps used to run in sequence, and most projects stalled at the first one. With agents I run them in parallel. I don’t trust instinct. Not mine, not the AI’s. So I test everything and keep what works. My git history is a graveyard of what didn’t.
It’s all craft, and the screen is just one medium. Off it, I go analog: abstract painting, sculpting clay, and custom carpentry, all done slowly and deliberately. It reminds me not everything should be automated.
Rocinante was Don Quixote’s horse: scrappy, stubborn, and not quite clever enough to check the odds. History remembers the knight tilting at windmills. I’ve always been more interested in the horse that carried the weight. Everything here started as an idea I had no business attempting. These are the ones that survived to production.
A private line that lets an AI assistant answer questions about the business straight from live company data. It can only read, never change anything, and personal details are stripped out before anything leaves the building.
A machine that keeps the company blog fresh on its own. It spots stale or outdated articles, rewrites them with every claim backed by a verified source, and checks its own work before handing it over. A person always presses publish.
The same loop that keeps the blog fresh, run against Google Ads. It reads the keywords, judges each one on what it actually brought in, and changes them, with live traffic data feeding every adjustment. It also tells Google which clicks became paying customers, with the real amounts, so the budget chases revenue instead of clicks. If someone did not arrive through an ad, nothing about them is ever sent.
The signup survey. Before anyone sees the app, five quick questions establish who they are and what they intend to do: buying or selling, how soon, where. Every way of signing up runs through it, no skips, and the answers feed the persona system directly, so the rest of the product knows who it is talking to from the first minute.
A clone of my CTO. I read every change request and PR comment he left over eighteen months and distilled what he keeps objecting to into 55 rules. Every night a bot checks the day’s merges against them: style fixes are bundled into one PR, anything functional gets a PR of its own. The same night the docs are checked against the code and brought back in line, so the codebase never quietly degrades.
Works out what kind of buyer someone is: nervous, analytical or impulsive. The first guess comes from the onboarding survey, then nightly behavior re-checks it. The only thing it is allowed to change is how an email sounds, its tone and its length. Never what it says.
Fed by Part 1. Every night it weighs and measures what each customer did and predicts their next step: who is about to leave, who is ready to upgrade, who has gone quiet after bidding. The scoring is plain arithmetic with no AI guessing.
Takes the persona from Part 1 and the activity from Part 2 and writes one highly specific email: the right tone for that reader, about where they are in the process, in the voice of their agent. It also knows when they are usually on the platform and holds the send for that window. If it is Monday and they always show up on Tuesday afternoon, it waits for Tuesday afternoon. Every email still passes its checks before it may send.
Shows which ads and pages actually bring in customers. It follows a visitor from the first page that brought them in to the moment they signed up, without ever sending anyone’s name or email to Google.
The blog had been left for dead on hosted Ghost. I brought it home, self-hosted, then rebuilt the entire marketing site around it with the blog as the engine. Everything is written for humans and structured for machines: SEO for search, AEO for the AI crawlers, so it ranks, and so an agent asked a question quotes us for the answer.
A searchable list of every customer with their full history, built to replace an external tool. It shipped, lived exactly three days, and was deleted.
Two internal pages of charts and a live activity feed that never reached users and were removed after two weeks. The useful part, knowing which actions signal real intent, lives on inside the scoring engine.
A daily call list for the sales team, with a one-click AI-drafted email per client. Replaced by asking the AI assistant for the same list. The scoring underneath is unchanged.
Everything needed to run live webinars: signups, calendar invites, reminders, replays, even its own AI tool. Ran from autumn to spring, then the company stopped doing webinars and all of it was deleted on purpose.
A careful mass-mail tool with filters, test sends and batch sending. It worked, it was never once used in production, and it was deleted along with the webinars it was built to announce.
Every weekday morning it reads over a thousand Amsterdam job listings, has an AI judge the best against my real background, and tailors my CV and cover letter for each strong match. It can rephrase my experience but never invent anything, and every application is still my click.
This website. It started as Antoine Wodniack’s open-source portfolio and got taken apart until almost none of it was left: the contour field, the lattice, the About lanes, the video store you are standing in. Built with agents, checked in a headless browser, judged by eye. Every section here is an idea I had no business attempting.
A phone app for learning Dutch by speaking it out loud, built as the companion app for a real Amsterdam language school. The phone reads the dialogue aloud and listens when it is your turn, flashcards drill de or het, and each session earns a stamp in a savings-card booklet.