Skip to content

My Writings

My thoughts, musings, and researches in coding, software, and life.

Why My PC Fans Go Crazy While Watching YouTube

A few days ago, I was just sitting there, enjoying a 4K video on YouTube, when my PC fans suddenly kicked into high gear.

LibreWolfFirefoxNVIDIA+7
3 min read

When Do We Actually Need Visual Regression Testing?

Teams often get stuck overusing visual regression testing in an attempt to keep UIs consistent.

Visual RegressionPlaywrightStorybook+3
3 min read

2025 Tooling Reflections: What Stays and What Goes

Having the latest tech doesn't mean much if it doesn't actually help us work or, worse, just adds more mental overhead.

RetrospectiveToolingTypeScript+4
2 min read

Handling Auth Flows in Testing Without Always Doing a "Real" Login

I often see teams hitting the same wall when writing E2E tests: should we go through the actual login process every single time, or just manipulate the data?

PlaywrightAuthE2E Testing+3
3 min read

When is the Page Object Model actually useful in Playwright?

Implementing the Page Object Model (POM) for every single automated test scenario often feels like a chore, but not everything needs to be wrapped in a class.

PlaywrightE2E TestingPage Objects+2
3 min read

Facing TypeScript 6.0: A Bridge or a Major Project?

TypeScript 6.0 is essentially a bridge release.

TypeScriptTypeScript 6Migration+3
2 min read

Lessons from Migrating to Biome

A while back, my team tried moving our tooling from ESLint and Prettier to Biome within a monorepo.

BiomeMigrationESLint+3
3 min read

Trying Out Biome: One Tool to Rule Them All?

I’ve written a lot recently about configuring ESLint and Prettier, dealing with pre-commit hooks, and optimizing slow rules.

BiomeESLintPrettier+3
3 min read

Why I’ve Started Using Branded Types in TypeScript

I’ve had those moments where everything runs perfectly on my machine, only to have things fall apart the second they hit production.

Branded TypesNominal TypingTypeScript+3
2 min read

Managing Vitest in a Monorepo Without the Headache

Keeping a testing suite fast within a pnpm monorepo is a real technical challenge.

VitestMonorepoTesting+3
2 min read

Unit, Integration, or E2E? Finding the Right Level of Testing

I see it all the time in pull requests: debates over how a test should actually be written.

Unit TestingIntegration TestingE2E Testing+3
3 min read

Finding a Testing Strategy That Doesn't Burn You Out

Deciding on a testing strategy usually runs into the same trap: the idea that more tests equals a safer app.

Testing TrophyVitestPlaywright+2
3 min read

Managing Prop Relationships with Conditional and Template Literal Types

Building a design system or smart UI components requires precision when mapping relationships between props.

Conditional TypesTemplate Literal TypesTypeScript+2
2 min read

When Do We Actually Need Generics?

There’s a tendency in the TypeScript community to throw generics everywhere just to look "complete" or sophisticated.

TypeScript GenericsReact ComponentsType Inference+2
3 min read

When Components Get Too Fat

When a component starts getting "fat," it’s usually not because the file size is huge, but because the list of props has turned into a grocery list.

React CompositionRender PropsCustom Hooks+2
2 min read

The Polymorphic Component Dilemma in React

Building components for a design system usually hits a wall the moment product requirements get weird.

Polymorphic ComponentsasChildTypeScript+3
2 min read

Managing Class Conflicts in UI Components

Building flexible UI components usually leads to a fight between utility classes.

tailwind-mergeclsxTailwind CSS+3
2 min read

Managing Variant Chaos with CVA

Variant explosion in primitive components is a real problem that can quickly wreck a design system.

CVAClass Variance AuthorityTailwind+3
2 min read

Organizing Error Boundaries: Saving the App or Just Patching Holes?

Handling errors in a React app isn't just about keeping it from crashing; it’s about controlling the blast radius.

Error BoundariesReactRecovery UX+2
2 min read

The Art of Managing Notifications: Why Not Everything Needs to be a Toast

I often see apps that just feel...

ToastNotificationsAccessibility+3
3 min read

The Form Dilemma: Controlled vs. Uncontrolled

I often find myself caught in the debate over the "best" way to handle inputs in React.

React FormsControlled InputsUncontrolled Inputs+2
3 min read

Making Responsive Layouts Actually Work

A lot of web projects look great on a massive monitor but fall apart the second you open them on a phone.

Responsive DesignSidebarCSS Grid+2
3 min read

Choosing a UI Library: It’s More Than Just Picking a Cool Logo

Picking a UI library isn't just about finding a nice logo or following whatever is trending on social media.

AccessibilityRadix UIReact Aria+3
2 min read

Separating Component Layers: From Primitives to Domain

When organizing component structures, it’s easy to fall into the trap of the "lazy" approach: throwing everything into a single ui/ folder.

Component LibraryDesign SystemReact+2
2 min read

The Real Problem with State Management

The real headache in modern app development usually isn't the libraries we pick, but the blurred boundaries between our data.

Server StateClient StateTanStack Query+2
2 min read

Why are we still overcomplicating state management in React?

The same pattern keeps showing up in different React apps: forcing API data into Redux, shoving user profiles into Context, or manually building fetching logic with `useEffect`.

TanStack QueryServer StateCaching+2
2 min read

Framework Convenience vs. Type-Safe Security in TanStack Router

Choosing a tech stack often feels like a trap driven by social media trends, as if we’re forced to always pick the "most modern" tool.

TanStack RouterTypeScriptRouting+2
2 min read

The Routing Dilemma: File Structure vs. URL Reality

Modern frameworks sell us on file-based routing with a very tempting pitch: just create a file, and your URL is ready to go.

File-Based RoutingNext.jsRemix+3
2 min read

Facing React 19: Should You Jump In or Just Wait?

Ever since React 19 dropped late last year, it feels like everyone has been talking about the same thing.

React 19MigrationActions+3
3 min read

The Real Challenge of Implementing Dark Mode

The biggest headache when implementing dark mode is the "white flash": that split second where the screen blasts bright white before finally switching to dark as the page loads.

Dark Modeprefers-color-schemeAccessibility+2
2 min read

Keeping Design Consistent in Large Projects

Maintaining design consistency in a large project isn't really a CSS skill issue. It’s a management issue.

Design TokensCSS VariablesCustom Properties+2
3 min read

Choosing a CSS Architecture: When is it time to switch?

I see development teams stuck in endless migration cycles all the time.

CSSCSS ModulesTailwind+3
3 min read

Why HMR Can Sometimes Lie to You

I’ve always felt like HMR (Hot Module Replacement) is a bit of magic when you're in the zone.

HMRViteDX+3
3 min read

Stop Chasing Numbers on Your Error Tracking Dashboard

Setting up Sentry for a Single Page Application (SPA) usually puts you in a dilemma: you either get useful data or you just collect junk.

SentryError TrackingSPA+3
3 min read

Don't be fooled: Frontend Environment Variables are public

There’s a common misconception that your .env file acts like a private vault inside a Single Page Application (SPA).

Environment VariablesViteSPA+3
3 min read

Fixing a Slow ESLint: Stop Guessing

I see it all the time: teams eventually stop running the linter.

ESLintPerformanceLinting+3
3 min read

Choosing a Framework: Next.js, Remix, or React Router?

Picking tools for a new project often feels like being caught in the hype cycles of Twitter/X.

Next.jsRemixReact Router+3
2 min read

Choosing Astro: Between Documents and Applications

Choosing a website structure usually involves a trade-off: do you build a highly responsive app or keep the JavaScript weight low? It used to be a black-and-white choice.

AstroReactIslands+3
3 min read

When Do You Actually Need SSR in Vite?

For the longest time, I felt like building applications as standard SPAs with Vite was more than enough.

ViteSSRSPA+3
3 min read

Keeping it Lean: Why I Stick to Vite, React, and TypeScript

The debate over which framework is "best" for web apps usually boils down to a choice between using a massive, all-in-one meta-framework or going back to basic…

ViteSPAReact+3
3 min read

Choosing Between SPA and MPA: It’s About More Than Just Your Framework

When starting a new project, the real question isn't "Should I use React or Vue?" It’s something much more critical: are we building a Single-Page App (SPA), a Multi-Page App (MPA), or some hybrid?

SPAMPAArchitecture+3
3 min read

On `tsconfig` and why being "strict" is a pain, but necessary

A while back, I wrote about the experience of moving from raw JavaScript to TypeScript.

TypeScripttsconfigstrict+2
3 min read

The Art of Migrating from JavaScript to TypeScript Without Breaking Everything

Migrating a project from raw JavaScript to TypeScript is a common trap for overambitious teams.

TypeScriptMigrationJavaScript+3
2 min read

Husky, lint-staged, or nano-staged? Understanding pre-commit tools

Messy code on your main branch is a classic headache that usually happens when you only run linters in CI.

Huskylint-stagednano-staged+2
3 min read

Migrating to ESLint Flat Config: It's More Than Just a Filename Change

ESLint Flat Config is now the standard.

ESLintFlat ConfigMonorepo+2
3 min read

Managing ESLint and Prettier in a Monorepo Without the Drama

Managing a single project is draining enough; adding a monorepo to the mix can make it much worse.

ESLintPrettierMonorepo+2
3 min read

JSDoc vs. TypeScript: When is it time to switch?

Does every single project actually need the complexity of a strict typing system? Sometimes, I find myself tempted to just go back to raw JavaScript, using JSD…

JSDocTypeScriptMigration+2
2 min read

When JSDoc is enough (and when it isn't)

Going full TypeScript for a small project or a simple script often feels like overkill.

JSDocTypeScriptJavaScript+2
3 min read

TypeScript or raw JavaScript? It depends on how much the code actually matters

Choosing between TypeScript or just blasting ahead with raw JavaScript usually comes down to how long the tool is actually going to live.

JavaScriptToolingDX+2
3 min read

Managing Monorepos Without the Headache Using pnpm Workspaces

Managing multiple packages in a single repository (a monorepo) is a bit like managing an ecosystem.

pnpmWorkspacesMonorepo+2
3 min read

The Monorepo Dilemma: Convenience vs. Overhead

I often find myself caught up in debates about repository structure.

MonorepoArchitectureFrontend+2
3 min read

Dealing with CSS Variable Errors in React TypeScript

A while back, I ran into a bit of a headache while working on a project.

ReactTypeScriptCSS+1
2 min read

Building a Reusable React Vite Template

I often find myself building little tools to help with my daily tasks: things like banner generators, image compressors, or file format converters.

ReactViteShadcn UI+2
3 min read

Making SVGs Dark Mode Ready

Image assets, especially SVGs, are often an afterthought when building websites with dark mode support.

SVGDark ModeLight Mode+2
2 min read

Back to Linux: A Risky Journey Toward Comfort

After a long stint on Windows, I’ve finally decided to make Linux my daily driver again.

LinuxWindowsKDE Neon+1
2 min read

Writing Content with MDX

Writing technical articles with plain text often feels limiting when I want to drop in interactive elements.

MarkdownMDXNext.js+1
2 min read

Building My Personal Site with Next.js

I finally decided to build my own personal site.

Next.jsPersonal SiteReact
2 min read

Making Code Snippets Easier to Read on Your Blog

Displaying code as plain black-and-white text is a massive mistake when writing tutorials.

Syntax HighlightingNext.jsMarkdown
2 min read

Managing Image Assets with WebP

Large image assets are a massive drag on website performance.

WebPImageConversion+1
2 min read

New Year, New OS

This year, I decided to make a big change in how I work with my computer: I’m moving from Windows to Linux.

LinuxWindowsKDE Neon+1
3 min read