<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Brandon Wie</title>
    <description>Software engineering insights, tutorials, and learnings</description>
    <link>https://brandonwie.dev</link>
    <atom:link href="https://brandonwie.dev/rss.xml" rel="self" type="application/rss+xml"/>
    <language>en-us</language>
    <lastBuildDate>Wed, 20 May 2026 08:01:16 GMT</lastBuildDate>
    
    <item>
      <title><![CDATA[AI Code Review Confusion Patterns]]></title>
      <description><![CDATA[Thirteen distinct ways Claude, Copilot, and Codex behave on PRs — ten failure modes plus two productive behaviors to amplify, plus an analyst-side error class. With detection signals and the empirical tiebreaker that resolves factual disagreements.]]></description>
      <link>https://brandonwie.dev/posts/ai-code-review-confusion-patterns</link>
      <guid isPermaLink="true">https://brandonwie.dev/posts/ai-code-review-confusion-patterns</guid>
      <pubDate>Wed, 20 May 2026 00:00:00 GMT</pubDate>
      <category>ai-ml</category>
      <category>code-review</category>
      <category>ai-reviewer</category>
      <category>confusion-patterns</category>
      <category>copilot</category>
      <category>claude</category>
      <category>codex</category>
    </item>
    <item>
      <title><![CDATA[Claude Code Agent Teams]]></title>
      <description><![CDATA[Experimental feature for orchestrating multiple Claude Code instances as a coordinated team with shared task lists and inter-agent messaging]]></description>
      <link>https://brandonwie.dev/posts/claude-code-agent-teams</link>
      <guid isPermaLink="true">https://brandonwie.dev/posts/claude-code-agent-teams</guid>
      <pubDate>Wed, 20 May 2026 00:00:00 GMT</pubDate>
      <category>ai-ml</category>
      <category>claude-code</category>
      <category>agent-teams</category>
      <category>experimental</category>
    </item>
    <item>
      <title><![CDATA[FastAPI Non-blocking Startup Dependencies]]></title>
      <description><![CDATA[FastAPI lifespan code runs before the application accepts requests. If startup awaits an optional dependency such as Kafka, Cloud Run cold starts can fail health checks and E2E probes even when the API would happily serve routes without it.]]></description>
      <link>https://brandonwie.dev/posts/fastapi-nonblocking-startup-dependencies</link>
      <guid isPermaLink="true">https://brandonwie.dev/posts/fastapi-nonblocking-startup-dependencies</guid>
      <pubDate>Wed, 06 May 2026 00:00:00 GMT</pubDate>
      <category>backend</category>
      <category>python</category>
      <category>fastapi</category>
      <category>kafka</category>
      <category>cloud-run</category>
      <category>transferable</category>
    </item>
    <item>
      <title><![CDATA[Anthropic Prompt Cache TTL + Cost Mechanics]]></title>
      <description><![CDATA[Anthropic silently dropped Claude Code's prompt-cache TTL from 1 hour to 5 minutes around early March 2026. Without explicit awareness, idle gaps ≥5 min between messages evaporate the cache and force a full cold cache-write on the next message — pricing it at 1.25× base input on the entire conversation prefix.]]></description>
      <link>https://brandonwie.dev/posts/anthropic-prompt-cache-ttl</link>
      <guid isPermaLink="true">https://brandonwie.dev/posts/anthropic-prompt-cache-ttl</guid>
      <pubDate>Wed, 06 May 2026 00:00:00 GMT</pubDate>
      <category>knowledge</category>
      <category>devops</category>
      <category>ai-ml</category>
      <category>claude-code</category>
    </item>
    <item>
      <title><![CDATA[Codex Skill Mirror Pattern]]></title>
      <description><![CDATA[When a repository already treats `.agents/skills/` as the canonical skill source, the clean Codex integration is not "replace it with `.codex/skills/`" or "symlink the whole folder wholesale." A mirror layer with selective adapters preserves the canonical source while giving Codex what it needs.]]></description>
      <link>https://brandonwie.dev/posts/codex-skill-mirror-pattern</link>
      <guid isPermaLink="true">https://brandonwie.dev/posts/codex-skill-mirror-pattern</guid>
      <pubDate>Wed, 06 May 2026 00:00:00 GMT</pubDate>
      <category>devops</category>
      <category>codex</category>
      <category>claude-code</category>
      <category>skills</category>
      <category>interoperability</category>
    </item>
    <item>
      <title><![CDATA[Two-Phase Invocation as a Manual Merge Gate]]></title>
      <description><![CDATA[When a CI/CD automation skill supports an "all-in-one" mode (`/skill +flag`), the all-in-one mode should be opt-in, not the default. Splitting invocations preserves a meaningful pause point between CI green and the irreversible merge.]]></description>
      <link>https://brandonwie.dev/posts/crucio-ship-two-phase-merge-gate</link>
      <guid isPermaLink="true">https://brandonwie.dev/posts/crucio-ship-two-phase-merge-gate</guid>
      <pubDate>Wed, 06 May 2026 00:00:00 GMT</pubDate>
      <category>devops</category>
      <category>automation</category>
      <category>ci-cd</category>
      <category>deployment</category>
      <category>gating</category>
    </item>
    <item>
      <title><![CDATA[`gh pr view` Head-Branch Ambiguity (False-Negative)]]></title>
      <description><![CDATA[Running `gh pr view --json number,state` on a branch with an open PR can return "no pull requests found" even when the PR exists and the branch is correctly tracked. The empty result means "gh's branch resolution didn't find one," not "no PR exists."]]></description>
      <link>https://brandonwie.dev/posts/gh-pr-view-head-branch-ambiguity</link>
      <guid isPermaLink="true">https://brandonwie.dev/posts/gh-pr-view-head-branch-ambiguity</guid>
      <pubDate>Wed, 06 May 2026 00:00:00 GMT</pubDate>
      <category>devops</category>
      <category>github-cli</category>
      <category>gh</category>
      <category>pr-management</category>
    </item>
    <item>
      <title><![CDATA[`git rev-parse HEAD` vs `git log -1` Divergence Under Watcher Hooks]]></title>
      <description><![CDATA[After a `gh pr merge` and a local pull, `git rev-parse HEAD` returned the correct merge commit while `git log -1` rendered the just-merged-away feature branch tip for several seconds. A graphify watcher rebuild fired during the checkout. The low-level read is authoritative; the log render can lag.]]></description>
      <link>https://brandonwie.dev/posts/git-rev-parse-vs-log-hook-interception</link>
      <guid isPermaLink="true">https://brandonwie.dev/posts/git-rev-parse-vs-log-hook-interception</guid>
      <pubDate>Wed, 06 May 2026 00:00:00 GMT</pubDate>
      <category>devops</category>
      <category>git</category>
      <category>watcher-hooks</category>
      <category>debugging</category>
      <category>graphify</category>
    </item>
    <item>
      <title><![CDATA[Markdownlint Pre-Commit: MD041 + MD001 Heading Gotchas]]></title>
      <description><![CDATA[Two markdownlint rules that repeatedly block husky pre-commit on newly-created markdown files with YAML frontmatter. Both fire silently, neither is auto-fixed by --fix, and they tend to appear together — fixing one exposes the other.]]></description>
      <link>https://brandonwie.dev/posts/markdownlint-pre-commit-heading-rules</link>
      <guid isPermaLink="true">https://brandonwie.dev/posts/markdownlint-pre-commit-heading-rules</guid>
      <pubDate>Wed, 06 May 2026 00:00:00 GMT</pubDate>
      <category>devops</category>
      <category>markdown</category>
      <category>tooling</category>
      <category>pre-commit</category>
    </item>
    <item>
      <title><![CDATA[Serena MCP — Multi-Profile Setup for Claude Code (cpers/cwork)]]></title>
      <description><![CDATA[Installing the Serena MCP server across a Claude Code dual-profile setup (cpers/cwork) plus Codex, including the four recommended hooks, the system-prompt override, and the non-obvious "installer writes to default ~/.claude.json, misses profile-specific stores" trap.]]></description>
      <link>https://brandonwie.dev/posts/serena-claude-code-multi-profile-setup</link>
      <guid isPermaLink="true">https://brandonwie.dev/posts/serena-claude-code-multi-profile-setup</guid>
      <pubDate>Wed, 06 May 2026 00:00:00 GMT</pubDate>
      <category>devops</category>
      <category>claude-code</category>
      <category>mcp</category>
      <category>serena</category>
      <category>dual-profile</category>
      <category>cpers</category>
      <category>cwork</category>
      <category>transferable</category>
    </item>
    <item>
      <title><![CDATA[State-invariant flag drift — recovery via reconciliation pass]]></title>
      <description><![CDATA[A boolean lifecycle flag kept getting stuck on entries that could never reach the code path that clears it. Symptom-only fixes recurred. The durable fix was a third workflow that enforces the invariant the flag implies, independent of how the flag got set.]]></description>
      <link>https://brandonwie.dev/posts/state-invariant-flag-drift-recovery</link>
      <guid isPermaLink="true">https://brandonwie.dev/posts/state-invariant-flag-drift-recovery</guid>
      <pubDate>Wed, 06 May 2026 00:00:00 GMT</pubDate>
      <category>devops</category>
      <category>sync</category>
      <category>data-lifecycle</category>
      <category>state-invariant</category>
      <category>drift-recovery</category>
      <category>defense-in-depth</category>
    </item>
    <item>
      <title><![CDATA[Wrap Skill Follow-Up Persistence Architecture]]></title>
      <description><![CDATA[When a session-state dashboard regenerates from a single source (today's journal), unresolved follow-ups from prior sessions vanish silently on every rebuild. Compounded with single-source discovery and conversation-only mentions, follow-ups disappear three ways at once. The fix is a 4-layer architecture.]]></description>
      <link>https://brandonwie.dev/posts/wrap-followup-persistence-architecture</link>
      <guid isPermaLink="true">https://brandonwie.dev/posts/wrap-followup-persistence-architecture</guid>
      <pubDate>Wed, 06 May 2026 00:00:00 GMT</pubDate>
      <category>devops</category>
      <category>claude-code</category>
      <category>skill-design</category>
      <category>session-state</category>
    </item>
    <item>
      <title><![CDATA[Empirical Close: Defer Skill-Side Tests to Natural Exercise]]></title>
      <description><![CDATA[Some verification tests need a real trigger that no fixture replicates faithfully — interactive prompts, conversation parsing, AskUserQuestion flows. Marking the test [~] empirical-close-pending and trusting the next natural trigger to verify is hygienic when paired with a friction-log reopen.]]></description>
      <link>https://brandonwie.dev/posts/empirical-close-pattern</link>
      <guid isPermaLink="true">https://brandonwie.dev/posts/empirical-close-pattern</guid>
      <pubDate>Wed, 06 May 2026 00:00:00 GMT</pubDate>
      <category>general</category>
      <category>process</category>
      <category>task-management</category>
      <category>verification</category>
    </item>
    <item>
      <title><![CDATA[Markdownlint Conventions]]></title>
      <description><![CDATA[7,500 markdownlint errors across 200 markdown files. The rules that mattered, the configuration that stuck, two pre-commit traps that surface only in nested scopes, and the strict-preset migration that collapsed a 14-rule custom config into one extends + five carve-outs.]]></description>
      <link>https://brandonwie.dev/posts/markdownlint-conventions</link>
      <guid isPermaLink="true">https://brandonwie.dev/posts/markdownlint-conventions</guid>
      <pubDate>Wed, 06 May 2026 00:00:00 GMT</pubDate>
      <category>general</category>
      <category>documentation</category>
      <category>markdown</category>
      <category>linting</category>
    </item>
    <item>
      <title><![CDATA[Plan-vs-Shipped Divergence Detection on Task Resume]]></title>
      <description><![CDATA[When resuming a multi-session task, the plan.md written at task start may not reflect what is actually shipped now. Implementations evolve mid-flight, scope shifts, branches merge. A 3-minute pre-flight check prevents hours of executing obsolete work.]]></description>
      <link>https://brandonwie.dev/posts/plan-vs-shipped-divergence</link>
      <guid isPermaLink="true">https://brandonwie.dev/posts/plan-vs-shipped-divergence</guid>
      <pubDate>Wed, 06 May 2026 00:00:00 GMT</pubDate>
      <category>general</category>
      <category>process</category>
      <category>task-resume</category>
      <category>verify-before-execute</category>
    </item>
    <item>
      <title><![CDATA[Checklist beats prose for LLM-robust skill preconditions]]></title>
      <description><![CDATA[Compound preconditions written in prose form get silently misapplied under context pressure. Restructuring them as explicit checkbox checklists with one box per clause makes the precondition LLM-robust — and surfaces implicit clauses that turn out to be the actual bugs.]]></description>
      <link>https://brandonwie.dev/posts/skill-instruction-checklist-pattern</link>
      <guid isPermaLink="true">https://brandonwie.dev/posts/skill-instruction-checklist-pattern</guid>
      <pubDate>Wed, 06 May 2026 00:00:00 GMT</pubDate>
      <category>general</category>
      <category>skill-authoring</category>
      <category>claude-code</category>
      <category>llm-prompts</category>
      <category>instructions</category>
      <category>robustness</category>
    </item>
    <item>
      <title><![CDATA[Codex `apply_patch` is a Shell-Mediated Tool, Not a Direct Tool]]></title>
      <description><![CDATA[Codex CLI doesn't have a discrete edit tool. File edits flow through `local_shell` carrying `apply_patch` patch text. Cross-agent hooks need a payload-parsing wrapper, not a tool-name matcher.]]></description>
      <link>https://brandonwie.dev/posts/codex-apply-patch-shell-mediated-tool</link>
      <guid isPermaLink="true">https://brandonwie.dev/posts/codex-apply-patch-shell-mediated-tool</guid>
      <pubDate>Tue, 05 May 2026 00:00:00 GMT</pubDate>
      <category>ai-ml</category>
      <category>codex</category>
      <category>claude-code</category>
      <category>hooks</category>
      <category>cross-agent</category>
      <category>transferable</category>
      <category>gotcha</category>
    </item>
    <item>
      <title><![CDATA[Cross-Agent Skill Alias Generalization]]></title>
      <description><![CDATA[Skills shared across Claude Code, Codex, and Gemini fail when they hardcode one agent's MCP tool alias. Two-tier pattern — declare both alias families in frontmatter; use generic names in prose.]]></description>
      <link>https://brandonwie.dev/posts/cross-agent-skill-alias-generalization</link>
      <guid isPermaLink="true">https://brandonwie.dev/posts/cross-agent-skill-alias-generalization</guid>
      <pubDate>Tue, 05 May 2026 00:00:00 GMT</pubDate>
      <category>ai-ml</category>
      <category>skills</category>
      <category>mcp</category>
      <category>cross-agent</category>
      <category>claude</category>
      <category>codex</category>
      <category>gemini</category>
      <category>transferable</category>
    </item>
    <item>
      <title><![CDATA[Stdlib-Only Helper Portability]]></title>
      <description><![CDATA[Helpers shipped to multiple agents fail in CI when they assume non-stdlib deps. Bind to standard library only — PyYAML, npm packages, and BSD/GNU sed flags are the three usual traps.]]></description>
      <link>https://brandonwie.dev/posts/stdlib-only-helper-portability</link>
      <guid isPermaLink="true">https://brandonwie.dev/posts/stdlib-only-helper-portability</guid>
      <pubDate>Tue, 05 May 2026 00:00:00 GMT</pubDate>
      <category>devops</category>
      <category>portability</category>
      <category>helpers</category>
      <category>ci</category>
      <category>python</category>
      <category>nodejs</category>
      <category>transferable</category>
    </item>
    <item>
      <title><![CDATA[`test -L` vs `realpath` for symlink detection]]></title>
      <description><![CDATA[A POSIX gotcha. `test -L child/leaf` returns false when a parent is the symlink, even when the resolution chain is healthy. Use `realpath` for source-of-truth chain validation.]]></description>
      <link>https://brandonwie.dev/posts/test-L-vs-realpath-symlink-detection</link>
      <guid isPermaLink="true">https://brandonwie.dev/posts/test-L-vs-realpath-symlink-detection</guid>
      <pubDate>Tue, 05 May 2026 00:00:00 GMT</pubDate>
      <category>devops</category>
      <category>shell</category>
      <category>symlinks</category>
      <category>posix</category>
      <category>gotcha</category>
      <category>transferable</category>
    </item>
    <item>
      <title><![CDATA[Schema-Versioned Helper Output Envelope]]></title>
      <description><![CDATA[A JSON output envelope for cross-agent helper scripts — schema_version, status, error, agent, ts. Stable shape, semver-bumpable, error-distinguishing.]]></description>
      <link>https://brandonwie.dev/posts/schema-versioned-helper-json-envelope</link>
      <guid isPermaLink="true">https://brandonwie.dev/posts/schema-versioned-helper-json-envelope</guid>
      <pubDate>Tue, 05 May 2026 00:00:00 GMT</pubDate>
      <category>general</category>
      <category>json</category>
      <category>schema</category>
      <category>helpers</category>
      <category>cross-agent</category>
      <category>transferable</category>
    </item>
    <item>
      <title><![CDATA[emitAsync Stamp Gating for Idempotent Bootstrap Retries]]></title>
      <description><![CDATA[A bootstrap that emits sync to a queue then stamps "done" silently strands downstream when Redis blips. emitAsync gates the stamp on enqueue admission.]]></description>
      <link>https://brandonwie.dev/posts/emitasync-stamp-gating</link>
      <guid isPermaLink="true">https://brandonwie.dev/posts/emitasync-stamp-gating</guid>
      <pubDate>Wed, 29 Apr 2026 00:00:00 GMT</pubDate>
      <category>backend</category>
      <category>nestjs</category>
      <category>eventemitter2</category>
      <category>bullmq</category>
      <category>idempotency</category>
    </item>
    <item>
      <title><![CDATA[Fallback-Branch Test Coverage Gap]]></title>
      <description><![CDATA[Tests pass. Coverage hits 100%. Removing the `|| randomUUID()` would still pass everything. How builder-driven fixtures hide the falsy branch.]]></description>
      <link>https://brandonwie.dev/posts/fallback-branch-test-coverage-gap</link>
      <guid isPermaLink="true">https://brandonwie.dev/posts/fallback-branch-test-coverage-gap</guid>
      <pubDate>Wed, 29 Apr 2026 00:00:00 GMT</pubDate>
      <category>backend</category>
      <category>testing</category>
      <category>coverage</category>
      <category>knowledge</category>
    </item>
    <item>
      <title><![CDATA[Stateless Auth DB-Column Drift]]></title>
      <description><![CDATA[Auth migrated from stateful to stateless JWT validation. Tests pass. Mobile users have access_token populated; web users have NULL. The drift is invisible until ops queries the column.]]></description>
      <link>https://brandonwie.dev/posts/stateless-auth-db-column-drift</link>
      <guid isPermaLink="true">https://brandonwie.dev/posts/stateless-auth-db-column-drift</guid>
      <pubDate>Wed, 29 Apr 2026 00:00:00 GMT</pubDate>
      <category>backend</category>
      <category>auth</category>
      <category>database</category>
      <category>migration</category>
      <category>stateless</category>
      <category>knowledge</category>
    </item>
    <item>
      <title><![CDATA[Symmetric Redis ↔ Kafka Bridge Pair for Cross-Cloud Event Flow]]></title>
      <description><![CDATA[Cloud Run can't reach an internal Kafka broker — `advertised.listeners` always wins. A pair of unidirectional bridges through Redis keeps every invariant intact.]]></description>
      <link>https://brandonwie.dev/posts/symmetric-redis-kafka-bridge-pair</link>
      <guid isPermaLink="true">https://brandonwie.dev/posts/symmetric-redis-kafka-bridge-pair</guid>
      <pubDate>Wed, 29 Apr 2026 00:00:00 GMT</pubDate>
      <category>backend</category>
      <category>distributed-systems</category>
      <category>event-streaming</category>
      <category>cross-cloud</category>
    </item>
    <item>
      <title><![CDATA[Byte-aware vs Count-based Chunking for Typesense documents/import]]></title>
      <description><![CDATA[Two chunking strategies for Typesense bulk import. Picking the wrong one silently fails the day a single power user creates a multi-MB document.]]></description>
      <link>https://brandonwie.dev/posts/typesense-import-byte-aware-chunking</link>
      <guid isPermaLink="true">https://brandonwie.dev/posts/typesense-import-byte-aware-chunking</guid>
      <pubDate>Wed, 29 Apr 2026 00:00:00 GMT</pubDate>
      <category>backend</category>
      <category>typesense</category>
      <category>batch</category>
      <category>search</category>
    </item>
    <item>
      <title><![CDATA[AI PR Review Validation Patterns]]></title>
      <description><![CDATA[Thirteen patterns where AI code reviewers (Claude, Copilot, Codex) produce false positives, plus the classification framework and reinforcing-comment templates that keep triage fast.]]></description>
      <link>https://brandonwie.dev/posts/ai-pr-review-validation-patterns</link>
      <guid isPermaLink="true">https://brandonwie.dev/posts/ai-pr-review-validation-patterns</guid>
      <pubDate>Wed, 29 Apr 2026 00:00:00 GMT</pubDate>
      <category>devops</category>
      <category>ai</category>
      <category>code-review</category>
    </item>
    <item>
      <title><![CDATA[Ruff Three-Gate Pre-Flight]]></title>
      <description><![CDATA[A push that turned into three CI cycles taught me Ruff in CI is three independent gates. A four-line shell function prevents the loop.]]></description>
      <link>https://brandonwie.dev/posts/ruff-three-gate-preflight</link>
      <guid isPermaLink="true">https://brandonwie.dev/posts/ruff-three-gate-preflight</guid>
      <pubDate>Wed, 29 Apr 2026 00:00:00 GMT</pubDate>
      <category>devops</category>
      <category>python</category>
      <category>ci-cd</category>
      <category>ruff</category>
      <category>pre-flight</category>
    </item>
    <item>
      <title><![CDATA[Phase A→B Classifier Deployment: Zero-Shot to Fine-Tuned]]></title>
      <description><![CDATA[How to ship a working intent classifier on day one with zero labeled data, then graduate to a domain-specific model as you collect examples.]]></description>
      <link>https://brandonwie.dev/posts/distilbert-vs-bart-intent-classification</link>
      <guid isPermaLink="true">https://brandonwie.dev/posts/distilbert-vs-bart-intent-classification</guid>
      <pubDate>Sat, 18 Apr 2026 00:00:00 GMT</pubDate>
      <category>ai-ml</category>
      <category>nlp</category>
      <category>intent-classification</category>
      <category>distilbert</category>
      <category>bart</category>
      <category>model-selection</category>
    </item>
    <item>
      <title><![CDATA[Claude Code: Shared + Personal AI Config Pattern]]></title>
      <description><![CDATA[Split AI instructions into committed (shared) and gitignored (personal) layers]]></description>
      <link>https://brandonwie.dev/posts/claude-code-shared-personal-config</link>
      <guid isPermaLink="true">https://brandonwie.dev/posts/claude-code-shared-personal-config</guid>
      <pubDate>Sat, 18 Apr 2026 00:00:00 GMT</pubDate>
      <category>devops</category>
      <category>claude-code</category>
      <category>ai-config</category>
      <category>onboarding</category>
    </item>
    <item>
      <title><![CDATA[Six Papers, Zero Applied: A Week of Disciplined Reading]]></title>
      <description><![CDATA[Six papers from DAIR.AI's April 6-12 batch. Three unifying themes surfaced, and zero were implemented — a practical walk-through of Pattern A, theme saturation before action.]]></description>
      <link>https://brandonwie.dev/posts/six-papers-zero-applied</link>
      <guid isPermaLink="true">https://brandonwie.dev/posts/six-papers-zero-applied</guid>
      <pubDate>Fri, 17 Apr 2026 00:00:00 GMT</pubDate>
      <category>forge</category>
      <category>ai-ml</category>
      <category>weekly-synthesis</category>
      <category>pattern-a</category>
      <category>llm-agents</category>
    </item>
    <item>
      <title><![CDATA[Measuring Claude Code Turn Latency from JSONL Transcripts]]></title>
      <description><![CDATA[Ground-truth, retroactive per-turn latency for Claude Code sessions — parsed from the JSONL transcripts already on disk, with four measurement traps I had to self-correct.]]></description>
      <link>https://brandonwie.dev/posts/claude-code-turn-latency-measurement</link>
      <guid isPermaLink="true">https://brandonwie.dev/posts/claude-code-turn-latency-measurement</guid>
      <pubDate>Tue, 14 Apr 2026 00:00:00 GMT</pubDate>
      <category>claude-code</category>
      <category>latency</category>
      <category>measurement</category>
      <category>debugging</category>
      <category>jsonl</category>
      <category>transcripts</category>
      <category>devops</category>
    </item>
    <item>
      <title><![CDATA[NestJS @Headers Decorator Returns string | undefined]]></title>
      <description><![CDATA[NestJS `@Headers('key')` returns `string | undefined`, not `string[]` — Express normalizes duplicate custom headers by joining them with comma-space.]]></description>
      <link>https://brandonwie.dev/posts/nestjs-headers-decorator-typing</link>
      <guid isPermaLink="true">https://brandonwie.dev/posts/nestjs-headers-decorator-typing</guid>
      <pubDate>Sat, 11 Apr 2026 00:00:00 GMT</pubDate>
      <category>backend</category>
      <category>nestjs</category>
      <category>express</category>
      <category>http-headers</category>
      <category>typescript</category>
    </item>
    <item>
      <title><![CDATA[NestJS Swagger: type is Silently Ignored When content is Provided]]></title>
      <description><![CDATA[When `@ApiResponse` sees both `type` and `content`, NestJS Swagger silently drops `type` — so your DTO stops appearing in the Swagger UI Models tab.]]></description>
      <link>https://brandonwie.dev/posts/nestjs-swagger-type-vs-content</link>
      <guid isPermaLink="true">https://brandonwie.dev/posts/nestjs-swagger-type-vs-content</guid>
      <pubDate>Sat, 11 Apr 2026 00:00:00 GMT</pubDate>
      <category>backend</category>
      <category>nestjs</category>
      <category>swagger</category>
      <category>openapi</category>
    </item>
    <item>
      <title><![CDATA[macOS VSCode Terminal Locale Fallback]]></title>
      <description><![CDATA[VSCode's integrated terminal can silently switch to a non-English locale on macOS — here is why your `git status` suddenly speaks Korean and how to pin `LANG` in `settings.json`.]]></description>
      <link>https://brandonwie.dev/posts/macos-vscode-terminal-locale-fallback</link>
      <guid isPermaLink="true">https://brandonwie.dev/posts/macos-vscode-terminal-locale-fallback</guid>
      <pubDate>Sat, 11 Apr 2026 00:00:00 GMT</pubDate>
      <category>devops</category>
      <category>macos</category>
      <category>vscode</category>
      <category>locale</category>
      <category>i18n</category>
      <category>gotcha</category>
    </item>
    <item>
      <title><![CDATA[Stow Symlink Health Checking]]></title>
      <description><![CDATA[GNU Stow creates symlinks from system config paths back to a dotfiles repo,]]></description>
      <link>https://brandonwie.dev/posts/stow-symlink-health-checking</link>
      <guid isPermaLink="true">https://brandonwie.dev/posts/stow-symlink-health-checking</guid>
      <pubDate>Thu, 09 Apr 2026 00:00:00 GMT</pubDate>
      <category>devops</category>
      <category>dotfiles</category>
      <category>stow</category>
      <category>symlinks</category>
    </item>
    <item>
      <title><![CDATA[I Built What Karpathy Described — Before He Described It]]></title>
      <description><![CDATA[Andrej Karpathy published a pattern for LLM-maintained knowledge bases. I have been running one for months. Here is what the comparison revealed.]]></description>
      <link>https://brandonwie.dev/posts/karpathy-llm-knowledge-bases</link>
      <guid isPermaLink="true">https://brandonwie.dev/posts/karpathy-llm-knowledge-bases</guid>
      <pubDate>Mon, 06 Apr 2026 00:00:00 GMT</pubDate>
      <category>ai-ml</category>
      <category>knowledge-management</category>
      <category>claude-code</category>
      <category>patterns</category>
    </item>
    <item>
      <title><![CDATA[LLM Fine-Tuning Strategies]]></title>
      <description><![CDATA[A practical decision framework for choosing between prompt engineering, RAG, and LoRA fine-tuning when building LLM-powered applications.]]></description>
      <link>https://brandonwie.dev/posts/llm-fine-tuning-strategies</link>
      <guid isPermaLink="true">https://brandonwie.dev/posts/llm-fine-tuning-strategies</guid>
      <pubDate>Mon, 06 Apr 2026 00:00:00 GMT</pubDate>
      <category>ai-ml</category>
      <category>fine-tuning</category>
      <category>llm</category>
    </item>
    <item>
      <title><![CDATA[Population Stability Index (PSI) for Model Drift Detection]]></title>
      <description><![CDATA[How to detect when your deployed classifier's input distribution shifts away from training data — before accuracy degrades — using a lightweight statistical metric.]]></description>
      <link>https://brandonwie.dev/posts/psi-model-drift-detection</link>
      <guid isPermaLink="true">https://brandonwie.dev/posts/psi-model-drift-detection</guid>
      <pubDate>Mon, 06 Apr 2026 00:00:00 GMT</pubDate>
      <category>ai-ml</category>
      <category>mlops</category>
      <category>drift-detection</category>
      <category>monitoring</category>
      <category>statistics</category>
    </item>
    <item>
      <title><![CDATA[Anthropic MCP Context Budget Optimization]]></title>
      <description><![CDATA[Anthropic-hosted MCP integrations consume ~71K tokens of your context window at session start — even when you never call them. Here is how to reclaim that budget.]]></description>
      <link>https://brandonwie.dev/posts/anthropic-mcp-context-budget-optimization</link>
      <guid isPermaLink="true">https://brandonwie.dev/posts/anthropic-mcp-context-budget-optimization</guid>
      <pubDate>Mon, 06 Apr 2026 00:00:00 GMT</pubDate>
      <category>devops</category>
      <category>claude-code</category>
      <category>ai-ml</category>
    </item>
    <item>
      <title><![CDATA[Docker Subnet Collision with Static-IP Services]]></title>
      <description><![CDATA[When multiple Docker Compose projects define custom bridge networks, their subnets can collide silently. Here is how to diagnose and fix it.]]></description>
      <link>https://brandonwie.dev/posts/docker-subnet-collision-static-ip-services</link>
      <guid isPermaLink="true">https://brandonwie.dev/posts/docker-subnet-collision-static-ip-services</guid>
      <pubDate>Mon, 06 Apr 2026 00:00:00 GMT</pubDate>
      <category>devops</category>
      <category>docker</category>
      <category>networking</category>
    </item>
    <item>
      <title><![CDATA[Hybrid CI: Self-Hosted Jenkins + GitHub Actions]]></title>
      <description><![CDATA[Why use one CI system when you can use both? A split architecture that plays to each tool's strengths for polyglot portfolio projects.]]></description>
      <link>https://brandonwie.dev/posts/hybrid-ci-jenkins-github-actions</link>
      <guid isPermaLink="true">https://brandonwie.dev/posts/hybrid-ci-jenkins-github-actions</guid>
      <pubDate>Mon, 06 Apr 2026 00:00:00 GMT</pubDate>
      <category>devops</category>
      <category>ci-cd</category>
      <category>jenkins</category>
      <category>github-actions</category>
      <category>architecture-decision</category>
    </item>
    <item>
      <title><![CDATA[PortAudio Stale USB Audio Device Handle]]></title>
      <description><![CDATA[Long-running audio daemons using PortAudio silently produce zero-filled buffers when the USB device handle goes stale. Here is how to diagnose and fix it.]]></description>
      <link>https://brandonwie.dev/posts/portaudio-stale-usb-audio-handle</link>
      <guid isPermaLink="true">https://brandonwie.dev/posts/portaudio-stale-usb-audio-handle</guid>
      <pubDate>Mon, 06 Apr 2026 00:00:00 GMT</pubDate>
      <category>general</category>
      <category>devops</category>
    </item>
    <item>
      <title><![CDATA[Google Meet Link Creation]]></title>
      <description><![CDATA[Lesson learned from implementing programmatic Google Meet link creation.]]></description>
      <link>https://brandonwie.dev/posts/google-meet-link-creation</link>
      <guid isPermaLink="true">https://brandonwie.dev/posts/google-meet-link-creation</guid>
      <pubDate>Mon, 06 Apr 2026 00:00:00 GMT</pubDate>
      <category>backend</category>
      <category>google-api</category>
      <category>work</category>
    </item>
    <item>
      <title><![CDATA[The Next Intelligence Explosion Is Social, Not Computational]]></title>
      <description><![CDATA[A Google paper argues every major intelligence explosion emerged from social organization, not individual cognition — and AI will follow the same pattern.]]></description>
      <link>https://brandonwie.dev/posts/next-intelligence-explosion-social</link>
      <guid isPermaLink="true">https://brandonwie.dev/posts/next-intelligence-explosion-social</guid>
      <pubDate>Wed, 01 Apr 2026 00:00:00 GMT</pubDate>
      <category>ai-ml</category>
      <category>ai-agents</category>
      <category>research</category>
      <category>society</category>
    </item>
    <item>
      <title><![CDATA[WAF Allowlist Patterns]]></title>
      <description><![CDATA[Block-by-default WAF approach using route allowlisting. Stronger security than]]></description>
      <link>https://brandonwie.dev/posts/waf-allowlist-patterns</link>
      <guid isPermaLink="true">https://brandonwie.dev/posts/waf-allowlist-patterns</guid>
      <pubDate>Thu, 26 Mar 2026 00:00:00 GMT</pubDate>
      <category>aws</category>
      <category>waf</category>
      <category>security</category>
      <category>infrastructure</category>
    </item>
    <item>
      <title><![CDATA[Redis and BullMQ Queue Patterns]]></title>
      <description><![CDATA[Comprehensive guide to Redis-backed job queues with BullMQ in Node.js/NestJS]]></description>
      <link>https://brandonwie.dev/posts/redis-queue-patterns</link>
      <guid isPermaLink="true">https://brandonwie.dev/posts/redis-queue-patterns</guid>
      <pubDate>Thu, 26 Mar 2026 00:00:00 GMT</pubDate>
      <category>backend</category>
      <category>redis</category>
      <category>bullmq</category>
      <category>queue</category>
      <category>node.js</category>
    </item>
    <item>
      <title><![CDATA[Gemini Asymmetric Embeddings]]></title>
      <description><![CDATA[Gemini's text-embedding-004 uses asymmetric embedding with task_type to encode queries and documents differently, producing better retrieval results than symmetric models.]]></description>
      <link>https://brandonwie.dev/posts/gemini-asymmetric-embeddings</link>
      <guid isPermaLink="true">https://brandonwie.dev/posts/gemini-asymmetric-embeddings</guid>
      <pubDate>Tue, 24 Mar 2026 00:00:00 GMT</pubDate>
      <category>ai-ml</category>
      <category>embeddings</category>
      <category>google</category>
    </item>
    <item>
      <title><![CDATA[RAG Hybrid Search Architecture]]></title>
      <description><![CDATA[Why single-method retrieval fails and how fusing dense, sparse, fuzzy, and managed search with Reciprocal Rank Fusion builds a retrieval pipeline that handles both semantic understanding and keyword precision.]]></description>
      <link>https://brandonwie.dev/posts/rag-hybrid-search-architecture</link>
      <guid isPermaLink="true">https://brandonwie.dev/posts/rag-hybrid-search-architecture</guid>
      <pubDate>Tue, 24 Mar 2026 00:00:00 GMT</pubDate>
      <category>ai-ml</category>
      <category>rag</category>
      <category>search</category>
      <category>architecture</category>
    </item>
    <item>
      <title><![CDATA[pgvector HNSW Index in PostgreSQL]]></title>
      <description><![CDATA[You don't need a dedicated vector database for semantic search — pgvector with HNSW indexes handles under 100K vectors at over 95% recall, right inside PostgreSQL.]]></description>
      <link>https://brandonwie.dev/posts/pgvector-hnsw-postgresql</link>
      <guid isPermaLink="true">https://brandonwie.dev/posts/pgvector-hnsw-postgresql</guid>
      <pubDate>Tue, 24 Mar 2026 00:00:00 GMT</pubDate>
      <category>backend</category>
      <category>database</category>
      <category>search</category>
      <category>postgresql</category>
    </item>
    <item>
      <title><![CDATA[EBS vs EFS: AWS Storage Comparison]]></title>
      <description><![CDATA[Understanding when to use EBS (block storage) vs EFS (network filesystem).]]></description>
      <link>https://brandonwie.dev/posts/ebs-vs-efs-storage</link>
      <guid isPermaLink="true">https://brandonwie.dev/posts/ebs-vs-efs-storage</guid>
      <pubDate>Sun, 22 Mar 2026 00:00:00 GMT</pubDate>
      <category>aws</category>
      <category>storage</category>
      <category>devops</category>
      <category>work</category>
    </item>
    <item>
      <title><![CDATA[ECS Autoscaling Patterns]]></title>
      <description><![CDATA[Best practices for implementing ECS service autoscaling with migration task]]></description>
      <link>https://brandonwie.dev/posts/ecs-autoscaling-patterns</link>
      <guid isPermaLink="true">https://brandonwie.dev/posts/ecs-autoscaling-patterns</guid>
      <pubDate>Sun, 22 Mar 2026 00:00:00 GMT</pubDate>
      <category>aws</category>
      <category>ecs</category>
      <category>autoscaling</category>
      <category>infrastructure</category>
    </item>
    <item>
      <title><![CDATA[NAT Gateway Architecture]]></title>
      <description><![CDATA[Understanding NAT Gateway placement and VPC network flow.]]></description>
      <link>https://brandonwie.dev/posts/nat-gateway-architecture</link>
      <guid isPermaLink="true">https://brandonwie.dev/posts/nat-gateway-architecture</guid>
      <pubDate>Sun, 22 Mar 2026 00:00:00 GMT</pubDate>
      <category>aws</category>
      <category>vpc</category>
      <category>networking</category>
    </item>
    <item>
      <title><![CDATA[AWS Security Groups Fundamentals]]></title>
      <description><![CDATA[Security Groups are virtual firewalls for AWS resources, controlling inbound]]></description>
      <link>https://brandonwie.dev/posts/security-groups-fundamentals</link>
      <guid isPermaLink="true">https://brandonwie.dev/posts/security-groups-fundamentals</guid>
      <pubDate>Sun, 22 Mar 2026 00:00:00 GMT</pubDate>
      <category>aws</category>
      <category>security</category>
      <category>networking</category>
    </item>
    <item>
      <title><![CDATA[Terraform Fundamentals]]></title>
      <description><![CDATA[Core Terraform concepts for AWS infrastructure management.]]></description>
      <link>https://brandonwie.dev/posts/terraform-fundamentals</link>
      <guid isPermaLink="true">https://brandonwie.dev/posts/terraform-fundamentals</guid>
      <pubDate>Sun, 22 Mar 2026 00:00:00 GMT</pubDate>
      <category>aws</category>
      <category>terraform</category>
      <category>infrastructure-as-code</category>
    </item>
    <item>
      <title><![CDATA[Terraform RDS Credentials Management]]></title>
      <description><![CDATA[Managing RDS credentials securely using variables instead of hardcoding.]]></description>
      <link>https://brandonwie.dev/posts/terraform-rds-credentials</link>
      <guid isPermaLink="true">https://brandonwie.dev/posts/terraform-rds-credentials</guid>
      <pubDate>Sun, 22 Mar 2026 00:00:00 GMT</pubDate>
      <category>aws</category>
      <category>terraform</category>
      <category>rds</category>
      <category>security</category>
      <category>work</category>
    </item>
    <item>
      <title><![CDATA[AWS WAF Implementation]]></title>
      <description><![CDATA[Web Application Firewall setup with allowlist approach.]]></description>
      <link>https://brandonwie.dev/posts/waf-implementation</link>
      <guid isPermaLink="true">https://brandonwie.dev/posts/waf-implementation</guid>
      <pubDate>Sun, 22 Mar 2026 00:00:00 GMT</pubDate>
      <category>aws</category>
      <category>security</category>
      <category>waf</category>
      <category>work</category>
    </item>
    <item>
      <title><![CDATA[Amplitude ETL Partitioning]]></title>
      <description><![CDATA[How Amplitude event data is partitioned when moving from raw to refined storage.]]></description>
      <link>https://brandonwie.dev/posts/amplitude-etl-partitioning</link>
      <guid isPermaLink="true">https://brandonwie.dev/posts/amplitude-etl-partitioning</guid>
      <pubDate>Sun, 22 Mar 2026 00:00:00 GMT</pubDate>
      <category>backend</category>
      <category>etl</category>
      <category>amplitude</category>
      <category>spark</category>
      <category>partitioning</category>
    </item>
    <item>
      <title><![CDATA[Amplitude Export API Response Format]]></title>
      <description><![CDATA[The Amplitude Export API returns data in a **nested compression format** that is]]></description>
      <link>https://brandonwie.dev/posts/amplitude-export-api-format</link>
      <guid isPermaLink="true">https://brandonwie.dev/posts/amplitude-export-api-format</guid>
      <pubDate>Sun, 22 Mar 2026 00:00:00 GMT</pubDate>
      <category>backend</category>
      <category>amplitude</category>
      <category>api</category>
      <category>data-format</category>
    </item>
    <item>
      <title><![CDATA[Backfill Stats Manifest on Early Exit]]></title>
      <description><![CDATA[When a job has an early exit path (e.g., "no work to do"), always save a]]></description>
      <link>https://brandonwie.dev/posts/backfill-stats-manifest-early-exit</link>
      <guid isPermaLink="true">https://brandonwie.dev/posts/backfill-stats-manifest-early-exit</guid>
      <pubDate>Sun, 22 Mar 2026 00:00:00 GMT</pubDate>
      <category>backend</category>
      <category>etl</category>
      <category>slack</category>
    </item>
    <item>
      <title><![CDATA[Calendar EXDATE Behavior: Apple vs Google]]></title>
      <description><![CDATA[Understanding how Apple Calendar and Google Calendar handle recurring event]]></description>
      <link>https://brandonwie.dev/posts/calendar-exdate-behavior</link>
      <guid isPermaLink="true">https://brandonwie.dev/posts/calendar-exdate-behavior</guid>
      <pubDate>Sun, 22 Mar 2026 00:00:00 GMT</pubDate>
      <category>backend</category>
      <category>calendar</category>
      <category>icalendar</category>
      <category>rfc5545</category>
    </item>
    <item>
      <title><![CDATA[Celery API-Side Dispatch Pattern]]></title>
      <description><![CDATA[Creating a send-only Celery client in an API service that dispatches tasks to a]]></description>
      <link>https://brandonwie.dev/posts/celery-api-side-dispatch</link>
      <guid isPermaLink="true">https://brandonwie.dev/posts/celery-api-side-dispatch</guid>
      <pubDate>Sun, 22 Mar 2026 00:00:00 GMT</pubDate>
      <category>backend</category>
      <category>celery</category>
      <category>python</category>
      <category>async</category>
    </item>
    <item>
      <title><![CDATA[class-transformer Undefined Own-Property Bug]]></title>
      <description><![CDATA[When `plainToInstance()` creates class instances under ES2022+ TypeScript]]></description>
      <link>https://brandonwie.dev/posts/class-transformer-undefined-fields</link>
      <guid isPermaLink="true">https://brandonwie.dev/posts/class-transformer-undefined-fields</guid>
      <pubDate>Sun, 22 Mar 2026 00:00:00 GMT</pubDate>
      <category>backend</category>
      <category>typescript</category>
      <category>class-transformer</category>
      <category>gotcha</category>
    </item>
    <item>
      <title><![CDATA[CPU Cache Locality in Batch Field Extraction]]></title>
      <description><![CDATA[Multiple `.map()` calls over the same array force the CPU to reload each object]]></description>
      <link>https://brandonwie.dev/posts/cpu-cache-locality-batch-iteration</link>
      <guid isPermaLink="true">https://brandonwie.dev/posts/cpu-cache-locality-batch-iteration</guid>
      <pubDate>Sun, 22 Mar 2026 00:00:00 GMT</pubDate>
      <category>backend</category>
      <category>performance</category>
      <category>optimization</category>
    </item>
    <item>
      <title><![CDATA[DataSource vs Repository Pattern]]></title>
      <description><![CDATA[Architectural decision guide for choosing between direct DataSource usage and]]></description>
      <link>https://brandonwie.dev/posts/datasource-vs-repository-pattern</link>
      <guid isPermaLink="true">https://brandonwie.dev/posts/datasource-vs-repository-pattern</guid>
      <pubDate>Sun, 22 Mar 2026 00:00:00 GMT</pubDate>
      <category>backend</category>
      <category>architecture</category>
      <category>patterns</category>
      <category>typeorm</category>
      <category>nestjs</category>
    </item>
    <item>
      <title><![CDATA[ETL Data Separation Strategy]]></title>
      <description><![CDATA[Mixing regular ETL data with manually recovered backfill data in the same S3]]></description>
      <link>https://brandonwie.dev/posts/etl-data-separation</link>
      <guid isPermaLink="true">https://brandonwie.dev/posts/etl-data-separation</guid>
      <pubDate>Sun, 22 Mar 2026 00:00:00 GMT</pubDate>
      <category>backend</category>
      <category>etl</category>
      <category>data-engineering</category>
      <category>s3</category>
      <category>architecture</category>
    </item>
    <item>
      <title><![CDATA[NestJS WebSockets Reference]]></title>
      <description><![CDATA[Complete reference for implementing WebSocket functionality in NestJS.]]></description>
      <link>https://brandonwie.dev/posts/nestjs-websockets</link>
      <guid isPermaLink="true">https://brandonwie.dev/posts/nestjs-websockets</guid>
      <pubDate>Sun, 22 Mar 2026 00:00:00 GMT</pubDate>
      <category>backend</category>
      <category>nestjs</category>
      <category>websockets</category>
      <category>work</category>
    </item>
    <item>
      <title><![CDATA[pandas itertuples() vs iterrows()]]></title>
      <description><![CDATA[`iterrows()` is the most common way to iterate over DataFrame rows, but it]]></description>
      <link>https://brandonwie.dev/posts/pandas-itertuples-vs-iterrows</link>
      <guid isPermaLink="true">https://brandonwie.dev/posts/pandas-itertuples-vs-iterrows</guid>
      <pubDate>Sun, 22 Mar 2026 00:00:00 GMT</pubDate>
      <category>backend</category>
      <category>python</category>
      <category>pandas</category>
      <category>performance</category>
    </item>
    <item>
      <title><![CDATA[PostgreSQL Advisory Locks with TypeORM]]></title>
      <description><![CDATA[Application-level locks managed by PostgreSQL for coordination.]]></description>
      <link>https://brandonwie.dev/posts/postgresql-advisory-locks</link>
      <guid isPermaLink="true">https://brandonwie.dev/posts/postgresql-advisory-locks</guid>
      <pubDate>Sun, 22 Mar 2026 00:00:00 GMT</pubDate>
      <category>backend</category>
      <category>postgresql</category>
      <category>database</category>
      <category>work</category>
    </item>
    <item>
      <title><![CDATA[PostgreSQL IN Clause Parameter Limits]]></title>
      <description><![CDATA[When querying by a large set of IDs using TypeORM's `In([...])` operator, the]]></description>
      <link>https://brandonwie.dev/posts/postgresql-in-clause-limits</link>
      <guid isPermaLink="true">https://brandonwie.dev/posts/postgresql-in-clause-limits</guid>
      <pubDate>Sun, 22 Mar 2026 00:00:00 GMT</pubDate>
      <category>backend</category>
      <category>postgresql</category>
      <category>typeorm</category>
      <category>performance</category>
    </item>
    <item>
      <title><![CDATA[Deduplicating Functions with Keyword-Only Parameters]]></title>
      <description><![CDATA[Two modules contain near-identical functions with slight behavioral differences.]]></description>
      <link>https://brandonwie.dev/posts/python-function-dedup-keyword-params</link>
      <guid isPermaLink="true">https://brandonwie.dev/posts/python-function-dedup-keyword-params</guid>
      <pubDate>Sun, 22 Mar 2026 00:00:00 GMT</pubDate>
      <category>backend</category>
      <category>python</category>
      <category>refactoring</category>
      <category>api-design</category>
    </item>
    <item>
      <title><![CDATA[Sentry N+1 Query Detection]]></title>
      <description><![CDATA[How Sentry detects N+1 queries at runtime, common false positives from parallel]]></description>
      <link>https://brandonwie.dev/posts/sentry-n-plus-one-detection</link>
      <guid isPermaLink="true">https://brandonwie.dev/posts/sentry-n-plus-one-detection</guid>
      <pubDate>Sun, 22 Mar 2026 00:00:00 GMT</pubDate>
      <category>backend</category>
      <category>performance</category>
      <category>observability</category>
      <category>sentry</category>
    </item>
    <item>
      <title><![CDATA[Stale vs Orphan Blocks in Calendar Sync]]></title>
      <description><![CDATA[When syncing calendar data from Google Calendar API, two distinct cleanup]]></description>
      <link>https://brandonwie.dev/posts/stale-vs-orphan-blocks</link>
      <guid isPermaLink="true">https://brandonwie.dev/posts/stale-vs-orphan-blocks</guid>
      <pubDate>Sun, 22 Mar 2026 00:00:00 GMT</pubDate>
      <category>backend</category>
      <category>sync</category>
      <category>google-calendar</category>
    </item>
    <item>
      <title><![CDATA[Sync Token Invalidation Recovery (410 GONE)]]></title>
      <description><![CDATA[When Google Calendar API returns 410 GONE, the sync token is invalidated and a]]></description>
      <link>https://brandonwie.dev/posts/sync-token-invalidation-recovery</link>
      <guid isPermaLink="true">https://brandonwie.dev/posts/sync-token-invalidation-recovery</guid>
      <pubDate>Sun, 22 Mar 2026 00:00:00 GMT</pubDate>
      <category>backend</category>
      <category>google-calendar</category>
      <category>sync</category>
      <category>error-handling</category>
    </item>
    <item>
      <title><![CDATA[TypeORM CLI와 NestJS DataSource 충돌]]></title>
      <description><![CDATA[TypeORM CLI를 NestJS 프로젝트에서 사용할 때 발생하는 연결 충돌 문제와 해결 방법.]]></description>
      <link>https://brandonwie.dev/posts/typeorm-cli-nestjs-datasource</link>
      <guid isPermaLink="true">https://brandonwie.dev/posts/typeorm-cli-nestjs-datasource</guid>
      <pubDate>Sun, 22 Mar 2026 00:00:00 GMT</pubDate>
      <category>backend</category>
      <category>typeorm</category>
      <category>nestjs</category>
    </item>
    <item>
      <title><![CDATA[TypeScript Type Narrowing Over Assertions]]></title>
      <description><![CDATA[Prefer type narrowing over non-null assertions (`!`) and forced casting]]></description>
      <link>https://brandonwie.dev/posts/typescript-type-narrowing</link>
      <guid isPermaLink="true">https://brandonwie.dev/posts/typescript-type-narrowing</guid>
      <pubDate>Sun, 22 Mar 2026 00:00:00 GMT</pubDate>
      <category>backend</category>
      <category>typescript</category>
      <category>best-practices</category>
    </item>
    <item>
      <title><![CDATA[updatedAt Staleness Guard]]></title>
      <description><![CDATA[When receiving asynchronous updates (webhooks, message queues), compare the]]></description>
      <link>https://brandonwie.dev/posts/updatedAt-staleness-guard</link>
      <guid isPermaLink="true">https://brandonwie.dev/posts/updatedAt-staleness-guard</guid>
      <pubDate>Sun, 22 Mar 2026 00:00:00 GMT</pubDate>
      <category>backend</category>
      <category>sync</category>
      <category>webhooks</category>
      <category>race-condition</category>
    </item>
    <item>
      <title><![CDATA[Webhook vs User Activity]]></title>
      <description><![CDATA[Webhooks from external services indicate **their** activity, not **your user's**]]></description>
      <link>https://brandonwie.dev/posts/webhook-vs-user-activity</link>
      <guid isPermaLink="true">https://brandonwie.dev/posts/webhook-vs-user-activity</guid>
      <pubDate>Sun, 22 Mar 2026 00:00:00 GMT</pubDate>
      <category>backend</category>
      <category>webhooks</category>
      <category>architecture</category>
      <category>patterns</category>
    </item>
    <item>
      <title><![CDATA[Amplitude Export API Timezone Behavior]]></title>
      <description><![CDATA[How Amplitude Export API handles timezones and hour boundaries for event data]]></description>
      <link>https://brandonwie.dev/posts/amplitude-export-api-timezone</link>
      <guid isPermaLink="true">https://brandonwie.dev/posts/amplitude-export-api-timezone</guid>
      <pubDate>Sun, 22 Mar 2026 00:00:00 GMT</pubDate>
      <category>data</category>
      <category>amplitude</category>
      <category>timezone</category>
      <category>api</category>
    </item>
    <item>
      <title><![CDATA[Airflow Celery Worker Log Server Configuration]]></title>
      <description><![CDATA[When using CeleryExecutor with workers on separate machines, the webserver needs]]></description>
      <link>https://brandonwie.dev/posts/airflow-celery-worker-log-server</link>
      <guid isPermaLink="true">https://brandonwie.dev/posts/airflow-celery-worker-log-server</guid>
      <pubDate>Sun, 22 Mar 2026 00:00:00 GMT</pubDate>
      <category>devops</category>
      <category>airflow</category>
      <category>celery</category>
      <category>logging</category>
    </item>
    <item>
      <title><![CDATA[Airflow CI/CD Concepts]]></title>
      <description><![CDATA[Understanding Airflow deployment and CI/CD concepts through a kitchen analogy.]]></description>
      <link>https://brandonwie.dev/posts/airflow-cicd-concepts</link>
      <guid isPermaLink="true">https://brandonwie.dev/posts/airflow-cicd-concepts</guid>
      <pubDate>Sun, 22 Mar 2026 00:00:00 GMT</pubDate>
      <category>devops</category>
      <category>airflow</category>
      <category>cicd</category>
      <category>docker</category>
      <category>work</category>
    </item>
    <item>
      <title><![CDATA[Airflow DAG-Level Callbacks]]></title>
      <description><![CDATA[Airflow 2.x silently ignores `on_success_callback` at the DAG level. Only]]></description>
      <link>https://brandonwie.dev/posts/airflow-dag-level-callbacks</link>
      <guid isPermaLink="true">https://brandonwie.dev/posts/airflow-dag-level-callbacks</guid>
      <pubDate>Sun, 22 Mar 2026 00:00:00 GMT</pubDate>
      <category>devops</category>
      <category>airflow</category>
      <category>callbacks</category>
      <category>work</category>
    </item>
    <item>
      <title><![CDATA[Airflow DAG start_date and Manual Triggers]]></title>
      <description><![CDATA[When manually triggering a DAG, Airflow may skip task execution if the trigger]]></description>
      <link>https://brandonwie.dev/posts/airflow-dag-start-date</link>
      <guid isPermaLink="true">https://brandonwie.dev/posts/airflow-dag-start-date</guid>
      <pubDate>Sun, 22 Mar 2026 00:00:00 GMT</pubDate>
      <category>devops</category>
      <category>airflow</category>
    </item>
    <item>
      <title><![CDATA[Airflow Manual DAG Config Pattern]]></title>
      <description><![CDATA[Pattern for allowing manual DAG triggers with custom parameters while keeping]]></description>
      <link>https://brandonwie.dev/posts/airflow-manual-dag-config</link>
      <guid isPermaLink="true">https://brandonwie.dev/posts/airflow-manual-dag-config</guid>
      <pubDate>Sun, 22 Mar 2026 00:00:00 GMT</pubDate>
      <category>devops</category>
      <category>airflow</category>
      <category>dag</category>
      <category>testing</category>
    </item>
    <item>
      <title><![CDATA[Airflow Task Dependency Syntax]]></title>
      <description><![CDATA[The `>>` operator in Airflow sets task dependencies and returns the downstream]]></description>
      <link>https://brandonwie.dev/posts/airflow-task-dependency-syntax</link>
      <guid isPermaLink="true">https://brandonwie.dev/posts/airflow-task-dependency-syntax</guid>
      <pubDate>Sun, 22 Mar 2026 00:00:00 GMT</pubDate>
      <category>devops</category>
      <category>airflow</category>
      <category>python</category>
      <category>work</category>
    </item>
    <item>
      <title><![CDATA[Bash set -e and Command Substitution]]></title>
      <description><![CDATA[When using `set -e` (exit on error), command substitution behaves unexpectedly]]></description>
      <link>https://brandonwie.dev/posts/bash-set-e-command-substitution</link>
      <guid isPermaLink="true">https://brandonwie.dev/posts/bash-set-e-command-substitution</guid>
      <pubDate>Sun, 22 Mar 2026 00:00:00 GMT</pubDate>
      <category>devops</category>
      <category>bash</category>
      <category>shell-scripting</category>
    </item>
    <item>
      <title><![CDATA[boto3 S3 put_object() Body Parameter Encoding]]></title>
      <description><![CDATA[An ETL pipeline that uploaded JSON manifest files to S3 was failing with a]]></description>
      <link>https://brandonwie.dev/posts/boto3-s3-encoding</link>
      <guid isPermaLink="true">https://brandonwie.dev/posts/boto3-s3-encoding</guid>
      <pubDate>Sun, 22 Mar 2026 00:00:00 GMT</pubDate>
      <category>devops</category>
      <category>aws</category>
      <category>s3</category>
      <category>boto3</category>
      <category>python</category>
    </item>
    <item>
      <title><![CDATA[Claude Code PostToolUse Hooks]]></title>
      <description><![CDATA[PostToolUse hooks fire after a tool completes. They receive JSON via stdin with]]></description>
      <link>https://brandonwie.dev/posts/claude-code-posttooluse-hooks</link>
      <guid isPermaLink="true">https://brandonwie.dev/posts/claude-code-posttooluse-hooks</guid>
      <pubDate>Sun, 22 Mar 2026 00:00:00 GMT</pubDate>
      <category>devops</category>
      <category>claude-code</category>
      <category>hooks</category>
    </item>
    <item>
      <title><![CDATA[DAG Deployment Strategies]]></title>
      <description><![CDATA[Different approaches to deploying Airflow DAGs, with trade-offs analysis.]]></description>
      <link>https://brandonwie.dev/posts/dag-deployment-strategies</link>
      <guid isPermaLink="true">https://brandonwie.dev/posts/dag-deployment-strategies</guid>
      <pubDate>Sun, 22 Mar 2026 00:00:00 GMT</pubDate>
      <category>devops</category>
      <category>airflow</category>
      <category>deployment</category>
      <category>gitops</category>
      <category>work</category>
    </item>
    <item>
      <title><![CDATA[Docker Compose CI/CD Patterns]]></title>
      <description><![CDATA[Patterns for using Docker Compose in CI/CD pipelines: separating dev and prod configurations, ECR integration, and deployment strategies.]]></description>
      <link>https://brandonwie.dev/posts/docker-compose-cicd-patterns</link>
      <guid isPermaLink="true">https://brandonwie.dev/posts/docker-compose-cicd-patterns</guid>
      <pubDate>Sun, 22 Mar 2026 00:00:00 GMT</pubDate>
      <category>devops</category>
      <category>docker</category>
      <category>cicd</category>
      <category>work</category>
    </item>
    <item>
      <title><![CDATA[ECR Credential Helper]]></title>
      <description><![CDATA[AWS's official solution for automatic ECR authentication. Instead of storing]]></description>
      <link>https://brandonwie.dev/posts/ecr-credential-helper</link>
      <guid isPermaLink="true">https://brandonwie.dev/posts/ecr-credential-helper</guid>
      <pubDate>Sun, 22 Mar 2026 00:00:00 GMT</pubDate>
      <category>devops</category>
      <category>aws</category>
      <category>docker</category>
      <category>ecr</category>
    </item>
    <item>
      <title><![CDATA[ECR Token Refresh Cron]]></title>
      <description><![CDATA[AWS ECR authentication tokens expire after 12 hours. For long-running Docker]]></description>
      <link>https://brandonwie.dev/posts/ecr-token-refresh-cron</link>
      <guid isPermaLink="true">https://brandonwie.dev/posts/ecr-token-refresh-cron</guid>
      <pubDate>Sun, 22 Mar 2026 00:00:00 GMT</pubDate>
      <category>devops</category>
      <category>aws</category>
      <category>ecr</category>
      <category>docker</category>
      <category>cron</category>
      <category>work</category>
    </item>
    <item>
      <title><![CDATA[ETL Schedule Timing]]></title>
      <description><![CDATA[How to choose the correct ETL schedule based on data arrival patterns.]]></description>
      <link>https://brandonwie.dev/posts/etl-schedule-timing</link>
      <guid isPermaLink="true">https://brandonwie.dev/posts/etl-schedule-timing</guid>
      <pubDate>Sun, 22 Mar 2026 00:00:00 GMT</pubDate>
      <category>devops</category>
      <category>airflow</category>
      <category>etl</category>
      <category>scheduling</category>
    </item>
    <item>
      <title><![CDATA[Linux Fundamentals]]></title>
      <description><![CDATA[1. [Cgroups (Control Groups)](#cgroups-control-groups)]]></description>
      <link>https://brandonwie.dev/posts/linux</link>
      <guid isPermaLink="true">https://brandonwie.dev/posts/linux</guid>
      <pubDate>Sun, 22 Mar 2026 00:00:00 GMT</pubDate>
      <category>devops</category>
      <category>linux</category>
    </item>
    <item>
      <title><![CDATA[Local S3 with MinIO]]></title>
      <description><![CDATA[MinIO is an S3-compatible object storage that runs locally via Docker.]]></description>
      <link>https://brandonwie.dev/posts/local-s3-minio</link>
      <guid isPermaLink="true">https://brandonwie.dev/posts/local-s3-minio</guid>
      <pubDate>Sun, 22 Mar 2026 00:00:00 GMT</pubDate>
      <category>devops</category>
      <category>docker</category>
      <category>s3</category>
      <category>minio</category>
      <category>local-dev</category>
    </item>
    <item>
      <title><![CDATA[Python Tooling Stack]]></title>
      <description><![CDATA[Standard Python development tooling for all MOBA projects.]]></description>
      <link>https://brandonwie.dev/posts/python-tooling-stack</link>
      <guid isPermaLink="true">https://brandonwie.dev/posts/python-tooling-stack</guid>
      <pubDate>Sun, 22 Mar 2026 00:00:00 GMT</pubDate>
      <category>devops</category>
      <category>python</category>
      <category>tooling</category>
    </item>
    <item>
      <title><![CDATA[S3 Path Normalization Pattern]]></title>
      <description><![CDATA[S3 key prefixes need consistent trailing slashes when building hierarchical]]></description>
      <link>https://brandonwie.dev/posts/s3-path-handling</link>
      <guid isPermaLink="true">https://brandonwie.dev/posts/s3-path-handling</guid>
      <pubDate>Sun, 22 Mar 2026 00:00:00 GMT</pubDate>
      <category>devops</category>
      <category>aws</category>
      <category>s3</category>
      <category>python</category>
      <category>path-handling</category>
    </item>
    <item>
      <title><![CDATA[Terraform State Recovery]]></title>
      <description><![CDATA[Procedures for recovering from Terraform state drift when state file doesn't]]></description>
      <link>https://brandonwie.dev/posts/terraform-state-recovery</link>
      <guid isPermaLink="true">https://brandonwie.dev/posts/terraform-state-recovery</guid>
      <pubDate>Sun, 22 Mar 2026 00:00:00 GMT</pubDate>
      <category>devops</category>
      <category>terraform</category>
      <category>aws</category>
      <category>disaster-recovery</category>
    </item>
    <item>
      <title><![CDATA[tmux Smart Session Auto-Start]]></title>
      <description><![CDATA[Auto-start tmux via an iTerm2 Profile Command (`tmux-smart-attach`) with numeric]]></description>
      <link>https://brandonwie.dev/posts/tmux-smart-session-auto-start</link>
      <guid isPermaLink="true">https://brandonwie.dev/posts/tmux-smart-session-auto-start</guid>
      <pubDate>Sun, 22 Mar 2026 00:00:00 GMT</pubDate>
      <category>devops</category>
      <category>tmux</category>
      <category>zsh</category>
      <category>terminal</category>
      <category>iterm2</category>
    </item>
    <item>
      <title><![CDATA[uv.lock Best Practice]]></title>
      <description><![CDATA[Whether to commit `uv.lock` to version control.]]></description>
      <link>https://brandonwie.dev/posts/uv-lock-best-practice</link>
      <guid isPermaLink="true">https://brandonwie.dev/posts/uv-lock-best-practice</guid>
      <pubDate>Sun, 22 Mar 2026 00:00:00 GMT</pubDate>
      <category>devops</category>
      <category>python</category>
      <category>uv</category>
    </item>
    <item>
      <title><![CDATA[Giscus SvelteKit Integration]]></title>
      <description><![CDATA[Adding a comment system to a statically generated SvelteKit blog without]]></description>
      <link>https://brandonwie.dev/posts/giscus-sveltekit-integration</link>
      <guid isPermaLink="true">https://brandonwie.dev/posts/giscus-sveltekit-integration</guid>
      <pubDate>Sun, 22 Mar 2026 00:00:00 GMT</pubDate>
      <category>frontend</category>
      <category>svelte</category>
      <category>comments</category>
    </item>
    <item>
      <title><![CDATA[Mobile Input UX]]></title>
      <description><![CDATA[Techniques for making custom-styled inputs work properly on mobile browsers.]]></description>
      <link>https://brandonwie.dev/posts/mobile-input-ux</link>
      <guid isPermaLink="true">https://brandonwie.dev/posts/mobile-input-ux</guid>
      <pubDate>Sun, 22 Mar 2026 00:00:00 GMT</pubDate>
      <category>frontend</category>
      <category>mobile</category>
      <category>css</category>
    </item>
    <item>
      <title><![CDATA[Paraglide-JS i18n for SvelteKit]]></title>
      <description><![CDATA[Adding Korean/English internationalization to a SvelteKit static blog without]]></description>
      <link>https://brandonwie.dev/posts/paraglide-i18n</link>
      <guid isPermaLink="true">https://brandonwie.dev/posts/paraglide-i18n</guid>
      <pubDate>Sun, 22 Mar 2026 00:00:00 GMT</pubDate>
      <category>frontend</category>
      <category>i18n</category>
      <category>svelte</category>
      <category>sveltekit</category>
    </item>
    <item>
      <title><![CDATA[Svelte 5 $effect Rune]]></title>
      <description><![CDATA[In Svelte 5, the reactive statement syntax (`$: { }`) from Svelte 4 is replaced]]></description>
      <link>https://brandonwie.dev/posts/svelte-effect-rune</link>
      <guid isPermaLink="true">https://brandonwie.dev/posts/svelte-effect-rune</guid>
      <pubDate>Sun, 22 Mar 2026 00:00:00 GMT</pubDate>
      <category>frontend</category>
      <category>svelte</category>
      <category>svelte5</category>
      <category>reactivity</category>
    </item>
    <item>
      <title><![CDATA[Claude Code Expert Workflows]]></title>
      <description><![CDATA[Synthesized patterns from three complementary expert sources: Boris Cherny (tool]]></description>
      <link>https://brandonwie.dev/posts/claude-code-expert-workflows</link>
      <guid isPermaLink="true">https://brandonwie.dev/posts/claude-code-expert-workflows</guid>
      <pubDate>Sun, 22 Mar 2026 00:00:00 GMT</pubDate>
      <category>general</category>
      <category>claude-code</category>
      <category>workflows</category>
      <category>best-practices</category>
    </item>
    <item>
      <title><![CDATA[CSS Inline-Replaced Element Gap]]></title>
      <description><![CDATA[Elements like `<textarea>`, `<img>`, `<input>`, and `<video>` are]]></description>
      <link>https://brandonwie.dev/posts/css-inline-replaced-element-gap</link>
      <guid isPermaLink="true">https://brandonwie.dev/posts/css-inline-replaced-element-gap</guid>
      <pubDate>Sun, 22 Mar 2026 00:00:00 GMT</pubDate>
      <category>general</category>
      <category>css</category>
      <category>frontend</category>
    </item>
    <item>
      <title><![CDATA[Documentation Patterns]]></title>
      <description><![CDATA[The **Buffer Pattern** preserves important discoveries during AI-assisted]]></description>
      <link>https://brandonwie.dev/posts/documentation-patterns</link>
      <guid isPermaLink="true">https://brandonwie.dev/posts/documentation-patterns</guid>
      <pubDate>Sun, 22 Mar 2026 00:00:00 GMT</pubDate>
      <category>general</category>
      <category>documentation</category>
      <category>3b</category>
      <category>patterns</category>
    </item>
    <item>
      <title><![CDATA[macOS Keychain Multi-Account Behavior]]></title>
      <description><![CDATA[macOS Keychain allows multiple entries with the same service name but different]]></description>
      <link>https://brandonwie.dev/posts/macos-keychain-multi-account</link>
      <guid isPermaLink="true">https://brandonwie.dev/posts/macos-keychain-multi-account</guid>
      <pubDate>Sun, 22 Mar 2026 00:00:00 GMT</pubDate>
      <category>general</category>
      <category>macos</category>
      <category>keychain</category>
      <category>security</category>
      <category>multi-account</category>
    </item>
    <item>
      <title><![CDATA[React Demo Pipeline Pattern]]></title>
      <description><![CDATA[Pattern for building a fully functional demo mode in a React dashboard when the]]></description>
      <link>https://brandonwie.dev/posts/react-demo-pipeline-pattern</link>
      <guid isPermaLink="true">https://brandonwie.dev/posts/react-demo-pipeline-pattern</guid>
      <pubDate>Sun, 22 Mar 2026 00:00:00 GMT</pubDate>
      <category>general</category>
      <category>react</category>
      <category>demo-mode</category>
      <category>frontend</category>
      <category>pipeline</category>
    </item>
    <item>
      <title><![CDATA[shadcn/ui Setup with Vite + Tailwind]]></title>
      <description><![CDATA[Manual setup of shadcn/ui component primitives in a Vite + React + TypeScript +]]></description>
      <link>https://brandonwie.dev/posts/shadcn-ui-vite-tailwind-setup</link>
      <guid isPermaLink="true">https://brandonwie.dev/posts/shadcn-ui-vite-tailwind-setup</guid>
      <pubDate>Sun, 22 Mar 2026 00:00:00 GMT</pubDate>
      <category>general</category>
      <category>react</category>
      <category>shadcn-ui</category>
      <category>tailwind</category>
      <category>vite</category>
      <category>frontend</category>
    </item>
    <item>
      <title><![CDATA[zsh Backtick Evaluation in Claude Code Skills]]></title>
      <description><![CDATA[Claude Code SKILL.md files can trigger zsh command substitution errors when]]></description>
      <link>https://brandonwie.dev/posts/zsh-backtick-eval-in-skills</link>
      <guid isPermaLink="true">https://brandonwie.dev/posts/zsh-backtick-eval-in-skills</guid>
      <pubDate>Sun, 22 Mar 2026 00:00:00 GMT</pubDate>
      <category>general</category>
      <category>claude-code</category>
      <category>zsh</category>
      <category>debugging</category>
    </item>
    <item>
      <title><![CDATA[Google Calendar API: Recurring Event Updates]]></title>
      <description><![CDATA[Handling "this", "thisAndFollowing", and "all" updates for recurring events.]]></description>
      <link>https://brandonwie.dev/posts/google-calendar-recurring-events</link>
      <guid isPermaLink="true">https://brandonwie.dev/posts/google-calendar-recurring-events</guid>
      <pubDate>Sun, 22 Mar 2026 00:00:00 GMT</pubDate>
      <category>backend</category>
      <category>google-api</category>
      <category>calendar</category>
      <category>work</category>
    </item>
    <item>
      <title><![CDATA[Google Calendar Recurring Event Operations]]></title>
      <description><![CDATA[Implementation patterns for `all`, `this`, and `thisAndFollowing` recurring]]></description>
      <link>https://brandonwie.dev/posts/recurring-event-operations</link>
      <guid isPermaLink="true">https://brandonwie.dev/posts/recurring-event-operations</guid>
      <pubDate>Sun, 22 Mar 2026 00:00:00 GMT</pubDate>
      <category>google-api</category>
      <category>calendar</category>
      <category>recurring-events</category>
      <category>work</category>
    </item>
    <item>
      <title><![CDATA[External Calendar Data Normalization]]></title>
      <description><![CDATA[External calendar data (Apple Calendar, GNOME Evolution, travel apps) often]]></description>
      <link>https://brandonwie.dev/posts/external-calendar-normalization</link>
      <guid isPermaLink="true">https://brandonwie.dev/posts/external-calendar-normalization</guid>
      <pubDate>Sun, 22 Mar 2026 00:00:00 GMT</pubDate>
      <category>backend</category>
      <category>google-calendar</category>
      <category>rrule</category>
      <category>parsing</category>
    </item>
    <item>
      <title><![CDATA[Partial Access Recurring Events]]></title>
      <description><![CDATA[When users are invited to recurring events from the middle of a series, Google]]></description>
      <link>https://brandonwie.dev/posts/partial-access-recurring-events</link>
      <guid isPermaLink="true">https://brandonwie.dev/posts/partial-access-recurring-events</guid>
      <pubDate>Sun, 22 Mar 2026 00:00:00 GMT</pubDate>
      <category>backend</category>
      <category>google-calendar</category>
      <category>data-integrity</category>
      <category>edge-cases</category>
    </item>
    <item>
      <title><![CDATA[rrule BYDAY Timezone Correction]]></title>
      <description><![CDATA[The rrule JavaScript library interprets `BYDAY` weekday names in UTC, not the]]></description>
      <link>https://brandonwie.dev/posts/rrule-byday-timezone-correction</link>
      <guid isPermaLink="true">https://brandonwie.dev/posts/rrule-byday-timezone-correction</guid>
      <pubDate>Sun, 22 Mar 2026 00:00:00 GMT</pubDate>
      <category>backend</category>
      <category>rrule</category>
      <category>timezone</category>
      <category>icalendar</category>
    </item>
    <item>
      <title><![CDATA[RRULE EXDATE Parsing with Timezone]]></title>
      <description><![CDATA[The `rrule` JavaScript library's `rrulestr()` function fails when:]]></description>
      <link>https://brandonwie.dev/posts/rrule-exdate-parsing</link>
      <guid isPermaLink="true">https://brandonwie.dev/posts/rrule-exdate-parsing</guid>
      <pubDate>Sun, 22 Mar 2026 00:00:00 GMT</pubDate>
      <category>backend</category>
    </item>
    <item>
      <title><![CDATA[Lemon Squeezy Subscription Management]]></title>
      <description><![CDATA[Subscription lifecycle, cancellation, expiration, and reactivation.]]></description>
      <link>https://brandonwie.dev/posts/lemon-squeezy-subscriptions</link>
      <guid isPermaLink="true">https://brandonwie.dev/posts/lemon-squeezy-subscriptions</guid>
      <pubDate>Sun, 22 Mar 2026 00:00:00 GMT</pubDate>
      <category>backend</category>
      <category>payments</category>
      <category>subscriptions</category>
      <category>work</category>
    </item>
    <item>
      <title><![CDATA[Binary Checksum Verification]]></title>
      <description><![CDATA[Verify downloaded binaries haven't been tampered with using SHA256 checksums.]]></description>
      <link>https://brandonwie.dev/posts/binary-checksum-verification</link>
      <guid isPermaLink="true">https://brandonwie.dev/posts/binary-checksum-verification</guid>
      <pubDate>Sun, 22 Mar 2026 00:00:00 GMT</pubDate>
      <category>security</category>
      <category>devops</category>
      <category>supply-chain</category>
    </item>
    <item>
      <title><![CDATA[IDOR Prevention via Required Parameters (Type-Level Enforcement)]]></title>
      <description><![CDATA[Insecure Direct Object Reference (IDOR) occurs when an API allows users to]]></description>
      <link>https://brandonwie.dev/posts/idor-prevention-type-level</link>
      <guid isPermaLink="true">https://brandonwie.dev/posts/idor-prevention-type-level</guid>
      <pubDate>Sun, 22 Mar 2026 00:00:00 GMT</pubDate>
      <category>security</category>
      <category>backend</category>
      <category>typescript</category>
    </item>
    <item>
      <title><![CDATA[Alembic with Async SQLAlchemy]]></title>
      <description><![CDATA[Configuring Alembic migrations to work with SQLAlchemy's async engine]]></description>
      <link>https://brandonwie.dev/posts/alembic-async-sqlalchemy</link>
      <guid isPermaLink="true">https://brandonwie.dev/posts/alembic-async-sqlalchemy</guid>
      <pubDate>Wed, 18 Mar 2026 00:00:00 GMT</pubDate>
      <category>backend</category>
      <category>alembic</category>
      <category>sqlalchemy</category>
      <category>python</category>
      <category>database</category>
    </item>
    <item>
      <title><![CDATA[Claude Code Multi-Profile HUD Setup]]></title>
      <description><![CDATA[Running Claude Code with multiple accounts requires careful HUD configuration to show correct per-account usage stats. Here's how to fix cross-profile data leaks.]]></description>
      <link>https://brandonwie.dev/posts/claude-code-multi-profile-hud</link>
      <guid isPermaLink="true">https://brandonwie.dev/posts/claude-code-multi-profile-hud</guid>
      <pubDate>Wed, 18 Mar 2026 00:00:00 GMT</pubDate>
      <category>general</category>
      <category>claude-code</category>
      <category>hud</category>
      <category>multi-account</category>
      <category>devtools</category>
    </item>
    <item>
      <title><![CDATA[ECR/ECS Deployment Workflow]]></title>
      <description><![CDATA[Complete guide to container deployment using Amazon ECR and ECS.]]></description>
      <link>https://brandonwie.dev/posts/ecr-ecs-deployment-workflow</link>
      <guid isPermaLink="true">https://brandonwie.dev/posts/ecr-ecs-deployment-workflow</guid>
      <pubDate>Sun, 15 Mar 2026 00:00:00 GMT</pubDate>
      <category>aws</category>
      <category>ecs</category>
      <category>ecr</category>
      <category>docker</category>
      <category>cicd</category>
    </item>
    <item>
      <title><![CDATA[AWS VPC Networking Fundamentals]]></title>
      <description><![CDATA[Comprehensive guide to AWS VPC networking: CIDR notation, subnet design, NAT Gateway placement, route tables, and complete Terraform examples.]]></description>
      <link>https://brandonwie.dev/posts/vpc-networking-fundamentals</link>
      <guid isPermaLink="true">https://brandonwie.dev/posts/vpc-networking-fundamentals</guid>
      <pubDate>Sun, 15 Mar 2026 00:00:00 GMT</pubDate>
      <category>aws</category>
      <category>networking</category>
      <category>vpc</category>
      <category>terraform</category>
    </item>
    <item>
      <title><![CDATA[FastAPI Dependency Injection Patterns]]></title>
      <description><![CDATA[How to use Annotated types with FastAPI Depends() for reusable, type-safe dependency injection across routers.]]></description>
      <link>https://brandonwie.dev/posts/fastapi-dependency-injection-patterns</link>
      <guid isPermaLink="true">https://brandonwie.dev/posts/fastapi-dependency-injection-patterns</guid>
      <pubDate>Sun, 15 Mar 2026 00:00:00 GMT</pubDate>
      <category>backend</category>
      <category>fastapi</category>
      <category>python</category>
    </item>
    <item>
      <title><![CDATA[Pessimistic Locking for Race Conditions]]></title>
      <description><![CDATA[Use SELECT FOR UPDATE to prevent race conditions in check-then-insert patterns, with TypeORM implementation and duplicate key safety nets.]]></description>
      <link>https://brandonwie.dev/posts/pessimistic-locking-race-conditions</link>
      <guid isPermaLink="true">https://brandonwie.dev/posts/pessimistic-locking-race-conditions</guid>
      <pubDate>Sun, 15 Mar 2026 00:00:00 GMT</pubDate>
      <category>backend</category>
      <category>database</category>
      <category>concurrency</category>
      <category>patterns</category>
    </item>
    <item>
      <title><![CDATA[WebSocket Architecture in AWS ECS/ALB]]></title>
      <description><![CDATA[How WebSocket connections work with ALB, ECS, and Redis Pub/Sub for real-time notifications in containerized environments.]]></description>
      <link>https://brandonwie.dev/posts/websocket-architecture</link>
      <guid isPermaLink="true">https://brandonwie.dev/posts/websocket-architecture</guid>
      <pubDate>Sun, 15 Mar 2026 00:00:00 GMT</pubDate>
      <category>backend</category>
      <category>websocket</category>
      <category>socket.io</category>
      <category>redis</category>
      <category>aws</category>
      <category>ecs</category>
      <category>alb</category>
    </item>
    <item>
      <title><![CDATA[OAuth 2.0 Implementation Patterns]]></title>
      <description><![CDATA[Practical patterns for implementing OAuth 2.0 flows in backend services.]]></description>
      <link>https://brandonwie.dev/posts/oauth2-implementation-patterns</link>
      <guid isPermaLink="true">https://brandonwie.dev/posts/oauth2-implementation-patterns</guid>
      <pubDate>Sun, 15 Mar 2026 00:00:00 GMT</pubDate>
      <category>security</category>
      <category>oauth</category>
      <category>api</category>
    </item>
    <item>
      <title><![CDATA[Understanding Traefik, Keycloak, and ForwardAuth]]></title>
      <description><![CDATA[How to add centralized authentication to Kubernetes services using Traefik ForwardAuth, Keycloak, and OAuth2-Proxy.]]></description>
      <link>https://brandonwie.dev/posts/traefik-keycloak-forwardauth</link>
      <guid isPermaLink="true">https://brandonwie.dev/posts/traefik-keycloak-forwardauth</guid>
      <pubDate>Sun, 15 Mar 2026 00:00:00 GMT</pubDate>
      <category>security</category>
      <category>traefik</category>
      <category>keycloak</category>
      <category>oauth2</category>
      <category>authentication</category>
    </item>
    <item>
      <title><![CDATA[Recharts Dark Theme Customization]]></title>
      <description><![CDATA[Techniques for styling Recharts charts to match a dark terminal theme with CSS]]></description>
      <link>https://brandonwie.dev/posts/recharts-dark-theme-customization</link>
      <guid isPermaLink="true">https://brandonwie.dev/posts/recharts-dark-theme-customization</guid>
      <pubDate>Mon, 09 Mar 2026 00:00:00 GMT</pubDate>
      <category>general</category>
      <category>react</category>
      <category>recharts</category>
      <category>charts</category>
      <category>frontend</category>
      <category>dark-theme</category>
    </item>
    <item>
      <title><![CDATA[AI Code Review Patterns]]></title>
      <description><![CDATA[Patterns observed when AI reviewers (Claude, Copilot, Codex) generate invalid or misleading feedback, and how to handle each one.]]></description>
      <link>https://brandonwie.dev/posts/ai-code-review-patterns</link>
      <guid isPermaLink="true">https://brandonwie.dev/posts/ai-code-review-patterns</guid>
      <pubDate>Thu, 05 Mar 2026 00:00:00 GMT</pubDate>
      <category>ai</category>
      <category>code-review</category>
      <category>patterns</category>
    </item>
    <item>
      <title><![CDATA[Batch Processing Trade-offs]]></title>
      <description><![CDATA[When processing multiple entities that share database operations, there's a]]></description>
      <link>https://brandonwie.dev/posts/batch-processing-trade-offs</link>
      <guid isPermaLink="true">https://brandonwie.dev/posts/batch-processing-trade-offs</guid>
      <pubDate>Tue, 03 Mar 2026 00:00:00 GMT</pubDate>
      <category>backend</category>
      <category>performance</category>
      <category>architecture</category>
      <category>trade-offs</category>
    </item>
    <item>
      <title><![CDATA[ECS Auto-Scaling Deep Dive]]></title>
      <description><![CDATA[Comprehensive guide to ECS auto-scaling concepts, algorithms, and container]]></description>
      <link>https://brandonwie.dev/posts/ecs-autoscaling-deep-dive</link>
      <guid isPermaLink="true">https://brandonwie.dev/posts/ecs-autoscaling-deep-dive</guid>
      <pubDate>Tue, 24 Feb 2026 00:00:00 GMT</pubDate>
      <category>aws</category>
      <category>ecs</category>
      <category>autoscaling</category>
      <category>fargate</category>
    </item>
    <item>
      <title><![CDATA[GitHub PR Review API - Inline Comments]]></title>
      <description><![CDATA[How to create PR reviews with inline comments using the GitHub API via `gh` CLI.]]></description>
      <link>https://brandonwie.dev/posts/github-pr-review-api-inline-comments</link>
      <guid isPermaLink="true">https://brandonwie.dev/posts/github-pr-review-api-inline-comments</guid>
      <pubDate>Wed, 04 Feb 2026 00:00:00 GMT</pubDate>
      <category>devops</category>
      <category>github</category>
      <category>api</category>
      <category>pr-review</category>
    </item>
    <item>
      <title><![CDATA[Two-Phase Deletion Pattern]]></title>
      <description><![CDATA[A safe deletion pattern for systems without rollback capability where external]]></description>
      <link>https://brandonwie.dev/posts/two-phase-deletion-pattern</link>
      <guid isPermaLink="true">https://brandonwie.dev/posts/two-phase-deletion-pattern</guid>
      <pubDate>Mon, 26 Jan 2026 00:00:00 GMT</pubDate>
      <category>backend</category>
      <category>architecture</category>
      <category>data-integrity</category>
      <category>patterns</category>
    </item>
    <item>
      <title><![CDATA[Infrastructure Hardening Checklist]]></title>
      <description><![CDATA[Comprehensive security hardening checklist for AWS infrastructure. Covers]]></description>
      <link>https://brandonwie.dev/posts/infrastructure-hardening-checklist</link>
      <guid isPermaLink="true">https://brandonwie.dev/posts/infrastructure-hardening-checklist</guid>
      <pubDate>Mon, 26 Jan 2026 00:00:00 GMT</pubDate>
      <category>security</category>
      <category>aws</category>
      <category>infrastructure</category>
      <category>checklist</category>
    </item>
    <item>
      <title><![CDATA[Google Calendar Sync Strategies]]></title>
      <description><![CDATA[Full sync vs incremental sync patterns and calendar segregation logic.]]></description>
      <link>https://brandonwie.dev/posts/google-calendar-sync-strategies</link>
      <guid isPermaLink="true">https://brandonwie.dev/posts/google-calendar-sync-strategies</guid>
      <pubDate>Fri, 23 Jan 2026 00:00:00 GMT</pubDate>
      <category>backend</category>
      <category>google-api</category>
      <category>sync</category>
      <category>calendar</category>
      <category>work</category>
    </item>
  </channel>
</rss>