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, […]