Articles
Long-form writing about engineering, web performance, and the things I've learned along the way.
38 articles publishedSeries
Web Accessibility: A Developer's Guide
View Series →The Ultimate SEO Guide for Developers, Designers and everyone else!
View Series →Core Web Vitals in 2026
View Series →Production-Ready TypeScript: A Complete Guide
View Series →Developing Scalable React Applications
View Series →Structured Data for Developers: A Complete Guide
View Series →Guide to Improving Page Performance in 2026
View Series →Practical Progressive Web Apps
View Series →
Three.js in a Web Worker: Fixing a 64 PageSpeed Score
How a floating-card redesign cost my Reads page a 100, and the three changes that won it back
A three.js redesign dropped my page to 64 on PageSpeed. Moving WebGL, card painting and fonts into an OffscreenCanvas worker took it back to 100, step by step.
Continue Reading →
Nobody Trained Me to Manage Five AI Agents at Once
Running several AI agents in parallel doesn't shrink the work, it moves the bottleneck to reviewing and trusting what they wrote. That's AI agent fatigue.
Nobody Trained Me to Manage Five AI Agents at Once
Running several AI agents in parallel doesn't shrink the work, it moves the bottleneck to reviewing and trusting what they wrote. That's AI agent fatigue.

Your Testing Problem Is a Confidence-Allocation Problem
Most testing debates are about shape, not risk. A plain-language look at risk-based testing across web, mobile and CI/infra work.
Your Testing Problem Is a Confidence-Allocation Problem
Most testing debates are about shape, not risk. A plain-language look at risk-based testing across web, mobile and CI/infra work.

Core Web Vitals and SEO: What They Do and Don't Influence
A source-backed look at how Core Web Vitals relate to SEO: what Google says, where they matter, and how to prioritize without overclaiming ranking impact.
Core Web Vitals and SEO: What They Do and Don't Influence
A source-backed look at how Core Web Vitals relate to SEO: what Google says, where they matter, and how to prioritize without overclaiming ranking impact.

I Stopped Bot Emails With a Multi-Step Contact Form
Bot emails hit my one-page contact form: SEO pitches, gibberish. A four step form, a honeypot, a two-second timer, and the bots went quiet.
I Stopped Bot Emails With a Multi-Step Contact Form
Bot emails hit my one-page contact form: SEO pitches, gibberish. A four step form, a honeypot, a two-second timer, and the bots went quiet.

Microdata vs JSON-LD vs RDFa: 2026 Comparison Guide
Microdata vs JSON-LD vs RDFa compared for 2026 — what Google recommends and how to choose without ranking myths. Part 2 of the series.
Microdata vs JSON-LD vs RDFa: 2026 Comparison Guide
Microdata vs JSON-LD vs RDFa compared for 2026 — what Google recommends and how to choose without ranking myths. Part 2 of the series.

Core Web Vitals in 2026: Optimization Quick Wins
A triage-first guide to the quick fixes that most often move LCP, INP and CLS in production, with pointers for the stubborn issues that remain.
Core Web Vitals in 2026: Optimization Quick Wins
A triage-first guide to the quick fixes that most often move LCP, INP and CLS in production, with pointers for the stubborn issues that remain.

Core Web Vitals in 2026: Understanding LCP, INP & CLS
The 2026 guide to Core Web Vitals: what LCP, INP and CLS measure, the updated thresholds, how to test them, and why Lighthouse differs from field data.
Core Web Vitals in 2026: Understanding LCP, INP & CLS
The 2026 guide to Core Web Vitals: what LCP, INP and CLS measure, the updated thresholds, how to test them, and why Lighthouse differs from field data.

Automated Performance Testing with Lighthouse CI and RUM
Run Lighthouse CI in GitHub Actions with performance budgets, then collect Real User Monitoring data for Core Web Vitals.
Automated Performance Testing with Lighthouse CI and RUM
Run Lighthouse CI in GitHub Actions with performance budgets, then collect Real User Monitoring data for Core Web Vitals.

Modern Redux with Redux Toolkit & RTK Query in 2026
A 2026 guide to Redux Toolkit and RTK Query with TypeScript: createSlice, createAsyncThunk, automatic caching and tag-based invalidation.
Modern Redux with Redux Toolkit & RTK Query in 2026
A 2026 guide to Redux Toolkit and RTK Query with TypeScript: createSlice, createAsyncThunk, automatic caching and tag-based invalidation.

Rebuilding My Site with Astro and Tailwind CSS
Why I left Gatsby for Astro, and how I rebuilt my site with Tailwind CSS, Content Collections and MDX, with migration steps and lessons learned.
Rebuilding My Site with Astro and Tailwind CSS
Why I left Gatsby for Astro, and how I rebuilt my site with Tailwind CSS, Content Collections and MDX, with migration steps and lessons learned.

Lessons from Photography for Solving Engineering Problems
Exploring my thoughts on how photography principles like composition, lighting, and creativity can enhance problem-solving and innovation as an engineer.
Lessons from Photography for Solving Engineering Problems
Exploring my thoughts on how photography principles like composition, lighting, and creativity can enhance problem-solving and innovation as an engineer.

Advanced Core Web Vitals: LCP, INP, CDN and Field Data
Go beyond the first fixes with fetchpriority, yielding long tasks, CDN and cache review, and field monitoring, without hunting for a silver bullet.
Advanced Core Web Vitals: LCP, INP, CDN and Field Data
Go beyond the first fixes with fetchpriority, yielding long tasks, CDN and cache review, and field monitoring, without hunting for a silver bullet.

Automated Accessibility Testing with axe-core and Playwright
Run accessibility regression checks in CI with axe-core, Playwright and GitHub Actions, then add manual testing where the tools stop.
Automated Accessibility Testing with axe-core and Playwright
Run accessibility regression checks in CI with axe-core, Playwright and GitHub Actions, then add manual testing where the tools stop.

Creating Accessible Web Forms
A developer's guide to accessible web forms: WCAG 2.2, ARIA roles, semantic HTML, keyboard navigation and clear error handling.
Creating Accessible Web Forms
A developer's guide to accessible web forms: WCAG 2.2, ARIA roles, semantic HTML, keyboard navigation and clear error handling.

Web Accessibility Guide: ARIA, Keyboard and Color Contrast
A practical accessibility guide covering semantic HTML, keyboard support, focus management, color contrast and when ARIA is needed. Updated for WCAG 2.2.
Web Accessibility Guide: ARIA, Keyboard and Color Contrast
A practical accessibility guide covering semantic HTML, keyboard support, focus management, color contrast and when ARIA is needed. Updated for WCAG 2.2.

Automate Frontend Workflows with GitHub Actions Webhooks
Set up CI/CD with custom webhooks in GitHub Actions to deploy Astro, React and static sites automatically when content changes.
Automate Frontend Workflows with GitHub Actions Webhooks
Set up CI/CD with custom webhooks in GitHub Actions to deploy Astro, React and static sites automatically when content changes.

Image Optimization for the Modern Web
Speed up image loading with responsive srcset and sizes, WebP and AVIF conversion, lazy loading and CI automation, with code examples throughout.
Image Optimization for the Modern Web
Speed up image loading with responsive srcset and sizes, WebP and AVIF conversion, lazy loading and CI automation, with code examples throughout.

Core Web Vitals: Real-World Optimization Strategies
Optimize Core Web Vitals for better SEO and UX. Practical strategies for LCP, INP, and CLS with code examples and real-world implementation tips.
Core Web Vitals: Real-World Optimization Strategies
Optimize Core Web Vitals for better SEO and UX. Practical strategies for LCP, INP, and CLS with code examples and real-world implementation tips.

Advanced PWA Guide: Offline, Push and Background Sync
Build offline PWAs with cache-first and network-first strategies, IndexedDB queues, Background Sync and Web Push with VAPID keys, with working code.
Advanced PWA Guide: Offline, Push and Background Sync
Build offline PWAs with cache-first and network-first strategies, IndexedDB queues, Background Sync and Web Push with VAPID keys, with working code.

Link Juice and SEO: Nofollow, Noreferrer and Link Equity
Learn how link juice, the nofollow and noreferrer attributes and link equity work, with advice on managing internal and external links.
Link Juice and SEO: Nofollow, Noreferrer and Link Equity
Learn how link juice, the nofollow and noreferrer attributes and link equity work, with advice on managing internal and external links.

JSON-LD Guide 2026: Implementation, Validation & Sync
Complete 2026 JSON-LD guide: placement, validation, and keeping markup in sync with page content. Part 1 of the Structured Data series.
JSON-LD Guide 2026: Implementation, Validation & Sync
Complete 2026 JSON-LD guide: placement, validation, and keeping markup in sync with page content. Part 1 of the Structured Data series.

Microformats and Microdata: Where They Still Fit
How Microformats and Microdata differ, where each still fits, and why most new Google-focused structured data work now starts with JSON-LD.
Microformats and Microdata: Where They Still Fit
How Microformats and Microdata differ, where each still fits, and why most new Google-focused structured data work now starts with JSON-LD.

Ultimate SEO Checklist for Web Developers: Complete Guide
A developer's SEO checklist covering technical optimizations, metadata, structured data and performance, so search engines and users understand your pages.
Ultimate SEO Checklist for Web Developers: Complete Guide
A developer's SEO checklist covering technical optimizations, metadata, structured data and performance, so search engines and users understand your pages.

Will Artificial Intelligence fully replace Web Developers?
Businesses use AI to boost efficiency and cut costs, yet web development still has no substitute for human expertise. Here is why.
Will Artificial Intelligence fully replace Web Developers?
Businesses use AI to boost efficiency and cut costs, yet web development still has no substitute for human expertise. Here is why.

Grays and Whites: Embracing Life's Ambiguities
How we label the ambiguous parts of our lives, career choices especially, and why embracing the undefined can beat rigid categories.
Grays and Whites: Embracing Life's Ambiguities
How we label the ambiguous parts of our lives, career choices especially, and why embracing the undefined can beat rigid categories.

TypeScript Declaration Merging and Module Augmentation
Extend third-party library types without forking: declaration merging, module augmentation, ambient declarations and .d.ts files, with real examples.
TypeScript Declaration Merging and Module Augmentation
Extend third-party library types without forking: declaration merging, module augmentation, ambient declarations and .d.ts files, with real examples.

TypeScript Type Guards: Narrowing, Predicates and typeof
Use TypeScript type guards for runtime type safety: discriminated unions, custom type predicates, typeof, instanceof and control flow narrowing.
TypeScript Type Guards: Narrowing, Predicates and typeof
Use TypeScript type guards for runtime type safety: discriminated unions, custom type predicates, typeof, instanceof and control flow narrowing.

Trains and the Buddhist Principle of Impermanence
Exploring how train journeys reflect the Buddhist concept of impermanence, teaching us to cherish moments and embrace life's transitory nature.
Trains and the Buddhist Principle of Impermanence
Exploring how train journeys reflect the Buddhist concept of impermanence, teaching us to cherish moments and embrace life's transitory nature.

TypeScript Strict Mode: Best Practices for Production Code
A guide to TypeScript strict mode: configure strictNullChecks, strictPropertyInitialization, noImplicitAny and related options for production code.
TypeScript Strict Mode: Best Practices for Production Code
A guide to TypeScript strict mode: configure strictNullChecks, strictPropertyInitialization, noImplicitAny and related options for production code.

TypeScript Utility Types and Advanced Patterns (2026)
Practical TypeScript utility types: Partial, Pick, Omit, Record, mapped, conditional and template literal types, with production-ready examples.
TypeScript Utility Types and Advanced Patterns (2026)
Practical TypeScript utility types: Partial, Pick, Omit, Record, mapped, conditional and template literal types, with production-ready examples.

Programmatic Lighthouse Audits with Mocha and Chai
A code-first way to automate Lighthouse audits with Mocha, Chai and chrome-launcher. Lighthouse CI is the better default for most new projects.
Programmatic Lighthouse Audits with Mocha and Chai
A code-first way to automate Lighthouse audits with Mocha, Chai and chrome-launcher. Lighthouse CI is the better default for most new projects.

React State Management Without Redux: Context and Reducer
Manage complex React state with useContext and useReducer: a scalable, Redux-like pattern with no external dependencies.
React State Management Without Redux: Context and Reducer
Manage complex React state with useContext and useReducer: a scalable, Redux-like pattern with no external dependencies.

Scalable React Architecture: Redux, Sagas & Services Pattern
Learn Redux architecture patterns for React applications. Complete guide to organizing Redux store, sagas, services, and selectors for enterprise projects.
Scalable React Architecture: Redux, Sagas & Services Pattern
Learn Redux architecture patterns for React applications. Complete guide to organizing Redux store, sagas, services, and selectors for enterprise projects.

Scalable React Architecture: Directory Structure Guide
Learn how to structure React applications with scalable, maintainable architecture. Practical directory organization patterns based on real-world experience.
Scalable React Architecture: Directory Structure Guide
Learn how to structure React applications with scalable, maintainable architecture. Practical directory organization patterns based on real-world experience.

Android Emulator Without Android Studio for React Native
Set up an Android emulator for React Native on Mac, Linux and Windows from the command line, with no Android Studio and minimal resource use.
Android Emulator Without Android Studio for React Native
Set up an Android emulator for React Native on Mac, Linux and Windows from the command line, with no Android Studio and minimal resource use.

React Native Data Encryption: Secure Redux Store Persistence
Encrypt Redux store persistence in React Native with redux-persist-transform-encrypt to protect user data stored on the device.
React Native Data Encryption: Secure Redux Store Persistence
Encrypt Redux store persistence in React Native with redux-persist-transform-encrypt to protect user data stored on the device.

Reduce React Native Android APK Size: Optimization Guide
Reduce the size of a React Native Android app with ProGuard, architecture-specific builds and bundle splitting for a smaller, faster APK.
Reduce React Native Android APK Size: Optimization Guide
Reduce the size of a React Native Android app with ProGuard, architecture-specific builds and bundle splitting for a smaller, faster APK.
No articles found with this tag.
Try another tag or browse all articles.