Blog
The system around the code
You've seen the demos. Someone spent an afternoon romancing Claude and built the thing the business has been asking about for years. Everyone is impressed and can feel the possibilities unlock, looks are exchanged, this feels like a game-changer and that we're now living in a […]
Just learned the NOT VALID keyword
After decades of working with databases I didn't know that NOT VALID was a thing:
Jump Design Improvements
Started a blog over at jumpcomedy.com and the first post tackled improvements that were made to reduce customer support emails.
Replacing prompts with loops: an example
Claude Code creator Boris Cherny made a bit of a stir when he said:
Speeding up Elixir test suites
Last week I took our Elixir/Phoenix suite (13,000 tests, 940 files) from 313 seconds to 64 seconds. Below is what was done with most impactful listed first. These are Elixir specific but I think the learnings apply to non-Elixir stacks. Your mileage will vary.
How LLMs Figure Out What You Mean - No Math Degree Required
When you type a sentence into an AI, how does it figure out what you mean? In "Do lions roar?", how does it know that "roar" goes with "lions" and not with "Do"?
Anthropic's Steganography Controversy Explained in Non-Technical Terms
You may have heard that Anthropic was caught doing something sneaky which I want to explain without any of the technical stuff because the lesson is for everyone, especially if you're paying for AI tools or deciding whether your team should use them.
Enforcing Invariants in AI-Generated Code with ADRs and Contracts
I had earlier written about using Hooks to enforce certain rules in AI-generated code. The idea was to use deterministic checks rather than prose-based guidance which can't be enforced at time of generation. A hook here is just a script that runs at a point in the agent's […]
Four Ways to Plan Agent Work, and When to Switch
This post is for developers who want to learn about the different planning approaches to take during agentic software development. This is my experience, and all of this could be wrong, but it does work for me.
Don't rely on instructions, use Agent Hooks to enforce guardrails
This post is for developers who use AGENTS.md or CLAUDE.md to provide guardrails for agent-generated code, but find that the agent sometimes ignores rules. if you want a deterministic check that will work 100% of the time, read on about agent hooks.
Run a local coding model with pi and LM Studio
This post is for people who generally use Claude, Codex, or Gemini but have heard you can run open-source models locally for free. The goal is to get you set up in no time so you can play around with the power of local models.
I'm done with cross-browser testing
I have completely stopped testing in anything other than Chrome on Mac and it hasn't affected me at all. I don't test in Edge, Safari or Firefox and have not encountered any notable issues by not doing so.
PayPal Has No Undo Button and It Cost Me $687.75
AAAAAARRRGGHHH!!!!!!
God bless AI, I hate AI
I had to rewrite an app which used the exchangelib Python library to Go. All was going smooth until I started manual testing and kept getting a 401. It turned out that the asmx Exchange URL was returning a domain which was being hashed during auth checks by the ntlm GO lib. The […]
Commit-based Progress Report
I had to give someone an update on what's new with the app over the last couple months, what value was added and what, if any, technical improvements were made. Took an agent 2 minutes using a common-sense prompt to produce the below. I asked it to scan git log and based on that […]
Spec-Driven Development: From Vibe Coding to Structured Development
Note: I currently work with a Payments Engineering team and wrote this as we are introducing spec-driven development into our development workflow.
Podcast: New Age Development Workflows
With Cheezy and Csaba. Topics include:
It's a Great Time to be a Software Engineer
Here are some thoughts on AI development based on my experience of the last two years. As with any list, these are in no particular order.
How to Setup a New WordPress Site on Digital Ocean Droplet
I had setup a Wordpress site a while back on Digital Ocean using their One-Click Installer. That installer sets it up for exactly one site with no direction on how to add additional sites. Months later I had to setup another one, and after some fiddling around, figured out all […]
Struct Updates Now Require Pattern Matching in Elixir 1.19
After upgrading to Elixir 1.19, you might see warnings like this:
Why Regex Serialization Changed in Elixir 1.19/OTP 28
When upgrading to Elixir 1.19 with Erlang/OTP 28, the deployment failed with a cryptic error:
Trade-offs in Aggregate Design when implementing CQRS in Elixir
Event sourcing with CQRS is a powerful feature, but it presents difficult design decisions which can challenge dogmatic Domain Driven Design theory. Ultimately as with all software engineering trade-offs, the business need dictates whether the complexity is worth it.
Building a Double-Entry Payment System in Elixir
Multi-tenant platforms which facilitate e-commerce transactions hold people's money. Getting that money to the right people, in the right amounts, at the right time, is the core trust contract with your partners. This is the most critical and sensitive component in our system as […]
Building Embeddable Widgets with Phoenix Channels
When you're selling stuff, every click away from your website is a potential lost sale. Customers kept asking us to allow people to buy tickets without leaving their branded site. They loved the service, but wanted to retain brand presence and coherence.
Scope discipline when AI makes building fast
I needed to show users contextual messages, e.g., banners for announcements, modals for important actions, tours for onboarding. I already use PostHog for analytics and PostHog allows the user to create apps which can provide this functionality while being tightly integrated […]
Embedding-Based Tool Selection for AI Agents
When I first built our AI assistant, it had five tools. Look up an order. Process a refund. Check ticket availability. Simple stuff. Fast forward six months and we're at nearly 40 tools spanning orders, events, marketing campaigns, contests, and customer management.
React2Shell serves as good reminder why JavaScript is no fun
Got this email from Vercel after the JavaScript ecosystem had another moment.
Why are dark deployments a good idea even if no features are being shipped?
Granting read only access to a Postgres database on DigitalOcean
The docs may say this:
TTC USB Outlets are Already Obsolete
Making decisions on hardware installations is tricky, because unlike software you can't just fire over an update. This is why I was very skeptical seven years ago when the TTC's electric buses started installing USB-A ports (the one everyone's used to) for charging.
Good riddance to Auth0 and social logins
Three months ago I got rid of social logins, fired Auth0 and made the decision to use Magic Links (easy in Phoenix - hello mix phx.gen.auth).
Has AI made the Agile Manifesto obsolete?
Was joined by Cheezy and Csaba to talk how AI doesn't require you to make the "over" compromises that the agile manifesto expounded. Subscribe to the YouTube channel or find the Continuous Delivery Podcaast wherever you listen to podcasts.
NY Times Fade Text CSS Effect
Example:
Pushing events back to Live View or Live Component from Hooks
When writing hooks in Phoenix LiveView the pattern of pushing events from the JavaScript hook back to the Live View or Live Component is a little different.
Pass on polymorphic tables
A decision I often have to make when designing databases is whether to create a polymorphic table or not. Let me give an example. I have:
Stop Worrying and Love the Bomb
A variant of this comment on HN is something I've heard too often:
Everything that's wrong with Google Search in one image
I typed in Midjourney to search for Midjourney because I wanted to use Midjourney. Here's what I got instead. It's the fifth result down on the page. So if you want to rank high on Google, not only do you need to build a great product to have enough backlinks but also pay Google […]
Iqbal on the West
Whenever my dad throws out a poetic verse, chances are it's going to be from Iqbal. This one right here is one of my favourites as it directly confronts the rampant materialism of the West, and calls it out as a mirage that will crumble. Here's the original.
The Other Girl in Red
I watched Schindlers List on February 23, 1997 when NBC aired the film uninterrupted and commercial-free, a rare event in network television. I remember being motionless as the final credits rolled—Holocaust survivors honouring Oscar Schindler's resting place with flowers, as […]
I'm rejuvenated by the Elixir EU Conference
Finished my first ever Elixir conference and it feels great for three reasons:
Getting Kanban Right (podcast with Fernando Cuenca)
Had a chance to dive keep into Kanban with Fernando Cuenca for the Continuous Delivery Podcast, check it out there:
How RTO Created the Strongest Team Building Exercise Ever
When companies announced their return-to-office mandates, they promised enhanced collaboration, stronger team bonds, and improved company culture. In one Bangalore tech company, they got exactly what they wished for – just not quite how they imagined it.
No Lie Logs
My new year's resolution is that I want better alerts. I'm using Better Stack for log storage and want to live in a world where every time there's a worthy error, I get pinged. I only want the word "error" to appear in the logs if it's actually something that needs attention. So […]
Penny Game Debrief
This is a debrief of the popular penny game which demonstrates flow. The questions a facilitator can ask during a debrief are varied. Some examples are below:
Painless widget development using Web Components
I've been trying to find a good solution for having responsive widgets which people can use to embed show listings, sign-up forms and the like on their websites, and have finally come to a good solution: Web Components (with Stencil to make things easier). It's got an acceptable […]
DORA: AI boosting productivity, hindering delivery
The new DORA report got released and has 30 pages dedicated to AI adoption. One particular finding stuck out to me: an increase in AI adoption was correlated with an increase in code quality, quicker code reviews, decrease in code complexity, decrease in technical debt and […]
How I Lost $210 to a Stripe Dispute Despite Proof
Note: This one has an HN thread.
The Wealth Transfer Nobody Talks About
American people don’t seem to see what’s right in front of them. In this short post I’ll tackle one glaring phenomenon that gets zero air time from any of the Western media, be it the traditional propagandists like CNN, Fox and MSNBC to the more progressive style of outlets. It […]
Closing the Raptors Republic chapter of my life
Raptors Republic was acquired by Better Collective last week marking an end to my involvement with the company I founded in 2008 alongside Sam Holako, Brandon Larabie, Scott Phillips (rest in peace) and Josh Budd.
Working around Postgres forcing DISTINCT fields to also be ORDER BY fields
I've been using Flop for pagination in my Elixir app and learned that anytime a DISTINCT clause is used in Ecto when using Postgres, the columns in the clause are prepended to any ORDER BY clauses in the query. This was causing a lot of problems for Flop since it uses specific […]
Excited about Zero Sync
I followed the announcement of onestack.dev which is embracing what I think of as the idea of a "complete stack", a singular project for all your data services, iOS/Android apps, and web. It's an ambitious project which uses Tamagui for styling and zerosync.dev for data […]
Early thoughts on React Native/Expo decision
I have to make an iPhone app for ticket scanning at the door and chose React Native/Expo as the stack. I had implemented this feature on the web using QR Code scanning libraries and things more or less worked fine. The main issues were the camera feeling a little clunky, […]
Good software development habits
Note: This got posted on HN and got some attention.
Symptoms of a System in Stasis
Here's an unordered list of symptoms that might indicate more profound issues with an organizational culture - one that's preventing it from delivering on its true potential.
Tailwind balances abstraction and transparency
I remember writing my first CSS file in Dreamweaver (still around) and it blew my mind that I no longer needed to use font, center, b, i, s, u and blink. The idea of separation of concerns between content and design was revolutionary (or at least novel) and thinning out your […]
The anatomy of a 2AM mental breakdown
Note: this made it on HN somehow.
Take a guess at what this icon in Confluence means
Scroll down for the answer.
Row Embedded Cache: KISS at its finest
Note: Hacker News thread crushing this pattern.
SCQA for Problem Definition
This post adapts Barbara Minto's SCQA to apply to a situation where there is less emphasis on providing specific answers but instead emphasis is given to collaborative problem solving.
Small Batch Thinking in UX Improves Usability and Code Quality
UX is hard but it becomes easier if you eat enough of your own dogfood. For the last few months I've had most of my forms look like the one below, i.e., present all the fields for editing and have one big submit button at the bottom:
Prefer optional objects to optional arguments
Every time I make a function with this type of signature, I end up regretting it:
Bit by falsy truths again
Spent about 3 hours figuring out why my PayPal integration wasn't working. I had followed the directions but still was getting weird responses from PayPal:
Using DORA metrics to coach teams
Related Hacker News thread.
DeckString
function createDeck() { const suits = \['S', 'H', 'D', 'C'\]; const deck = \[\]; for (let suit of suits) { for (let num = 1; num <= 13; num++) { const cardNumber = num.toString().padStart(2, '0'); deck.push(cardNumber + suit); } } return deck; } function shuffleDeck(deck) { for […]
SNRD
I paid a TON of money to do an MBA at Rotman. I think of it as an early(ish) mid-life crisis where I had serious FOMO about a formal management education. It turns out that you can learn most of that stuff on YouTube and by reading a few books. However, YouTube won't give you […]
How Function Sequence in Elixir Can Trip You Up
I've been getting into Elixir over the last year and have loved the experience. One thing that has bitten me is the order in which functions are defined. In most language that makes no difference but for languages that use pattern-matching this makes or breaks things, and […]
Time to start from scratch
I've been writing on the web since 2001 and liked it when all my stuff used to be on one site: arsenalist.com. That got split into raptorsrepublic.com, depressedprogrammer.wordpress.com, arsenalist.wordpress.com, bitbytebit.substack.com, ijtihad.substack.com, dev.to/arsenalist, […]