I have a nifty Divoom Pixoo-64 on my desk that I got for Christmas a few years back. It’s a 64x64 LED display that can show pixel art, animations, the time, etc. But if you don’t mind code, it can show whatever you want. I wanted it to show the weather in a specific way that I liked. The Divoom on my office wall The result: a little serverless function that generates a 64x64 pixel…
For our team’s final 2025 meeting, I made a nice 2025 end-of-year report on our code entropy over the past year, with a focus on recognizing the contributions of our team. Sharing this guide for anyone who might want to do something similar. It’s nice to have a snapshot of what a team accomplished in code form: code commits, PR reviews, cross-repo work, security patches, dependency…
At WorkTango, a pull request (PR) moves through a predictable lifecycle: Developer opens a PR against the main branch ( master , in our case) CI runs (tests, linting, type checking) At least one approving review required (more for certain files via CODEOWNERS ) All status checks must pass When ready, the developer adds a GitHub label ( breakdance ) to request auto-merge On merge: commits are…
As a Node/TypeScript engineer constantly trying to prune build tools and layers of complexity away, I find ECMAscript modules quite the difficulty hurdle. A lot of the little rules and differences between ESM and CJS have deep technical reasons behind them, many of which I’m sure are difficult to explain. One of those is the whole “where’s my __dirname and __filename ?!”…
I got to thinking about all of the ire I often see directed toward Test Driven Development (TDD). Developers tend to consider the “write the test first” dogma to be unhelpful–too picky for people who actually want to ship products. I totally understand. Nobody likes something that exists only as a set of obtrusive, mechanical, seemingly regressive rules. (This is tilting at…
There are a whole lot of NodeJS ORMs and/or DB management drivers to choose from: Objection Sequelize Knex Prisma Hasura Raw mode (PG2, node-mysql, SQLite, etc.) TypeORM Kysely Mongoose Waterline (Sails) MikroORM I’ve used most of them at some point, either professionally or in side projects. Over time, I’ve developed a preference against treating my schema shape (in code) as the…
I’ve done a number of AI-related projects. Nothing huge, and nothing from the metal, like training models. (I don’t have a year’s salary to set on fire!) If you don’t do a ton of Python (I don’t), some of the techniques appear at first glance magical. They’re referenced in arxiv papers with fancy names like “embeddings,” or…
I just realized after a few months that our GitHub code owners file wasn’t properly covering our migration files. I trust our code owners, and the misconfiguration is purely my fault. And, luckily, we didn’t lose any data to my mistake. No harm, no foul. But now it’s time to get serious with this. I made the change expecting it to work one way, but it worked another way. I…
Abstractions are a wonderful software development tool, allowing one to take common business rules and consolidate them into a centralized location for improved testability and reuse. We trade complexity in multiple locations for complexity in a central place, so that our top-level function doesn’t need to understand all the intricacies of the underlying, abstracted tooling. Yet, even the…
At WorkTango, we mandate 100% code coverage. Over the years, we have found a few handy, type-safe helpers to help us save on writing test cases where the scenario would add no value. The Problem Consider this function: 1 2 3 4 5 6 7 8 9 10 11 12 interface Attribute { name : string ; displayName? : string ; // <-- Optional } /** * Given an at tribute, returns its display name if present. Otherwise,…
The Problem In our codebase over at KazooHR.com , we generate all of our code with @graphql-codegen . We use those types (mostly) as the canonical records for our business objects in the frontend (and for a lot of backend operations). Generating this code automatically gives us type safety for most of our backend and frontend code. We also enforce 100% code coverage. At first, it was onerous, but…
We should respect process. Is exists to provide accountability and known pipelines for the movement of features from your development box to production sites. But. Code quality and standards are often difficult to make a business case for. Why should we carve out time to improve years of unprofessional, difficult-to-read code when there will be no actual improvement to what we deliver to…
Sublime Text 3 is awesome. I won’t talk about that now. What I did want to quickly blog about is the command line utility. I’ve got a nice long list of bash aliases that I’ll blog about sometime in the future. One thing I wanted was a way to launch Sublime from the command line. In my search, I found Olivier Lacan’s nice writeup about setting up the Sublime CLI . It’s…
Magento2 uses RequireJS to load its javascript. The library is made to be a browser-based solution to a classic problem in frontend development: how to incorporate third-party dependencies in your javascript. Rather than having to place a page’s dependencies in script tags in each page’s header, RequireJS handles everything for you asynchronously, allowing your javascript to define its own…
This short tutorial assumes you have Magento2 installed and ready to go. I’m using a local install on OSX, but these same commands and principles will work if you install Mage2 via Docker or Vagrant, as well. Note: for a visual dive into this subject, check out the YouTube video I made on the subject, A Magento2 Frontend Workflow . Magento2 ships with LESS because its easy to use PHP to compile…
If you haven’t heard about CSS Grids yet, what are you doing? Go read about them, now! Support for them just dropped in the evergreen browsers, save Safari, which is due out in April. That means that by the end of the year, we could see as high as 50-70% support. (I just made this number up.) But as I’ve been working with a designer on what this means, and how we can best use CSS grids, I’ve come…
This past week, I’ve been taking a crash-course in Magento 1.x. I’ve been thoroughly impressed that it runs a fairly sophisticated ORM that implements an ActiveRecord-like API in an otherwise DataMapped pattern. It only calls a record’s resource handler (which saves the data to the database) when you call a row’s save() method. Pretty cool stuff. But holy moly, what a complex, spaghetti-like…