2025-05-05 13:29:00
Hey friends!
I hope you had a good week! Mine was very tiring with a brand new baby at home, but good. Let's gooo!
Was this forwarded to you? You can subscribe here!
IKEA's web fonts
All 420 entries from Gamedev.js Jam 2025
GSAP 3.13: now free!
Giving V8 a Heads-Up: Faster JavaScript Startup with Explicit Compile Hints
Welp, I've finished week 1 of being a parent of TWO babies. Whew. It's been exhausting, but also somewhat easier than I expected? I think experience really does help. We're not as stressed about funky noises or anything, and we know how to burp a baby and change a baby and... generally how to keep one alive.
...But also we have a toddler at the same time.
Anyway. I'm in the trenches over here, but hanging in there. My newborn is chilling watching me write this, and I can say with certainty that all of the pains of pregnancy, the c-section, and the hormonal swings are worth it.
The State of Devs survey is now open to participation, and unlike previous "State of" surveys it covers everything except code: career, workplace, but also health, hobbies, and more. Come take our most important (and most fun!) survey yet!
It takes a few minutes. Make your voice count!
Last week, I had you compress an array of characters! Good work Kracekumar, Kyle, Neha, Miguel, Ross, Austin, Andrew, Ashuzon, Roodz, David, Muhammad, Ten, Jeremias, and Danny!
This week's question:
Write a function that takes a list of strings and returns the longest string that is a prefix of at least two strings in the list.
Examples:
longestCommonPrefix(["flower","flow","flight"])
"flow"
longestCommonPrefix(["dog","racecar","car"])
""
longestCommonPrefix(["interstellar","internet","interval"])
"inter"
(you can submit your answers by replying to this email with a link to your solution, or share on Bluesky, Twitter, LinkedIn, or Mastodon)
"Final Usonian home" by Frank Lloyd Wright completed in Ohio
Qazikat wireless keyboard with Hydrangea keycaps
Using Pigeons & Poop Jokes to Teach Kids About Digital Minimalism
Chongqing, the world’s largest city - in pictures
Rest in peace, boiled water.
You will be mist!
That's all for now, folks! Have a great week. Be safe, make good choices, and treasure your sleep!
Special thanks to IceSloth, Ezell, Sebastián, Ben, Kinetic Labs, and Marta for supporting my Patreon and this newsletter!
cassidoo
website | blog | github | bluesky | twitter | patreon | twitch | codepen | mastodon
2025-04-28 13:13:17
Hey friends!
Assuming all has gone well since I hit the "schedule" button on this issue... I just gave birth! Ahh! Baby! But there's still stuff to leeeearn!
Was this forwarded to you? You can subscribe here!
Creating CSS Theme Variables from a JS file
What Does It Really Mean For A Site To Be Keyboard Navigable
CSS color-mix() Demo
Hiding elements that require JavaScript without JavaScript
I... just had a baby!! So this is gonna be short because I've now got a brand-spankin'-new kid to keep alive. As I write this, before actually giving birth, I'm nervous and excited. A friend of mine asked the (very nerdy) question, "if your baby were a React component what would it be?" and I said, "whatever it is, I am ready to unmount it," because oh my word, these final days of pregnancy are HARD. So, onwards and upwards to some sleepless nights, but with a little less physical strain (we hope), ha!
Boost team morale and encourage peer-to-peer praising, directly on Slack!
Sparkles is an app for Slack that makes awarding kudos fun. Simply add "++" next to your co-worker's Slack handle, and Sparkles will award them a sparkle!
Sparkles have no intrinsic value, but it’s a fun way to give kudos. As the numbers tally up, users can be proud of how many sparkles they have accumulated.
Who on your team deserves a Sparkle today? Get started and learn more at sparklesapp.com!
Last week, I had you calculate ingredient amounts for a recipe! I got as many submissions as I could pre-baby so if I missed ya, sorry about that! That being said, really great job Neha, Leyan, Ten, Miguel, Muhammad, Emeka, Dave, Andrew, Chase, Austin, David, Kyle, Elke, Chris, Kracekumar, Ross, Nick, and John!
This week's question:
Given an array of characters chars
, compress it such that consecutive duplicate characters are replaced with the character followed by the count of duplicates. If the count is 1
, omit it.
Examples:
> compress(["a", "b", "b", "b", "c"])
> ["a", "b", "3", "c"]
> compress(["a", "a", "b", "b", "c", "c", "c"])
> ["a", "2", "b", "2", "c", "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)
This blog is hosted on a Nintendo Wii
What async communication behaviors lead to better outcomes for software engineers?
Hypertext TV
BAYS60 by Deadline Studio keyboard with doys.dat.1 keycaps
A dad washes his car with his son.
After a while, the son says, "why can't you just use a sponge?"
That's all for now, folks! Have a great week. Be safe, make good choices, and give yourself some grace!
Special thanks to IceSloth, Ezell, Sebastián, Ben, Kinetic Labs, and Marta for supporting my Patreon and this newsletter!
cassidoo
website | blog | github | bluesky | twitter | patreon | twitch | codepen | mastodon
2025-04-21 14:26:28
Hey friends!
If you celebrate it, Happy Easter! Or Passover! Or mid-April! Let's learn.
Was this forwarded to you? You can subscribe here!
Typography troubles: Balancing lines in Japanese & Korean
Lessons Learned from Recreating a Styled Dialog
Astro 5.7
Withdrawal of the Records and Tuples proposal for ECMAScript
I am, as of writing, officially on maternity leave! I'm due to give birth this week and it's kind of blowing my mind that by the time the next issue of this comes out, I'll have another little human in my life.
That being said, it was a mad rush to "the finish line" to get stuff done at work before I was officially out!
And one more personal thing, I finished up working with Stack Overflow on their newsletter, blog, and podcast! End of an era blog post is here. Good ending, good timing with a new kiddo, and onwards and upwards!
Unlock Your Career Potential with Keenesse
Feeling stuck, or ready for your next big move?
Keenesse offers personalized career 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 sum a connected path in a grid! Awesome job Muhammad, Ten, Kyle, Nick, Saleh, and Neha!
This week's question:
Given an array of objects representing ingredients (each with a name and amount per serving), and a target number of servings, write a function to calculate the required amount of each ingredient for the target servings. Return the results as an array of objects with name and amount. Can you do this in less than 5 lines? In one?
Example:
const ingredients = [
{ name: "flour", amount: 200 }, // 200g per
{ name: "sugar", amount: 100 }, // 100g per
{ name: "eggs", amount: 2 } // 2 eggs per
];
const targetServings = 3;
> calculateIngredients(ingredients, targetServings);
> [
{ name: "flour", amount: 600 },
{ name: "sugar", amount: 300 },
{ name: "eggs", amount: 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)
(you might see some repeat questions for the next few weeks because... new baby)
Inside Africa's Food Forest Mega-Project (video)
Grid650 with Teal Wavez module + GMK Hammerhead Light
Still Tasty
A lack of frequency increases the pressure to deliver quality
What's the worst thing about ancient history class?
The teachers tend to Babylon.
That's all for now, folks! Have a great week. Be safe, make good choices, and see ya on the other side!
Special thanks to IceSloth, Ezell, Sebastián, Ben, Kinetic Labs, and Marta for supporting my Patreon and this newsletter!
cassidoo
website | blog | github | bluesky | twitter | patreon | twitch | codepen | mastodon
2025-04-14 11:45:51
Hola hola!
We made it to mid-April, where does the time go?? I hope you had a good week. Let's get learnin'!
Was this forwarded to you? You can subscribe here!
Tauri vs. Electron: performance, bundle size, and the real trade-offs
Mastering default values in JavaScript with the nullish coalescing (??) operator
CSS Bursts with Conic Gradients
Better typography with text-wrap pretty
A steam locomotive from 1993 broke my yarn test
I pumped out a bunch of content this past week!
For work, I morphed a post about MCP that I wrote for my own blog last week into something a bit more business-y, and shipped the latest episode of The Download!
I also blogged a bunch of other stuff:
Anyway, for the 8th (!) newsletter anniversary raffle last week, winners will be pinged this week! Thanks for entering, y'all!
Unlock Your Career Potential with Keenesse
Feeling stuck, or ready for your next big move?
Keenesse offers personalized career 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 generate Leyland numbers. Ya did great David, Muhammad, Elke, Ten, Austin, Jeremias, Patrycja, Nick, Levi, and Neha!
This week's question:
Given a 2D grid of integers, find the largest sum of any connected path of cells. A path consists of horizontally or vertically adjacent cells (no diagonals) and cannot reuse cells. Return the largest sum.
Examples:
const grid1 = [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
];
const grid2 = [
[5, 3],
[2, 8]
];
largestPathSum(grid1)
> 45 // (1 → 2 → 3 → 6 → 9 → 8 → 7 → 4 → 5)
largestPathSum(grid2)
> 18 // (5 → 3 → 8 → 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)
Custom Gochu60 keyboard
What is manga lettering?
Avoid these 5 tape measure mistakes (video)
Leaf Color and Shape Enhance Cooling Effect
What kind of tree fits in your hand?
A palm tree!
That's all for now, folks! Have a great week. Be safe, make good choices, and get the rest you need!
Special thanks to IceSloth, Ezell, Sebastián, Ben, Kinetic Labs, and Marta for supporting my Patreon and this newsletter!
cassidoo
website | blog | github | bluesky | twitter | patreon | twitch | codepen | mastodon
2025-04-07 13:49:25
Hey friends!
I'm so excited to be in your inbox today! It is this newsletter's EIGHTH 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)!
Was this forwarded to you? You can subscribe here!
The Death of the Browser - Rachel-Lee Nabors (video)
Minimal CSS-only blurry image placeholders
Exploring Art with TypeScript, Jupyter, Polars, and Observable Plot
Automatically create social card images for your Astro blog
I don't know what MCP is and at this point I'm too afraid to ask
Gosh, it's so unfathomable to me that it's been 8 years since starting this newsletter, and I am so grateful to you for being here and reading along with me each week. It's a genuine pleasure to know that it's giving you some value in some way, even if it's just a light occasional chuckle.
For those who've been here before, you may know that I love doing raffle giveaways and coupons every year! We have some lovely folks offering free things for ya!
freakingnerds
!CASSIDOO
at checkout! Take your CSS skills to the next level.CASSIDOO15
!CASSIDOO20
for 20% off your first year of blogging with Pika!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, U.S. Central Time to get an entry!
And just once again: Thank you so much for being here. It makes my day to see replies and messages and posts and toots and skeets and carrier pigeons from people that enjoy reading this, and seeing you share it with others.
Also as a quick (mic drop ICYMI?) side note: I'm super pregnant, and due this month! If you see some repeated interview questions or links over the next few weeks... that's why. Woo hoo!
Some APIs just hit different—clean docs, solid DX, and they actually listen.
Vote for your faves in the Postman Developers’ Choice Award now through April 17.
Just hit the vote icon on their Postman API Network workspace—you can even track a live leaderboard on the API Network homepage.
Winners drop at POST/CON 25.
Let’s give props to the APIs that make our lives easier.
👉 Cast your vote
P.S. Want to go to POST/CON and celebrate with the winners?
Here’s a special 40% off discount code just for you — expires April 17, so don’t wait!
👉 Register now with code PMN40CAM1
Last week, I had you find gaps in timestamps! Tick tock, you rock John, Taylor, Andy, Ben, Mike, Mazen, Nick, David, Muhammad, Roodz, Andrea, Ten, Huyixi, Elke, Austin, Miguel, Ben, Neha, Murtala, Levi, Saleh, Saravana, and Ross!
This week's question:
Write a function that returns the first n
Leyland numbers in ascending order. A Leyland number is defined as x^y + y^x
for integers x > 1
and y > 1
.
Examples:
getLeylandNumbers(1)
[8]
getLeylandNumbers(5)
[8, 17, 32, 54, 57]
(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 If We Made Advertising Illegal?
Stoop Coffee: How a Simple Idea Transformed My Neighborhood
Medieval Tavern in Blender - 3D Modeling Process (video)
Keykobo Soju on the Mode Encore
My laziness is like the number 8.
Once it lies down, it becomes infinite.
That's all for now, folks! Have a great week. Be safe, make good choices, and thank you for being here!
Special thanks to IceSloth, Ezell, Sebastián, Ben, Kinetic Labs, and Marta for supporting my Patreon and this newsletter!
cassidoo
website | blog | github | bluesky | twitter | patreon | twitch | codepen | mastodon
2025-03-31 15:04:50
Hey friends!
It's the last issue of March AND next week is the 8th anniversary issue! How about that? Make sure you're ready for some goodies that I can rustle up for ya. Until then, time to read!
Was this forwarded to you? You can subscribe here!
Meet Declarative Web Push
UI Algorithms: A Tiny Undo Stack
You should know this before choosing Next.js
Hot sauce if you're wrong · web dev trivia for staff engineers (video)
This week was a slower one for me, so much so that this section of the newsletter took the longest for me to write, heh. Did a whole lot of staring off into space.
I did some reflecting on my blog about how I'm trying to be more efficient and say no to more things, while also finishing as much as I can before baby #2 comes. It's a tough balance! But, I think it's good to have this... forcing function (for lack of a better phrase) to slow down and reset a bit. While also keeping humans alive. No pressure.
Parents have been asking, “Where can my kid access engaging, educational content without running into ads or random, nasty surprises?”
That's why we created Lingokids.
Lingokids is the fun, safe, educational app that parents trust and kids love. It's packed with thousands of hours of shows, songs, interactive games and more, all created by educators so your kid can play and learn on their own.
5 reasons the Lingokids app is guilt-free:
Oh, and did we mention it’s free?
Last week, I had you find streaks in an array! Great job Debopam, Tom, Marco, Ten, Miguel, Amine, Jeremias, John, Saleh, Max, Chase, Mazen, Andrea, Tim, Muhammad, Sreetam, Jesper, Leo, Kyle, Levi, Joe, Neha, Elke, Sean, Murtala, Jan-Magnus!
This week's question:
Write a function that takes an array of timestamps (HH:MM
) from the same day and returns the longest gap in minutes between consecutive timestamps.
Examples:
findLongestTimeGap(['12:00'])
0
findLongestTimeGap(['09:00', '11:00'])
120
findLongestTimeGap(['14:00', '09:00', '15:00', '10:30'])
210
findLongestTimeGap(['08:00', '10:00', '10:00', '14:00'])
240
(you can submit your answers by replying to this email with a link to your solution, or share on Bluesky, Twitter, LinkedIn, or Mastodon)
I Am Obsessed With this Tomb Raider Pen
Twilight Memeboard
E. Svetlanov's "Prelude 10" played by V. Aretinskaya & S. Gudelev (video)
You Can Still Read NASA’s Deleted "First Woman" Graphic Novels
What has ears but can't hear?
A field of corn!
That's all for now, folks! Have a great week. Be safe, make good choices, and scroll less!
Special thanks to IceSloth, Ezell, Sebastián, Ben, Kinetic Labs, and Marta for supporting my Patreon and this newsletter!
cassidoo
website | blog | github | bluesky | twitter | patreon | twitch | codepen | mastodon