
Dev
Development lessons from real work.
140 posts
140 posts
2026
- Built an AI Personal Assistant on Mac mini - OpenClaw Setup to Cost Optimization
- React Compiler: Drop useMemo and useCallback, Let the Compiler Handle It
- JavaScript Set New Methods - intersection, union, difference Practical Guide
- Clean Up Async Code with JavaScript Promise.withResolvers()
- Node.js AsyncLocalStorage - Stop Passing requestId Through Every Function
- TypeScript Type Guards with 'is' Keyword - Narrowing Union Types Safely
- React Error Boundary in Practice - Prevent Your App from Crashing
- CSS animation-timeline: scroll() — Scroll Animations Without JavaScript
- Node.js stream.pipeline - Process Large Files Without Memory Overflow
- Node.js --env-file: Native .env Support Without dotenv
- TypeScript Record Type: Building Type-Safe Dictionaries
- PostgreSQL JSONB Query Optimization with GIN Index
- Selectively Stash Files with git stash push -m
- TypeScript Pick, Omit, Partial: Practical Utility Type Combinations
- git bisect - Find the Bug-Introducing Commit with Binary Search
- Docker Compose Watch: Hot Reload for Containerized Development
- Extracting Generic Types with TypeScript infer Keyword
- git worktree: Work on Multiple Branches Without Switching
- Instant UI Updates with React useOptimistic Hook
- CSS Container Queries: Component-Level Responsive Design
- TypeScript as const: Stop Type Widening for Good
- Promise.allSettled vs Promise.all: Handle Partial Failures Gracefully
- Generate UUIDs in Node.js Without the uuid Package
- TypeScript Enum vs Union Type: Which One Should You Use?
- Next.js 15 Changed the Default Fetch Cache - How to Handle no-store
- Serve Static Sites with Nginx + Docker
- I Asked AI to Build an App and It Was Done in a Day - But Store Registration Took 3 Days
- Cookie Authentication with localStorage Fallback
- Set Up a Monorepo with pnpm Workspace
- Next.js API Proxy with rewrites for Microservices
- How to Properly Type React useRef with TypeScript
- Estimate LLM Token Count - Korean vs English Differences
- Type-Safe API Responses with TypeScript Generics
- Zod: Runtime Type Validation for TypeScript
- Build an FPS Monitor with requestAnimationFrame
- TypeScript satisfies Operator: Type Safety Without Losing Inference
- React useEffect Infinite Loop: 3 Causes and How to Fix Them
- Restructuring Jekyll Multilingual Blog URLs and Overhauling Pagination
- My $50 Credit Vanished in 3 Hours - The Real Cost of Claude Code 1M
- Escaping Compacting Hell - Claude Code 1M Context Model Review
- AI Can Do Everything Now - So What Should We Build?
- CORS Error Complete Guide - From Cause to Next.js/Express Setup
- Auto-Deploy Docker Images to ECR with GitHub Actions
- Python FastAPI + SQLAlchemy Async Database Connection Pattern
- AWS Lambda Deploy Script - Auto-Find CDK Function Names
- Everyone's Talking About OpenClaw, But I Was Already Building the Korean Version
- Deep Copy in JavaScript with structuredClone
- CSS :has() Selector: The Parent Selector We've Been Waiting For
- Docker Volume vs Bind Mount: When to Use Which
- I Asked AI to Design a 3D Hardware Case - It Took 5 Minutes
- Python match-case: Cleaner Alternative to if-elif Chains
- S3 Presigned URLs - Build One-Time Download Links
- JavaScript Temporal API - Finally a Proper Date Replacement
- React useDeferredValue: Optimize Search Without Debounce
- Organizing CSS Priority with @layer
- Array Grouping in One Line with Object.groupBy
- Handling Fetch Timeouts with Node.js AbortController
- DynamoDB ConditionExpression for Concurrency Control
- Offload CPU-Intensive Tasks with Node.js worker_threads
- Reduce Selector Repetition with CSS :is() and :where()
- Create Immutable Data Objects with Python dataclass(frozen=True)
- AWS CDK - Build a SES Email Lambda in Minutes
- I Tried Opencode... Turns Out Claude Code Already Does It All
- What Services Should You Build in the AI Era - It All Comes Down to Data
- Vite Monorepo - Allow Parent Directory Access with server.fs.allow
- Using __dirname in ES Modules - import.meta.url Approach
2025
- Redis Key Naming Convention - Hierarchical Key Design
- Electron contextIsolation + Preload Security Pattern
- Node.js --expose-gc for Memory Leak Debugging
- S3 Cache Busting - Always Fetch the Latest File
- Prisma Index Strategy - Composite Indexes and Sort Direction
- Next.js Health Check API - Essential Production Monitoring Endpoint
- Node.js TCP Port Scanner - Using net.Socket with Timeout
- Node.js Get Local IP Address - Cross-Platform (Win/Mac/Linux)
- Next.js HttpOnly Cookie JWT Auth - Protect Tokens from XSS
- Docker Compose Redis Healthcheck - Guarantee Startup Order
- Building a Kiosk with Raspberry Pi - More Pitfalls Than Expected
- Auto-Inject Bearer Token with a fetch API Auth Helper
- Can One Person Really Develop Entire Projects? 200% AI Utilization with CDK + Lambda + Cursor
- Creating Naver/Kakao OIDC for Firebase? Reality Hits Different
- JavaScript Intl.NumberFormat - Format Numbers Without Libraries
- Unity + Firebase Authentication Journey: From Anonymous to Account Linking
- Building a GitHub Pages Tech Blog with AI - Complete Series Guide
- Building a GitHub Pages Tech Blog with AI (5) - Completing Jekyll Multilingual Blog with MCP
- Building a GitHub Pages Tech Blog with AI (4) - Perfect Implementation of Dark/Light Mode with MCP
- Building a GitHub Pages Tech Blog with AI (3) - Setting up Giscus Comment System in 5 Minutes with MCP
- Building a GitHub Pages Tech Blog with AI (2) - Complete Automation of SEO-Optimized Tech Posting with MCP
- Complete RAG Guide: Understanding True Data Integration AI through Manufacturing MES Systems
- AI Development Reality Check: Lessons from Blog Automation
- Building a GitHub Pages Tech Blog with AI (1) - Creating Jekyll Blog Locally with Claude Desktop MCP
- Automating Blog Image Generation with Vertex AI Imagen: From Python Package to MCP Server
- vertex-ai-imagen: A Simple Python Package for Google Vertex AI Imagen
- Easy MCP Installation Using Existing MCPs - Practical Guide for Installing Playwright MCP
- Building a Complete Tech Blog with Claude Desktop + MCP: The Reality of AI Pair Programming
- Getting Started with a Tech Blog Using GitHub Pages
- PM2 Cluster Mode for Next.js Production Performance
- Python Timestamp Guide - Current Time, Conversion, and Practical Usage
- Node.js Redis Singleton Connection + Auto-Reconnect Strategy
- Docker Compose YAML Anchors (&) - Eliminate Repeated Config
- How to Get Good Code From AI - It's Not Just About Prompts
- Cursor Agent After One Month - Where AI Coding Actually Stands
- Docker Multi-Stage Build for Next.js - Optimize Image Size
- Running LLMs Locally With Ollama - It Depends on the Use Case
- API Endpoint Security Without Authentication - How Far Should You Go?
- Next.js Prisma Singleton Pattern - Fix Hot Reload Connection Leaks
- JavaScript UTC to KST Conversion - 3 Utility Functions for Production
2024
- Vector Databases - Do You Actually Need One?
- Creating a Gnuboard Q&A Site Using ChatGPT-4o - Idea Journal
- Giving SvelteKit a Try - Am I Framework-Hopping Again?
- Linux SSH Key Generation - Complete ssh-keygen Guide
- Building an Automated Naver Blog Posting System with AWS Lambda + S3 + CloudWatch + SNS
- Hardware-Based Key Management and Access Control System Design Using Thingplug
- Using ChatGPT for Microservice Architecture Design - An Honest Review
- Linux System Resource Monitoring with htop
- Building Remote Desktop with AWS EC2 - Reality and Future of Cloud Work Environment
- Adding Specific Files from Ignored Directories in .gitignore
2023
- Setting up SSH Push with Bitbucket Access Key
- Installing LEMP Stack on Ubuntu 18.04LTS: Complete Guide to Nginx, MariaDB, PHP 7.1
- Complete Guide to Configuring MariaDB External Access
- Setting up nginx Bandwidth Limiting - Complete limit_rate Guide
- Complete Guide to GitKraken GitHub Organization Repository Integration
- Creating Photoshop Effects with CSS Blend Modes - Complete Guide to background-blend-mode and mix-blend-mode
- Complete Guide to Gnuboard Hook Usage and Event Types
- JavaScript Number Padding with Zeros - Complete Guide to padStart() and Custom Functions
- Complete Guide to MySQL/MariaDB Database Backup and Restore via Console
- Complete Guide to Fixing Chrome Yellow Autocomplete Bug - Experimental Features Reset & Korean Input Method Setup
- Adding Values to HTTP Headers in JavaScript jQuery AJAX Communication
- ThemePress Addon Server Architecture - Microservice-Based Scalable Web Platform Design
- Configuring Apache to Recognize PHP Code in HTML Files
- Critical Mistake to Avoid When Integrating Amazon Cognito with JavaScript
- Complete Guide to Linux tar Command - Everything About Compression and Extraction
- Fixing Korean Character Encoding Issues After Apache Server Migration
2022
2021
2020
- AWS Certified Developer Associate - Exam Review and How I Passed
- An On-Premise Developer Falls Hard for AWS
- MySQL uuid() in Practice - Stop Exposing Auto Increment PKs in URLs
- From On-Premise to Cloud - Confessions of a Developer Who Keeps Postponing Migration
- My Honest Review After Using Docker for Every Project for 2 Years