Skip to content

Today I Learned

Short reflections on things I pick up along the way.

2026

Source maps make those cryptic console errors actually traceable

Today I learned,

those cryptic index.js:1203 errors in the browser console are actually traceable. I kept clicking on them and just getting a wall of minified nonsense. Turns out all you need is a source map file. Source maps link the bundled code back to your original source so the browser shows you the real file and line number. Most bundlers can generate them, you just need to make sure the option is enabled. Would have saved me hours.

Handle your service worker cache properly or you will regret it

Today I learned,

when working with service workers, always make sure you handle the caching strategy properly. I was playing around with it to implement push notifications, didn’t pay attention to the caching strategy, and Workbox sets cache-first as default for precaching. The service worker kept serving stale assets from its own cache and users were stuck on the old version. I had a hard time working on that, but I’m glad I was able to solve it by doing a workaround that even AI didn’t think of. Always check what caching strategy your tools are using before shipping a service worker to production.

Why you should proxy your feature flag service

Today I learned,

using feature flags is amazing. It helps you control features across multiple environments in seconds and even release things slowly. But the nightmare comes when the service gets blocked on the user side. My experience was with Statsig getting blocked at the network level by adblockers, enterprise VPNs, or other filtering tools. Turns out, these tools are starting to treat feature flag requests the same as tracking scripts.

The fix is simple, route the SDK traffic through a proxy on your own domain so it looks like a first-party request. You don’t think about it until it bites you.

Your git commits are documentation

Today I learned,

writing proper git commit messages actually matters more than I thought. Not just for your teammates or your future self, but for LLMs too. When you ask an AI to understand what happened in the past, it reads the git history. If your commits say “fix stuff” or “wip” then good luck getting useful context out of it. A clear commit message is basically free documentation.

Not every industry moves at the same speed with AI

Today I learned,

AI adoption is not as fast as I thought in every sector. I assumed every company involving software engineering would jump on it quickly. Turns out sectors like banking have a ton of compliance rules and security concerns that make it really hard to adopt AI tooling. So while other industries are fully integrated with AI, those engineers are still mostly coding manually, relying on their fundamental knowledge. Another reason why fundamentals always win.

Why ownership matters more than code

Today I learned,

ownership matters more than I ever expected. I was working at a mature company where my job was simple. Pick up a ticket, do what my supervisor told me, ship it. Then I moved to a startup where I became the only frontend engineer handling 3 projects. That’s where it clicked. A good software engineer doesn’t just write code. They take responsibility for the product and care about solving real problems for their users.

2025

Rive is great for web animations, but comes with a tradeoff

Today I learned,

Rive can be a solid alternative to Lottie for optimized animations on the web. It supports interactive state machines, runs at 60 FPS, and the file sizes are way smaller than Lottie.

The biggest downside from my experience is that Rive has to be initialized on the client. It needs a Canvas or WebGL context which only exists in the browser, so there’s no way to pre-render it on the server. This means you get a flash of white or empty space before the animation kicks in. Sometimes it just looks weird, especially on slower connections. You can work around it by hiding the canvas until the rive instance is ready and fading it in, which is a fair tradeoff if you can accept a slight delay before the animation appears.

Ship everything behind a gate

Today I learned,

how important feature gates are. Sometimes in a bunch of commits we have to ship the code but we don’t wanna release it yet. Or a feature that already shipped is broken and we need to turn it off in a minute. Feature gates solve both. Since then, I always put every feature under a gate. This stuff also helps if we wanna do A/B testing to ship incrementally, reducing errors happening to a massive number of users.

2023

Frameworks come and go, fundamentals stay

Today I learned,

after years of doing frontend since 2020, one thing has become clear. No matter which framework you use, the most important thing is the fundamentals of the web itself. HTML, CSS, and JavaScript. Whatever framework you pick, it’s just a different concept built on the same basics. The platform stays. Learn the platform well and picking up any new tool becomes easy.

© 2026 All rights reserved.