❯grep -ri "$QUERY" ./posts
Search
Tip: press / anywhere to jump here. Search runs in your browser — no query leaves the page.
❯ls -R ./posts
All posts
91 posts across 1 year
202691
- What's next for api-client, and what I'd do differently
- Troubleshooting api-client: the bugs I actually hit, told straight
- The api-client cheat sheet: every config option and method in one place
- Testing without mocking fetch by hand, again
- Framework guides: Next.js, Vite, edge runtimes, and plain Node
- The SSR RPC bridge, part 2: the security model, threat by threat
- The SSR RPC bridge, part 1: your backend URL is in the browser bundle right now
- The TanStack Query integration: no hand-written query keys
- When your types lie: runtime validation and drift detection
- Codegen: turning your OpenAPI spec into types you actually trust
- Hooks vs events: shaping every request without touching every method
- One BigInt in your log data deletes every other field
- Why your serverless function loses its last logs
- Your fetch timeout starts before the request does
- Stop catching generic Errors: typed error classes and safeMode
- What really happens when two requests share one console.time() label
- How to stop your structured logs from silently drifting out of shape
- My debug log rule did nothing, and the reason was the order of the commas
- I read TanStack Pacer's rate limiter source and found its default window lets nearly double the limit through
- One client, many tenants: doing multi-tenancy without a footgun
- How to stop a dead Redis cache from flooding your logs with the same error thousands of times
- How to catch every uncaught error in a Next.js app, including the ones window.onerror silently misses
- How to turn minified chunk paths in your error logs back into real filenames
- How to tag every log line with a request ID using AsyncLocalStorage (and the 3 places it silently gives you nothing)
- How to stop a re-rendering React component from flooding your logging endpoint
- Why JSON.stringify(error) prints {} in your logs, and how to actually log an Error properly
- How to log from the browser straight into your terminal in Next.js (without opening a public endpoint)
- Why your app feels flaky: dedup, retries, timeouts, and the queue
- Caching without the cross-user data leak
- Auth, all four ways — and the OAuth2 refresh race that breaks most apps
- Global, module, per-call: the config system that stops settings drift
- Global, module, per-call: the config system that stops settings drift
- Composing calls and the response envelope you're throwing away
- Composing calls and the response envelope you're throwing away
- The three concepts you need before you write a single line of api-client
- How to auto-generate and publish blog posts with a GitHub Action
- How to harden a Vercel deploy with security and cache headers
- I kept rebuilding the same fetch wrapper. So I built api-client instead
- How to add an accessible skip link and ARIA-correct navigation
- How to get structured JSON output from the Claude API
- How to avoid render-blocking fonts by self-hosting a variable font
- How to generate an Open Graph image from an SVG template
- How to force dark mode with zero flash of the wrong theme
- How to add Person, ProfilePage, WebSite and FAQPage JSON-LD to a static site
- How to configure Tailwind v4 inline with @theme (no config file)
- How to respect prefers-reduced-motion without breaking your layout
- How to build a CRT / terminal aesthetic with pure CSS
- Building a CRT-terminal portfolio with React 19 and vite-react-ssg
- How to build a custom cursor with mix-blend-mode in React
- How to add touch-swipe navigation in React
- How to add keyboard navigation that doesn't hijack form inputs
- How to debounce wheel scrolling so one flick advances one panel
- How to build a full-page horizontal-scroll slideshow in React
- How to share one Zod schema between a React form and a serverless handler
- How to make typing animations SSG-safe and hydration-friendly
- How to build an accessible form with react-hook-form and Zod
- How to make tabbed/one-at-a-time React UI crawlable with sr-only mirrors
- How to stop form spam with a honeypot field
- How to keep your React code SSG-safe by avoiding browser globals
- How to add simple in-memory rate limiting to a Vercel serverless function
- How to improve SEO for a client-side React + Vite app with vite-react-ssg
- How to send email from a serverless function with Resend
- JWT refresh-token rotation and RBAC, the boring-but-correct way
- How to style an Astro blog with Tailwind v4 and no config file
- How to unit-test a form and serverless handler with Vitest
- How to theme Shiki syntax highlighting in Astro
- How to build an image, SVG, and code lightbox with zoom and keyboard support
- How to format dates consistently with a reusable Astro component
- How to add Giscus (GitHub Discussions) comments to an Astro blog
- How to add privacy-friendly analytics to an Astro site
- How to unify authorship across two sites by sharing one Person @id in JSON-LD
- How to design a custom 404 page in Astro
- How to add BlogPosting and BreadcrumbList JSON-LD to Astro posts
- How to build dynamic post routes with getStaticPaths in Astro
- How to add RSS, a sitemap, and SEO metadata to Astro with a reusable BaseHead
- What shipping at 5 companies in under 2 years actually taught me
- How to add a tag system with index and per-tag pages in Astro
- How to build related posts and prev/next navigation in Astro
- How to build a typed content collection with a Zod frontmatter schema in Astro
- How to add privacy-friendly full-text search to a static Astro site with Pagefind
- How to opt into the unified remark/rehype pipeline in Astro 7
- How to keep all your site content in one typed data file
- How to build a code-block toolbar (copy + fullscreen) with a rehype plugin
- How to do a blur-in image reveal with CSS
- How to write a custom remark plugin to add reading time in Astro
- How to build animated skill bars with pure CSS keyframes
- How to theme Mermaid when your palette uses OKLCH
- How to trigger entrance animations only when a section is on screen
- How to lazy-load the Mermaid runtime only on pages that have a diagram
- How to build an SSR-safe React error boundary
- How to render Mermaid diagrams in Astro MDX