Blog

Writing about AI-assisted development, software engineering, and personal projects.

·5 min read

Why I stopped using feature flags as configuration and started treating them as code

Feature flags stored in external systems create deployment coupling and make debugging production issues nearly impossible.

AI Dev
feature-flags
deployment
debugging
·4 min read

Why I stopped using React's useEffect for component cleanup

useEffect cleanup functions create memory leaks and race conditions when you don't understand React's rendering lifecycle.

AI Dev
react
hooks
performance
·5 min read

Why I stopped using AI code suggestions for critical business logic

AI coding assistants excel at boilerplate and patterns, but they create subtle bugs in complex business rules that are expensive to fix.

AI Dev
ai
coding
business-logic
·5 min read

Why I stopped using Git hooks for automated code quality checks

Git hooks seem perfect for enforcing code standards, but they create inconsistent environments and frustrating developer experiences.

AI Dev
git
hooks
ci
·4 min read

Why I stopped using Vite's default dev server for API development

Vite's dev server is blazing fast for frontend builds, but proxying API requests creates debugging nightmares and deployment mismatches.

AI Dev
vite
api
development
·5 min read

Why I stopped using React's useState for async operations

useState handles synchronous state perfectly, but async operations need proper loading states, error handling, and race condition prevention.

AI Dev
react
usestate
async
·4 min read

Why I stopped using React's useContext for component communication

useContext seems perfect for sharing state, but it causes unnecessary re-renders and makes component testing nearly impossible.

AI Dev
react
usecontext
context
·4 min read

Why I stopped using React's useRef for DOM manipulation and started using callback refs

useRef seems like the obvious choice for DOM access, but callback refs handle dynamic elements and cleanup automatically.

AI Dev
react
useref
dom
·4 min read

Why I stopped using React's useState for server state management

useState seems natural for API data, but it creates stale state bugs and makes caching impossible.

AI Dev
react
state-management
usestate
·4 min read

Why I stopped using React's useCallback everywhere

useCallback seems like a performance optimization, but overusing it actually makes your app slower and harder to maintain.

AI Dev
react
performance
usecallback
·5 min read

Why I stopped using React's useEffect for API error handling

useEffect seems like the right place for error handling, but it creates unpredictable error states and makes debugging a nightmare.

AI Dev
react
error-handling
useeffect
·5 min read

Why I stopped using React's useState for complex form validation

useState feels natural for forms, but it creates a tangled mess of validation logic that's hard to test and maintain.

AI Dev
react
forms
state-management
·5 min read

Why I stopped using GitHub Copilot's first suggestion

Accepting Copilot's first suggestion feels productive, but it often leads to technical debt and missed learning opportunities.

AI Dev
github-copilot
ai-development
code-quality
·5 min read

Why I stopped using environment variables for feature flags

Environment variables seem like the obvious choice for feature flags, but they create deployment headaches and limit runtime flexibility.

AI Dev
feature-flags
deployment
configuration
·4 min read

Why I stopped using Prettier's default configuration

Prettier's defaults work for most teams, but customizing key rules improved my code readability and Git diffs.

AI Dev
prettier
code-formatting
developer-experience
·4 min read

Why I stopped using React.memo() everywhere and started measuring first

React.memo() feels like free performance, but it often creates more problems than it solves.

AI Dev
react
performance
optimization
·5 min read

Why I stopped using React's useState for form state management

React Hook Form and controlled components solve different problems -- here's when to use each approach.

AI Dev
react
forms
state-management
·4 min read

Why I stopped using Docker Compose for local development

Native tooling and package managers are faster and more reliable than containerizing every development dependency.

AI Dev
docker
local-development
tooling
·4 min read

Why I stopped using console.log and started using structured logging

Structured logging with proper levels and context makes debugging production issues infinitely easier than scattered console.log statements.

AI Dev
logging
debugging
observability
·4 min read

Why I build with TypeScript interfaces instead of types for public APIs

Interfaces provide better extensibility and clearer intent than type aliases when designing public APIs and component props.

AI Dev
typescript
api-design
interfaces
·5 min read

Why I stopped writing integration tests and started testing user flows

Traditional integration tests miss the forest for the trees -- testing user flows catches real bugs that matter to your users.

AI Dev
testing
user-flows
integration-tests
·5 min read

Why I stopped using React's useEffect for data fetching

Modern data fetching patterns with React Query and SWR eliminate most useEffect complexity while providing better user experience.

AI Dev
react
data-fetching
useeffect
·5 min read

My workflow for debugging production issues with AI assistance

How I use AI to quickly identify root causes and generate fixes for production bugs without panic-driven debugging.

AI Dev
debugging
ai-dev
production
·5 min read

Why I write unit tests with AI pair programming instead of TDD

AI pair programming generates better test cases faster than traditional TDD, while still maintaining code quality and coverage.

AI Dev
testing
ai-dev
productivity
·4 min read

Why I switched from complex test frameworks to Node.js built-in test runner

Node.js 18's built-in test runner eliminates dependencies and simplifies testing without sacrificing functionality.

AI Dev
testing
nodejs
tooling
·4 min read

Why I build internal tools before reaching for third-party solutions

Building your own tools first teaches you the problem domain and often leads to simpler, more maintainable solutions.

AI Dev
tooling
architecture
productivity
·5 min read

The hidden cost of over-engineering your development environment

Why complex dev setups often hurt productivity more than they help, and how I learned to embrace boring tools.

AI Dev
productivity
tooling
development
·4 min read

Why I stopped using npm install for development

Switching to pnpm and Corepack improved my development workflow, disk usage, and dependency management across projects.

AI Dev
pnpm
nodejs
tooling
·4 min read

MDX is underrated for developer blogs

Why I switched from plain markdown to MDX and never looked back -- interactive examples and component reuse changed everything.

AI Dev
mdx
blogging
react
·4 min read

How I use AI to review my own pull requests

My self-review workflow using Claude to catch bugs and improve code quality before my teammates even see it.

AI Dev
ai
code-review
workflow
·4 min read

Setting up a Cloudflare Workers CI/CD pipeline from scratch

Building a complete deployment pipeline for Cloudflare Workers using GitHub Actions and Wrangler CLI.

AI Dev
cloudflare
cicd
deployment
·4 min read

Practical TypeScript patterns I use every day

The TypeScript utility types, discriminated unions, and branded types that make my code cleaner and safer in production.

AI Dev
typescript
patterns
development
·1 min read

Building in Public: My Personal Site

Why I built rjemerson.com with Next.js 15, MDX, and Cloudflare Workers — and what I learned along the way.

AI Dev
nextjs
cloudflare
mdx
·3 min read

Building with AI Agents: Lessons from Real-World Projects

What I learned integrating AI coding agents into my daily workflow and how it changed the way I think about software architecture.

AI Dev
AI
agents
development
·4 min read

Running Local LLMs for Development: A Practical Guide

A deep dive into setting up local language models for code generation, review, and testing.

AI Dev
LLM
local
ollama
·3 min read

Why I Chose Cloudflare Workers Over Vercel for My Projects

Comparing deployment platforms for Next.js applications. Costs, cold starts, edge compute, and DX.

Personal
cloudflare
infrastructure
nextjs