2026-03-23 15:08:15
Howdy howdy howdy!
I hope you had a good week! I enjoyed time with friends and family, ate some good food, and built some fun things too. Let's get into it!
Was this forwarded to you? You can subscribe here!
contrast-color() beyond black & white
Stuff Everybody Knows: A guide to the rest of your web development career
Comprehension Debt - the hidden cost of AI generated code.
Two React Design Choices Developers Don’t Like—But Can’t Avoid
This week I replaced a bunch of parts in my PC as well as my camera, and it took some effort. Desk configuration is always more annoying than you expect. I ended up blogging about my camera setup after tweaking it a bunch, and these are my latest PC parts!
Video editing has gotten MUCH faster already, which saves me a lot of time at work especially. I recorded this one about using GitHub Copilot to help me update parts of my app todometer that I had put off for literally years (I was so excited)!
Last thing: newsletter anniversary is coming up. If you want to offer a giveaway, respond to this email to let me know!
Mux is video infrastructure for developers. When you upload a video to Mux, you don't just get playback. You get building blocks like transcripts, storyboards, thumbnails, and clips. The pieces are just there. Feed them into whatever you're building: search, summarization, content moderation, or anything else you can dream up.
Mux also stewards Video.js, the web's most popular open source video player. Video.js v10 is a full architectural rebuild with the beta now available at videojs.org. It's worth a look and trying out.
Trusted by Patreon, Substack, and Cursor. Get started free, no credit card required →
Last week, I had you get distances to fire stations! Great work Amine, Dan, Christian, Paul, Matt, Donato, Toni, Micah, David, and the delightful folks in the Ruby Users Forum!
This week's question:
Given a text string and a pattern, implement a fuzzy string search using the Bitap algorithm that finds all positions in the text where the pattern matches with at most k errors (insertions, deletions, or substitutions). Return an array of objects containing the position and the number of errors at that match.
Example:
> fuzzySearch("the cat sat on the mat", "cat", 0);
> [{ position: 4, errors: 0 }]
> fuzzySearch("cassidoo", "cool", 1);
> []
> fuzzySearch("cassidoo", "cool", 3);
> [{ "position": 3, "errors": 3 }, { "position": 4, "errors": 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)
The Day I Discovered Type Design
Old Pops Sheet Music Digital Collection
CannonKeys x Fnctl.co Wood Bakeneko65 with GMK Ursa
I'm OK being left behind, thanks!
What do you call a pig who does karate?
A pork chop!
(Thanks, Lynelle, for this one!)
That's all for now, folks! Have a great week. Be safe, make good choices, and do some jumping jacks!
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-03-16 13:25:34
Hey friends!
I hope you had a good Pi Day (3/14) yesterday! My week was a long one, but it was nice ending it with some tasty pie with friends and family. Let's learn!
Was this forwarded to you? You can subscribe here!
What do coders do after AI?
Too Much Color
The Odometer Effect (without JavaScript)
Trash Talk - Understanding Memory Management (video)
The most exciting thing of the week was my round in the MadCSS tournament! It was very fun. I screamed. You'll see.
I also did a video for work about the GitHub Copilot CLI, and then... I got a stye in my eye. It's relevant because I recorded this video about this newsletter's anniversary and had to wear sunglasses because it is not a cute look.
But anyway! Speaking of that! My newsletter's 9th anniversary is coming up in a couple weeks. Every year I offer giveaways from a variety of companies, from credits to swag to gadgets to tickets to coupons! If your org would like to donate a prize, hit reply here and I'll happily slot you in.
DatoCMS is the headless CMS that won't make you regret your stack choices at 2AM.
GraphQL and REST APIs out of the box, a smooooth content modelling system that actually makes sense, cache tags, great CLI, layered MCP, and an editor experience your non-technical folks will love (we know that's a low bar, but still). Speaking of the box, it comes with all the buzzwords your content team's going to ask for — SEO, i18n, Visual Editing, plugins, modular content, asset optimization, collaboration, versioning... you get the drill. It's bootstrapped, got a great free tier, fast, plays nicely with all your frameworks, is DX-first, and refreshingly AI-light.
Last week, I had you swap characters to get an alternating string. Yayayay David, Ten, Paul, Micah, Amine, Christian, AJ, Matt, Donato, Toni, and the cool kids in the Ruby Users Forum!
This week's question:
You're given a 2D grid representing a city where each cell is either empty (0), a fire station (1), or a building (2). Fire stations can serve buildings based on horizontal + vertical moves only. Return a 2D grid where each cell shows the minimum distance to the nearest fire station.
Examples:
> fireStationCoverage([
[2, 0, 1],
[0, 2, 0],
[1, 0, 2]
])
> [[2, 1, 0],
[1, 2, 1],
[0, 1, 2]]
> fireStationCoverage([
[1, 0, 0, 1],
[0, 0, 0, 0],
[0, 0, 0, 0],
[1, 0, 0, 1]
])
> [[0, 1, 1, 0],
[1, 2, 2, 1],
[1, 2, 2, 1],
[0, 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)
Keyboard with Black Big Legend Keycaps
Does culture make emotion?
On Neutrinos | Physics Girl | Physics (video)
David Altrath photography diary
Did you know vending machines kill more humans than sharks?
Maybe it's because sharks rarely use vending machines.
That's all for now, folks! Have a great week. Be safe, make good choices, and clean your face!
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-03-09 16:45:29
Hey friends!
Happy International Women's Day, and good new week! I hope you had a good one. This past week felt like a blur, so let's get into it.
Was this forwarded to you? You can subscribe here!
Finding an accessibility-first culture in npmx
What AI Exposed About Iterative Development
Image Asset Optimizations: Performance Optimizations in React (video)
How to make your first contribution to an open source project
I was on a video kick this week!
I also cut a new minor version of FancyGist. It feels weird to version a side project "properly" but it's a nice way to group new features together, so I'm rolling with it!
You know that split brain where your app code lives in Git, but your API specs and collections are just... floating somewhere else? The new Postman fixes that.
Your specs, collections, tests, and mocks now live directly in your Git repo. They go through branches. They go through PRs. They get versioned. API assets are finally treated like the code they've always been.
On top of that, Postman shipped Agent Mode. With Agent Mode, you can add your favorite AI tools and your model of choice directly within your workspace. Agent Mode has full workflow context across your specs, tests, and mocks. When your API changes, it coordinates the multi-step updates and keeps everything in sync. And the same tests you run locally? Those are the exact ones that run in CI. You can go and create whatever you need.
Last week, I had you implement the Boyer-Moore Voting algorithm! Good work Micah, Ten, Miguel, Pranshu, Noumisyifa, Paul, Donato, AJ, Matt, Christian, Varenya, Toni, and the lovely people in the Ruby Users Forum!
This week's question:
Given a string s consisting only of 'a' and 'b', you may swap adjacent characters any number of times. Return the minimum number of adjacent swaps needed to transform s into an alternating string, either "ababab..." or "bababa...", or return -1 if it's impossible.
Example:
minSwapsToAlternate('aabb')
1
minSwapsToAlternate('aaab')
-1
minSwapsToAlternate('aaaabbbb')
6
(you can submit your answers by replying to this email with a link to your solution, or share on Bluesky, Twitter, LinkedIn, or Mastodon)
Neologism: Nerd osmosis
Ground Control 40
Professional Trumpet player tries the 5 cheapest trumpets on Amazon (video)
The Veronicas "Untouched" (live) (video)
Why did the cow go to space?
To see the mooooon!
That's all for now, folks! Have a great week. Be safe, make good choices, and go for a walk!
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-03-02 16:46:58
Happy March!
I hope your February ended well. The world news is hard to read right now, but focusing on what we can control and having a little fun is good for our brains to push forward. Anyway, time to read!
Was this forwarded to you? You can subscribe here!
Standard HTML Video & Audio Lazy-loading is Coming!
Building Fluid Typographic Scales with clamp() and :heading()
Building a Toast component
Lessons Learned from Failed Demos: Pure CSS Nav Thumb Flip on Scroll
A couple weeks ago I mentioned that I've been working on a little side project called FancyGist, and I officially cut the v1 release! It's been really fun to work on. It's a simple project (really just the power of CodeMirror and React with a dash of serverless functions), but it's been nice to work on something that I'll use a lot personally.
Outside of that, I played with the new CodePen 2.0 editor this week, wrote about how passkeys work, and streamed. Whew!
Main Branch spotlights the GitHub features, language fundamentals, and workflows that have a real impact on your day-to-day development. Real releases, real lessons, delivered right when you need them.
It's a no-fluff, 3-minute read every week in your inbox, in English and Spanish. Check it out and subscribe here!
Last week, I had you implement Kadane's Algorithm! Awesome work Varenya, Amine, Paul, Ten, Elke, Miguel, David, AJ, Donato, Noumisyifa, Ender, Toni, Baricus, and the fine folks in the Ruby Users Forum!
This week's question:
Find the majority element in an array (one that appears more than n/2 times) in O(n) time and O(1) space without hashmaps. Hint: the Boyer-Moore Voting algorithm might help if you can't figure this one out!
Example:
> majorityElement([2, 2, 1, 1, 2, 2, 1, 2, 2])
2
> majorityElement([3, 3, 4, 2, 3, 3, 1])
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)
Pokémon 30th Anniversary
Cosmic Sans keyboard with PBTfans Loki
Oldest cave painting of red claw hand could rewrite human creativity timeline
Say Goodbye to the Undersea Cable That Made the Global Internet Possible
What's leather and sounds like a sneeze?
A shoe!
That's all for now, folks! Have a great week. Be safe, make good choices, and stretch your neck!
Special thanks to Ben, Kinetic Labs, and Marta for supporting my Patreon and this newsletter!
cassidoo
website | blog | github | bluesky | twitter | patreon | twitch | codepen | mastodon
2026-02-23 15:16:25
Hey friends!
I'm sleepily writing to you from my couch in Chicago, after a weird week of very warm weather (also known as Fool's Spring), and I'm now watching snow fall. What a weird time. Anyway, time to learn!
Was this forwarded to you? You can subscribe here!
Picket fence animation using scroll animations
Reactive Depth: Building a Scroll-Driven 3D Image Tube with React Three Fiber
How I built Timeframe, our family e-paper dashboard
Welcome to the Eternal September of open source.
I have a whole pile of videos for ya, on and off my own channels!
If you're building AI agents, you've probably already hit the auth wall. Hardcoded API keys work fine in dev, but they're not something you want anywhere near production.
Auth0 for AI Agents is now GA. It gives you Token Vault, User Authentication, Asynchronous Authorization, FGA for RAG... everything you need to ship agents that are actually secure.
Start building with Auth0 for AI Agents →
Last week, I had you "zoom in" on an array! Awesome work Christian, Micah, Leyan, Baricus, Nico, Ben, David, Marco, Donato, Matt, Ender, Ruby Users Forum users, Ten, AJ, Ridhwaan, Noumisyifa, Amine, Varenya, Elke, Iskren, and Toni!
This week's question:
Given an array of integers, find the contiguous subarray that has the largest sum and return that sum. A subarray must contain at least one element. If all elements are negative, return the largest (least negative) value. If you need a hint, look up Kadane's Algorithm!
Examples:
> maxSubarraySum([-2, 1, -3, 4, -1, 2, 1, -5, 4])
6
> maxSubarraySum([5])
5
> maxSubarraySum([-1, -2, -3, -4])
-1
> maxSubarraySum([5, 4, -1, 7, 8])
23
(you can submit your answers by replying to this email with a link to your solution, or share on Bluesky, Twitter, LinkedIn, or Mastodon)
SEVEN Keyboard by DN (video)
Mere-exposure effect
Women's Sizing Chaos
A Pokémon of a Different Color
How much soda can a tropical bird drink?
Toucans!
That's all for now, folks! Have a great week. Be safe, make good choices, and clean your phone!
Special thanks to Ben, Kinetic Labs, and Marta for supporting my Patreon and this newsletter!
cassidoo
website | blog | github | bluesky | twitter | patreon | twitch | codepen | mastodon
2026-02-16 15:54:43
Howdy y'all!
I hope your week was a good one. Mine felt productive, which is always a nice feeling! Let's leeearn.
Was this forwarded to you? You can subscribe here!
Building a View Counter for Static Sites with Supabase and Astro
Interop 2025: A year of convergence
Shades of Halftone
React Logo Soup
I mentioned last week that I (re?)started my YouTube channel after not really using it beyond a video/livestream dumping ground, and it's been fun getting back into making videos a bit more regularly! I made this one about parenthood in tech, and this one about how I've been passively learning morse code for over a decade now. I have a few videos coming this week that I've partially made, and I'm enjoying it so far!
I also built and open sourced a new project this week, FancyGist! It's a UI on top of GitHub Gists. I have some ideas in the repository if you want to take a peek (or drop a star, perhaps)!
Get your year started with personalized career coaching from Keenesse
Keenesse offers coaching to help you gain crystal-clear career goals, pinpoint exciting advancement opportunities, and master crucial skills like resume optimization, interview mastery, and confident negotiation – all to land your dream role in a competitive market.
Our expert team of seasoned tech industry coaches provides tailored support at every career stage, from ambitious students to accomplished executives.
Ready? Schedule your free, no-obligation consultation today at keenesse.com.
Last week, I had you move numbers to the end of an array! To the left to the left Jacob, Jeremias, Miguel, David, Amine, Leyan, Micah, Iskren, Ridhwaan, AJ, Matt, Michael, Ten, Paul (who solved it with LEDs??), Mikaël, Toni, Phillip, Noumisyifa, Varenya, Simeon, and Roberto!
This week's question:
You have a 2D grid of numbers. Write a function that zooms in by an integer factor k >= 2 by turning each cell into a k x k block with the same value, returning the bigger grid.
Examples:
zoom([[1,2],[3,4]], 2)
[
[1,1,2,2],
[1,1,2,2],
[3,3,4,4],
[3,3,4,4]
]
zoom([[7,8,9]], 3)
[
[7,7,7,8,8,8,9,9,9],
[7,7,7,8,8,8,9,9,9],
[7,7,7,8,8,8,9,9,9]
]
zoom([[1],[2]], 3)
[
[1,1,1],
[1,1,1],
[1,1,1],
[2,2,2],
[2,2,2],
[2,2,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)
The seismometers at the end of the earth have names
R3 V4n4g0n with c0v3r
How long do job postings stay open?
Searching for Birds
Why was the programmer upset with the tester?
The tester was mocking their code.
That's all for now, folks! Have a great week. Be safe, make good choices, and water your plants!
Special thanks to Ben, Kinetic Labs, and Marta for supporting my Patreon and this newsletter!
cassidoo
website | blog | github | bluesky | twitter | patreon | twitch | codepen | mastodon | youtube