Skip to content

My Writings

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

LibreWolf (Firefox) Hardware Acceleration on CachyOS (Archlinux)

Configuring LibreWolf/Firefox for NVIDIA GPU hardware Acceleration on CachyOS - Archlinux

LibreWolfFirefoxNVIDIA+7
14 min read

Visual Regression Testing: When and How

When screenshot diffs are worth the overhead in a frontend suite, and when they become a flake factory that trains the team to approve blindness.

Visual RegressionPlaywrightStorybook+3
5 min read

2025 Tooling Retrospective

Year-end judgment on the 2025 tooling arcs, what held up across types, lint, frameworks, and tests, and what I would not repeat.

RetrospectiveToolingTypeScript+4
5 min read

Testing Auth Flows Without Real Auth

How to E2E auth-gated journeys without hitting a real IdP every run, storage state, route stubs, and the lies that still slip through.

PlaywrightAuthE2E Testing+3
4 min read

E2E With Playwright: Page Objects

When Playwright page objects pay off, and when they become a second UI framework that flaky tests hide behind.

PlaywrightE2E TestingPage Objects+2
5 min read

TypeScript 6.0 Bridge Release

TypeScript 6.0 as a bridge release, prepare defaults and deprecations without treating tsgo or TypeScript 7 as today’s default toolchain.

TypeScriptTypeScript 6Migration+3
5 min read

Migrating to Biome: What We Learned

Biome migration lessons from a monorepo cutover, what breaks, how to stage the handoff, and when not to migrate mid-incident.

BiomeMigrationESLint+3
5 min read

Biome First Look: One Tool to Rule Them All?

What Biome consolidates versus ESLint + Prettier, practical first-look notes for a late-2025 monorepo, when you already run ESLint and Prettier.

BiomeESLintPrettier+3
5 min read

Branded Types and Nominal Typing

Use branded and nominal types for IDs and tokens, when brands prevent real mixups, and when they are ceremony TypeScript does not need.

Branded TypesNominal TypingTypeScript+3
5 min read

Vitest: Config, Parallelism, Workspaces

Practical Vitest setup trade-offs for monorepos, config composition, parallelism, and workspaces without turning CI into a flag dump.

VitestMonorepoTesting+3
5 min read

Unit vs Integration vs E2E

Explicit criteria for choosing unit, integration, or E2E, and the failure modes of “only E2E” and “only unit” strategies.

Unit TestingIntegration TestingE2E Testing+3
5 min read

Testing Strategy: The Testing Trophy

Use the testing trophy as a judgment framework, where unit, integration, and E2E pay off, and what over-testing UI chrome actually costs.

Testing TrophyVitestPlaywright+2
4 min read

Conditional Types and Template Literal Types

Use conditional and template literal types for real prop relationships and token unions, practical frontend TypeScript, not trivia.

Conditional TypesTemplate Literal TypesTypeScript+2
5 min read

TypeScript Generics for Reusable Components

Put generics on component APIs only when they justify the complexity, constraints, inference, and when any is a design smell.

TypeScript GenericsReact ComponentsType Inference+2
4 min read

React Composition Patterns: Render Props → Hooks

Migrate render-prop APIs to hooks with judgment, when composition beats prop sprawl, and when a render prop still pays off.

React CompositionRender PropsCustom Hooks+2
6 min read

Polymorphic Components in React

Type and ship polymorphic as / asChild primitives, flexibility versus accessibility and TypeScript cost.

Polymorphic ComponentsasChildTypeScript+3
5 min read

Tailwind Merge and clsx: Class Composition

Compose Tailwind classes with clsx and tailwind-merge, conflict resolution as policy, not string order luck.

tailwind-mergeclsxTailwind CSS+3
5 min read

Class Variance Authority: Type-Safe Variants

Put typed variants on primitives with CVA, and stop variant explosion before product nouns leak into the design-system API.

CVAClass Variance AuthorityTailwind+3
4 min read

Error Boundaries: Granularity and Recovery

Place error boundaries at route and widget granularity, recover without blank-screen religion or toast-shaped lies.

Error BoundariesReactRecovery UX+2
5 min read

Toast and Notification Architecture

Own toasts with queueing, live regions, and clear rules for when not to toast , notifications as a product surface, not confetti.

ToastNotificationsAccessibility+3
5 min read

Form Handling: Controlled vs Uncontrolled

Decision criteria for controlled vs uncontrolled inputs, and when form libraries earn their dependency weight.

React FormsControlled InputsUncontrolled Inputs+2
5 min read

Responsive Layout: Sidebar, Mobile Patterns

Sidebar and mobile navigation with concrete breakpoints and focus management , when CSS grid/flex beat another layout component.

Responsive DesignSidebarCSS Grid+2
5 min read

Accessible UI Libraries Compared

Compare accessible UI kits on a11y guarantees, styling escape hatches, and ownership cost, pick on axes, not logos.

AccessibilityRadix UIReact Aria+3
5 min read

Component Library Design: Primitives → Domain

Layer a UI system from primitives to patterns to domain components, and decide what belongs in a shared package versus app code.

Component LibraryDesign SystemReact+2
5 min read

Client vs Server State: Boundaries

Deepen the Query boundary, when remote data belongs in a cache versus local UI state, and how global stores fail when they absorb both.

Server StateClient StateTanStack Query+2
5 min read

TanStack Query: Server State Management

Draw the server-state vs client-state boundary, cache keys, invalidation, and the failure modes that show up in real product UIs.

TanStack QueryServer StateCaching+2
5 min read

TanStack Router: Type-Safe Routes and Navigation

When type-safe routes are worth the overhead over framework defaults, and how TanStack Router fits beside RR, Remix, and Next.

TanStack RouterTypeScriptRouting+2
5 min read

File-Based Routing Compared

Compare file-based routing conventions on clarity, nesting, and escape hatches, pick on axes, not logos.

File-Based RoutingNext.jsRemix+3
5 min read

React 19: New Features and Migration Strategy

What in React 19 is worth adopting mid-2025 versus what you can ignore - migration without rewrite religion.

React 19MigrationActions+3
5 min read

Dark Mode: System Preference, Toggle, Persistence

Wire prefers-color-scheme, an explicit toggle, and persistence without a flash, and keep the result accessible.

Dark Modeprefers-color-schemeAccessibility+2
5 min read

Design Tokens With CSS Custom Properties

Token taxonomy for color, space, type, and radius: CSS custom properties as the contract between design intent and implementation.

Design TokensCSS VariablesCustom Properties+2
5 min read

CSS Architecture: Global → Modules → Utility-First

Migration criteria between global CSS, CSS Modules, and utility-first, a decision table for teams that need coherence without endless debate.

CSSCSS ModulesTailwind+3
5 min read

Hot Module Replacement: How It Works and When It Breaks

A practical HMR mental model for Vite-era SPAs, what updates in place, which breakage patterns waste hours, and when a full reload is the honest fix.

HMRViteDX+3
5 min read

Error Tracking: Sentry Setup for SPAs

Practical Sentry setup for SPAs, what to capture vs ignore, PII discipline, and release health without vanity dashboards.

SentryError TrackingSPA+3
4 min read

Environment Variables in SPAs: Patterns and Pitfalls

Client vs server secrets in SPAs: Vite VITE_* honesty, what actually ships to the browser, and the failure modes that leak credentials.

Environment VariablesViteSPA+3
4 min read

ESLint Performance: Profiling and Optimizing Slow Rules

Measure ESLint cost before debating rules, profile slow plugins, use cache and concurrency with evidence, and keep CI from becoming a lint tax.

ESLintPerformanceLinting+3
5 min read

Next.js vs Remix vs React Router: Framework field

Compare Next.js, Remix, and React Router on navigation, data, and deploy axes , decision criteria without tribe membership.

Next.jsRemixReact Router+3
5 min read

Astro With React: Islands and Partial Hydration

When Astro islands beat a full SPA, ship mostly static HTML, hydrate only the interactive pieces, and keep React where it pays off.

AstroReactIslands+3
5 min read

Vite + SSR Plugins: When SPAs Need Server Rendering

When a Vite SPA should grow server rendering, what SSR plugins actually own, the complexity tax, and when a meta-framework is the honest next step.

ViteSSRSPA+3
6 min read

Vanilla Vite: The Simplest SPA

A minimal Vite + React SPA that stays honest, what the scaffold buys you, how I structure routing and env, and the moment a meta-framework pays off.

ViteSPAReact+3
5 min read

SPA vs MPA: The Fundamental Trade-Offs

Decision criteria for single-page vs multi-page architectures, navigation, data, SEO, and team shape, without turning the choice into a framework war.

SPAMPAArchitecture+3
5 min read

TypeScript Config Deep Dive: Strict Mode and the Toolchain

Which strict flags change day-to-day React and Node work, what breaks when you flip them, and how tsc, the editor, and the bundler each read your tsconfig.

TypeScripttsconfigstrict+2
5 min read

Making the Leap: Migrating JS to TypeScript

A file-by-file TypeScript migration that keeps CI green, the sequence I use after JSDoc stops scaling, and the failure modes that turn leaps into rewrites.

TypeScriptMigrationJavaScript+3
6 min read

Pre-commit Hooks: Husky vs lint-staged vs nano-staged

Comparing husky, lint-staged, and nano-staged on DX and speed, what each owns, where hooks become a tax, and the stack I keep for frontend monorepos.

Huskylint-stagednano-staged+2
5 min read

ESLint Flat Config: Migrating From .eslintrc

A practical migration from .eslintrc to eslint.config.js, what breaks in a monorepo, which gotchas matter, and the flat layout I keep after the move.

ESLintFlat ConfigMonorepo+2
5 min read

Setting Up ESLint + Prettier in a Monorepo

Shared ESLint and Prettier configs as packages, keeping package boundaries clean so lint stays a maintainable contract, not a copy-paste museum.

ESLintPrettierMonorepo+2
4 min read

JSDoc vs TypeScript: Where the Trade-Offs Bite

An explicit comparison of JSDoc-checked JavaScript and TypeScript, migration triggers I trust, and the trade-offs that actually show up in day-to-day work.

JSDocTypeScriptMigration+2
4 min read

JSDoc Annotations: Types Without a Compiler

Using JSDoc as a bridge, what checkJs actually catches, what it quietly misses, and how I keep annotations from rotting into noise.

JSDocTypeScriptJavaScript+2
4 min read

Raw JavaScript: Productivity Without the Build Step

An honest case for JS-first small tools, when skipping the compiler is discipline, and the concrete moments it stops scaling.

JavaScriptToolingDX+2
4 min read

pnpm Workspaces: Managing Dependencies at Scale

Concrete pnpm workspace layout, peer-dependency traps, and the install failures that taught me to stop treating the lockfile as optional reading.

pnpmWorkspacesMonorepo+2
4 min read

Monorepo Architecture: Why and How

When a monorepo pays off versus when it is overhead, decision criteria from sharing UI and config without inventing a platform team.

MonorepoArchitectureFrontend+2
4 min read

React TypeScript CSS Properties

How to properly use CSS custom properties (CSS variables) in React with TypeScript.

ReactTypeScriptCSS+1
2 min read

Making Basic React Vite Template

Create a reusable React template with Vite, Shadcn UI, and Biome.js for efficient development of small, specialized tools.

ReactViteShadcn UI+2
2 min read

SVG with Dark and Light Mode

Dark and light mode is a feature that is supported by most modern web browser. This feature can be used in customizing how SVG is displayed.

SVGDark ModeLight Mode+2
2 min read

Using Linux as My Daily Driver

My switch to Linux from Windows was smooth and rewarding, despite some compatibility frustrations. The customization and open-source joy make it worth the effort.

LinuxWindowsKDE Neon+1
4 min read

Using MDX for writing content

Use MDX to write content with React components in Next.js.

MarkdownMDXNext.js+1
1 min read

Writing My Personal Site in Next.js

Exploring the benefits and challenges of using Next.js to build a personal website.

Next.jsPersonal SiteReact
2 min read

Syntax Highlighting in NextJS

Syntax highlighting for Next.js site using rehype-pretty-code and shiki.

Syntax HighlightingNext.jsMarkdown
2 min read

Converting Images to WebP

A guide on converting various image formats to WebP using the cwebp command-line tool and a custom shell script.

WebPImageConversion+1
4 min read

New Year, New OS

Switching from Windows to KDE Neon Linux, overcoming compatibility issues, and enjoying a customizable and user-friendly environment.

LinuxWindowsKDE Neon+1
3 min read