<?xml version='1.0' encoding='utf-8'?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9" xmlns:image="http://www.google.com/schemas/sitemap-image/1.1"><url><loc>https://praritsidana.com/</loc><lastmod>2026-11-11T06:05:21.919417+00:00</lastmod><image:image><image:loc>https://praritsidana.com/media/portfolio/imported/cd19c8cbacb69ed9-1783330427213-3dx80c.jpeg</image:loc></image:image></url><url><loc>https://praritsidana.com/blog</loc><lastmod>2026-11-11T16:36:38.622764+00:00</lastmod></url><url><loc>https://praritsidana.com/blog/document-integration-readiness-without-implying-live-execution</loc><lastmod>2026-11-11T16:36:38.622764+00:00</lastmod><image:image><image:loc>https://praritsidana.com/media/portfolio/portfolio-assets/blog-campaign-20261111/92072866b5704f2a88a36ca0ffae3769.webp</image:loc></image:image></url><url><loc>https://praritsidana.com/blog/distinguish-a-technical-case-study-from-a-product-outcome-claim</loc><lastmod>2026-11-11T16:36:38.467383+00:00</lastmod><image:image><image:loc>https://praritsidana.com/media/portfolio/portfolio-assets/blog-campaign-20261111/7e3375bd4cb545349db0e2263f84283e.webp</image:loc></image:image></url><url><loc>https://praritsidana.com/blog/handle-a-websocket-disconnect-in-a-django-channels-consumer</loc><lastmod>2026-11-11T16:36:38.316630+00:00</lastmod><image:image><image:loc>https://praritsidana.com/media/portfolio/portfolio-assets/blog-campaign-20261111/e1b584608c104f968e17fe2dba349329.webp</image:loc></image:image></url><url><loc>https://praritsidana.com/blog/separate-pending-forecast-horizons-from-evaluated-results</loc><lastmod>2026-11-11T16:36:38.179957+00:00</lastmod><image:image><image:loc>https://praritsidana.com/media/portfolio/portfolio-assets/blog-campaign-20261111/8f17f058fb1f435baa8841cae280509a.webp</image:loc></image:image></url><url><loc>https://praritsidana.com/blog/evaluate-a-forecast-with-time-ordered-splits</loc><lastmod>2026-11-11T16:36:38.014518+00:00</lastmod><image:image><image:loc>https://praritsidana.com/media/portfolio/portfolio-assets/blog-campaign-20261111/2e9f3fe438fc4db88853498ec4902934.webp</image:loc></image:image></url><url><loc>https://praritsidana.com/blog/cancel-a-media-processing-job-and-clean-up-partial-output</loc><lastmod>2026-11-11T16:36:37.876238+00:00</lastmod><image:image><image:loc>https://praritsidana.com/media/portfolio/portfolio-assets/blog-campaign-20261111/b2d5e31793134367a54a434a9ee3c531.webp</image:loc></image:image></url><url><loc>https://praritsidana.com/blog/align-video-captions-with-a-transcript-timebase</loc><lastmod>2026-11-11T16:36:37.712674+00:00</lastmod><image:image><image:loc>https://praritsidana.com/media/portfolio/portfolio-assets/blog-campaign-20261111/c013d519c62744aa8e16fbf9af1a2ac1.webp</image:loc></image:image></url><url><loc>https://praritsidana.com/blog/explain-what-electron-safestorage-protects-on-windows</loc><lastmod>2026-11-11T16:36:37.550954+00:00</lastmod><image:image><image:loc>https://praritsidana.com/media/portfolio/portfolio-assets/blog-campaign-20261111/d4d88ae0ebce44fe979bdedb8fdb10de.webp</image:loc></image:image></url><url><loc>https://praritsidana.com/blog/pass-a-local-file-safely-across-an-electron-boundary</loc><lastmod>2026-11-11T16:36:37.387433+00:00</lastmod><image:image><image:loc>https://praritsidana.com/media/portfolio/portfolio-assets/blog-campaign-20261111/240c66df92054fca90f013ae0ec15c36.webp</image:loc></image:image></url><url><loc>https://praritsidana.com/blog/choose-an-encoder-fallback-when-hardware-encoding-fails</loc><lastmod>2026-11-11T16:36:37.232743+00:00</lastmod><image:image><image:loc>https://praritsidana.com/media/portfolio/portfolio-assets/blog-campaign-20261111/ab3b72c4922545359b39e918321ca2ec.webp</image:loc></image:image></url><url><loc>https://praritsidana.com/blog/preserve-aspect-ratio-when-exporting-a-vertical-clip</loc><lastmod>2026-11-11T16:36:37.068157+00:00</lastmod><image:image><image:loc>https://praritsidana.com/media/portfolio/portfolio-assets/blog-campaign-20261111/9818836dc9a64399baef418e3d6c5ffe.webp</image:loc></image:image></url><url><loc>https://praritsidana.com/blog/keep-video-segments-within-a-declared-duration-policy</loc><lastmod>2026-11-11T16:36:36.912492+00:00</lastmod><image:image><image:loc>https://praritsidana.com/media/portfolio/portfolio-assets/blog-campaign-20261111/a702379b2e4144428e59318ead2f3975.webp</image:loc></image:image></url><url><loc>https://praritsidana.com/blog/inspect-a-video-file-with-ffprobe-before-processing-it</loc><lastmod>2026-11-11T16:36:36.771499+00:00</lastmod><image:image><image:loc>https://praritsidana.com/media/portfolio/portfolio-assets/blog-campaign-20261111/c6472ca3eec141a696aba5a68f61480a.webp</image:loc></image:image></url><url><loc>https://praritsidana.com/blog/check-public-asset-paths-after-deploying-under-a-subpath</loc><lastmod>2026-11-11T16:36:36.636327+00:00</lastmod><image:image><image:loc>https://praritsidana.com/media/portfolio/portfolio-assets/blog-campaign-20261111/4be9c7c1d434421ea1a08c480e004223.webp</image:loc></image:image></url><url><loc>https://praritsidana.com/blog/practice-a-release-rollback-with-an-explicit-schema-boundary</loc><lastmod>2026-11-11T16:36:36.486380+00:00</lastmod><image:image><image:loc>https://praritsidana.com/media/portfolio/portfolio-assets/blog-campaign-20261111/977748e1b7dc45b3a0493004c3cbd125.webp</image:loc></image:image></url><url><loc>https://praritsidana.com/blog/trace-a-request-across-api-and-worker-boundaries</loc><lastmod>2026-11-11T16:36:36.339622+00:00</lastmod><image:image><image:loc>https://praritsidana.com/media/portfolio/portfolio-assets/blog-campaign-20261111/07ac0955779241fd826e82a7668eebc1.webp</image:loc></image:image></url><url><loc>https://praritsidana.com/blog/return-a-real-404-for-a-missing-application-route</loc><lastmod>2026-11-11T16:36:36.187499+00:00</lastmod><image:image><image:loc>https://praritsidana.com/media/portfolio/portfolio-assets/blog-campaign-20261111/9830a148596b4461b67ceb81bca8792d.webp</image:loc></image:image></url><url><loc>https://praritsidana.com/blog/keep-deleted-urls-out-of-an-xml-sitemap</loc><lastmod>2026-11-11T16:36:36.042445+00:00</lastmod><image:image><image:loc>https://praritsidana.com/media/portfolio/portfolio-assets/blog-campaign-20261111/8c9497dd67d349799223a8dd7746daac.webp</image:loc></image:image></url><url><loc>https://praritsidana.com/blog/serve-meaningful-html-before-react-loads</loc><lastmod>2026-11-11T16:36:35.874865+00:00</lastmod><image:image><image:loc>https://praritsidana.com/media/portfolio/portfolio-assets/blog-campaign-20261111/77e2d808549342f4ae7c8533a365b588.webp</image:loc></image:image></url><url><loc>https://praritsidana.com/blog/schedule-a-maintenance-command-with-a-systemd-timer</loc><lastmod>2026-11-11T16:36:35.710841+00:00</lastmod><image:image><image:loc>https://praritsidana.com/media/portfolio/portfolio-assets/blog-campaign-20261111/70dc39e9e7d04b8abc76968bc70be96d.webp</image:loc></image:image></url><url><loc>https://praritsidana.com/blog/distinguish-liveness-from-readiness-in-an-application-health-check</loc><lastmod>2026-11-11T16:36:35.541848+00:00</lastmod><image:image><image:loc>https://praritsidana.com/media/portfolio/portfolio-assets/blog-campaign-20261111/ee6a15ee7a2646a9a6c3f456eef14642.webp</image:loc></image:image></url><url><loc>https://praritsidana.com/blog/verify-a-postgresql-backup-by-restoring-it</loc><lastmod>2026-11-11T16:36:35.356320+00:00</lastmod><image:image><image:loc>https://praritsidana.com/media/portfolio/portfolio-assets/blog-campaign-20261111/95ae2121221a4afe9eb9a2ab2dc05344.webp</image:loc></image:image></url><url><loc>https://praritsidana.com/blog/run-django-s-deployment-checks-before-a-release</loc><lastmod>2026-11-11T16:36:35.194128+00:00</lastmod><image:image><image:loc>https://praritsidana.com/media/portfolio/portfolio-assets/blog-campaign-20261111/cb268e5dd39547139ca5378db539ebc0.webp</image:loc></image:image></url><url><loc>https://praritsidana.com/blog/set-proxy-timeouts-for-a-streamed-api-response</loc><lastmod>2026-11-11T16:36:35.035613+00:00</lastmod><image:image><image:loc>https://praritsidana.com/media/portfolio/portfolio-assets/blog-campaign-20261111/c591c649bb374b748d781c0a53e5d5a7.webp</image:loc></image:image></url><url><loc>https://praritsidana.com/blog/keep-deployment-secrets-out-of-a-docker-image</loc><lastmod>2026-11-11T16:36:34.881133+00:00</lastmod><image:image><image:loc>https://praritsidana.com/media/portfolio/portfolio-assets/blog-campaign-20261111/afdf5ba75f8e4689a8f95c3a37b56c02.webp</image:loc></image:image></url><url><loc>https://praritsidana.com/blog/wait-for-database-readiness-in-docker-compose</loc><lastmod>2026-11-11T16:36:34.730912+00:00</lastmod><image:image><image:loc>https://praritsidana.com/media/portfolio/portfolio-assets/blog-campaign-20261111/e661071b5b064969bba088e25f5f9a2c.webp</image:loc></image:image></url><url><loc>https://praritsidana.com/blog/add-a-manual-fallback-when-an-ai-service-is-unavailable</loc><lastmod>2026-11-11T16:36:34.588142+00:00</lastmod><image:image><image:loc>https://praritsidana.com/media/portfolio/portfolio-assets/blog-campaign-20261111/1d31296e4eaf4c79977d3299e5410a57.webp</image:loc></image:image></url><url><loc>https://praritsidana.com/blog/store-the-evidence-behind-an-ai-recommendation</loc><lastmod>2026-11-11T16:36:34.434518+00:00</lastmod><image:image><image:loc>https://praritsidana.com/media/portfolio/portfolio-assets/blog-campaign-20261111/2f7f2dbacae34fb89e208f2e28350ddd.webp</image:loc></image:image></url><url><loc>https://praritsidana.com/blog/evaluate-a-classifier-when-classes-are-imbalanced</loc><lastmod>2026-11-11T16:36:34.234169+00:00</lastmod><image:image><image:loc>https://praritsidana.com/media/portfolio/portfolio-assets/blog-campaign-20261111/4c25da189f7a43fb9c734e2753796950.webp</image:loc></image:image></url><url><loc>https://praritsidana.com/blog/load-an-inference-resource-through-fastapi-lifespan</loc><lastmod>2026-11-11T16:36:34.067305+00:00</lastmod><image:image><image:loc>https://praritsidana.com/media/portfolio/portfolio-assets/blog-campaign-20261111/2211c76666b24b26a3ae79dc0d313567.webp</image:loc></image:image></url><url><loc>https://praritsidana.com/blog/stream-an-ai-response-while-keeping-a-final-authoritative-state</loc><lastmod>2026-11-11T16:36:33.905321+00:00</lastmod><image:image><image:loc>https://praritsidana.com/media/portfolio/portfolio-assets/blog-campaign-20261111/d229a701bdd84619b59ec76d897c5900.webp</image:loc></image:image></url><url><loc>https://praritsidana.com/blog/cache-ai-responses-using-all-inputs-that-affect-the-result</loc><lastmod>2026-11-11T16:36:33.746031+00:00</lastmod><image:image><image:loc>https://praritsidana.com/media/portfolio/portfolio-assets/blog-campaign-20261111/eee8635c1b384b4286c51b9d1fb9a99b.webp</image:loc></image:image></url><url><loc>https://praritsidana.com/blog/version-prompts-with-their-evaluation-fixtures</loc><lastmod>2026-11-11T16:36:33.594978+00:00</lastmod><image:image><image:loc>https://praritsidana.com/media/portfolio/portfolio-assets/blog-campaign-20261111/5a615ccc2179402096e8913cd583812b.webp</image:loc></image:image></url><url><loc>https://praritsidana.com/blog/redact-sensitive-fields-before-sending-context-to-a-model</loc><lastmod>2026-11-11T16:36:33.384717+00:00</lastmod><image:image><image:loc>https://praritsidana.com/media/portfolio/portfolio-assets/blog-campaign-20261111/21c90002e6d44a55bd0a891438d9cfb2.webp</image:loc></image:image></url><url><loc>https://praritsidana.com/blog/set-a-bounded-budget-for-an-ai-workflow</loc><lastmod>2026-11-11T16:36:32.996299+00:00</lastmod><image:image><image:loc>https://praritsidana.com/media/portfolio/portfolio-assets/blog-campaign-20261111/1e24e2ebe97844a78725ea34095d0739.webp</image:loc></image:image></url><url><loc>https://praritsidana.com/blog/separate-model-failures-from-application-failures-in-an-ai-endpoint</loc><lastmod>2026-11-11T16:36:32.860114+00:00</lastmod><image:image><image:loc>https://praritsidana.com/media/portfolio/portfolio-assets/blog-campaign-20261111/bdbcfbe1c45c422594b4945181987dac.webp</image:loc></image:image></url><url><loc>https://praritsidana.com/blog/limit-an-ai-tool-to-an-explicit-argument-schema</loc><lastmod>2026-11-11T16:36:32.720112+00:00</lastmod><image:image><image:loc>https://praritsidana.com/media/portfolio/portfolio-assets/blog-campaign-20261111/85b49c370f1e48d68bb08f096936c37b.webp</image:loc></image:image></url><url><loc>https://praritsidana.com/blog/put-human-approval-before-an-ai-triggered-action</loc><lastmod>2026-11-11T16:36:32.577813+00:00</lastmod><image:image><image:loc>https://praritsidana.com/media/portfolio/portfolio-assets/blog-campaign-20261111/aa5b0abd82aa4d20a254cfd2a1736022.webp</image:loc></image:image></url><url><loc>https://praritsidana.com/blog/validate-ai-generated-json-at-an-application-boundary</loc><lastmod>2026-11-11T16:36:32.416029+00:00</lastmod><image:image><image:loc>https://praritsidana.com/media/portfolio/portfolio-assets/blog-campaign-20261111/0af50dbc5994489e81ded8ecb03556c6.webp</image:loc></image:image></url><url><loc>https://praritsidana.com/blog/remove-deleted-documents-from-every-rag-storage-layer</loc><lastmod>2026-11-11T16:36:32.266471+00:00</lastmod><image:image><image:loc>https://praritsidana.com/media/portfolio/portfolio-assets/blog-campaign-20261111/a98d079064234f3784ac8bd5ccb23d8d.webp</image:loc></image:image></url><url><loc>https://praritsidana.com/blog/audit-pdf-text-extraction-before-indexing-documents</loc><lastmod>2026-11-11T16:36:32.126737+00:00</lastmod><image:image><image:loc>https://praritsidana.com/media/portfolio/portfolio-assets/blog-campaign-20261111/597c5694de6e43f5ba8b9d4b4553b6a9.webp</image:loc></image:image></url><url><loc>https://praritsidana.com/blog/reindex-documents-when-an-embedding-model-changes</loc><lastmod>2026-11-11T16:36:31.962290+00:00</lastmod><image:image><image:loc>https://praritsidana.com/media/portfolio/portfolio-assets/blog-campaign-20261111/95a014f7a0d84d4cb4e3d2f5b62de730.webp</image:loc></image:image></url><url><loc>https://praritsidana.com/blog/treat-retrieved-instructions-as-untrusted-rag-content</loc><lastmod>2026-11-11T16:36:31.800956+00:00</lastmod><image:image><image:loc>https://praritsidana.com/media/portfolio/portfolio-assets/blog-campaign-20261111/746d44ccf1df46ba9540b44da5b4d382.webp</image:loc></image:image></url><url><loc>https://praritsidana.com/blog/test-a-rag-system-against-a-fixed-question-set</loc><lastmod>2026-11-11T16:36:31.628239+00:00</lastmod><image:image><image:loc>https://praritsidana.com/media/portfolio/portfolio-assets/blog-campaign-20261111/7817ecc38b604cafa17587295d56a382.webp</image:loc></image:image></url><url><loc>https://praritsidana.com/blog/handle-an-unanswerable-rag-question-explicitly</loc><lastmod>2026-11-11T16:36:31.470336+00:00</lastmod><image:image><image:loc>https://praritsidana.com/media/portfolio/portfolio-assets/blog-campaign-20261111/4e92369cb0fb4dcba6819a777c9b0c10.webp</image:loc></image:image></url><url><loc>https://praritsidana.com/blog/show-source-citations-that-point-to-the-retrieved-passage</loc><lastmod>2026-11-11T16:36:31.249589+00:00</lastmod><image:image><image:loc>https://praritsidana.com/media/portfolio/portfolio-assets/blog-campaign-20261111/d17b909540524b6196e23738f300cf70.webp</image:loc></image:image></url><url><loc>https://praritsidana.com/blog/keep-tenant-filters-inside-the-retrieval-query</loc><lastmod>2026-11-11T16:36:31.066303+00:00</lastmod><image:image><image:loc>https://praritsidana.com/media/portfolio/portfolio-assets/blog-campaign-20261111/f66b268f39b942888b73b8b8819ca4aa.webp</image:loc></image:image></url><url><loc>https://praritsidana.com/blog/add-a-reranking-stage-to-a-small-retrieval-pipeline</loc><lastmod>2026-11-11T16:36:30.691991+00:00</lastmod><image:image><image:loc>https://praritsidana.com/media/portfolio/portfolio-assets/blog-campaign-20261111/b3064ae08c194808925e9b12c46715c9.webp</image:loc></image:image></url><url><loc>https://praritsidana.com/blog/build-a-lexical-search-baseline-before-semantic-retrieval</loc><lastmod>2026-11-11T16:36:30.557870+00:00</lastmod><image:image><image:loc>https://praritsidana.com/media/portfolio/portfolio-assets/blog-campaign-20261111/d26a00285f424da99305823499efed22.webp</image:loc></image:image></url><url><loc>https://praritsidana.com/blog/keep-document-ids-stable-across-rag-reindexing</loc><lastmod>2026-11-11T16:36:30.412195+00:00</lastmod><image:image><image:loc>https://praritsidana.com/media/portfolio/portfolio-assets/blog-campaign-20261111/f314862bb3c44a28b7d4bf83ccf8536d.webp</image:loc></image:image></url><url><loc>https://praritsidana.com/blog/compare-chunk-overlap-with-a-small-retrieval-fixture</loc><lastmod>2026-11-11T16:36:30.220103+00:00</lastmod><image:image><image:loc>https://praritsidana.com/media/portfolio/portfolio-assets/blog-campaign-20261111/9fde9c5ce35d4a8ea85df015c19e49a6.webp</image:loc></image:image></url><url><loc>https://praritsidana.com/blog/choose-document-boundaries-before-chunking-a-rag-corpus</loc><lastmod>2026-11-11T16:36:30.055387+00:00</lastmod><image:image><image:loc>https://praritsidana.com/media/portfolio/portfolio-assets/blog-campaign-20261111/40bf348e4ef140d492a49cdd3ed7505f.webp</image:loc></image:image></url><url><loc>https://praritsidana.com/blog/debounce-a-search-input-without-delaying-its-visible-value</loc><lastmod>2026-11-11T16:36:29.901744+00:00</lastmod><image:image><image:loc>https://praritsidana.com/media/portfolio/portfolio-assets/blog-campaign-20261111/3c9169573fb948fbbff0fede38a0e37d.webp</image:loc></image:image></url><url><loc>https://praritsidana.com/blog/recover-a-websocket-driven-react-inbox-after-reconnect</loc><lastmod>2026-11-11T16:36:29.722375+00:00</lastmod><image:image><image:loc>https://praritsidana.com/media/portfolio/portfolio-assets/blog-campaign-20261111/5a2e1958c26e48d9bfee9642f90f3b0a.webp</image:loc></image:image></url><url><loc>https://praritsidana.com/blog/release-object-urls-after-a-react-upload-preview</loc><lastmod>2026-11-11T16:36:29.560970+00:00</lastmod><image:image><image:loc>https://praritsidana.com/media/portfolio/portfolio-assets/blog-campaign-20261111/b171fcc1753947a892920f373d2b216d.webp</image:loc></image:image></url><url><loc>https://praritsidana.com/blog/split-a-rarely-used-react-route-with-lazy-and-suspense</loc><lastmod>2026-11-11T16:36:29.402038+00:00</lastmod><image:image><image:loc>https://praritsidana.com/media/portfolio/portfolio-assets/blog-campaign-20261111/1d872fa1c40c4b3b97793d1908036939.webp</image:loc></image:image></url><url><loc>https://praritsidana.com/blog/manage-focus-when-a-react-modal-opens-and-closes</loc><lastmod>2026-11-11T16:36:29.236321+00:00</lastmod><image:image><image:loc>https://praritsidana.com/media/portfolio/portfolio-assets/blog-campaign-20261111/67909d6635c9420181c786dd80129ec2.webp</image:loc></image:image></url><url><loc>https://praritsidana.com/blog/show-field-errors-accessibly-in-a-react-form</loc><lastmod>2026-11-11T16:36:29.048254+00:00</lastmod><image:image><image:loc>https://praritsidana.com/media/portfolio/portfolio-assets/blog-campaign-20261111/cdeffd82b2674f46999ce60ed27b0398.webp</image:loc></image:image></url><url><loc>https://praritsidana.com/blog/roll-back-an-optimistic-react-update-when-a-save-fails</loc><lastmod>2026-11-11T16:36:28.919238+00:00</lastmod><image:image><image:loc>https://praritsidana.com/media/portfolio/portfolio-assets/blog-campaign-20261111/2cb7b8a418584216ac35f381479fb8d1.webp</image:loc></image:image></url><url><loc>https://praritsidana.com/blog/invalidate-the-right-tanstack-query-entries-after-a-mutation</loc><lastmod>2026-11-11T16:36:28.775525+00:00</lastmod><image:image><image:loc>https://praritsidana.com/media/portfolio/portfolio-assets/blog-campaign-20261111/6e640e8c531040d08eadbd6a43a3907b.webp</image:loc></image:image></url><url><loc>https://praritsidana.com/blog/define-a-typescript-union-for-asynchronous-ui-states</loc><lastmod>2026-11-11T16:36:28.621592+00:00</lastmod><image:image><image:loc>https://praritsidana.com/media/portfolio/portfolio-assets/blog-campaign-20261111/beb9beb1d6284fe49519301229ee7eab.webp</image:loc></image:image></url><url><loc>https://praritsidana.com/blog/keep-stable-keys-when-a-react-list-can-reorder</loc><lastmod>2026-11-11T16:36:28.500152+00:00</lastmod><image:image><image:loc>https://praritsidana.com/media/portfolio/portfolio-assets/blog-campaign-20261111/2e9ce241c9b3408ebf352761a9097f15.webp</image:loc></image:image></url><url><loc>https://praritsidana.com/blog/reset-a-react-editor-when-its-record-changes</loc><lastmod>2026-11-11T16:36:28.350073+00:00</lastmod><image:image><image:loc>https://praritsidana.com/media/portfolio/portfolio-assets/blog-campaign-20261111/17729e09cb3e43c1a8ff83f97817ca0e.webp</image:loc></image:image></url><url><loc>https://praritsidana.com/blog/cancel-stale-search-requests-in-a-react-component</loc><lastmod>2026-11-11T16:36:28.177034+00:00</lastmod><image:image><image:loc>https://praritsidana.com/media/portfolio/portfolio-assets/blog-campaign-20261111/2bf2e9b152a24ac293b5751ad774905c.webp</image:loc></image:image></url><url><loc>https://praritsidana.com/blog/remove-derived-react-state-from-a-filtered-list</loc><lastmod>2026-11-11T16:36:28.027875+00:00</lastmod><image:image><image:loc>https://praritsidana.com/media/portfolio/portfolio-assets/blog-campaign-20261111/8665a458716a4c73a0a9cb08292c79c3.webp</image:loc></image:image></url><url><loc>https://praritsidana.com/blog/reconcile-scheduled-work-from-durable-application-state</loc><lastmod>2026-11-11T16:36:27.854367+00:00</lastmod><image:image><image:loc>https://praritsidana.com/media/portfolio/portfolio-assets/blog-campaign-20261111/43fc0791857843aba3c00216b71ecbc9.webp</image:loc></image:image></url><url><loc>https://praritsidana.com/blog/apply-backpressure-before-a-queue-grows-without-bounds</loc><lastmod>2026-11-11T16:36:27.676680+00:00</lastmod><image:image><image:loc>https://praritsidana.com/media/portfolio/portfolio-assets/blog-campaign-20261111/5593bc521d584410ac431031970a971b.webp</image:loc></image:image></url><url><loc>https://praritsidana.com/blog/use-a-circuit-breaker-around-a-failing-dependency</loc><lastmod>2026-11-11T16:36:27.520480+00:00</lastmod><image:image><image:loc>https://praritsidana.com/media/portfolio/portfolio-assets/blog-campaign-20261111/051a00c449cb4ba1a2553b7589d1d7a5.webp</image:loc></image:image></url><url><loc>https://praritsidana.com/blog/record-ambiguous-outcomes-after-a-provider-timeout</loc><lastmod>2026-11-11T16:36:27.364054+00:00</lastmod><image:image><image:loc>https://praritsidana.com/media/portfolio/portfolio-assets/blog-campaign-20261111/b2726599b80a461c93bfb06dd0f5936a.webp</image:loc></image:image></url><url><loc>https://praritsidana.com/blog/protect-an-oauth-callback-from-mismatched-state</loc><lastmod>2026-11-11T16:36:27.225335+00:00</lastmod><image:image><image:loc>https://praritsidana.com/media/portfolio/portfolio-assets/blog-campaign-20261111/36ef0d6130d84f55a72c9ec9b3b26577.webp</image:loc></image:image></url><url><loc>https://praritsidana.com/blog/deduplicate-webhook-deliveries-by-provider-event-id</loc><lastmod>2026-11-11T16:36:27.093332+00:00</lastmod><image:image><image:loc>https://praritsidana.com/media/portfolio/portfolio-assets/blog-campaign-20261111/fd3016cc0b6a432eb56e76d89938a408.webp</image:loc></image:image></url><url><loc>https://praritsidana.com/blog/verify-a-webhook-before-trusting-its-event-body</loc><lastmod>2026-11-11T16:36:26.968775+00:00</lastmod><image:image><image:loc>https://praritsidana.com/media/portfolio/portfolio-assets/blog-campaign-20261111/ebba1770c0bf430bb17dcf3e057c9492.webp</image:loc></image:image></url><url><loc>https://praritsidana.com/blog/expose-task-progress-without-treating-it-as-completion</loc><lastmod>2026-11-11T16:36:26.828402+00:00</lastmod><image:image><image:loc>https://praritsidana.com/media/portfolio/portfolio-assets/blog-campaign-20261111/725e2df6d7734754927a120519dd8fec.webp</image:loc></image:image></url><url><loc>https://praritsidana.com/blog/route-slow-media-tasks-away-from-short-api-tasks</loc><lastmod>2026-11-11T16:36:26.705196+00:00</lastmod><image:image><image:loc>https://praritsidana.com/media/portfolio/portfolio-assets/blog-campaign-20261111/cc0ff97e84da45ec889d09187bd51729.webp</image:loc></image:image></url><url><loc>https://praritsidana.com/blog/prevent-overlapping-runs-of-a-periodic-queue-job</loc><lastmod>2026-11-11T16:36:26.571108+00:00</lastmod><image:image><image:loc>https://praritsidana.com/media/portfolio/portfolio-assets/blog-campaign-20261111/bfbb61df170f4f14ad0329f1fdeac71d.webp</image:loc></image:image></url><url><loc>https://praritsidana.com/blog/schedule-celery-beat-jobs-in-a-declared-timezone</loc><lastmod>2026-11-11T16:36:26.398874+00:00</lastmod><image:image><image:loc>https://praritsidana.com/media/portfolio/portfolio-assets/blog-campaign-20261111/be4bb243a17244c7939cb4c2cdb91636.webp</image:loc></image:image></url><url><loc>https://praritsidana.com/blog/separate-retryable-failures-from-permanent-celery-errors</loc><lastmod>2026-11-11T16:36:26.121858+00:00</lastmod><image:image><image:loc>https://praritsidana.com/media/portfolio/portfolio-assets/blog-campaign-20261111/b7d0e52936444075a01ced51ed38067d.webp</image:loc></image:image></url><url><loc>https://praritsidana.com/blog/design-a-celery-task-that-can-run-twice-safely</loc><lastmod>2026-11-11T16:36:25.959787+00:00</lastmod><image:image><image:loc>https://praritsidana.com/media/portfolio/portfolio-assets/blog-campaign-20261111/3bc8a9c9ccfd4c7abf6633f648ac7fbd.webp</image:loc></image:image></url><url><loc>https://praritsidana.com/blog/keep-django-serializer-validation-errors-useful-to-a-form</loc><lastmod>2026-11-11T16:36:25.781676+00:00</lastmod><image:image><image:loc>https://praritsidana.com/media/portfolio/portfolio-assets/blog-campaign-20261111/36b795f1c1884efb957fdd1617a9490f.webp</image:loc></image:image></url><url><loc>https://praritsidana.com/blog/use-select-for-update-for-a-contested-state-transition</loc><lastmod>2026-11-11T16:36:25.633907+00:00</lastmod><image:image><image:loc>https://praritsidana.com/media/portfolio/portfolio-assets/blog-campaign-20261111/34ba0e9f89084e8a8009f9ac91443a1c.webp</image:loc></image:image></url><url><loc>https://praritsidana.com/blog/scope-a-django-cache-key-to-the-user-and-input</loc><lastmod>2026-11-11T16:36:25.372268+00:00</lastmod><image:image><image:loc>https://praritsidana.com/media/portfolio/portfolio-assets/blog-campaign-20261111/ec666758a90140af9e039d3828eb86e6.webp</image:loc></image:image></url><url><loc>https://praritsidana.com/blog/add-a-nullable-field-through-a-staged-django-migration</loc><lastmod>2026-11-11T16:36:25.229962+00:00</lastmod><image:image><image:loc>https://praritsidana.com/media/portfolio/portfolio-assets/blog-campaign-20261111/ef59adf860a94f0092032bf9e5321331.webp</image:loc></image:image></url><url><loc>https://praritsidana.com/blog/test-a-django-endpoint-s-public-and-private-responses</loc><lastmod>2026-11-11T16:36:25.089285+00:00</lastmod><image:image><image:loc>https://praritsidana.com/media/portfolio/portfolio-assets/blog-campaign-20261111/4e5eab0cd09742d586dbacdde4a2a187.webp</image:loc></image:image></url><url><loc>https://praritsidana.com/blog/validate-file-uploads-at-the-django-boundary</loc><lastmod>2026-11-11T16:36:24.951769+00:00</lastmod><image:image><image:loc>https://praritsidana.com/media/portfolio/portfolio-assets/blog-campaign-20261111/734515c5d0dd4e1b8308905b486775a3.webp</image:loc></image:image></url><url><loc>https://praritsidana.com/blog/explain-csrf-protection-in-a-cookie-authenticated-api</loc><lastmod>2026-11-11T16:36:24.781687+00:00</lastmod><image:image><image:loc>https://praritsidana.com/media/portfolio/portfolio-assets/blog-campaign-20261111/15ce9538aff54553961ce7dcc2e3a134.webp</image:loc></image:image></url><url><loc>https://praritsidana.com/blog/validate-patch-requests-without-erasing-omitted-values</loc><lastmod>2026-11-11T16:36:24.629766+00:00</lastmod><image:image><image:loc>https://praritsidana.com/media/portfolio/portfolio-assets/blog-campaign-20261111/be2633fa96924b61bdc3b39d1c5fcc64.webp</image:loc></image:image></url><url><loc>https://praritsidana.com/blog/choose-cursor-pagination-for-a-changing-activity-feed</loc><lastmod>2026-11-11T16:36:24.476935+00:00</lastmod><image:image><image:loc>https://praritsidana.com/media/portfolio/portfolio-assets/blog-campaign-20261111/db1d7c6d27c44b178c7be114ccd8886d.webp</image:loc></image:image></url><url><loc>https://praritsidana.com/blog/add-object-permissions-to-a-django-rest-framework-endpoint</loc><lastmod>2026-11-11T16:36:24.316208+00:00</lastmod><image:image><image:loc>https://praritsidana.com/media/portfolio/portfolio-assets/blog-campaign-20261111/4f162e0fb29247fab71e61f37971a8ff.webp</image:loc></image:image></url><url><loc>https://praritsidana.com/blog/run-follow-up-work-only-after-a-django-transaction-commits</loc><lastmod>2026-11-11T16:36:24.189990+00:00</lastmod><image:image><image:loc>https://praritsidana.com/media/portfolio/portfolio-assets/blog-campaign-20261111/0f7cc1512ce04a8fb672489f1a682480.webp</image:loc></image:image></url><url><loc>https://praritsidana.com/blog/use-database-constraints-for-rules-a-serializer-cannot-enforce-alone</loc><lastmod>2026-11-11T16:36:24.041741+00:00</lastmod><image:image><image:loc>https://praritsidana.com/media/portfolio/portfolio-assets/blog-campaign-20261111/8d7c0d9690734438b300fb30edd75258.webp</image:loc></image:image></url><url><loc>https://praritsidana.com/blog/find-an-n-1-query-in-a-django-list-endpoint</loc><lastmod>2026-11-11T16:36:23.839520+00:00</lastmod><image:image><image:loc>https://praritsidana.com/media/portfolio/portfolio-assets/blog-campaign-20261111/ec4ede4a52784290b23ab88d2f3125a2.webp</image:loc></image:image></url><url><loc>https://praritsidana.com/blog/return-useful-exit-codes-from-a-python-command</loc><lastmod>2026-11-11T15:57:32.513939+00:00</lastmod><image:image><image:loc>https://praritsidana.com/media/portfolio/portfolio-assets/blog-campaign-20261111/d143eb8762d549208d2c410f98118c5d.webp</image:loc></image:image></url><url><loc>https://praritsidana.com/blog/make-a-scheduled-python-job-resume-from-a-checkpoint</loc><lastmod>2026-11-11T15:57:32.070862+00:00</lastmod><image:image><image:loc>https://praritsidana.com/media/portfolio/portfolio-assets/blog-campaign-20261111/92f1364eeadd4f89b32bcecf8741a31f.webp</image:loc></image:image></url><url><loc>https://praritsidana.com/blog/test-a-file-processing-script-with-temporary-directories</loc><lastmod>2026-11-11T15:57:31.670037+00:00</lastmod><image:image><image:loc>https://praritsidana.com/media/portfolio/portfolio-assets/blog-campaign-20261111/98dc6690f2e043dcbdd4a26ae8762a3f.webp</image:loc></image:image></url><url><loc>https://praritsidana.com/blog/detect-duplicate-local-files-using-hashes-and-an-explicit-policy</loc><lastmod>2026-11-11T15:57:31.260431+00:00</lastmod><image:image><image:loc>https://praritsidana.com/media/portfolio/portfolio-assets/blog-campaign-20261111/f9cf20875eff4deab126965a55063979.webp</image:loc></image:image></url><url><loc>https://praritsidana.com/blog/capture-a-subprocess-timeout-and-its-useful-error-output</loc><lastmod>2026-11-11T15:57:30.818993+00:00</lastmod><image:image><image:loc>https://praritsidana.com/media/portfolio/portfolio-assets/blog-campaign-20261111/7d6fcb1aa870430ba3928c71780a388d.webp</image:loc></image:image></url><url><loc>https://praritsidana.com/blog/add-request-context-to-python-logs-without-exposing-payloads</loc><lastmod>2026-11-11T15:57:30.309707+00:00</lastmod><image:image><image:loc>https://praritsidana.com/media/portfolio/portfolio-assets/blog-campaign-20261111/067864587649476ea09793a601544000.webp</image:loc></image:image></url><url><loc>https://praritsidana.com/blog/stream-a-large-text-transformation-without-reading-the-whole-file</loc><lastmod>2026-11-11T15:57:29.883793+00:00</lastmod><image:image><image:loc>https://praritsidana.com/media/portfolio/portfolio-assets/blog-campaign-20261111/7230885abeca444a8917fe5de6e47b0b.webp</image:loc></image:image></url><url><loc>https://praritsidana.com/blog/clean-up-child-tasks-when-an-asyncio-operation-fails</loc><lastmod>2026-11-11T15:57:29.459558+00:00</lastmod><image:image><image:loc>https://praritsidana.com/media/portfolio/portfolio-assets/blog-campaign-20261111/ab8b1e62225540439b6fe7c91ea8404b.webp</image:loc></image:image></url><url><loc>https://praritsidana.com/blog/bound-concurrent-requests-with-asyncio-in-python</loc><lastmod>2026-11-11T15:57:29.002459+00:00</lastmod><image:image><image:loc>https://praritsidana.com/media/portfolio/portfolio-assets/blog-campaign-20261111/e82f2f5fba3c425592c899838399a386.webp</image:loc></image:image></url><url><loc>https://praritsidana.com/blog/handle-daylight-saving-changes-in-a-python-scheduler</loc><lastmod>2026-11-11T15:57:28.528236+00:00</lastmod><image:image><image:loc>https://praritsidana.com/media/portfolio/portfolio-assets/blog-campaign-20261111/c4d6432978d943b6a416425560aaabb5.webp</image:loc></image:image></url><url><loc>https://praritsidana.com/blog/add-a-dry-run-mode-to-a-python-cleanup-command</loc><lastmod>2026-11-11T15:57:28.071660+00:00</lastmod><image:image><image:loc>https://praritsidana.com/media/portfolio/portfolio-assets/blog-campaign-20261111/e436f9cfae7d45dd83b6344eba66fc33.webp</image:loc></image:image></url><url><loc>https://praritsidana.com/blog/validate-a-csv-import-before-changing-application-data</loc><lastmod>2026-11-11T15:57:27.621388+00:00</lastmod><image:image><image:loc>https://praritsidana.com/media/portfolio/portfolio-assets/blog-campaign-20261111/fdb588f046e74d838b92670a824eab95.webp</image:loc></image:image></url><url><loc>https://praritsidana.com/blog/write-a-python-export-atomically-when-a-job-can-stop-halfway</loc><lastmod>2026-11-11T15:57:27.201637+00:00</lastmod><image:image><image:loc>https://praritsidana.com/media/portfolio/portfolio-assets/blog-campaign-20261111/24a192d53d0c4df986ac099103f2107e.webp</image:loc></image:image></url><url><loc>https://praritsidana.com/blog/getting-started-python-automation</loc><lastmod>2026-11-10T18:43:37.514529+00:00</lastmod></url><url><loc>https://praritsidana.com/blog/art-of-sales-digital-age</loc><lastmod>2026-01-08T11:49:09.483134+00:00</lastmod></url><url><loc>https://praritsidana.com/blog/building-scalable-react-apps</loc><lastmod>2026-11-10T18:43:53.290755+00:00</lastmod></url><url><loc>https://praritsidana.com/blog/developer-to-sales-head-journey</loc><lastmod>2026-01-08T11:49:09.483134+00:00</lastmod></url><url><loc>https://praritsidana.com/blog/top-vscode-extensions-productivity</loc><lastmod>2026-01-08T11:49:09.483134+00:00</lastmod></url><url><loc>https://praritsidana.com/projects/postzyo</loc><lastmod>2026-11-10T18:43:36.625097+00:00</lastmod><image:image><image:loc>https://praritsidana.com/media/portfolio/imported/29890815374a00bd-1783331439947-f8cjfe.png</image:loc></image:image></url><url><loc>https://praritsidana.com/projects/jsll-prediction-platform</loc><lastmod>2026-11-10T18:43:36.782377+00:00</lastmod><image:image><image:loc>https://opengraph.githubassets.com/1/prarit0097/jsllprediciton</image:loc></image:image></url><url><loc>https://praritsidana.com/projects/nirogidhara-ai-command-center</loc><lastmod>2026-11-10T18:43:36.956147+00:00</lastmod><image:image><image:loc>https://opengraph.githubassets.com/1/prarit0097/Nirogidhara-AI-Command-Center</image:loc></image:image></url><url><loc>https://praritsidana.com/projects/whatsapp-smart-connect</loc><lastmod>2026-11-10T18:43:37.130286+00:00</lastmod><image:image><image:loc>https://opengraph.githubassets.com/1/prarit0097/Whatsapp-sales-dashboard</image:loc></image:image></url><url><loc>https://praritsidana.com/projects/shortforge</loc><lastmod>2026-11-10T18:43:37.261915+00:00</lastmod><image:image><image:loc>https://opengraph.githubassets.com/1/prarit0097/ShortForge</image:loc></image:image></url><url><loc>https://praritsidana.com/projects/riims-website</loc><lastmod>2026-11-11T06:05:21.919417+00:00</lastmod><image:image><image:loc>https://opengraph.githubassets.com/1/prarit0097/Riims-Website</image:loc></image:image></url></urlset>