<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
<url>
<loc>https://brandonperfetti.com</loc>
<changefreq>weekly</changefreq>
<priority>1</priority>
</url>
<url>
<loc>https://brandonperfetti.com/about</loc>
<changefreq>monthly</changefreq>
<priority>0.8</priority>
</url>
<url>
<loc>https://brandonperfetti.com/articles</loc>
<lastmod>2026-03-19T01:15:00.000Z</lastmod>
<changefreq>daily</changefreq>
<priority>0.9</priority>
</url>
<url>
<loc>https://brandonperfetti.com/projects</loc>
<changefreq>monthly</changefreq>
<priority>0.7</priority>
</url>
<url>
<loc>https://brandonperfetti.com/tech</loc>
<changefreq>monthly</changefreq>
<priority>0.7</priority>
</url>
<url>
<loc>https://brandonperfetti.com/uses</loc>
<changefreq>monthly</changefreq>
<priority>0.6</priority>
</url>
<url>
<loc>https://brandonperfetti.com/hermes</loc>
<changefreq>weekly</changefreq>
<priority>0.6</priority>
</url>
<url>
<loc>https://brandonperfetti.com/articles/nextjs-15-notion-cms-ditch-git-deploy-content-updates</loc>
<lastmod>2026-03-19T01:12:00.000Z</lastmod>
<changefreq>monthly</changefreq>
<priority>0.7</priority>
</url>
<url>
<loc>https://brandonperfetti.com/articles/pgvector-postgresql-production-ready-semantic-search-without-a-vector-db</loc>
<lastmod>2026-03-19T01:11:00.000Z</lastmod>
<changefreq>monthly</changefreq>
<priority>0.7</priority>
</url>
<url>
<loc>https://brandonperfetti.com/articles/feature-flags-in-javascript-ship-faster-without-breaking-things</loc>
<lastmod>2026-03-19T01:12:00.000Z</lastmod>
<changefreq>monthly</changefreq>
<priority>0.7</priority>
</url>
<url>
<loc>https://brandonperfetti.com/articles/building-a-cli-tool-in-node-js-from-script-to-publishable-package</loc>
<lastmod>2026-03-19T01:13:00.000Z</lastmod>
<changefreq>monthly</changefreq>
<priority>0.7</priority>
</url>
<url>
<loc>https://brandonperfetti.com/articles/building-a-cli-tool-in-node-js-from-script-to-publishable-package</loc>
<lastmod>2026-03-13T14:32:00.000Z</lastmod>
<changefreq>monthly</changefreq>
<priority>0.7</priority>
</url>
<url>
<loc>https://brandonperfetti.com/articles/webhooks-building-reliable-event-receivers-in-node-js</loc>
<lastmod>2026-03-19T01:13:00.000Z</lastmod>
<changefreq>monthly</changefreq>
<priority>0.7</priority>
</url>
<url>
<loc>https://brandonperfetti.com/articles/webhooks-building-reliable-event-receivers-in-node-js</loc>
<lastmod>2026-03-13T14:30:00.000Z</lastmod>
<changefreq>monthly</changefreq>
<priority>0.7</priority>
</url>
<url>
<loc>https://brandonperfetti.com/articles/typescript-path-aliases-clean-imports-that-actually-work-in-next-js</loc>
<lastmod>2026-03-19T01:14:00.000Z</lastmod>
<changefreq>monthly</changefreq>
<priority>0.7</priority>
</url>
<url>
<loc>https://brandonperfetti.com/articles/typescript-path-aliases-clean-imports-that-actually-work-in-next-js</loc>
<lastmod>2026-03-13T14:32:00.000Z</lastmod>
<changefreq>monthly</changefreq>
<priority>0.7</priority>
</url>
<url>
<loc>https://brandonperfetti.com/articles/api-rate-limiting-in-node-js-protecting-your-backend-without-killing-ux</loc>
<lastmod>2026-03-19T01:13:00.000Z</lastmod>
<changefreq>monthly</changefreq>
<priority>0.7</priority>
</url>
<url>
<loc>https://brandonperfetti.com/articles/api-rate-limiting-in-node-js-protecting-your-backend-without-killing-ux</loc>
<lastmod>2026-03-13T14:32:00.000Z</lastmod>
<changefreq>monthly</changefreq>
<priority>0.7</priority>
</url>
<url>
<loc>https://brandonperfetti.com/articles/prisma-migrations-in-production-the-zero-downtime-playbook</loc>
<lastmod>2026-03-19T01:14:00.000Z</lastmod>
<changefreq>monthly</changefreq>
<priority>0.7</priority>
</url>
<url>
<loc>https://brandonperfetti.com/articles/javascript-event-loop-demystified-what-senior-devs-know-that-juniors-dont</loc>
<lastmod>2026-03-19T01:13:00.000Z</lastmod>
<changefreq>monthly</changefreq>
<priority>0.7</priority>
</url>
<url>
<loc>https://brandonperfetti.com/articles/image-optimization-for-the-web-what-actually-makes-a-difference</loc>
<lastmod>2026-03-19T01:13:00.000Z</lastmod>
<changefreq>monthly</changefreq>
<priority>0.7</priority>
</url>
<url>
<loc>https://brandonperfetti.com/articles/zod-the-validation-library-that-changed-how-i-think-about-data</loc>
<lastmod>2026-03-19T01:14:00.000Z</lastmod>
<changefreq>monthly</changefreq>
<priority>0.7</priority>
</url>
<url>
<loc>https://brandonperfetti.com/articles/web-performance-metrics-that-actually-move-the-needle</loc>
<lastmod>2026-03-19T01:13:00.000Z</lastmod>
<changefreq>monthly</changefreq>
<priority>0.7</priority>
</url>
<url>
<loc>https://brandonperfetti.com/articles/monorepo-vs-polyrepo-the-real-decision-for-full-stack-js-teams</loc>
<lastmod>2026-03-19T01:12:00.000Z</lastmod>
<changefreq>monthly</changefreq>
<priority>0.7</priority>
</url>
<url>
<loc>https://brandonperfetti.com/articles/writing-tests-for-react-that-dont-make-you-quit</loc>
<lastmod>2026-03-19T01:11:00.000Z</lastmod>
<changefreq>monthly</changefreq>
<priority>0.7</priority>
</url>
<url>
<loc>https://brandonperfetti.com/articles/nodejs-streams-why-they-matter-and-when-to-actually-use-them</loc>
<lastmod>2026-03-19T01:14:00.000Z</lastmod>
<changefreq>monthly</changefreq>
<priority>0.7</priority>
</url>
<url>
<loc>https://brandonperfetti.com/articles/react-useref-beyond-dom-manipulation-patterns-worth-knowing</loc>
<lastmod>2026-03-19T01:13:00.000Z</lastmod>
<changefreq>monthly</changefreq>
<priority>0.7</priority>
</url>
<url>
<loc>https://brandonperfetti.com/articles/infinite-scroll-vs-pagination-the-tradeoffs-nobody-tells-you-about</loc>
<lastmod>2026-03-19T01:14:00.000Z</lastmod>
<changefreq>monthly</changefreq>
<priority>0.7</priority>
</url>
<url>
<loc>https://brandonperfetti.com/articles/optimistic-ui-updates-in-react-making-your-app-feel-instant</loc>
<lastmod>2026-03-19T01:14:00.000Z</lastmod>
<changefreq>monthly</changefreq>
<priority>0.7</priority>
</url>
<url>
<loc>https://brandonperfetti.com/articles/ai-tool-calls-explained-giving-your-llm-the-ability-to-actually-do-things</loc>
<lastmod>2026-03-19T01:14:00.000Z</lastmod>
<changefreq>monthly</changefreq>
<priority>0.7</priority>
</url>
<url>
<loc>https://brandonperfetti.com/articles/postgresql-full-text-search-good-enough-to-replace-elasticsearch</loc>
<lastmod>2026-03-19T01:13:00.000Z</lastmod>
<changefreq>monthly</changefreq>
<priority>0.7</priority>
</url>
<url>
<loc>https://brandonperfetti.com/articles/building-a-streaming-ai-chat-ui-with-ai-sdk-v5-and-react</loc>
<lastmod>2026-03-19T01:14:00.000Z</lastmod>
<changefreq>monthly</changefreq>
<priority>0.7</priority>
</url>
<url>
<loc>https://brandonperfetti.com/articles/tailwind-css-v4-what-changed-and-how-to-migrate</loc>
<lastmod>2026-03-19T01:11:00.000Z</lastmod>
<changefreq>monthly</changefreq>
<priority>0.7</priority>
</url>
<url>
<loc>https://brandonperfetti.com/articles/getting-started-with-vercel-ai-sdk-v5-the-patterns-that-actually-stick</loc>
<lastmod>2026-03-19T01:12:00.000Z</lastmod>
<changefreq>monthly</changefreq>
<priority>0.7</priority>
</url>
<url>
<loc>https://brandonperfetti.com/articles/react-19-actions-finally-a-clean-way-to-handle-server-mutations</loc>
<lastmod>2026-03-19T01:14:00.000Z</lastmod>
<changefreq>monthly</changefreq>
<priority>0.7</priority>
</url>
<url>
<loc>https://brandonperfetti.com/articles/typescript-strict-mode-extra-pain-worth-it</loc>
<lastmod>2026-03-19T01:13:00.000Z</lastmod>
<changefreq>monthly</changefreq>
<priority>0.7</priority>
</url>
<url>
<loc>https://brandonperfetti.com/articles/strapi-v4-custom-api-building-endpoints-beyond-generated-crud</loc>
<lastmod>2026-03-19T01:13:00.000Z</lastmod>
<changefreq>monthly</changefreq>
<priority>0.7</priority>
</url>
<url>
<loc>https://brandonperfetti.com/articles/accessibility-in-react-the-quick-wins-that-cover-80-percent-of-issues</loc>
<lastmod>2026-03-19T01:15:00.000Z</lastmod>
<changefreq>monthly</changefreq>
<priority>0.7</priority>
</url>
<url>
<loc>https://brandonperfetti.com/articles/nextjs-app-router-after-a-year-in-production-what-id-tell-my-past-self</loc>
<lastmod>2026-03-19T01:11:00.000Z</lastmod>
<changefreq>monthly</changefreq>
<priority>0.7</priority>
</url>
<url>
<loc>https://brandonperfetti.com/articles/mongodb-vs-postgresql-the-decision-framework-i-actually-use</loc>
<lastmod>2026-03-19T01:10:00.000Z</lastmod>
<changefreq>monthly</changefreq>
<priority>0.7</priority>
</url>
<url>
<loc>https://brandonperfetti.com/articles/prisma-postgresql-the-data-layer-setup-i-use-on-every-project</loc>
<lastmod>2026-03-19T01:11:00.000Z</lastmod>
<changefreq>monthly</changefreq>
<priority>0.7</priority>
</url>
<url>
<loc>https://brandonperfetti.com/articles/postgresql-indexing-basics-that-actually-matter-for-app-developers</loc>
<lastmod>2026-03-19T01:11:00.000Z</lastmod>
<changefreq>monthly</changefreq>
<priority>0.7</priority>
</url>
<url>
<loc>https://brandonperfetti.com/articles/css-custom-properties-theyre-not-just-for-color-tokens</loc>
<lastmod>2026-03-19T01:12:00.000Z</lastmod>
<changefreq>monthly</changefreq>
<priority>0.7</priority>
</url>
<url>
<loc>https://brandonperfetti.com/articles/docker-for-frontend-devs-stop-being-scared-of-containers</loc>
<lastmod>2026-03-19T01:11:00.000Z</lastmod>
<changefreq>monthly</changefreq>
<priority>0.7</priority>
</url>
<url>
<loc>https://brandonperfetti.com/articles/nodejs-error-handling-that-doesnt-embarrass-you-in-production</loc>
<lastmod>2026-03-19T01:12:00.000Z</lastmod>
<changefreq>monthly</changefreq>
<priority>0.7</priority>
</url>
<url>
<loc>https://brandonperfetti.com/articles/typescript-interface-vs-type-the-real-difference-and-when-it-matters</loc>
<lastmod>2026-03-19T01:12:00.000Z</lastmod>
<changefreq>monthly</changefreq>
<priority>0.7</priority>
</url>
<url>
<loc>https://brandonperfetti.com/articles/gsap-scrolltrigger-in-react-the-patterns-that-actually-work</loc>
<lastmod>2026-03-19T01:12:00.000Z</lastmod>
<changefreq>monthly</changefreq>
<priority>0.7</priority>
</url>
<url>
<loc>https://brandonperfetti.com/articles/usecallback-and-usememo-stop-reaching-for-them-by-default</loc>
<lastmod>2026-03-19T01:12:00.000Z</lastmod>
<changefreq>monthly</changefreq>
<priority>0.7</priority>
</url>
<url>
<loc>https://brandonperfetti.com/articles/css-grid-the-layout-system-youve-been-avoiding-and-shouldnt</loc>
<lastmod>2026-03-19T01:12:00.000Z</lastmod>
<changefreq>monthly</changefreq>
<priority>0.7</priority>
</url>
<url>
<loc>https://brandonperfetti.com/articles/rest-api-design-patterns-that-make-your-nodejs-backend-a-joy-to-work-with</loc>
<lastmod>2026-03-19T01:12:00.000Z</lastmod>
<changefreq>monthly</changefreq>
<priority>0.7</priority>
</url>
<url>
<loc>https://brandonperfetti.com/articles/javascript-asyncawait-patterns-that-trip-up-senior-devs</loc>
<lastmod>2026-03-19T01:11:00.000Z</lastmod>
<changefreq>monthly</changefreq>
<priority>0.7</priority>
</url>
<url>
<loc>https://brandonperfetti.com/articles/custom-react-hooks-when-to-extract-and-when-to-leave-it-inline</loc>
<lastmod>2026-03-19T01:11:00.000Z</lastmod>
<changefreq>monthly</changefreq>
<priority>0.7</priority>
</url>
<url>
<loc>https://brandonperfetti.com/articles/component-composition-patterns-in-react-that-actually-scale</loc>
<lastmod>2026-03-19T01:11:00.000Z</lastmod>
<changefreq>monthly</changefreq>
<priority>0.7</priority>
</url>
</urlset>
