RSSAmplifier

Blog

Mike Zornek

Recent content on Mike Zornek

mikezornek.comRSS feed ↗50 posts

Latest posts

An Agent Skill for Updating Elixir Dependencies

If you have experimented with AI coding tools or are considering it, one feature of the coding harness (the interactive shell you work in) you’ll encounter is skills. 
 What is a skill?
 
 As described by Agent Skills : 
 
 Agent Skills are a lightweight, open format for extending AI agent capabilities with specialized knowledge and workflows. 
 At its core, a skill…

Shimming Your Way Off a Dead Elixir Dependency

On a recent client project, we set out to move ex_money to a new major version. That was already a meaningful piece of work in its own right, not a quick bump. But before I could even get started on it, the upgrade wouldn’t resolve. The new ex_money wants gettext 1.0, but something else in the dependency tree was pinning gettext to 0.26. That something was Timex . 
 So the significant…

Guarding Against AI Drift: My Automated Elixir Quality Checks

Over the last couple of months I’ve been using LocalCents as a place to experiment with AI code generation, and the raw volume of what I ship has climbed right along with it. I won’t pretend that’s pure fun. It’s actually a little scary. My worry isn’t any single generated change; it’s the long-term drift. An AI reaches for whatever pattern it has already seen,…

My Notes on Three Years of Coding with AI

I want to talk through how my use of AI has changed over the last three years. Not because I’ve got it figured out. I don’t. But the tooling is moving fast enough that I don’t think any of us can keep up on our own, and the way I’ve always sorted through a confusing stretch of this industry is by comparing notes with my peers. 
 So think of this as the version of that…

What Is Good Code?

Everything I do to keep a codebase healthy (the CI checks, the standards files, the review habits) is in service of something I’ve never actually defined: good code . The practices only make sense once you can name what they’re protecting. So let’s start there, and connect the what to the why . 
 Solves a problem
 
 An obvious starting point, but if we are not helping…

A Place for Everything: How I Track Work

When I have management responsibility on a project and influence to shape workflows, this is how I typically manage issues and pull requests. None of this is the One True Way – it’s just the system I’ve arrived at, and I find writing it down useful both for myself and for blog readers who enjoy such things and want to evolve their own flows. 
 Aside: If I’m joining a…

Decision Records, Playbooks, and Other Acts of Kindness

You’ve felt this. You open a project you didn’t write, hit a wall, and there’s no one left to ask. The code is all there, but the why is gone – it left with whoever wrote it. 
 Most of the work that prevents that moment never shows up in a code change. It’s the stuff you do around the code so the next person – maybe a teammate, maybe future you –…

Stabilizing Inherited Software: My First-Week Checklist

Not every consulting engagement starts with joining a team that’s humming along. Sometimes it starts with a handoff: the developers who built the software have moved on, but the software itself is still live, still has users, and still needs to keep working. There’s no team culture to learn – there might not be much of a team at all. This is how two of my recent client projects…

Fresh Eyes on a Cucumbered Team

I once did some subcontracting for Test Double (wonderful consultancy btw, really good people there). While there I picked up a term for what happens when you’ve been inside an organization so long you stop noticing its quirks: you’ve been “cucumbered.” Left in the brine long enough, you become indistinguishable from the brine itself. 
 It’s a good metaphor…

The Moral Struggles of AI Coding

This is more of a personal journal entry than a typical helpful blog post. Normally, I’d keep this in my private notebook, but since I want to link to these thoughts, I figured I’d post them on the blog. 
 Background: I am a programmer with nearly 30 years of experience who makes my living through freelance and consulting work, typically focused on programming Elixir and related…

GitHub Copilot and Unhonored Branch Protection

I was using the GitHub Copilot web chat experience yesterday for client work. I needed to migrate some issues from a third-party CSV export into GitHub Issues. (It mostly worked, but there was still a lot of data massaging after the fact, which the chat could not do.) 
 Early in the process, the chat took my command of make the issues to make markdown files in an issues folder on the main…

Becoming an Accessibility Ally: My Early Journey and Resources

Here is a hard truth: while I want to be viewed as an ally to accessibility, I probably would not score very high if you judged me by my actions. In the past, I’ve worked a little extra to find the correct semantic HTML tags to use in various situations. I have included the random image alt attribute but not much else. 
 I had a few peers at my last employment who were more active…

A Visual Tour of Phoenix's Updated 'magic link' Authentication Code Generator

With Phoenix 1.8, the authentication code generator inside phx.gen.auth has been revamped, favoring an emailed ‘magic link’ authentication flow. 
 In this blog post, I’ll give a visual tour of how this looks to the user, what the core schemas/contexts look like, and I’ll sprinkle in some personal commentary as we go. 
 Background on authentication
 
 When…

Open for Software Dev Coffee Talk

One of the joys of self-employment is having a little extra control over your day-to-day schedule. 
 In the past, during the time between paid projects, I have enjoyed casual open meetings with folks around the software developer community. 
 Right now, work is light, and I have extra room to chat, so I figured I’d promote the opportunity. 
 If you have an interesting side…

Returning to Self-Employment

My full-time employment is coming to a close, and I am once again rebooting my self-employment life. 
 
 
 From web comic name . 
 What Happened?
 
 If you’ve been following along with my now updates, it has been clear that my full-time job was not in a great place for a while. 
 The short story is that when I interviewed and eventually accepted the job, I had a…

Ranked Vote Flick Demo

Took a few moments tonight to record a short demo of RankedVote.app (Project name: Flick ) tonight. 
 
 Flick is a simple Elixir / Phoenix LiveView app that helps capture ranked votes. 
 This project was built to help the Elixir Book Club pick books, but it is open to all. 
 
 I’m going to moving on to other side projects and seems as good a time as any to capture this in…

Using Google Sheets to Catalog Expenses for Budgeting Considerations

I try to revisit my budget every six months or so, and having just wrapped up my taxes, which provide helpful totaling of where the money went last year, it was a good time to rebuild the numbers. 
 In the past, I’ve used Soulver for some of this, and while I still like that app, this time, I took a shot using a Google Spreadsheet. 
 I liked how the expense spreadsheet came out and…

How to Use a Modern Version of Hugo on Render's Static Site Service

I host this site at Render.com . Specifically, I use Render’s Static Site product . It’s a good product and free for most usage. It features an auto-configured SSL certificate, global CDN, pull request previews, and many other nice things. I’m also paying Render to host some Elixir things and enjoy the simplicity of fewer things to manage 
 When you read the docs, Render…

How I Got Rid of My Google-Hosted Web Fonts

Over the last few weeks, I’ve been doing some infrastructure updates to the website, and one of those changes was to drop the use of Google’s linked web fonts and instead host custom fonts from my own server in the spirit of improving the privacy of my site visitors. 
 Here is how I did it and some of the problems I ran into. 
 Picking your font
 
 The first custom font…

2025 Tools Audit

It is good to take inventory of things from time to time. Here is a list of the tools I use regularly as of April 2025. 
 I welcome hearing your suggestions for tools I should consider in the future. 
 None of the links below are affiliate links. I ain’t got time for that shit. 
 Hardware
 
 
 2021 Apple M1 Max MacBook Pro, 16-inch with 32 GB of RAM and 1 TB of…

Conference Notes: Code BEAM America (San Francisco) 2025

After a run of bad luck where I had to cancel Elixir-related conferences at the last minute (once because of the smoke storms that hit NY, and once because I got COVID before the conference), this week I enjoyed some time at Code BEAM America 2025 in San Francisco . 
 I had a great time at the conference. The content was high quality and well presented. The in-person attendees totaled around…

What is Local-first Software?

Local-first software is a term that came out of a research lab called Ink & Switch back in April 2019. In a wonderful paper , they explored some ideas that resonated with me. 
 In today’s post, I want to talk a bit about the problems local-first software solves and explore an abbreviated definition of how to identify local-first software. I’ll close with some resources to learn…

A Few Good Memes


 
 Yesterday I took to r/ProgrammerHumor to reply to this post about code review . I used a meme I crafted back in September and posted this meme as I was preparing for quarterly performance review season. It since has gotten some replies that have me laughing out loud. Recording for prosperity. 
 Intelligent-Touch936 writes : 
 
 We live in a world that has code, and that…

Phoenix LiveView: Presenting DateTime in User's Time Zone

This past weekend, I added a feature to Flick ( RankedVote.app ) where we now present domain-specific DateTime values, like published_at and closed_at , on the live view page using the user’s time zone. I thought I’d capture some notes on how this was accomplished, some known limitations, ideas to solve those in your own work, and a set of resource links to learn more. 
 Elixir…

On Asking Multiple Questions

On the socials @jerzone shares : 
 
 My super power is carefully combining a number of relevant questions in the same message so the person doesn’t have to spend a lot of time going back and forth with me on individual questions. 
 Everyone else’s super power seems to be picking out the least relevant of those questions and responding in an oblique fashion. 
 
 In…

Best Vinyl of 2024

In March of 2024, I purchased a record player after seeing one at my cousin’s place. 
 I am not an audiophile; in fact, I have partial hearing loss in my left ear. Nonetheless, I like the physicality of playing a record. The intent of putting the vinyl down on the platter, lining up the needle, and letting it play out without the distractions of a computer or phone. Taking the time to…

New Gaming PC

In the closing days of summer this past year, I started to get an itch about building a new gaming PC. In this post, I’ll share what I built and some notes on its assembly. 
 
 
 
 Assembled computer powered on. 
 
 Inspiration
 
 I had been playing a few games on my Mac laptop over the summer, including Civilization VI and Stardew Valley. Civilization VII was…

Personal Elixir Code Aesthetics

With my side project Flick hitting an MVP milestone and inspired by some conversations during Elixir Book Club , I thought I’d take a moment to document some code aesthetic choices I made in this project. 
 The order below is not ranked in importance. In fact most of this is nitpicky, but still my preference. 
 Whitespace between import and alias.
 
 Alphabetically ordered…

LiveView Modules Must End in `Live`

When working with LiveView you’ll notice people naming modules with the suffix Live , as seen in module names like FlickWeb.Ballots.IndexLive or FlickWeb.Vote.VoteCaptureLive . 
 A student I was mentoring once asked me what that Live suffix was for and if it was required. 
 We drafted some simple LiveView demos with modules that did not end in Live, and things worked fine. I had a…

June 2024 Review

A collection of accomplishments, notes, and observations about June 2024 (and some early July things too). 
 Work
 
 Stress about the future private equity acquisition of my current employer looms. There is a high probability of being laid off in early 2025. 
 My mindset has reverted to treating the employment more like a contract. I am a professional and give them a professional…

May 2024 Review

A collection of accomplishments, notes, and observations about May 2024. 
 Work
 
 Stress and uneasiness. 
 Code wise, mostly focusing on Highchart implementations as the team works towards finishing up a specific epic story. 
 Side Projects
 
 Had a few short coding sessions on Flick , but not as much as I would have liked. 
 Tech Education / Books
 
…

April 2024 Review

A collection of accomplishments, notes, and observations about April 2024. 
 Work
 
 Meh. 🤷‍♂️ 
 As I was reminded during our annual compliance training, we aren’t allowed to talk much about what we do, which sucks. I have good things I’d like to share; I have bad things I’d like to share. I might even drop this section of the monthly post in the future,…

Impactful Books

A local developer Slack had an icebreaker post asking for programming books that impacted your career. I figured I’d share mine in a more long-lived format. Some are more timeless than others. 
 Web Development and Programming
 
 
 Designing With Web Standards by Jeffrey Zeldman – I recall reading this in 2003 when I was just out of college and starting to invest…

March 2024 Review

A collection of accomplishments, notes, and observations about March 2024. 
 Work
 
 Work is ok. Chipping away at our big project. Some things feel like they take forever as I need to unpack our complex domain and/or more advanced LiveView things. 
 Feel like I continue to improve my impact with the team. Getting well known for in-depth code reviews. Also trying to mind the balance…

February 2024 Review

A collection of accomplishments, notes, and observations about February 2024. 
 Work
 
 As shared last month , the big recent work news was not only my new full-time job (which I started in December 2023) but also the Allovue acquisition by PowerSchool. Based on that, February saw continued adjustments at work, and they will continue in March. 
 I’ve about wrapped up my first…

January 2024 Review

A collection of accomplishments, notes, and observations about January 2024. 
 Work
 
 In last month’s review , I shared my early notes on my new job at Allovue . Well, the BIG news of January is that PowerSchool acquired Allovue . I have not been laid off (a relief considering my very recent hire date). My employment title, salary, and benefits are mostly a 1:1 carryover at the…

December 2023 Review

A collection of accomplishments, notes, and observations about December 2023. 
 Work
 
 This month, I started my new job, putting in about three weeks before the holiday, which the company was fully closed for, which was nice. 
 The first week was a lot of general onboarding activities and some social/cultural events. After getting the code, I started to make some small technical…

November 2023 Review

A collection of accomplishments, notes, and observations about November 2023. 
 Work
 
 The big news is the announcement of my new job . 
 I applied on August 28th and did four interviews, including a two and half hour coding session (a mix of PR review, ticket grooming, and actual coding exercise). Was given the offer letter on November 13th. 
 To the people who are juggling…

Announcing my New Full-Time Job

I have some big news: Starting December 4th, I’ll be working full-time as a Senior Elixir Developer for Allovue , where they build web-based accounting software for school districts. 
 This change is particularly significant because I’ve been self-employed as a freelance consultant for most of my career. 
 Frankly, finding consistent Elixir contracts over the last 18 months has…

How to Run a Successful Book Club

I’ve been a member (and organizer) of many professional-oriented book clubs in my career. I find them a valuable way to connect with peers, keep up with my reading goals, discover new ideas, and learn from other points of view. 
 Running a book club can be a relatively low-cost and high-value experience. To help, I thought I’d document how I tend to prefer book clubs. These…

Journal -- October 20, 2023

Monday, October 20, 2023 – It’s been over a month since I did a casual journal – so here we go. 
 Work
 
 Work has been good. Still in an underemployed amount of client work phase, but working more hours this month than last, so I’ll take that as good news. 
 For my main client, I’ve been focusing on API consumption-related features, getting our…

Journal -- September 11, 2023

Monday, September 11, 2023 – A regular check-in of personal things. 
 Work
 
 Work has been relatively busy. 
 My one client, who is in a maintenance-type contract, had multiple downtime issues recently. I was able to deal with the Elixir incident personally but was more on the sidelines for an Android build issue. 
 For my other part-time client, I continue to hack on…

Journal -- August 6, 2023

Sunday, August 6, 2023 – A quick recap of recent personal things. Nothing earth-shattering, just a regular journal. 
 Work
 
 Work things have been a little busier since my last update . 
 My one retainer client (who could be considered a maintenance/fire alarm type of contract) had some curious push notification behavior to look into. It has yet to result in any actionable…

Early Svelte Thoughts

After more than five years of giving my full attention to Elixir, Phoenix, and LiveView as the primary toolkit I use to build web apps, over the last few weeks, I’ve started to sample some other tech stacks, with an initial focus on Svelte and SvelteKit . Here are some early thoughts. 
 Why the move?
 
 This move comes from an ongoing, uneasy feeling that the current LiveView…

Circle Sign-Up Forms and Credit Card Fraud

I’m a long-time fan of work done at freeCodeCamp and was sad to read this article a few years ago about how someone had used their online donation form to test/validate stolen credit cards (for later sale on the dark web). The amount of headaches this kind of thing causes (for all parties) is a nightmare. Refunds need to be issued, credit card fees paid regardless of refund status, cleaning…

Shutting Down ElixirClub

After six months, today I announced ElixirClub’s closure. For context and for those many souls who did not know: 
 
 ElixirClub is (was/hopped to be) an outcome-oriented community that helps Elixir developers finish their side projects. 
 
 I ran the site on Circle, hosted some weekly events and async project update threads – but the hard truth is that I was not able to…

Journal -- June 12, 2023

Monday, June 12, 2023 – Time for the regular check-in to braindump what I’ve been up to and what I’m thinking about. Who reads this stuff? 
 Work
 
 I continue to look for contract and/or full-time Elixir work. Hire me! 
 It’s been a quiet and slow spring, but there are small signs of promise. Took a few more calls and emails in the last 4 weeks than the 4…

Side Project Launch Cold Feet

Almost a year ago I documented my interest in re-building this blog in an Elixir/Phoenix/LiveView app for the purpose of learning event-sourcing and some new UI concepts. The good news, that project is functionally complete. The bad news, I’m not sure I want to launch it. 
 When I posted the project outline in “Challenges and Risks” I said: 
 
 Not using an…

Notes about Technical Debt

The Elixir Book Club is reading Software Design X-Rays:
Fix Technical Debt with Behavioral Code Analysis . 
 This past Sunday, we had our first meeting, reviewing chapter one and sharing some interesting discussions on technical debt. I wanted to capture some thoughts while they were fresh in my head. 
 What is technical debt?
 
 So the book starts by defining technical debt…

Journal -- April 2, 2023

Sunday, April 2, 2023 – The morning coffee has been consumed, and it’s time for some Sunday journaling. 
 Work
 
 I am still looking for a new contract gig . I have some very light retainer work on my plate and have also started some paid-for mentoring sessions (though those are highly discounted, so it’s more of generosity than an actual income stream). 
 I…