2026-05-18 15:27:10
Hellloooo my friends!
I hope you had a good week! Mine was my first week back from vacation, and my brain is still catching up. Let's get into the goodies.
Was this forwarded to you? You can subscribe here!
Moving away from Tailwind, and learning to structure my CSS
On Rendering the Sky, Sunsets, and Planets
Preserving DOM Changes Across Live Reloads
33 JavaScript Concepts
I mentioned that I got back to work this week after vacation, and I kid you not, exactly an hour into being at my desk, I got a stye in my eye and a canker sore. I think I'm allergic to Slack.
Anyway, I rapidly pumped out some videos before my eye blew up, including this recap of the trip, talking about how we traveled with toddlers, this newsletter recap (in case you didn't know, I've been recapping this newsletter every week in video form, if you wanna consume it that way or hear my thoughts on the links I share here), this episode of The Download, and this livestream about vibe coding, from the perspective of Millennials and Gen Xers! I also had my episode of Adventures in DevOps come out, which was a fun one. Phew.
I ended up not streaming on my various channels (Twitch and YouTube, if you aren't subscribed yet) because by the time I hit my usual Thursday streaming day... my eye was a monster. But it's nearly healed now, thank goodness. Remove your makeup and wash your pillowcases, people! And be wary of toddlers.
No sponsor this week!
...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 bounce an object around an array! Great job Amine, Toni, Ten, David, and the devs over in the Ruby Users Forum!
This week's question:
Given a string s consisting of letters, convert each character to its opposite case that is, change every lowercase letter to uppercase, and every uppercase letter to lowercase. Bonus: add an "alternate" parameter that converts the whole string to AlTeRnAtE cAsE!
Examples:
let alternating = true
toggleChar("Hello, world!")
> "hELLO, WORLD!"
toggleChar("HeheHeheHEheheHeH")
> "hEHEhEHEheHEHEhEh"
toggleChar("This will be alternated", alternating)
> "ThIs WiLl Be AlTeRnAtEd"
(you can submit your answers by replying to this email with a link to your solution, or share on Bluesky, Twitter, LinkedIn, or Mastodon)
How diamonds are made?
A big thank you to cassidoo
Wallace & Gromit 24/7 LIVE Stream (video)
We've made the world too complicated
Why did the knife dress up in a suit?
Because it wanted to look sharp!
That's all for now, folks! Have a great week. Be safe, make good choices, and clear off your desk!
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-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