<?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-08-23T15:43:29.401Z</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/corvus</loc>
<changefreq>weekly</changefreq>
<priority>0.6</priority>
</url>
<url>
<loc>https://brandonperfetti.com/articles/runbooks-to-agent-skills</loc>
<lastmod>2026-08-23T15:43:29.401Z</lastmod>
<changefreq>monthly</changefreq>
<priority>0.7</priority>
</url>
<url>
<loc>https://brandonperfetti.com/articles/from-neon-to-supabase</loc>
<lastmod>2026-08-23T15:43:09.756Z</lastmod>
<changefreq>monthly</changefreq>
<priority>0.7</priority>
</url>
<url>
<loc>https://brandonperfetti.com/articles/from-sendgrid-to-resend</loc>
<lastmod>2026-08-23T15:42:53.473Z</lastmod>
<changefreq>monthly</changefreq>
<priority>0.7</priority>
</url>
<url>
<loc>https://brandonperfetti.com/articles/the-nextjs-stack-i-reuse</loc>
<lastmod>2026-08-23T15:42:33.541Z</lastmod>
<changefreq>monthly</changefreq>
<priority>0.7</priority>
</url>
<url>
<loc>https://brandonperfetti.com/articles/from-notion-to-payload</loc>
<lastmod>2026-08-23T15:41:56.570Z</lastmod>
<changefreq>monthly</changefreq>
<priority>0.7</priority>
</url>
<url>
<loc>https://brandonperfetti.com/articles/nextjs-15-notion-cms-ditch-git-deploy-content-updates</loc>
<lastmod>2026-08-22T20:11:46.966Z</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-08-22T20:12:01.430Z</lastmod>
<changefreq>monthly</changefreq>
<priority>0.7</priority>
</url>
<url>
<loc>https://brandonperfetti.com/articles/reading-code-you-didnt-write-habits-that-make-it-faster</loc>
<lastmod>2026-08-22T20:12:44.137Z</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-08-22T20:35:58.559Z</lastmod>
<changefreq>monthly</changefreq>
<priority>0.7</priority>
</url>
<url>
<loc>https://brandonperfetti.com/articles/sql-joins-explained-without-the-venn-diagrams</loc>
<lastmod>2026-08-22T20:10:54.952Z</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-08-22T21:04:46.008Z</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-08-22T20:12:08.099Z</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-08-22T21:04:20.296Z</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-08-22T21:04:07.113Z</lastmod>
<changefreq>monthly</changefreq>
<priority>0.7</priority>
</url>
<url>
<loc>https://brandonperfetti.com/articles/designing-a-design-system-in-react-tokens-components-and-what-actually-scales</loc>
<lastmod>2026-08-22T21:04:33.280Z</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-08-22T21:04:13.428Z</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-08-22T21:39:29.030Z</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-08-22T20:11:17.937Z</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-08-22T20:11:54.282Z</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-08-22T20:11:10.991Z</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-08-22T21:39:35.332Z</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-08-22T20:12:19.533Z</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-08-22T22:41:00.087Z</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-08-22T22:11:33.119Z</lastmod>
<changefreq>monthly</changefreq>
<priority>0.7</priority>
</url>
<url>
<loc>https://brandonperfetti.com/articles/writing-tests-for-react-that-dont-make-you-want-to-quit</loc>
<lastmod>2026-08-22T22:41:25.333Z</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-08-22T22:11:06.310Z</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-08-22T22:11:27.021Z</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-08-22T21:04:27.333Z</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-08-22T21:39:57.952Z</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-08-22T20:35:33.890Z</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-08-22T20:11:25.281Z</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-08-22T20:12:27.395Z</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-08-22T20:36:11.377Z</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-08-22T20:12:35.733Z</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-08-22T21:04:39.858Z</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-08-22T20:11:39.743Z</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-08-22T22:10:54.325Z</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-08-22T20:35:39.726Z</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-08-22T20:35:45.992Z</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-08-22T21:39:48.223Z</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-08-22T20:35:52.024Z</lastmod>
<changefreq>monthly</changefreq>
<priority>0.7</priority>
</url>
<url>
<loc>https://brandonperfetti.com/articles/mongodb-aggregation-pipeline-the-feature-that-unlocks-real-queries</loc>
<lastmod>2026-08-22T21:39:16.071Z</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-08-22T22:41:06.285Z</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-08-22T21:39:22.325Z</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-08-22T21:39:41.887Z</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-08-22T22:11:39.291Z</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-08-22T22:11:19.557Z</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-08-22T20:11:32.391Z</lastmod>
<changefreq>monthly</changefreq>
<priority>0.7</priority>
</url>
<url>
<loc>https://brandonperfetti.com/articles/zustand-vs-redux-vs-context-choosing-state-management-that-wont-haunt-you</loc>
<lastmod>2026-08-22T20:36:04.604Z</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-08-22T22:11:13.023Z</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-08-22T22:41:12.713Z</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-08-22T22:41:18.851Z</lastmod>
<changefreq>monthly</changefreq>
<priority>0.7</priority>
</url>
<url>
<loc>https://brandonperfetti.com/now</loc>
<changefreq>monthly</changefreq>
<priority>0.5</priority>
</url>
</urlset>
