<!DOCTYPE html>
<html>
<head>
<title>Bytes: Firefox is cooking again</title>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="color-scheme" content="light dark">
<meta name="supported-color-schemes" content="light dark">
<link href="https://fonts.googleapis.com/css2?family=Fira+Mono&family=Outfit:wght@400;500;700;900&family=Paytone+One" rel="stylesheet">
<style>@media (prefers-color-scheme: dark) {
.email-wrapper {
color: #F9F4DA !important;
background-color: #0F0D0E !important;
}
hr {
border-color: #262422 !important;
}
mark {
background-color: #231F20 !important;
color: #F9F4DA !important;
}
pre {
background-color: #231F20 !important;
border: 1px solid #231F20 !important;
color: #F9F4DA !important;
}
.bg-alt {
background-color: #231F20 !important;
}
.unsubscribe-link {
color: #504C48 !important;
}
.token.punctuation {
color: #f9f4da !important;
}
}
@media screen and (min-width: 600px) {
.mobile-break {
display: none;
}
}</style>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
</head>
<body>
<table class="email-wrapper" border="0" cellspacing="0" width="100%" style="background-color: #FFF; border-collapse: collapse; color: #231F20; font-family: Outfit, sans-serif; font-size: 16px; width: 100%;"><tbody><tr>
<td style="border-collapse: collapse !important; word-break: normal;"></td>
<td width="600px" style="border-collapse: collapse !important; width: 600px; word-break: normal;"><div style="max-width:600px;padding-top:80px">
<div style="text-align:center"><img width="600" style="max-width: 100%; padding-bottom: 40px;" src="https://bytes.dev/images/bytes-banner-rounded.png" alt="Bytes"></div>
<p style="font-family: Outfit, sans-serif; font-size: 17px; line-height: 1.5; padding-left: 24px; padding-right: 24px;"><strong style="font-weight: 600;">Today’s issue:</strong> The Alexander Supertramp of git, the <em>Baby Driver</em> of accessibility, and the AI-induced psychosis of Rust.</p>
<p style="font-family: Outfit, sans-serif; font-size: 17px; line-height: 1.5; padding-left: 24px; padding-right: 24px;">Welcome to <a href="https://c5e21242.click.convertkit-mail.com/gku3k3q5wwh5hlgqv3vcrh8wx2699imh2w30/25h2h9u3llm8qlt3/aHR0cHM6Ly9ieXRlcy5kZXYvYXJjaGl2ZXMvNDU4" style="color: #12b5e5; font-weight: 600; text-decoration: underline;" url-id="1828032133">#458</a>.</p>
<hr style="border: 0; border-bottom: 5px solid; border-color: #f5f5f5; margin-bottom: 100px; margin-top: 100px;">
<div style="text-align:center;margin-bottom:36px">
<img width="80" src="https://bytes.dev/images/content/eyes.png" alt="Eyeballs logo" style="max-width: 100%;"><h2 style="font-family: Paytone One, sans-serif; font-size: 28px; margin-top: 10px; text-transform: uppercase;">The Main Thing</h2>
</div>
<div class="bg-alt" style="background-color: #f5f5f5; border-radius: 16px; margin-bottom: 40px; max-width: 100%; padding: 24px; padding-bottom: 12px;">
<img src="https://bytes.dev/images/content/hiding-scanner.jpg" alt="A girl hiding in the corner scanning an old lady's face" width="600" style="border-radius: 5px; max-width: 100%;"><p style="font-family: Outfit, sans-serif; font-size: 15px; font-style: italic; line-height: 1; margin: 0; padding-bottom: 4px; padding-left: 24px; padding-right: 24px; padding-top: 10px; text-align: center;">All those unused AI features getting ready to crash my browser again<!-- --> </p>
</div>
<h3 style="font-size: 24px; margin-bottom: 0; padding-left: 24px; padding-right: 24px;">Firefox is cooking again</h3>
<p style="font-family: Outfit, sans-serif; font-size: 17px; line-height: 1.5; padding-left: 24px; padding-right: 24px;">Mozilla shipped <a href="https://c5e21242.click.convertkit-mail.com/gku3k3q5wwh5hlgqv3vcrh8wx2699imh2w30/qvh8h8udeek4lzul/aHR0cHM6Ly93d3cuZmlyZWZveC5jb20vZW4tVVMvZmlyZWZveC8xNDcuMC9yZWxlYXNlbm90ZXMv" style="color: #12b5e5; font-weight: 600; text-decoration: underline;" url-id="1828032134">Firefox 147</a> two weeks ago, and it’s easily one of their biggest web-platform releases in years.</p>
<p style="font-family: Outfit, sans-serif; font-size: 17px; line-height: 1.5; padding-left: 24px; padding-right: 24px;">It’s particularly refreshing after last month, when Mozilla’s CEO surprised everyone by <a href="https://c5e21242.click.convertkit-mail.com/gku3k3q5wwh5hlgqv3vcrh8wx2699imh2w30/g3hnhwumggql09ur/aHR0cHM6Ly9ibG9nLm1vemlsbGEub3JnL2VuL21vemlsbGEvbGVhZGVyc2hpcC9tb3ppbGxhcy1uZXh0LWNoYXB0ZXItYW50aG9ueS1lbnpvci1kZW1lby1uZXctY2VvLw==" style="color: #12b5e5; font-weight: 600; text-decoration: underline;" url-id="1828032135">announcing</a> his <del>threat</del> <em>vision</em> for Firefox to evolve into “a modern AI browser that will support a portfolio of new and safe software additions.”</p>
<p style="font-family: Outfit, sans-serif; font-size: 17px; line-height: 1.5; padding-left: 24px; padding-right: 24px;">Turns out approximately zero Firefox users asked for this. But thankfully, old-fashioned cyberbullying still works in our modern times. So after taking <em>a lot</em> of flak from their most passionate users, Firefox backtracked and <a href="https://c5e21242.click.convertkit-mail.com/gku3k3q5wwh5hlgqv3vcrh8wx2699imh2w30/9qhzhdud4456erf9/aHR0cHM6Ly9tYXN0b2Rvbi5zb2NpYWwvQGZpcmVmb3h3ZWJkZXZzLzExNTc0MDUwMDM3MzY3Nzc4Mg==" style="color: #12b5e5; font-weight: 600; text-decoration: underline;" url-id="1828032136">promised</a> to build an “AI kill switch” that would let users disable all AI features entirely.</p>
<p style="font-family: Outfit, sans-serif; font-size: 17px; line-height: 1.5; padding-left: 24px; padding-right: 24px;">And one month later, they shipped Firefox 147 with a bunch of long-awaited platform features and zero mention of AI. Coincidence? You tell me. Here are the three biggest upgrades:</p>
<ul>
<li>
<p style="font-family: Outfit, sans-serif; font-size: 17px; line-height: 1.5;"><strong style="font-weight: 600;">Navigation API</strong> – A modern successor to the <code style="font-size: 14px;">history</code> API that lets apps initiate, intercept, and manage navigations without relying on fragile <code style="font-size: 14px;">popstate</code> hacks. Great news for frameworks, routers, and SPAs.</p>
</li>
<li>
<p style="font-family: Outfit, sans-serif; font-size: 17px; line-height: 1.5;"><strong style="font-weight: 600;">CSS Anchor Positioning</strong> – This means all modern browsers now support tethering elements like tooltips, popovers, and menus to anchor elements, using only CSS.</p>
</li>
<li>
<p style="font-family: Outfit, sans-serif; font-size: 17px; line-height: 1.5;"><strong style="font-weight: 600;">View Transition upgrades</strong> – New selectors like <code style="font-size: 14px;">:active-view-transition-type</code>, better devtools visibility, and APIs to introspect active transitions. It’s another big step towards smooth, app-like UX on the web without relying on framework magic.</p>
</li>
</ul>
<p style="font-family: Outfit, sans-serif; font-size: 17px; line-height: 1.5; padding-left: 24px; padding-right: 24px;"><strong style="font-weight: 600;">Bottom Line:</strong> I know that most of this work was underway long before the “AI browser” fallout, but it’s nice to at least pretend that a company listened to its users, slowed down the AI hype train, and shipped a bunch of features that developers actually want.</p>
<p style="font-family: Outfit, sans-serif; font-size: 17px; line-height: 1.5; padding-left: 24px; padding-right: 24px;">Hopefully other software companies follow Firefox’s lead.</p>
<table width="100%" cellpadding="0" cellspacing="0" border="0" style="border-collapse: collapse; margin-top: 40px; text-align: center;"><tbody><tr><td style="border-collapse: collapse !important; padding-top: 12px; word-break: normal;">
<a href="https://c5e21242.click.convertkit-mail.com/gku3k3q5wwh5hlgqv3vcrh8wx2699imh2w30/3ohphdu3xxp2klbr/aHR0cHM6Ly9mYWNlYm9vay5jb20vc2hhcmVyL3NoYXJlci5waHA_dT1odHRwcyUzQSUyRiUyRmJ5dGVzLmRldiUyRmFyY2hpdmVzJTJGNDU4" rel="noopener" style="color: #12b5e5; font-weight: 600; padding-left: 5px; text-decoration: none;" target="_blank" url-id="1828032137"><img alt="" style="display: inline-block; max-width: 100%; width: 32px;" width="25" src="https://bytes.dev/images/fb-share-icon.png"></a><a href="https://c5e21242.click.convertkit-mail.com/gku3k3q5wwh5hlgqv3vcrh8wx2699imh2w30/n2hohquv227xl9f6/aHR0cHM6Ly93d3cubGlua2VkaW4uY29tL3NoYXJpbmcvc2hhcmUtb2Zmc2l0ZS8_dXJsPWh0dHBzJTNBJTJGJTJGYnl0ZXMuZGV2JTJGYXJjaGl2ZXMlMkY0NTg=" rel="noopener" style="color: #12b5e5; font-weight: 600; padding-left: 5px; text-decoration: none;" target="_blank" url-id="1828032138"><img alt="" style="display: inline-block; max-width: 100%; width: 32px;" width="25" src="https://bytes.dev/images/li-share-icon.png"></a><a href="https://c5e21242.click.convertkit-mail.com/gku3k3q5wwh5hlgqv3vcrh8wx2699imh2w30/48hvh7umwwxp74cx/aHR0cHM6Ly90d2l0dGVyLmNvbS9pbnRlbnQvdHdlZXQvP3RleHQ9QnJlYWtpbmclMjBkb3duJTIwdGhlJTIwYmlnZ2VzdCUyMEZpcmVmb3glMjByZWxlYXNlJTIwb2YlMjB0aGUlMjBwYXN0JTIwZml2ZSUyMHllYXJzJnVybD1odHRwcyUzQSUyRiUyRmJ5dGVzLmRldiUyRmFyY2hpdmVzJTJGNDU4" rel="noopener" style="color: #12b5e5; font-weight: 600; padding-left: 5px; text-decoration: none;" target="_blank" url-id="1828032139"><img alt="" style="display: inline-block; max-width: 100%; width: 32px;" width="25" src="https://bytes.dev/images/tw-share-icon.png"></a><a href="https://c5e21242.click.convertkit-mail.com/gku3k3q5wwh5hlgqv3vcrh8wx2699imh2w30/wnh2h6uqmm0kl0a7/bWFpbHRvOj9ib2R5PVRob3VnaHQlMjB5b3UlMjdkJTIwbG92ZSUyMHRoaXMlMjB3ZWVrJTI3cyUyMEJ5dGVzJTBBLS0tJTBBQnJlYWtpbmclMjBkb3duJTIwdGhlJTIwYmlnZ2VzdCUyMEZpcmVmb3glMjByZWxlYXNlJTIwb2YlMjB0aGUlMjBwYXN0JTIwZml2ZSUyMHllYXJzJTBBaHR0cHMlM0ElMkYlMkZieXRlcy5kZXYlMkZhcmNoaXZlcyUyRjQ1OCZzdWJqZWN0PVlvdSUyMGxpa2UlMjBjb3JuYnJlYWQlM0Y=" rel="noopener" style="color: #12b5e5; font-weight: 600; padding-left: 5px; text-decoration: none;" target="_blank" url-id="1828032140"><img alt="" style="display: inline-block; max-width: 100%; width: 32px;" width="25" src="https://bytes.dev/images/em-share-icon.png"></a>
</td></tr></tbody></table>
<hr style="border: 0; border-bottom: 5px solid; border-color: #f5f5f5; margin-bottom: 100px; margin-top: 100px;">
<div style="text-align:center;margin-bottom:36px">
<img width="150" src="https://bytes.dev/images/content/qa-wolf-logo.png" alt="QA Wolf logo" style="max-width: 100%;"><h2 style="font-family: Paytone One, sans-serif; font-size: 28px; margin-top: 10px; text-transform: uppercase;"><span>Our Friends <br class="mobile-break">(With Benefits)</span></h2>
</div>
<div class="bg-alt" style="background-color: #f5f5f5; border-radius: 16px; margin-bottom: 40px; max-width: 100%; padding: 24px; padding-bottom: 12px;">
<img src="https://bytes.dev/images/content/smoking-sad.jpg" alt="A guy looking tired while smoking a cigarette" width="600" style="border-radius: 5px; max-width: 100%;"><p style="font-family: Outfit, sans-serif; font-size: 15px; font-style: italic; line-height: 1; margin: 0; padding-bottom: 4px; padding-left: 24px; padding-right: 24px; padding-top: 10px; text-align: center;">Engineering leads evaluating another AI tool<!-- --> </p>
</div>
<h3 style="font-size: 24px; margin-bottom: 0; padding-left: 24px; padding-right: 24px;"><a href="https://c5e21242.click.convertkit-mail.com/gku3k3q5wwh5hlgqv3vcrh8wx2699imh2w30/reh8h9umkk63ooa2/aHR0cHM6Ly9hdHRlbmQucWF3b2xmLmNvbS9haS10b29scy1mb3ItdGVzdGluZy1ob3ctdG8tY2hvb3NlLXRoZS1yaWdodC1hcHByb2FjaC1mb3ItcWEvcmVnaXN0cmF0aW9uP3V0bV9jYW1wYWlnbj1BQ1FfQWxsX0V2ZW50JTIwUmVnaXN0cmF0aW9uc19fTmV3c2xldHRlckF1ZGllbmNlXy1fTmV3c2xldHRlcl9BSVRvb2xzRm9yVGVzdGluZ18yMDI2MDEyOC1Ob25lX0V4cGVyaW1lbnQtRkFMU0UmdXRtX2NvbnRlbnQ9QUlUb29sc0ZvclRlc3RpbmdfUlNWUEhlcmVGb3JUaGVXb3Jrc2hvcF9Ob25lX0hlYWRsaW5lJTNBSG93VG9DaG9vc2VBSVRlc3RpbmdUT29sc0ZvckxhcmdlVGVhbXNGcmVlV2ViaW5hcl9fX19OZXdzbGV0dGVyLVByaW1hcnlQbGFjZW1lbnRfMjAyNjAxMjhfdjFfJnV0bV9tZWRpdW09bmV3c2xldHRlciZ1dG1fc291cmNlPWJ5dGVzJnV0bV90ZXJtPWhlYWRsaW5lLUhvd1RvQ2hvb3NlQUlUZXN0aW5nVG9vbHNGb3JMYXJnZVRlYW1zRnJlZVdlYmluYXI=" style="color: #12b5e5; font-weight: 600; text-decoration: underline;" url-id="1828032141">How to choose AI testing tools for large teams - free webinar</a></h3>
<p style="font-family: Outfit, sans-serif; font-size: 17px; line-height: 1.5; padding-left: 24px; padding-right: 24px;">If you’re a technical leader, how can you tell which AI tools are actually helpful and which ones are vaporware?</p>
<p style="font-family: Outfit, sans-serif; font-size: 17px; line-height: 1.5; padding-left: 24px; padding-right: 24px;">It’s not easy. That’s why QA Wolf’s Staff Engineering Lead, Yurij Mikhalevich is hosting this <a href="https://c5e21242.click.convertkit-mail.com/gku3k3q5wwh5hlgqv3vcrh8wx2699imh2w30/08hwhgu2nnl9p4bl/aHR0cHM6Ly9hdHRlbmQucWF3b2xmLmNvbS9haS10b29scy1mb3ItdGVzdGluZy1ob3ctdG8tY2hvb3NlLXRoZS1yaWdodC1hcHByb2FjaC1mb3ItcWEvcmVnaXN0cmF0aW9uP3V0bV9jYW1wYWlnbj1BQ1FfQWxsX0V2ZW50JTIwUmVnaXN0cmF0aW9uc19fTmV3c2xldHRlckF1ZGllbmNlXy1fTmV3c2xldHRlcl9BSVRvb2xzRm9yVGVzdGluZ18yMDI2MDEyOC1Ob25lX0V4cGVyaW1lbnQtRkFMU0UmdXRtX2NvbnRlbnQ9QUlUb29sc0ZvclRlc3RpbmdfUlNWUEhlcmVGb3JUaGVXb3Jrc2hvcF9Ob25lX0hlYWRsaW5lJTNBSG93VG9DaG9vc2VBSVRlc3RpbmdUT29sc0ZvckxhcmdlVGVhbXNGcmVlV2ViaW5hcl9fX19OZXdzbGV0dGVyLVByaW1hcnlQbGFjZW1lbnRfMjAyNjAxMjhfdjFfJnV0bV9tZWRpdW09bmV3c2xldHRlciZ1dG1fc291cmNlPWJ5dGVzJnV0bV90ZXJtPWJvZHktRnJlZVdvcmtzaG9w" style="color: #12b5e5; font-weight: 600; text-decoration: underline;" url-id="1828032142">free workshop</a> breaking down the full landscape of AI testing tools.</p>
<p style="font-family: Outfit, sans-serif; font-size: 17px; line-height: 1.5; padding-left: 24px; padding-right: 24px;">You’ll learn:</p>
<ul>
<li>The 4 big categories of AI testing tools</li>
<li>The real tradeoffs for coverage, reliability, and maintenance</li>
<li>A practical framework you can use to evaluate AI tools for your team</li>
</ul>
<p style="font-family: Outfit, sans-serif; font-size: 17px; line-height: 1.5; padding-left: 24px; padding-right: 24px;"><a href="https://c5e21242.click.convertkit-mail.com/gku3k3q5wwh5hlgqv3vcrh8wx2699imh2w30/8ghqh3uowwr274ck/aHR0cHM6Ly9hdHRlbmQucWF3b2xmLmNvbS9haS10b29scy1mb3ItdGVzdGluZy1ob3ctdG8tY2hvb3NlLXRoZS1yaWdodC1hcHByb2FjaC1mb3ItcWEvcmVnaXN0cmF0aW9uP3V0bV9jYW1wYWlnbj1BQ1FfQWxsX0V2ZW50JTIwUmVnaXN0cmF0aW9uc19fTmV3c2xldHRlckF1ZGllbmNlXy1fTmV3c2xldHRlcl9BSVRvb2xzRm9yVGVzdGluZ18yMDI2MDEyOC1Ob25lX0V4cGVyaW1lbnQtRkFMU0UmdXRtX2NvbnRlbnQ9QUlUb29sc0ZvclRlc3RpbmdfUlNWUEhlcmVGb3JUaGVXb3Jrc2hvcF9Ob25lX0hlYWRsaW5lJTNBSG93VG9DaG9vc2VBSVRlc3RpbmdUT29sc0ZvckxhcmdlVGVhbXNGcmVlV2ViaW5hcl9fX19OZXdzbGV0dGVyLVByaW1hcnlQbGFjZW1lbnRfMjAyNjAxMjhfdjFfJnV0bV9tZWRpdW09bmV3c2xldHRlciZ1dG1fc291cmNlPWJ5dGVzJnV0bV90ZXJtPWN0YS1SU1ZQSGVyZUZvclRoZVdvcmtzaG9w" style="color: #12b5e5; font-weight: 600; text-decoration: underline;" url-id="1828032143">RSVP here for the workshop</a>.</p>
<hr style="border: 0; border-bottom: 5px solid; border-color: #f5f5f5; margin-bottom: 100px; margin-top: 100px;">
<div style="text-align:center;margin-bottom:36px">
<img width="110" src="https://bytes.dev/images/content/spot-the-bug.png" alt="Spot the Bug logo" style="max-width: 100%;"><h2 style="font-family: Paytone One, sans-serif; font-size: 28px; margin-top: 10px; text-transform: uppercase;">Spot the Bug</h2>
<div class="section-presenter" style="margin-bottom:50px;margin-top:15px">
<h4 style="font-size: 19px; margin-bottom: 0; padding-left: 24px; padding-right: 24px;">Sponsored by <a href="https://c5e21242.click.convertkit-mail.com/gku3k3q5wwh5hlgqv3vcrh8wx2699imh2w30/vqh3hmuommwv62sg/aHR0cHM6Ly9zZW50cnkuaW8vcHJvZHVjdC9zZWVyLz91dG1fY2FtcGFpZ249c2Vlci1meTI3cTEtc2VlcmxhdW5jaCZ1dG1fY29udGVudD1uZXdzbGV0dGVyLXByb2R1Y3QtbGVhcm5tb3JlJnV0bV9tZWRpdW09cGFpZC1jb21tdW5pdHkmdXRtX3NvdXJjZT1ieXRlcw==" style="color: #12b5e5; font-weight: 600; text-decoration: underline;" url-id="1828032144">Sentry Seer</a>
</h4>
<p style="font-family: Outfit, sans-serif; font-size: 16px; line-height: 1.5; margin-top: 5px; padding-left: 24px; padding-right: 24px;"><em>It’s an AI debugger that uses <a href="https://c5e21242.click.convertkit-mail.com/gku3k3q5wwh5hlgqv3vcrh8wx2699imh2w30/vqh3hmuommwv62sg/aHR0cHM6Ly9zZW50cnkuaW8vcHJvZHVjdC9zZWVyLz91dG1fY2FtcGFpZ249c2Vlci1meTI3cTEtc2VlcmxhdW5jaCZ1dG1fY29udGVudD1uZXdzbGV0dGVyLXByb2R1Y3QtbGVhcm5tb3JlJnV0bV9tZWRpdW09cGFpZC1jb21tdW5pdHkmdXRtX3NvdXJjZT1ieXRlcw==" style="color: #12b5e5; font-weight: 600; text-decoration: underline;" url-id="1828032144">all of Sentry’s context</a> to identify root causes in production and fix what you missed.</em></p>
</div>
</div>
<pre class="language-js" style="background-color: #f9f9f9; border: 1px solid #f9f9f9; border-radius: 8px; color: #231F20; overflow: auto; padding: 24px;"><code class="language-js" style="font-size: 14px;"><span class="token keyword" style="color: #f38ba3; font-size: 14px;">function</span> <span class="token function" style="color: #9d7dce; font-size: 14px;">safeUpdate</span><span class="token punctuation" style="color: #231F20; font-size: 14px;">(</span><span class="token parameter" style="color: #f38ba3; font-size: 14px;">obj<span class="token punctuation" style="color: #231F20; font-size: 14px;">,</span> key<span class="token punctuation" style="color: #231F20; font-size: 14px;">,</span> value</span><span class="token punctuation" style="color: #231F20; font-size: 14px;">)</span> <span class="token punctuation" style="color: #231F20; font-size: 14px;">{</span>
<span class="token keyword" style="color: #f38ba3; font-size: 14px;">if</span> <span class="token punctuation" style="color: #231F20; font-size: 14px;">(</span><span class="token operator" style="color: #12b5e5; font-size: 14px;">!</span>obj<span class="token punctuation" style="color: #231F20; font-size: 14px;">.</span><span class="token function" style="color: #9d7dce; font-size: 14px;">hasOwnProperty</span><span class="token punctuation" style="color: #231F20; font-size: 14px;">(</span>key<span class="token punctuation" style="color: #231F20; font-size: 14px;">)</span><span class="token punctuation" style="color: #231F20; font-size: 14px;">)</span> <span class="token punctuation" style="color: #231F20; font-size: 14px;">{</span>
obj<span class="token punctuation" style="color: #231F20; font-size: 14px;">.</span>key <span class="token operator" style="color: #12b5e5; font-size: 14px;">=</span> value<span class="token punctuation" style="color: #231F20; font-size: 14px;">;</span>
<span class="token punctuation" style="color: #231F20; font-size: 14px;">}</span>
<span class="token punctuation" style="color: #231F20; font-size: 14px;">}</span>
<span class="token keyword" style="color: #f38ba3; font-size: 14px;">const</span> user <span class="token operator" style="color: #12b5e5; font-size: 14px;">=</span> <span class="token punctuation" style="color: #231F20; font-size: 14px;">{</span>
<span class="token literal-property property" style="color: #12b5e5; font-size: 14px;">name</span><span class="token operator" style="color: #12b5e5; font-size: 14px;">:</span> <span class="token string" style="color: #f99157; font-size: 14px;">"Alice"</span><span class="token punctuation" style="color: #231F20; font-size: 14px;">,</span>
<span class="token literal-property property" style="color: #12b5e5; font-size: 14px;">age</span><span class="token operator" style="color: #12b5e5; font-size: 14px;">:</span> <span class="token number" style="color: #fcba28; font-size: 14px;">30</span>
<span class="token punctuation" style="color: #231F20; font-size: 14px;">}</span><span class="token punctuation" style="color: #231F20; font-size: 14px;">;</span>
<span class="token function" style="color: #9d7dce; font-size: 14px;">safeUpdate</span><span class="token punctuation" style="color: #231F20; font-size: 14px;">(</span>user<span class="token punctuation" style="color: #231F20; font-size: 14px;">,</span> <span class="token string" style="color: #f99157; font-size: 14px;">"country"</span><span class="token punctuation" style="color: #231F20; font-size: 14px;">,</span> <span class="token string" style="color: #f99157; font-size: 14px;">"USA"</span><span class="token punctuation" style="color: #231F20; font-size: 14px;">)</span><span class="token punctuation" style="color: #231F20; font-size: 14px;">;</span>
</code></pre>
<hr style="border: 0; border-bottom: 5px solid; border-color: #f5f5f5; margin-bottom: 100px; margin-top: 100px;">
<div style="text-align:center;margin-bottom:36px">
<img width="110" src="https://bytes.dev/images/content/cool-bits.png" alt="Cool Bits logo" style="max-width: 100%;"><h2 style="font-family: Paytone One, sans-serif; font-size: 28px; margin-top: 10px; text-transform: uppercase;">Cool Bits</h2>
</div>
<ol>
<li>
<p style="font-family: Outfit, sans-serif; font-size: 17px; line-height: 1.5;">Vercel just disclosed multiple <a href="https://c5e21242.click.convertkit-mail.com/gku3k3q5wwh5hlgqv3vcrh8wx2699imh2w30/l2heh6ulqqxnp0a6/aHR0cHM6Ly92ZXJjZWwuY29tL2NoYW5nZWxvZy9zdW1tYXJ5LW9mLWN2ZS0yMDI2LTIzODY0" style="color: #12b5e5; font-weight: 600; text-decoration: underline;" url-id="1828032145">high-severity vulnerabilities in RSC</a> that require immediate upgrades. These should not be confused with the RSC CVEs from last month, or the RSC CVEs that will be discovered next month.</p>
</li>
<li>
<p style="font-family: Outfit, sans-serif; font-size: 17px; line-height: 1.5;"><a href="https://c5e21242.click.convertkit-mail.com/gku3k3q5wwh5hlgqv3vcrh8wx2699imh2w30/m2h7h6u3224qxqbm/aHR0cHM6Ly9kZXZlbG9wZXIucHV0ZXIuY29tLw==" style="color: #12b5e5; font-weight: 600; text-decoration: underline;" url-id="1828032146">Puter.js</a> is a single JavaScript library that gives you serverless auth, cloud storage, LLM integration, and more – no backend, no config, and no stress required. [sponsored]</p>
</li>
<li>
<p style="font-family: Outfit, sans-serif; font-size: 17px; line-height: 1.5;">Lead Yarn maintainer, Maël Nison shared this <a href="https://c5e21242.click.convertkit-mail.com/gku3k3q5wwh5hlgqv3vcrh8wx2699imh2w30/dphehmueddpoxkum/aHR0cHM6Ly95YXJuNi5uZXRsaWZ5LmFwcC9ibG9nLzIwMjYtMDEtMjgteWFybi02LXByZXZpZXcv" style="color: #12b5e5; font-weight: 600; text-decoration: underline;" url-id="1828032147">Yarn 6 Preview</a>. Yes, they rewrote it in Rust, which means you need to either take a drink or put on your animal ears.</p>
</li>
<li>
<p style="font-family: Outfit, sans-serif; font-size: 17px; line-height: 1.5;">The Turbopack team wrote about how they <a href="https://c5e21242.click.convertkit-mail.com/gku3k3q5wwh5hlgqv3vcrh8wx2699imh2w30/e0hph0u7mmrlzwi8/aHR0cHM6Ly9uZXh0anMub3JnL2Jsb2cvdHVyYm9wYWNrLWluY3JlbWVudGFsLWNvbXB1dGF0aW9u" style="color: #12b5e5; font-weight: 600; text-decoration: underline;" url-id="1828032148">build faster by building less</a>, thanks to their “very fine-grained caching architecture.”</p>
</li>
<li>
<p style="font-family: Outfit, sans-serif; font-size: 17px; line-height: 1.5;"><a href="https://c5e21242.click.convertkit-mail.com/gku3k3q5wwh5hlgqv3vcrh8wx2699imh2w30/7qh7h2u9ddn6emiz/aHR0cHM6Ly9leHBvLmRldi9jaGFuZ2Vsb2cvc2RrLTU1LWJldGE_dXRtX2NhbXBhaWduPTM1NjYzNjQzLVNESyUyMDU1JnV0bV9jb250ZW50PVNES181NV9jaGFuZ2Vsb2cmdXRtX21lZGl1bT1uZXdzbGV0dGVyJnV0bV9zb3VyY2U9Ynl0ZXM=" style="color: #12b5e5; font-weight: 600; text-decoration: underline;" url-id="1828032149">Expo SDK 55 beta</a> just shipped <em>without</em> support for React Native’s legacy architecture for the first time <span role="img" aria-label="clapping hands">👏</span>. It also adds opt-in Hermes v1 support and AI agent skills for building, deploying, and debugging complex Expo apps. [sponsored]</p>
</li>
<li>
<p style="font-family: Outfit, sans-serif; font-size: 17px; line-height: 1.5;">Vjeux wrote about <a href="https://c5e21242.click.convertkit-mail.com/gku3k3q5wwh5hlgqv3vcrh8wx2699imh2w30/owhkhwuwxxq6e8uv/aHR0cHM6Ly9ibG9nLnZqZXV4LmNvbS8yMDI2L2FuYWx5c2lzL3BvcnRpbmctMTAway1saW5lcy1mcm9tLXR5cGVzY3JpcHQtdG8tcnVzdC11c2luZy1jbGF1ZGUtY29kZS1pbi1hLW1vbnRoLmh0bWw=" style="color: #12b5e5; font-weight: 600; text-decoration: underline;" url-id="1828032150">porting 100k lines from TypeScript to Rust in a month using Claude Code</a>. Porting things to Rust is my favorite form of AI-induced psychosis.</p>
</li>
<li>
<p style="font-family: Outfit, sans-serif; font-size: 17px; line-height: 1.5;"><a href="https://c5e21242.click.convertkit-mail.com/gku3k3q5wwh5hlgqv3vcrh8wx2699imh2w30/z2hgh7ue55lkzocp/aHR0cHM6Ly9ub2RlanMub3JnL2VuL2Jsb2cvcmVsZWFzZS92MjUuNS4w" style="color: #12b5e5; font-weight: 600; text-decoration: underline;" url-id="1828032151">Node.js 25.5</a> blesses us all with a new <code style="font-size: 14px;">--build-sea</code> command line flag that simplifies the process of building Single Executable Apps (SEA) in Node.</p>
</li>
<li>
<p style="font-family: Outfit, sans-serif; font-size: 17px; line-height: 1.5;">Our very own Lynn Fisher wrote this case study on <a href="https://c5e21242.click.convertkit-mail.com/gku3k3q5wwh5hlgqv3vcrh8wx2699imh2w30/x0hph3uekkqpmea5/aHR0cHM6Ly9seW5uYW5kdG9uaWMuY29tL3Rob3VnaHRzL2VudHJpZXMvY2FzZS1zdHVkeS0yMDI1LXJlZnJlc2gv" style="color: #12b5e5; font-weight: 600; text-decoration: underline;" url-id="1828032153">the 2025 refresh of her personal site</a>, just in case you need some proof that not every website on the internet has been turned into AI slop.</p>
</li>
<li>
<p style="font-family: Outfit, sans-serif; font-size: 17px; line-height: 1.5;">Only idiots write manual tests – modern engineering teams like Notion, Dropbox and LaunchDarkly use Meticulous to maintain e2e UI tests that <a href="https://c5e21242.click.convertkit-mail.com/gku3k3q5wwh5hlgqv3vcrh8wx2699imh2w30/e0hph0u7mmrlz4h8/aHR0cHM6Ly93d3cubWV0aWN1bG91cy5haS8_dXRtX2NhbXBhaWduPTI2cTEmdXRtX2NvbnRlbnQ9c2Vjb25kYXJ5JnV0bV9tZWRpdW09bmV3c2xldHRlciZ1dG1fc291cmNlPWJ5dGVz" style="color: #12b5e5; font-weight: 600; text-decoration: underline;" url-id="1828032155">cover every edge case</a> of your web app. [sponsored]</p>
</li>
<li>
<p style="font-family: Outfit, sans-serif; font-size: 17px; line-height: 1.5;">Laura Kalbag just shared her book <a href="https://c5e21242.click.convertkit-mail.com/gku3k3q5wwh5hlgqv3vcrh8wx2699imh2w30/7qh7h2u9ddn6e3hz/aHR0cHM6Ly9hY2Nlc3NpYmlsaXR5Zm9yZXZlcnlvbmUuc2l0ZS8=" style="color: #12b5e5; font-weight: 600; text-decoration: underline;" url-id="1828032156">Accessibility for Everyone</a> for free online. Like <em>Baby Driver</em> it first came out back in 2017, is highly underrated, and still holds up great.</p>
</li>
<li>
<p style="font-family: Outfit, sans-serif; font-size: 17px; line-height: 1.5;"><a href="https://c5e21242.click.convertkit-mail.com/gku3k3q5wwh5hlgqv3vcrh8wx2699imh2w30/owhkhwuwxxq6exbv/aHR0cHM6Ly9udXh0LmNvbS9ibG9nL3Y0LTM=" style="color: #12b5e5; font-weight: 600; text-decoration: underline;" url-id="1828032157">Nuxt 4.3</a> comes with perf upgrades and new features for layouts, caching, and DX.</p>
</li>
<li>
<p style="font-family: Outfit, sans-serif; font-size: 17px; line-height: 1.5;">TonyStr <a href="https://c5e21242.click.convertkit-mail.com/gku3k3q5wwh5hlgqv3vcrh8wx2699imh2w30/z2hgh7ue55lkznfp/aHR0cHM6Ly90b255c3RyLm5ldC9ibG9nL2dpdF9pbW1pdGF0aW9u" style="color: #12b5e5; font-weight: 600; text-decoration: underline;" url-id="1828032158">made his own git</a> and finally got to experience the bliss of living off the grid, wild and free from the shackles of modernity, like a modern day Alexander Supertramp. Just don’t go to Alaska.</p>
</li>
</ol>
<hr style="border: 0; border-bottom: 5px solid; border-color: #f5f5f5; margin-bottom: 100px; margin-top: 100px;">
<div style="text-align:center;margin-bottom:36px">
<img width="110" src="https://bytes.dev/images/content/spot-the-bug.png" alt="Spot the Bug logo" style="max-width: 100%;"><h2 style="font-family: Paytone One, sans-serif; font-size: 28px; margin-top: 10px; text-transform: uppercase;">Spot the Bug: Solution</h2>
<div class="section-presenter" style="margin-bottom:50px;margin-top:15px"><h4 style="font-size: 19px; margin-bottom: 0; padding-left: 24px; padding-right: 24px;">Sponsored by <a href="https://c5e21242.click.convertkit-mail.com/gku3k3q5wwh5hlgqv3vcrh8wx2699imh2w30/vqh3hmuommwv62sg/aHR0cHM6Ly9zZW50cnkuaW8vcHJvZHVjdC9zZWVyLz91dG1fY2FtcGFpZ249c2Vlci1meTI3cTEtc2VlcmxhdW5jaCZ1dG1fY29udGVudD1uZXdzbGV0dGVyLXByb2R1Y3QtbGVhcm5tb3JlJnV0bV9tZWRpdW09cGFpZC1jb21tdW5pdHkmdXRtX3NvdXJjZT1ieXRlcw==" style="color: #12b5e5; font-weight: 600; text-decoration: underline;" url-id="1828032144">Sentry Seer</a>
</h4></div>
</div>
<p style="font-family: Outfit, sans-serif; font-size: 17px; line-height: 1.5; padding-left: 24px; padding-right: 24px;">This one was for the beginners.</p>
<pre class="language-js" style="background-color: #f9f9f9; border: 1px solid #f9f9f9; border-radius: 8px; color: #231F20; overflow: auto; padding: 24px;"><code class="language-js" style="font-size: 14px;"><span class="token keyword" style="color: #f38ba3; font-size: 14px;">function</span> <span class="token function" style="color: #9d7dce; font-size: 14px;">safeUpdate</span><span class="token punctuation" style="color: #231F20; font-size: 14px;">(</span><span class="token parameter" style="color: #f38ba3; font-size: 14px;">obj<span class="token punctuation" style="color: #231F20; font-size: 14px;">,</span> key<span class="token punctuation" style="color: #231F20; font-size: 14px;">,</span> value</span><span class="token punctuation" style="color: #231F20; font-size: 14px;">)</span> <span class="token punctuation" style="color: #231F20; font-size: 14px;">{</span>
<span class="token keyword" style="color: #f38ba3; font-size: 14px;">if</span> <span class="token punctuation" style="color: #231F20; font-size: 14px;">(</span><span class="token operator" style="color: #12b5e5; font-size: 14px;">!</span>obj<span class="token punctuation" style="color: #231F20; font-size: 14px;">.</span><span class="token function" style="color: #9d7dce; font-size: 14px;">hasOwnProperty</span><span class="token punctuation" style="color: #231F20; font-size: 14px;">(</span>key<span class="token punctuation" style="color: #231F20; font-size: 14px;">)</span><span class="token punctuation" style="color: #231F20; font-size: 14px;">)</span> <span class="token punctuation" style="color: #231F20; font-size: 14px;">{</span>
obj<span class="token punctuation" style="color: #231F20; font-size: 14px;">.</span>key <span class="token operator" style="color: #12b5e5; font-size: 14px;">=</span> value<span class="token punctuation" style="color: #231F20; font-size: 14px;">;</span>
<span class="token punctuation" style="color: #231F20; font-size: 14px;">}</span>
<span class="token punctuation" style="color: #231F20; font-size: 14px;">}</span>
</code></pre>
<p style="font-family: Outfit, sans-serif; font-size: 17px; line-height: 1.5; padding-left: 24px; padding-right: 24px;">Our bug is that we’re adding a literal <code style="font-size: 14px;">key</code> property to our object.</p>
<pre class="language-js" style="background-color: #f9f9f9; border: 1px solid #f9f9f9; border-radius: 8px; color: #231F20; overflow: auto; padding: 24px;"><code class="language-js" style="font-size: 14px;">console<span class="token punctuation" style="color: #231F20; font-size: 14px;">.</span><span class="token function" style="color: #9d7dce; font-size: 14px;">log</span><span class="token punctuation" style="color: #231F20; font-size: 14px;">(</span>user<span class="token punctuation" style="color: #231F20; font-size: 14px;">.</span>key<span class="token punctuation" style="color: #231F20; font-size: 14px;">)</span> <span class="token comment" style="color: rgb(167, 167, 167); font-size: 14px;">// "USA"</span>
</code></pre>
<p style="font-family: Outfit, sans-serif; font-size: 17px; line-height: 1.5; padding-left: 24px; padding-right: 24px;">In JavaScript, if you want to use a variable as the key of an object, you need to use bracket notation instead of dot notation.</p>
<pre class="language-js" style="background-color: #f9f9f9; border: 1px solid #f9f9f9; border-radius: 8px; color: #231F20; overflow: auto; padding: 24px;"><code class="language-js" style="font-size: 14px;"><span class="token keyword" style="color: #f38ba3; font-size: 14px;">function</span> <span class="token function" style="color: #9d7dce; font-size: 14px;">safeUpdate</span><span class="token punctuation" style="color: #231F20; font-size: 14px;">(</span><span class="token parameter" style="color: #f38ba3; font-size: 14px;">obj<span class="token punctuation" style="color: #231F20; font-size: 14px;">,</span> key<span class="token punctuation" style="color: #231F20; font-size: 14px;">,</span> value</span><span class="token punctuation" style="color: #231F20; font-size: 14px;">)</span> <span class="token punctuation" style="color: #231F20; font-size: 14px;">{</span>
<span class="token keyword" style="color: #f38ba3; font-size: 14px;">if</span> <span class="token punctuation" style="color: #231F20; font-size: 14px;">(</span><span class="token operator" style="color: #12b5e5; font-size: 14px;">!</span>obj<span class="token punctuation" style="color: #231F20; font-size: 14px;">.</span><span class="token function" style="color: #9d7dce; font-size: 14px;">hasOwnProperty</span><span class="token punctuation" style="color: #231F20; font-size: 14px;">(</span>key<span class="token punctuation" style="color: #231F20; font-size: 14px;">)</span><span class="token punctuation" style="color: #231F20; font-size: 14px;">)</span> <span class="token punctuation" style="color: #231F20; font-size: 14px;">{</span>
obj<span class="token punctuation" style="color: #231F20; font-size: 14px;">[</span>key<span class="token punctuation" style="color: #231F20; font-size: 14px;">]</span> <span class="token operator" style="color: #12b5e5; font-size: 14px;">=</span> value<span class="token punctuation" style="color: #231F20; font-size: 14px;">;</span>
<span class="token punctuation" style="color: #231F20; font-size: 14px;">}</span>
<span class="token punctuation" style="color: #231F20; font-size: 14px;">}</span>
</code></pre>
<div style="text-align:center;padding-bottom:80px;padding-top:80px">
<div class="bg-alt" style="background-color: #f5f5f5; border-radius: 16px; margin-bottom: 40px; padding: 24px;"><div style="margin-top:-40px">
<img src="https://bytes.dev/images/bytes-icon.png" alt="Bytes" width="55px" style="max-width: 100%; width: 55px;"><h5 style="font-size:18px;font-weight:400;margin-bottom:24px">Want us to say nice things <br> about your company?</h5>
<div style="margin-bottom:16px"><a style="background-color: #FCBA28; border: 1px solid #231F20; border-radius: 100px; color: #231F20; font-size: 14px; font-weight: 600; padding: 8px 14px; text-decoration: none;" href="https://c5e21242.click.convertkit-mail.com/gku3k3q5wwh5hlgqv3vcrh8wx2699imh2w30/p8hehqu4rrq2e6uq/aHR0cHM6Ly9ieXRlcy5kZXYvYWR2ZXJ0aXNl" url-id="1828032159">Sponsor Bytes</a></div>
<div style="margin-bottom:20px"><a style="color: #FCBA28; font-size: 14px; font-weight: 600; text-decoration: underline;" href="https://c5e21242.click.convertkit-mail.com/gku3k3q5wwh5hlgqv3vcrh8wx2699imh2w30/x0hph3uekkqpm0c5/aHR0cHM6Ly9ieXRlcy5kZXYvc2hhcmU=" url-id="1828032160">or share it</a></div>
<p style="font-family: Outfit, sans-serif; font-size: 14px; line-height: 1.5; padding-left: 24px; padding-right: 24px;">Built with ❤️ by<!-- --> <a style="color: #ed203d; font-weight: 600; text-decoration: underline;" href="https://c5e21242.click.convertkit-mail.com/gku3k3q5wwh5hlgqv3vcrh8wx2699imh2w30/6qhehoulxx954gco/aHR0cHM6Ly9maXJlc2hpcC5kZXY=" url-id="1828032161">Fireship</a></p>
</div></div>
<p style="font-family: Outfit, sans-serif; font-size: 14px; line-height: 1.5; opacity: 0.5; padding-left: 24px; padding-right: 24px;">50 W Broadway Ste 333 PMB 51647 Salt Lake City, Utah 84101</p>
<div style="font-family:Papyrus, cursive"><a class="unsubscribe-link" href="https://c5e21242.click.convertkit-mail.com/gku3k3q5wwh5hlgqv3vcrh8wx2699imh2w30/58hvh8ug336nwri6/aHR0cHM6Ly9ieXRlcy5kZXYvdW5zdWJzY3JpYmU=" style="color: #9B9890;" url-id="1828032163">Unsubscribe from Bytes</a></div>
</div>
</div></td>
<td style="border-collapse: collapse !important; word-break: normal;"></td>
</tr></tbody></table>
<span style="display: none"><a href="https://c5e21242.unsubscribe.convertkit-mail.com/gku3k3q5wwh5hlgqv3vcrh8wx2699imh2w30">Unsubscribe</a></span>
<!-- -->
<img src="https://c5e21242.open.convertkit-mail.com/gku3k3q5wwh5hlgqv3vcrh8wx2699imh2w30" alt="">
</body>
</html>