How I built Wooster

A dedicated series covering the development of Wooster, an AI-powered trip planning project. Explore the journey from an initial one-week MVP sprint, to deployment, and further feature implementation and refactoring.

Express Error Handling: Because Things Will Go Wrong
ExpressNodeJSBackendError HandlingTypeScriptPinoWooster

Express Error Handling: Because Things Will Go Wrong

From try-catch hell to elegant error handling: A deep dive into implementing robust error handling in Express with TypeScript, custom error types, and global middleware.

Making Wooster Talk: A Deep Dive into Structured Logging
PinoNodeJSBackendLoggingTypeScriptExpressWooster

Making Wooster Talk: A Deep Dive into Structured Logging

From chaotic console.logs to structured logging: How Wooster learned to communicate clearly using Pino, environment-aware configuration, and proper log levels.

From Fetch Mocks to MSW: A Testing Journey
TestingMSWAxiosTypeScriptVitestWooster

From Fetch Mocks to MSW: A Testing Journey

How a simple Axios refactor led me down the path of modernizing my test mocks with Mock Service Worker, and the valuable lessons learned along the way.

Refactoring Wooster's API Layer: A Simple Approach with Axios
AxiosTypeScriptREST APIRefactoringAuthenticationFrontend DevelopmentWooster

Refactoring Wooster's API Layer: A Simple Approach with Axios

Moving from fetch to Axios: simplifying API calls, adding interceptors for authentication, and improving error handling - all while following the official documentation patterns.

Deploying Wooster: A Tale of Memory Limits and Nginx Configs
DevOpsDigital OceanNginxGitHub ActionsDeploymentWooster

Deploying Wooster: A Tale of Memory Limits and Nginx Configs

Adventures in deploying an AI travel planner: memory limits, OAuth drama, and rate limits.

State Management: Teaching Wooster to Remember Things
State ManagementReact ContextTypeScriptCustom HooksCaching StrategiesWooster

State Management: Teaching Wooster to Remember Things

Building a clean, efficient state management system for Wooster using React, Supabase, and TypeScript: a look into reducer patterns, data fetching, caching strategies, and lessons learned from minimizing useEffect usage.

Structuring the Front End: Building Wooster's User Interface
Frontend ArchitectureReactTypeScriptUI/UXComponent DesignResponsive DesignWooster

Structuring the Front End: Building Wooster's User Interface

Creating a well-structured front end for Wooster with a feature-driven component architecture, engaging UI, and a balance of simplicity and interactivity.

Building a Scalable Express Backend for Wooster
ExpressTypeScriptMVCAPI DesignBackendWooster

Building a Scalable Express Backend for Wooster

From MVC architecture to endpoint design: Building a scalable Express backend that even a golden retriever could understand.

Teaching an AI Dog New Tricks (The Gemini Integration)
Gemini APIExpressSupabasePostgreSQLTypeScriptAIWooster

Teaching an AI Dog New Tricks (The Gemini Integration)

Integrating Google's Gemini API to give Wooster its personality: prompt engineering, response parsing, and teaching an AI to think like a golden retriever.

Building Wooster's Backend Brain
ReactTypescriptExpressSupabaseAILLMWooster

Building Wooster's Backend Brain

Teaching an AI dog new tricks: database design, Express endpoints, and why I'm probably overthinking this.

Full Stack in a Week: Building an AI Trip Planner
ReactTypescriptExpressSupabaseAILLMWooster

Full Stack in a Week: Building an AI Trip Planner

Building a full-stack AI trip planner in one week - featuring a golden retriever named Wooster