2026-05-11 14:48:33
Hey friends!
I hope you had a great week! I am writing this the night before going back to work after a much-needed vacation in Spain... and I am in denial. Wee! Let's learn something.
Was this forwarded to you? You can subscribe here!
The Boring Internet
AI Doesn't Fix Accessible Systems. It Depends on Them.
9 Times the Web Platform Was Influenced by Libraries
Projecting React
I'm back in the USA! After traveling internationally for 4 of the past 5 weeks, it feels good to be home and sleeping in my own bed. Or rather, "sleeping" the best we can in a jet-lagged household with two toddlers.
Now that we're back... I'm excited to be back into streaming again, and I'll be on the Vibing Like It's 1999, Coding Like It's 2026 stream this week, as well!
No sponsor! Be free from capitalism!
...But also it'd be cool if your company would be down to sponsor, because though this newsletter is free to read, it's not free to make!
There's some info here if you wanna pass it along to decision-makers in your org.
Or, if you'd like to help support my work individually, you can use Patreon or GitHub Sponsors (both of which get you access to a very fun Discord group)!
Last week, I had you work with coprime numbers! You are in the prime of your lives Amine, Thulasi, Shreya, Paul, Ten, and Toni!
This week's question:
You are given a 2D grid representing a screen, a starting position for a bouncing object, a target position, and an initial diagonal direction. On each step, the object moves one cell diagonally, and if its next move would leave the grid, it "bounces" by reversing the corresponding row and/or column direction before continuing. Return the number of bounces needed for the logo to land on the target cell, or -1 if it will loop forever without ever reaching it.
Examples:
// inputs are grid, start, target, velocity/direction
countBouncesToTarget([8,8], [0,0], [3,4], [1,4])
> 2
countBouncesToTarget([3,3], [0,1], [2,1], [1,1])
> 1
countBouncesToTarget([4,5], [0,0], [3,3], [1,1])
> 0
(you can submit your answers by replying to this email with a link to your solution, or share on Bluesky, Twitter, LinkedIn, or Mastodon)
Mechanical Pencil: An illustrated celebration of the engineering around us
Agar mini keyboard with GMK Rubrehose & GMK Dualshot
New ultra stainless steel stuns researchers
Speed is Not Conducive to Wisdom
I had a pair of racing snails. I removed their shells to make them more aerodynamic, but they became sluggish!
That's all for now, folks! Have a great week. Be safe, make good choices, and try to accomplish a small goal this month!
Special thanks to Ben, Kinetic Labs, and Marta for supporting my Patreon and this newsletter!
cassidoo
website | blog | github | bluesky | youtube | twitch | twitter | patreon | codepen | mastodon
2026-05-04 10:04:22
Hola amigos!
Happy May! I hope you've had a great week. I've been in Barcelona with my family on a much-needed vacation, and squeezing in some web surfin time in the wee hours of the night. Let's see what happened this week!
Was this forwarded to you? You can subscribe here!
font-family Doesn’t Fall Back the Way You Think
The end of responsive images
Anchor-name + transitions
DO_NOT_TRACK
On this vacation, I've been on Airplane Mode the entire time, and only looking at my phone when 1. we have WiFi and 2. everyone's doing their own thing. It's been wonderful. Not scrolling, or checking notifications, or thinking about anything, just being in the moment (as much as possible) has been great.
Now, don't get me wrong... my inbox is a trash fire and I try to tame it in the evenings before bed. But it's been a good mental reset.
That being said, I did mention last week that I have a hankering for side projects, and I shipped!! I cut a new release of my app todometer, which implements a bunch of new features that I've been wanting to include for a long time. I blogged about it in detail here.
Some of the new features under the hood enables me/other users to add extensions and helpers to their todometer instances, which I've wanted for a while. For example, I just open sourced a little web clipper for it! I need to figure out how to organize/share these, but for now, I'm pleased.
Warp is now open-source.
Read that again. It's a big deal!
Contribute today using an agent-first workflow managed by Oz → github.com/warpdotdev/warp
Last week, I had you fix broken "tiles" in a 2D array! This was a fun one, great work Paul, Micah, Ten, Toni, and the folks in the Ruby Users Forum!
This week's question:
Given an array of positive integers, find the length of the longest subsequence where every adjacent pair of elements in the subsequence is coprime (where the greatest common divisor, or GCD, is 1).
Example:
longestCoprimeSubsequence([6, 12, 4, 8])
> 1 // none are coprime
longestCoprimeSubsequence([4, 3, 6, 9, 7, 2])
> 4 // [4, 3, 7, 2], where gcd(4,3)=1, gcd(3,7)=1, gcd(7,2)=1
(you can submit your answers by replying to this email with a link to your solution, or share on Bluesky, Twitter, LinkedIn, or Mastodon)
Make Your Own Micro Forest
Magnified sand
NIUNIU HX-40 in classic beige
"Nothing" is the secret to structuring your work
What do cows do after they get married?
They go on a honey-moo!
That's all for now, folks! Have a great week. Be safe, make good choices, and uninstall something!
Special thanks to Ben, Kinetic Labs, and Marta for supporting my Patreon and this newsletter!
cassidoo
website | blog | github | bluesky | youtube | twitch | twitter | patreon | codepen | mastodon
2026-04-27 10:04:57
Hey friends!
We made it to the end of April! This month was definitely my busiest in a long time, but I'm on vacation now for a very welcome break. Let's surf the web.
Was this forwarded to you? You can subscribe here!
An Interactive Cover Component
3 ways to store variables in React, and why you shouldn't sleep on useRef
I Made a Funny Game About Software Teams. It Turned Out to Be a Mirror
Godot Showcase – Xogot: Godot for iPad & iPhone
I spoke at Codemotion Madrid this past week! It was a really great time, the conference was cool and I got to meet some lovely people. My talk was a keynote called, "Our Brains in the AI Era" and I'll be sure to share the recording as soon as it's up!
And now that that's done... I'm on vacation in Barcelona with my family! We've been eating delicious food and walking it off constantly, and it's been great to be mostly offline and just enjoying some brain space.
...I do get the "side project itch" though when I have time off, and have been tempted to start a new one. I shouldn't!! But it would be fun!!
No sponsor! Be free from capitalism!
...But also it'd be cool if your company would be down to sponsor, because though this newsletter is free to read, it's not free to make!
There's some info here if you wanna pass it along to decision-makers in your org.
Or, if you'd like to help support my work individually, you can use Patreon or GitHub Sponsors (both of which get you access to a very fun Discord group)!
Last week, I had you match characters to a pattern, and it was a sneakily tricky one! Nice work Christian, Shreya, Amine, George, Micah, Willy, Ten, Ridhwaan, Toni, Paul, Donato, and the console cowboys in the Ruby Users Forum!
This week's question:
You are given a 2D grid where 1 represents an intact tile and 0 represents a broken tile. A "broken region" is a group of connected 0s (connected horizontally or vertically). Find the minimum number of tiles you need to repair to ensure no broken region has an area larger than k.
Examples:
const grid = [
[1, 0, 0, 1],
[1, 0, 0, 1],
[1, 1, 0, 1],
[0, 1, 1, 1],
];
const k = 2;
let newGrid = [
[1, 0, 0, 1],
[1, 0, 0, 1],
[1, 1, 0, 1],
[0, 0, 1, 1],
];
let newK = 1;
minRepairs(grid, k)
> 2
minRepairs(newGrid, newK)
> 3
(you can submit your answers by replying to this email with a link to your solution, or share on Bluesky, Twitter, LinkedIn, or Mastodon)
Everyone should make music in some shape or form
Whose Story is it Okay To Tell?
Plants can sense the sound of rain, a new study finds
Custom keyboard with GMK WoB Katakana and DCS WoB
What's faster than an escalator?
An escasoonor!
That's all for now, folks! Have a great week. Be safe, make good choices, and stay hydrated!
Special thanks to Ben, Kinetic Labs, and Marta for supporting my Patreon and this newsletter!
cassidoo
website | blog | github | bluesky | youtube | twitch | twitter | patreon | codepen | mastodon
2026-04-20 11:56:18
Hola friends!
I hope you had a great week! Mine was a whirlwind getting things in order before heading off to Spain, and now I'm here and very jet lagged. Anyway, let's boogie!
Was this forwarded to you? You can subscribe here!
How to Recreate the Omnichord for the iPad with React Native
Under the hood of MDN's new frontend
Phaser v4.0.0
Software engineer interviews for the age of AI
I'm in Madrid! I'm speaking at Codemotion Madrid this week and then vacationing with my family after for a much-needed break. I'm writing this next to my very jet lagged kiddos who will not sleep, because I am the unreasonable one asking them to sleep at 2am. Of course.
Anyway, I worked on some projects this week, and blogged too! I wrote about updating some of my desk equipment on my blog, and on the GitHub blog about an emoji list generator I made on their livestream channels! I've been working on other projects under the hood, and will hopefully have something to write about soonish on those, too.
Also: If you filled out the newsletter anniversary's giveaway form a couple weeks ago, I will be contacting you soon if you're a winner! I got delayed with all the travels and about half of the winners have been contacted so far. Keep an eye out!
DatoCMS is the Headless CMS picked by devs, and weirdly enough, loved by editors
Know that feeling when something just works the way you expect it to? GraphQL and REST APIs out of the box, smooooth content modelling, CLI, layered MCP, cache tags, plugins, visual editing, and first-class framework integrations. And somehow, the editor experience is just as good. Clean, structured, and intuitive enough that non-technical folks can actually use it without a barrage of Slacks or tickets in your direction. No wonder Jeff Escalante called us "unbelievable." Bootstrapped, DX-first, refreshingly AI-light.
Last week, I had you layer pizza ingredients! Mamma mia good job Andrew, Varenya, Christian, Ridhwaan, David, Donato, George, Micah, Amine, Dhiraj, Paul, Toni, Thulasi, Ten, and the cool cats in the Ruby Users Forum!
This week's question:
Given a string s containing letters and ? wildcards (that can match any letter), and a target pattern string pattern, rearrange the entire string however you like. Return the maximum number of non-overlapping copies of pattern that can appear in the rearranged result.
Example:
maxPatternCopies("abcabc???", "ac") // 3
maxPatternCopies("aab??", "aab") // 1
maxPatternCopies("??????", "abc") // 2
(you can submit your answers by replying to this email with a link to your solution, or share on Bluesky, Twitter, LinkedIn, or Mastodon)
What has technology done to us?
Agar EC keyboard w/ GMK Villanelle
Personal Location Tracking FTW
Doing Things for You
Where do sheep go to get their hair cut?
The baa-baa shop!
That's all for now, folks! Have a great week. Be safe, make good choices, and take the leap you've been thinking about!
Special thanks to Ben, Kinetic Labs, and Marta for supporting my Patreon and this newsletter!
cassidoo
website | blog | github | bluesky | youtube | twitch | twitter | patreon | codepen | mastodon
2026-04-13 14:20:57
Hey friends!
I hope you've had a good week! Mine has been very jet lagged (I flew back from Korea this week), but also very full of wonderful people and work to keep me busy.
Was this forwarded to you? You can subscribe here!
How I remember link and image Markdown syntax
Wind Waker JS
Moving Railway's Frontend Off Next.js
The Git Commands I Run Before Reading Any Code
This is a talk-heavy month! Last weekend (I didn't talk about it as much in the last issue because it was this newsletter's anniversary), I gave a few talks in Seoul, South Korea, and this weekend I spoke at Deep Dish Swift here in Chicago! I have one more big conference to go next week (Codemotion Madrid), and then I have a lull until Microsoft Build out in June.
I also did an interview on the Write That Blog! newsletter all about technical blogging! You should blog more.
One Command, Zero Friction: Developer Environments That Just Work
Wasting hours on "README archaeology" and broken dev setups? Flox delivers portable, reproducible environments that span the entire SDLC—from local dev to CI/CD and production.
It's powered by Nix, and built for everyone. Flox lets you manage 190,000+ packages without polluting your global system. Run flox activate to instantly layer your project’s dependencies, environment variables, and services.
Whether you’re onboarding teammates or switching between complex microservices, Flox works on every machine, every time.
Last week, I had you return combinations of Perrin numbers! Good work Thulasi, Donato, Amine, Toni, Paul, Ten, Nico, Christian, Alberto, Philip John, Ender, and the fine folks in the Ruby Users Forum!
This week's question:
You're building a pizza ordering system that enforces strict ingredient layering rules. Given an array of pizza layers (bottom to top) and a set of rules where each rule states that ingredient A must appear somewhere below ingredient B, write a function that determines whether the pizza is valid. If any rule is violated, return the pair [A, B] that was violated first (in the order the rules are given). If the pizza is valid, return true.
Examples:
const layers = ["dough", "sauce", "cheese", "pepperoni", "basil"];
const rules = [
["sauce", "cheese"],
["cheese", "pepperoni"],
["dough", "basil"],
];
const rules2 = [
["cheese", "pepperoni"],
["cheese", "sauce"], // "it's under the sauce"
];
validatePizza(layers, rules);
> true
validatePizza(layers, rules2);
> ['cheese', 'sauce']
(you can submit your answers by replying to this email with a link to your solution, or share on Bluesky, Twitter, LinkedIn, or Mastodon)
Artemis II - Mission Communications Archive
Most people can't juggle one ball
Early Efforts in Sticker Making
Typing test: CSTM80 keyboard with DSA Royal Navy and Gateron Yellow switches (video)
My friend Sid was a sudden ID theft victim.
Now they're just S!
That's all for now, folks! Have a great week. Be safe, make good choices, and dream bigger!
Special thanks to Ben, Kinetic Labs, and Marta for supporting my Patreon and this newsletter!
cassidoo
website | blog | github | bluesky | youtube | twitch | twitter | patreon | codepen | mastodon
2026-04-06 09:06:29
Hey friends!
I'm so excited to be in your inbox today! Happy April, happy Easter, or happy Passover, whatever your persuasion is! But also: it is this newsletter's 9th year anniversary!! I'm so grateful for all of you here. Let's keep it going (also there are free things and coupons below, keep scrolling)!
Onwards!
Was this forwarded to you? You can subscribe here!
The Drill-Down Menu with Details and @scope
Your options for preloading images with JavaScript
There’s no need to include ‘navigation’ in your navigation labels
CSS is DOOMed
I can't believe it's been a whole 9 years since starting this newsletter. Thank you so much for being here and reading along with me each week!! I'm so grateful for all of you!
For those who've been here before, you may know that I love doing raffle giveaways and coupons every year. We have some delightful folks offering free things for ya!
Freestyle.sh is offering $250 in credits for all readers with code CASSIDOO in the dashboard, and 25 lucky winners will get a Keychron V10 Ultra!
Matthew Brandt is offering a fully covered seat to any upcoming live cohort of the Decision Science for Analysts course on Maven!
Zo Computer is offering $100 in AI credits to get started with your personal cloud computer. Sign up with this link!
Night Owl Studio is offering a free year of a premium subscription to Kebab, the donation tracking app!
Cynthia Dunlop is offering 9 free copies of Writing for Developers!
ZurichJS Conference 2026 is Switzerland's premier JavaScript event, taking place September 11, 2026 at Technopark Zurich. They are offering 2 vouchers towards conference tickets and/or workshops!
Gitea Cloud, by CommitGo, is offering a lifetime 50% discount on all plans with 20 or fewer users.
Get (my favorite) coding font MonoLisa for 15% off with code freakingnerds!
PixieBrix lets you vibe code AI-powered workflows directly inside your browser - turn any app into your own custom tool. They’re giving away a 6-month extended trial ($1,400 value- use this link) so you can build extensions, automate workflows, and connect your stack without leaving your tabs.
Obvious.ai, the most capable, collaborative AI agent, is giving away 25 credits when you sign up with this link!
Alexander Obenauer is offering 5 free copies of his book, Bootstrapping Computing!
FusionAuth is offering 3 copies of the ebook "The Modern Guide to OAuth", and a starter license for FusionAuth for a year ($1500 value)! Learn more about FusionAuth.
GitHub is offering 3 one-year licenses for GitHub Copilot Pro+!
FSH Tech is giving away 5 swag packs!
And... I personally am giving away some special swag packs! In the form below, if you put in your mailing address, I'll send as many packs as I can. I am mysterious.
If you'd like to enter in the raffle for all the great prizes here (huge thanks to all the folks who are offering them!), please fill out this form by Thursday at noon, Central U.S. Time to get an entry!
And just once again: Thank you so much for reading this. It makes my day to see replies and messages and tweets and toots and carrier pigeons from people that enjoy reading this, and seeing you share it with others! And as a friendly reminder, I'm newly doing video versions of every issue on YouTube, too! See you next week.
See it. Click it. Change it. Headless CMS and Visual Editing have had a looooong love-hate relationship. DatoCMS's new Visual Editing release takes a dual-approach that lets your editors click directly on any element in a live preview and jump straight to the right record and field in the CMS. OR. Get a native side-by-side editor to make changes in real time in the CMS with a slick full-screen editing mode.
As a dev, all you need to do is add 2 headers to your GraphQL requests and a lil <ContentLink /> component, and you're done 💁♀️ And just like that, you'll never hear "Where do I change this?!?!" ever again.
Check it out (even on the free tier!) →
Last week, I had you do some symlink path resolution! Y'all did great Yassir, Andrew, Christian, Amine, Rob, Shreya, Jeremias, Trey, Donato, Thulasi, Toni, Lucy, Ten, Ross, Miguel, and David!
This week's question:
Given an integer n, return all unique combinations of Perrin numbers (up to and including the nth Perrin number) that sum to a target value k, where each Perrin number can be used at most once. Return the combinations sorted in ascending order.
Example:
> perrinCombinations(7, 12)
[[0,2,3,7],[0,5,7],[2,3,7],[5,7]]
> perrinCombinations(6, 5)
[[0,2,3],[0,5],[2,3],[5]]
(you can submit your answers by replying to this email with a link to your solution, or share on Bluesky, Twitter, LinkedIn, or Mastodon)
Artemis II Flight Day 3: Crew Prepares for First Correction Burn, Readies to Receive Lunar Observation Assignment
Architypes: Memories of a (not so) distant past
In Defense of My Impressively Questionable Career Goals
Agar60 EC with GMK MTNU Graphite
What do ducks watch on TV?
Duckumentaries!
That's all for now, folks! Have a great week. Be safe, make good choices, and thank you so much for being here!
Special thanks to Ben, Kinetic Labs, and Marta for supporting my Patreon and this newsletter!
cassidoo
website | blog | github | bluesky | youtube | twitch | twitter | patreon | codepen | mastodon