2026-08-10 12:44:07
Hey friends!
I hope you had a good week! We have some BIG rainstorms in Chicago as I type this and it's very cozy hearing the thunder outside. I love it! Anyway, let's get to the goodies.
Was this forwarded to you? You can subscribe here!
How we built a software factory to drive Astro’s GitHub issue count to zero
The secret third option for JavaScript comments (video)
Open Source Must Be Fun (Or It Will Die)
SolidStart v2 is now Stable
The valley of webhooks
This week was a whole lot of prep in anticipation for RenderATL this next week (see the sponsor link below!), team vacations, and really just a lot of admin work. I really hoped I could blog some or make some videos, but eh, wasn't my week.
That being said, I have been keeping up with the video recaps of this newsletter, in case you ever want additional commentary/behind-the-scenes of how the sausage gets made! Check it out and... smash that subscribe button? Ha.
Waffles and wings. Collards and code. RenderATL is a two-day software engineering conference this week August 12-13 in Atlanta featuring good vibes, great music, and expert speakers on tech, leadership, inclusion, and accessibility!
Come learn, celebrate, and get hyped with the most diverse lineup of expert speakers across the engineering world. I'm personally thrilled to be emceeing at the event, and you can snag a last-minute ticket with code CASSIDY for 15% off!
Can't make it to Atlanta? Keep an eye out on their website for some surprises so that you, too, can experience RenderATL!
Last week, I had you re-order strings! Amazing work Wesley, Paul, Greer, Nico, Ross, Brooks, David, Debopam, Ten, Kriszti, Vasanth, Stephen, Brad, Darryl, Alex, Christian, and Amine!
This week's question:
Write a function trim(type, s) that trims a string based on a trim type. The type parameter is one of four modes: "leading" (remove leading spaces), "trailing" (remove trailing spaces), "both" (remove leading and trailing spaces), or "compress" (collapse any sequence of multiple consecutive spaces into a single space, but leave single spaces intact). Return the trimmed string.
Example:
trim("leading", " hello world ")
> "hello world "
trim("trailing", " hello world ")
> " hello world"
trim("both", " hello world ")
> "hello world"
trim("compress", "hello world !")
> "hello world !"
trim("compress", " hi there ")
> " hi there "
(you can submit your answers by replying to this email with a link to your solution, or share on Bluesky, Twitter, LinkedIn, or Mastodon)
Carrot
The Abstract Protagonist - HHKB Edition
Take Better Notes with Obsidian (video)
50 Vintage Color Slides Capturing People at Homes in the 1960s
I've always wanted to look into why I procrastinate... but I keep putting it off!
That's all for now, folks! Have a great week. Be safe, make good choices, and call someone on the phone this week!
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-08-03 15:50:13
Helllllooooo!
Happy August! I hope you had a great week. Mine was WILDLY busy at work, and this weekend was a welcome brain break. But now, break's over, let's learn!
Was this forwarded to you? You can subscribe here!
CodePen 2.0
React Debugging with Performance Tracks (video)
Storybook tutorial: build and test UI components in isolation
Use-Webmcp-Tool
This week was very packed at work, prepping for the launch of stacked PRs on GitHub! For those who don't know what that is, at a high level, it's a chain of PRs. This was a highly requested feature and my team was very heavily involved in testing it out, making content (like this blog post I wrote!), running livestreams, speaking to analysts, helping with product messaging, and mooore. It was really fun to work together in this way on a feature that developers are excited about.
Some of my fave pieces of content I made were... memes, really. I was particularly proud of this Inception one (Twitter, Bluesky, LinkedIn), and this "brainrot" one (Twitter, Bluesky), heh. Check out the GitHub feeds on your favorite network of choice for my team's weird posts!
When you spend most of your day online, sometimes it's good to use something physical.
Renacer is a Chicago-based Italian leather goods studio, creating small-batch bags and notebooks for people who want to own quality gear that will last.
Each piece is handmade in Chicago with the most sustainable leather sources from Tuscany. Our leather journals are designed to accompany you through the ideation process, from scattered thoughts to ideas worth building!
Some of the best ideas begin away from the screen. Write them down in something made to last.
Explore the collection or follow us on Instagram.
Last week, I had you fulfill ice cream orders! Ice cream you scream we all scream for ice cream Ten, Paul, David, Willy, Alex, Tatiana, Thulasi, Andrew, Amine, Greg, Akhil, Christian, Nico, and the fine developers in the Ruby Users Forum!
This week's question:
Given an array of strings A, and an array of indexes B, reorder the strings in array A with the given indices in array B. You can choose to do this in-place, or return a new array. As you decide which route to take, think... which is more efficient?
Example:
let a = ['C', 'D', 'E', 'F', 'G', 'H'];
let b = [3, 0, 4, 1, 2, 5];
> reorder(a, b) // a is now ['D', 'F', 'G', 'C', 'E', 'H']
(you can submit your answers by replying to this email with a link to your solution, or share on Bluesky, Twitter, LinkedIn, or Mastodon)
Silver Alice Duo with GMK Camping
VibeSail: a 3D sailing game in your browser
Craft
Making Strawberry Gazpacho
Two satellites decided to get married.
The wedding wasn't much, but the reception was incredible!
That's all for now, folks! Have a great week. Be safe, make good choices, and get yourself a sweet treat!
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-07-27 14:10:00
Hey friends!
We made it to the end of July! It's been a fun summer and though we still have August to work through... I am so excited to be closer to fall time. Ha! Anyway, let's learn!
Was this forwarded to you? You can subscribe here!
Astro vs Next.js 2026
Build a HTML5 game like Geometry Dash using Phaser 4 and TypeScript, with a simple custom physics engine
RSS in 2026 — the best distribution channel nobody uses
A system prompt to get AI to stop pretending to be human
I had a very action-packed "offline" week, with a wedding of a good friend (where my daughter was a flower girl and my husband played piano!) and a gathering at a lake house and a birthday party and visits with family and friends. Phew!
Whenever I have these offline times, I admit part of me feels like I should be more productive in some way. It's hard to shake it in like... how we're trained to think in this society. But, that's why I chose the quote in the newsletter subject this week! Having a mental break and an enjoyable time matters.
...all that being said, I did enter a hackathon this week. Check out my fun lil entry and the repo!
If you’re evaluating voice APIs, SpeechifyAI is worth your eyes (and ears)!
Their Simba 3.2 TTS API is at the top of voice-quality blind-testing leaderboards, is the cheapest option in the top 10 (by far), and is fast enough for real-time voice agent use cases.
They also offer Simba Voice Agents for low-latency conversational AI, plus a free tier so you can test quickly.
Try it today at speechify.ai.
Last week, I had you return the gap between blinks! Batting my eyes at Ten, Micah, Willy, Ross, Austin, Brooks, David, Christian, Iain, Thulasi, Alex, Andrew, Trey, Amine, and the smarties in the Ruby Users Forum!
This week's question:
Given an array of ice cream orders and a freezer stock map, return how many orders can be fulfilled before the first unavailable flavor.
Example:
> fulfilledOrdersBeforeFailure(
[["chocolate"],["chocolate"],["chocolate"]],
{ chocolate: 2 })
> 2
> fulfilledOrdersBeforeFailure(
[["vanilla","vanilla"],["chocolate","mint"],["strawberry"],["strawberry","mint"]],
{ vanilla: 2, chocolate: 1, mint: 1, strawberry: 5 })
> 3
> fulfilledOrdersBeforeFailure(
[["rocky road"],["vanilla"]],
{ vanilla: 3 })
> 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)
How the Words We Teach English Language Learners Changed, and What That Says About Us
The gap is not glorious
I Guess I'm Playing The Long Game Now
Dimple r3 40% Cozy Keyboard Build (video)
Did you hear about the 1790s French music?
It's royalty free!
That's all for now, folks! Have a great week. Be safe, make good choices, and have a sleepover with your friends!
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-07-20 15:53:50
Hola hola amigos!
I hope you had a fun week! I enjoyed hanging out with friends and family and watching Spain win the World Cup! Let's boogie.
Was this forwarded to you? You can subscribe here!
In defense of polyfills
How to build a design system strategy you'll actually deliver
Equinox: Test light and dark mode at the same time
Microsoft Comic Chat is now open source
It was a good week! I feel like I both was wildly busy the entire time, and also like I got nothing done. We had multiple engagement celebrations, family time, friends time, work time, and some time in between to watch the show Better Late Than Single on Netflix (which is a Korean dating show that is both entertaining and infuriating). I'm also reading the book Welcome to the Hyunam-dong Bookshop now (a recommendation from a reader here!) and it's really nice so far!
Also, I noticed that the Twitter algorithm changed this week. I made a video about it, mostly in a conflicted state, because... eh, it's fun, but I'm not sure how I feel about social media platforms these days? But it also is really nice to see some online friends there again!
No sponsor this week!
SHILL TIME: Would you mind subscribing to my YouTube channel (where I do newsletter recaps every week in addition to technical videos and commentary) and letting me know the kinds of videos you'd like to see there?
Whether you respond to this issue here or in the YouTube comments, I'd really appreciate it. It's been a fun experiment getting into making longer-form videos, and I want to make sure they're valuable!
Last week, I had you spiral! With numbers! Wee Amine, Brad, Micah, Ross, David, Ten, Thulasi, Alex, Ege, Tatiana, and the devs in the Ruby Users Forum!
This week's question:
Given a string of . and _ where _ represents a blink, return the longest gap between blinks.
Examples:
countBlinks("_..__...._.")
> 4
countBlinks("...._")
> 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)
Spyder TKL with KAP Santa Llum
Backtrack-free cursive
Urban congestion relief experiments through routing-app interventions
The Lost Joy of Music Piracy
I startled my neighbor the other day with my new power tool.
I told them, "Don't worry, this is just a drill!"
That's all for now, folks! Have a great week. Be safe, make good choices, and decorate something to brighten your day!
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-07-13 12:17:13
Hey friends!
I hope you had a good week! Mine was a satisfying one, we spent a lot of time at home just taking care of chores and being with each other, which was really nice. Let's learn!
Was this forwarded to you? You can subscribe here!
TypeScript 7.0
Fixing full-bleed CSS
Obfuscated, self-evaluating bash script by CDN Akamai being supplied to consumers via retail stores
Write code like a human will maintain it
Getting Started with Anchor Positioning
I got a fun little e-reader called the Xteink and played with it this week! It's been really cool to mess around with.
In general, I'm trying to read more and scroll less (aren't we all), and having a very easily accessible device like this is nice for that. Plus, the hardware is really quite good for something I got for 50 bucks. It's got WiFi, there's open source firmware that you can flash to it via the browser, it takes an SD card to hold custom splash screens and books, it's got a magnet on the back, and you can fully program it to do other things, too!
Rafal sent me this article too about other use cases (I saw someone using it as a writer deck too, so cool), and Remy sent this giant hub of even more resources!
This is very much not an ad, rather I'm just happy to find more open hardware in the world for people to make their own. We need more of that!
No sponsor this week!
SHILL TIME: Would you mind subscribing to my YouTube channel (where I do newsletter recaps every week in addition to technical videos and commentary) and letting me know the kinds of videos you'd like to see there?
Whether you respond to this issue here or in the YouTube comments, I'd really appreciate it. It's been a fun experiment getting into making longer-form videos, and I want to make sure they're valuable!
Last week, I had you get the impacted coordinates of a fireworks display! Boom boom Brad, Alex, Greg, Amine, Ege, Tatiana, Paul, Sergio, Ten, and the smarties in the Ruby Users Forum!
This week's question:
Write a function that takes a non-negative integer n and prints the numbers 0 through n in a clockwise spiral, starting at the top-left of a square grid. Hint: The grid size should be ceil(sqrt(n + 1)), and any unused cells should be blank.
Example:
> spiralGrid(99)
0 1 2 3 4 5 6 7 8 9
35 36 37 38 39 40 41 42 43 10
34 63 64 65 66 67 68 69 44 11
33 62 83 84 85 86 87 70 45 12
32 61 82 95 96 97 88 71 46 13
31 60 81 94 99 98 89 72 47 14
30 59 80 93 92 91 90 73 48 15
29 58 79 78 77 76 75 74 49 16
28 57 56 55 54 53 52 51 50 17
27 26 25 24 23 22 21 20 19 18
> spiralGrid(30)
0 1 2 3 4 5
19 20 21 22 23 6
18 24 7
17 30 25 8
16 29 28 27 26 9
15 14 13 12 11 10
(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 The World’s Longest-Running Sardine Cannery Packs 60 Million Cans A Year (video)
ScottoBigum Handwired Macropad
NOMOS Glashütte: In House Or Nothing
Teaching Pop Music Analysis for Non-Majors
Leather is great for sneaking around... because it's made of hide!
That's all for now, folks! Have a great week. Be safe, make good choices, and learn someone else's perspective on 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-07-06 15:10:34
Happy July!
I hope you had a good week! I had a busy one and the long weekend here in the States was a VERY welcome step away. Let's kick off the week!
Was this forwarded to you? You can subscribe here!
Your documentation is still in your Mum’s filing cabinet
You Can Detect if Code Is Being Run Inside a Terminal
The Goldilocks customizable select height
New in Chrome 150
I updated my blog template this week to Astro 7! It was really fun and I blogged about the main thing I had to update to make everything work smoothly.
I've been noodling on the tech stack for my blog lately. I really like the setup, but I have noticed that my node_modules folder gets heavy because I'm using TinaCMS. I even made a video about a tool I found to clean up that folder because it was so beefy. I like that Tina is Git and markdown-based, but I might experiment with options to see if I can trim the built repo size down. We'll see!
Ever notice your agents just...forget everything the second a session ends?
Redis Agent Memory fixes that.
It gives your agents short-term memory plus context that actually sticks around across conversations, managed for you.
Last week, I had you get the mean number of bits to represent numbers! You did a bit too well Kriszti, Andrew, Alex, Amine, Ten, Paul, Ross, David, Brad, Thulasi, Nico, Shreya, and the fine folks in the Ruby Users Forum!
This week's question:
Given an n x m grid, an odd integer size, and a coordinate (row, col) representing where a firework explodes, return all grid coordinates impacted by the blast. A firework affects every cell within Math.floor(size / 2) rows and columns of the center, clipped to the grid boundaries.
Example:
> getImpactedCoordinates(5, 5, 3, 1, 1)
> [[0,0],[0,1],[0,2],[1,0],[1,1],[1,2],[2,0],[2,1],[2,2]]
> getImpactedCoordinates(3, 3, 1, 2, 1)
> [[2,1]]
> getImpactedCoordinates(5, 5, 3, 4, 4)
> [[3,3],[3,4],[4,3],[4,4]]
(you can submit your answers by replying to this email with a link to your solution, or share on Bluesky, Twitter, LinkedIn, or Mastodon)
Bring Back Crappy Forums
If you’re a button, you have one job
The Tech Tree of Milk Is Insane (video)
I built a Game Boy Themed Keyboard (video)
What do you call corn that joins the army?
Kernel!
(...this joke also works for operating systems)
That's all for now, folks! Have a great week. Be safe, make good choices, and go appreciate some plants!
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