Posts
110 entries
- Expressive Code: code blocks that explain themselves2026-10-23
- A Mermaid diagram gallery2026-10-23
- Senior engineers often write less code2026-09-30
- Choose between git hooks and CI checks2026-09-03
- Postmortem: hunting a flaky E2E test in CI2026-07-30
- Organize large stylesheets with cascade layers2026-07-29
- Stop adding abstraction before the second use case2026-07-28
- What rebuilding my todo app three times taught me about state2026-07-08
- What we learned redesigning our loading states2026-06-24
- Build Astro error pages that actually help users2026-06-18
- Track down unnecessary re-renders in a data table2026-06-17
- Add rate limiting to an Express API2026-05-19
- Compare passkeys and password managers2026-05-15
- Teach what you just learned, while it is still awkward2026-05-14
- Animate list changes with Vue's transition-group2026-04-07
- Use pprof to find a Go bottleneck2026-04-07
- Implement offline-first notes with conflict resolution2026-04-02
- Why our design system stalled after six months2026-03-12
- A checklist for reviewing AI-generated code2026-03-05
- Find and fix event listener memory leaks2026-02-25
- Build immutability habits in everyday JavaScript2026-02-17
- Speed up navigation with prefetch and prerender2026-02-09
- Load environment variables with type-safe configuration2026-01-20
- Cut cloud spend by right-sizing three overloaded servers2026-01-15
- Why we deleted half our E2E suite2026-01-12
- Case study: 40,000 programmatic SEO pages, six months later2026-01-09
- Postmortem: a migration that locked our production table2025-11-26
- Async writing beats one more meeting2025-11-23
- Clean up history with an interactive rebase workflow2025-11-12
- Postmortem: an API key leaked for nine days2025-10-02
- Run a weekly demo day your team actually looks forward to2025-10-02
- Catch common accessibility mistakes in your markup2025-09-18
- Load data with React Server Components and avoid the waterfall2025-09-09
- Compare scroll-driven animations with JavaScript2025-08-26
- Design keyboard navigation by default, not as an add-on2025-08-18
- Compare structuredClone and JSON round-tripping2025-07-14
- What a 24-hour hackathon taught me about scope2025-06-24
- Narrow unknown safely after JSON.parse2025-06-21
- Lessons from rewriting instead of refactoring2025-05-27
- Handle failed runs with retries and error workflows2025-05-12
- Open-source your internal tools without regret2025-04-11
- Fix the microcopy mistakes in your form errors2025-03-11
- Decide when Astro SSR is worth it2025-03-09
- Measure Core Web Vitals with real user monitoring2025-02-26
- Build a local RAG knowledge base over your own notes2025-02-17
- Compare GitHub Actions with GitLab CI for small teams2025-02-13
- Handle errors consistently across an Express app2025-01-28
- Build a weather widget from a public API2025-01-23
- Compare goroutines and a worker pool2025-01-19
- Measure the real cost of third-party scripts2025-01-15
- Build a full color palette from one brand color2024-12-05
- Serve responsive images with the picture element2024-12-02
- Ship database changes safely with expand and contract2024-11-19
- Why we ship the feature flag before the feature2024-11-19
- Make an accessible tooltip using only CSS2024-11-12
- Understand currying through real API examples2024-11-05
- Burnout signs engineers tend to ignore2024-10-21
- Add structured data markup to blog posts2024-10-16
- Run a Postgres restore drill you can actually trust2024-10-08
- Tell watch and watchEffect apart in Vue 32024-09-25
- Choose between webhook and polling triggers in n8n2024-09-17
- Why framework churn exhausts frontend teams2024-09-16
- Understand tool calling patterns for reliable LLM agents2024-09-12
- Recover lost commits with git reflog2024-08-27
- Break down a shortest-path interview question step by step2024-08-12
- Dark mode is a system, not a feature2024-08-09
- Snapshot tests create false confidence2024-08-07
- Understand transactions and isolation levels2024-07-16
- Why your generic constraint fails on union types2024-07-09
- Audit cookie flags with a six-point checklist2024-06-10
- Diagnose main-thread jank with the DevTools performance panel2024-05-30
- Compare React Context with a state library before you pick2024-05-28
- Handle form submissions with Astro Actions2024-05-22
- The case for boring, predictable forms2024-03-19
- Postmortem: a session cookie that kept vanishing in Safari2024-03-19
- Build a Go CLI with Cobra and persistent flags2024-03-05
- Onboard a new teammate without drowning them2024-02-14
- Build a drag-to-sort list with Pointer Events2024-01-30
- Treat empty states as your quietest onboarding2023-12-05
- Read code from other people on purpose2023-12-04
- Structure middleware so routes stay readable2023-11-14
- Monorepo or multi-repo: choose with trade-offs, not vibes2023-11-08
- When not to reach for an LLM2023-11-08
- What three months of invoice automation taught me2023-11-06
- Design blank screens that tell users what to do next2023-10-19
- Understand Content Security Policy headers2023-09-27
- Avoid layout shift caused by web fonts2023-09-26
- Why pure functions pay off in messy codebases2023-09-14
- Cache dependencies to cut CI build time2023-08-29
- Run a blameless postmortem after an outage2023-08-22
- Understand Astro islands and partial hydration2023-08-14
- Build a Kanban board with native drag and drop2023-08-03
- Improve Core Web Vitals on a content-heavy site2023-07-03
- What twelve months of monthly writing taught me2023-06-30
- Wrap Go errors without losing the story2023-06-21
- Lessons from rewriting a legacy jQuery dashboard2023-06-14
- Compare provide/inject with props drilling in Vue 32023-06-12
- Design empty states that actually guide users2023-05-22
- Find the bad commit with git bisect2023-05-16
- Run a triage workflow for flaky tests2023-05-16
- Understand layout, paint, and composite in the browser2023-05-09
- Use satisfies instead of as when you only need checking2023-04-15
- Understand the JavaScript event loop2023-04-11
- Cancel stale requests the right way with useEffect2023-04-11
- Choose the right index for a slow query2023-04-10
- Set up an Nginx reverse proxy with automatic SSL renewal2023-03-21
- Know when to reach for the native dialog element2023-03-21
- Understand CSS Subgrid alignment2023-03-13
- Add retry with exponential backoff and jitter2023-03-07
- What a hundred days of coding challenges did to my problem solving2023-02-15