<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
<url>
<loc>https://www.rukon.dev</loc>
<lastmod>2026-10-20</lastmod>
<changefreq>monthly</changefreq>
<priority>1</priority>
</url>
<url>
<loc>https://www.rukon.dev/work</loc>
<lastmod>2026-10-20</lastmod>
<changefreq>monthly</changefreq>
<priority>0.9</priority>
</url>
<url>
<loc>https://www.rukon.dev/blog</loc>
<lastmod>2026-10-20</lastmod>
<changefreq>weekly</changefreq>
<priority>0.7</priority>
</url>
<url>
<loc>https://www.rukon.dev/cv</loc>
<lastmod>2026-10-20</lastmod>
<changefreq>yearly</changefreq>
<priority>0.4</priority>
</url>
<url>
<loc>https://www.rukon.dev/work/rpoms</loc>
<lastmod>2026-10-20</lastmod>
<changefreq>monthly</changefreq>
<priority>0.8</priority>
</url>
<url>
<loc>https://www.rukon.dev/work/rpoms-print-engine</loc>
<lastmod>2026-10-20</lastmod>
<changefreq>monthly</changefreq>
<priority>0.8</priority>
</url>
<url>
<loc>https://www.rukon.dev/work/erth</loc>
<lastmod>2026-10-20</lastmod>
<changefreq>monthly</changefreq>
<priority>0.8</priority>
</url>
<url>
<loc>https://www.rukon.dev/work/researchforge</loc>
<lastmod>2026-10-20</lastmod>
<changefreq>monthly</changefreq>
<priority>0.8</priority>
</url>
<url>
<loc>https://www.rukon.dev/work/rpoms-ai</loc>
<lastmod>2026-10-20</lastmod>
<changefreq>monthly</changefreq>
<priority>0.8</priority>
</url>
<url>
<loc>https://www.rukon.dev/work/itms</loc>
<lastmod>2026-10-20</lastmod>
<changefreq>monthly</changefreq>
<priority>0.8</priority>
</url>
<url>
<loc>https://www.rukon.dev/work/drivekeep</loc>
<lastmod>2026-10-20</lastmod>
<changefreq>monthly</changefreq>
<priority>0.8</priority>
</url>
<url>
<loc>https://www.rukon.dev/work/spendrop</loc>
<lastmod>2026-10-20</lastmod>
<changefreq>monthly</changefreq>
<priority>0.8</priority>
</url>
<url>
<loc>https://www.rukon.dev/work/rukon-link</loc>
<lastmod>2026-10-20</lastmod>
<changefreq>monthly</changefreq>
<priority>0.8</priority>
</url>
<url>
<loc>https://www.rukon.dev/work/bbtech-laptop-tool</loc>
<lastmod>2026-10-20</lastmod>
<changefreq>monthly</changefreq>
<priority>0.8</priority>
</url>
<url>
<loc>https://www.rukon.dev/work/erth-router-distribution</loc>
<lastmod>2026-10-20</lastmod>
<changefreq>monthly</changefreq>
<priority>0.8</priority>
</url>
<url>
<loc>https://www.rukon.dev/work/startup-research-hub</loc>
<lastmod>2026-10-20</lastmod>
<changefreq>monthly</changefreq>
<priority>0.8</priority>
</url>
<url>
<loc>https://www.rukon.dev/work/bbtech-laptop-inspection-tool</loc>
<lastmod>2026-10-20</lastmod>
<changefreq>monthly</changefreq>
<priority>0.8</priority>
</url>
<url>
<loc>https://www.rukon.dev/work/link-nest</loc>
<lastmod>2026-10-20</lastmod>
<changefreq>monthly</changefreq>
<priority>0.8</priority>
</url>
<url>
<loc>https://www.rukon.dev/work/rpoms/case-study</loc>
<lastmod>2026-10-20</lastmod>
<changefreq>monthly</changefreq>
<priority>0.75</priority>
</url>
<url>
<loc>https://www.rukon.dev/work/rpoms-print-engine/case-study</loc>
<lastmod>2026-10-20</lastmod>
<changefreq>monthly</changefreq>
<priority>0.75</priority>
</url>
<url>
<loc>https://www.rukon.dev/work/erth/case-study</loc>
<lastmod>2026-10-20</lastmod>
<changefreq>monthly</changefreq>
<priority>0.75</priority>
</url>
<url>
<loc>https://www.rukon.dev/work/researchforge/case-study</loc>
<lastmod>2026-10-20</lastmod>
<changefreq>monthly</changefreq>
<priority>0.75</priority>
</url>
<url>
<loc>https://www.rukon.dev/work/rpoms-ai/case-study</loc>
<lastmod>2026-10-20</lastmod>
<changefreq>monthly</changefreq>
<priority>0.75</priority>
</url>
<url>
<loc>https://www.rukon.dev/work/itms/case-study</loc>
<lastmod>2026-10-20</lastmod>
<changefreq>monthly</changefreq>
<priority>0.75</priority>
</url>
<url>
<loc>https://www.rukon.dev/work/drivekeep/case-study</loc>
<lastmod>2026-10-20</lastmod>
<changefreq>monthly</changefreq>
<priority>0.75</priority>
</url>
<url>
<loc>https://www.rukon.dev/work/spendrop/case-study</loc>
<lastmod>2026-10-20</lastmod>
<changefreq>monthly</changefreq>
<priority>0.75</priority>
</url>
<url>
<loc>https://www.rukon.dev/work/rukon-link/case-study</loc>
<lastmod>2026-10-20</lastmod>
<changefreq>monthly</changefreq>
<priority>0.75</priority>
</url>
<url>
<loc>https://www.rukon.dev/work/bbtech-laptop-tool/case-study</loc>
<lastmod>2026-10-20</lastmod>
<changefreq>monthly</changefreq>
<priority>0.75</priority>
</url>
<url>
<loc>https://www.rukon.dev/work/erth-router-distribution/case-study</loc>
<lastmod>2026-10-20</lastmod>
<changefreq>monthly</changefreq>
<priority>0.75</priority>
</url>
<url>
<loc>https://www.rukon.dev/work/startup-research-hub/case-study</loc>
<lastmod>2026-10-20</lastmod>
<changefreq>monthly</changefreq>
<priority>0.75</priority>
</url>
<url>
<loc>https://www.rukon.dev/work/bbtech-laptop-inspection-tool/case-study</loc>
<lastmod>2026-10-20</lastmod>
<changefreq>monthly</changefreq>
<priority>0.75</priority>
</url>
<url>
<loc>https://www.rukon.dev/work/link-nest/case-study</loc>
<lastmod>2026-10-20</lastmod>
<changefreq>monthly</changefreq>
<priority>0.75</priority>
</url>
<url>
<loc>https://www.rukon.dev/blog/category/building-real-systems</loc>
<lastmod>2026-10-20</lastmod>
<changefreq>weekly</changefreq>
<priority>0.6</priority>
</url>
<url>
<loc>https://www.rukon.dev/blog/category/full-stack-development</loc>
<lastmod>2026-10-20</lastmod>
<changefreq>weekly</changefreq>
<priority>0.6</priority>
</url>
<url>
<loc>https://www.rukon.dev/blog/category/ai-and-automation</loc>
<lastmod>2026-10-13</lastmod>
<changefreq>weekly</changefreq>
<priority>0.6</priority>
</url>
<url>
<loc>https://www.rukon.dev/blog/category/ui-ux-and-product</loc>
<lastmod>2026-10-02</lastmod>
<changefreq>weekly</changefreq>
<priority>0.6</priority>
</url>
<url>
<loc>https://www.rukon.dev/blog/category/developer-journey</loc>
<lastmod>2026-10-02</lastmod>
<changefreq>weekly</changefreq>
<priority>0.6</priority>
</url>
<url>
<loc>https://www.rukon.dev/blog/category/malaysia-and-cyberjaya</loc>
<lastmod>2026-10-02</lastmod>
<changefreq>weekly</changefreq>
<priority>0.6</priority>
</url>
<url>
<loc>https://www.rukon.dev/blog/what-is-a-production-management-system</loc>
<lastmod>2026-06-02</lastmod>
<changefreq>yearly</changefreq>
<priority>0.5</priority>
</url>
<url>
<loc>https://www.rukon.dev/blog/common-problems-manual-production-tracking</loc>
<lastmod>2026-09-24</lastmod>
<changefreq>yearly</changefreq>
<priority>0.5</priority>
</url>
<url>
<loc>https://www.rukon.dev/blog/how-admin-panels-help-manage-operational-data</loc>
<lastmod>2026-06-23</lastmod>
<changefreq>yearly</changefreq>
<priority>0.5</priority>
</url>
<url>
<loc>https://www.rukon.dev/blog/from-manual-workflow-to-digital-workflow</loc>
<lastmod>2026-10-01</lastmod>
<changefreq>yearly</changefreq>
<priority>0.5</priority>
</url>
<url>
<loc>https://www.rukon.dev/blog/why-developers-should-understand-the-physical-process</loc>
<lastmod>2026-07-07</lastmod>
<changefreq>yearly</changefreq>
<priority>0.5</priority>
</url>
<url>
<loc>https://www.rukon.dev/blog/why-system-maintenance-matters-after-deployment</loc>
<lastmod>2026-07-14</lastmod>
<changefreq>yearly</changefreq>
<priority>0.5</priority>
</url>
<url>
<loc>https://www.rukon.dev/blog/designing-a-website-in-figma-before-development</loc>
<lastmod>2026-10-01</lastmod>
<changefreq>yearly</changefreq>
<priority>0.5</priority>
</url>
<url>
<loc>https://www.rukon.dev/blog/from-figma-design-to-production-website</loc>
<lastmod>2026-10-01</lastmod>
<changefreq>yearly</changefreq>
<priority>0.5</priority>
</url>
<url>
<loc>https://www.rukon.dev/blog/translating-figma-components-into-reusable-code</loc>
<lastmod>2026-10-01</lastmod>
<changefreq>yearly</changefreq>
<priority>0.5</priority>
</url>
<url>
<loc>https://www.rukon.dev/blog/designing-for-desktop-and-mobile-before-development</loc>
<lastmod>2026-10-01</lastmod>
<changefreq>yearly</changefreq>
<priority>0.5</priority>
</url>
<url>
<loc>https://www.rukon.dev/blog/what-an-it-systems-role-actually-involves</loc>
<lastmod>2026-08-15</lastmod>
<changefreq>yearly</changefreq>
<priority>0.5</priority>
</url>
<url>
<loc>https://www.rukon.dev/blog/replacing-repetitive-manual-work-with-software</loc>
<lastmod>2026-08-18</lastmod>
<changefreq>yearly</changefreq>
<priority>0.5</priority>
</url>
<url>
<loc>https://www.rukon.dev/blog/why-internal-software-needs-good-ux</loc>
<lastmod>2026-08-21</lastmod>
<changefreq>yearly</changefreq>
<priority>0.5</priority>
</url>
<url>
<loc>https://www.rukon.dev/blog/reporting-from-operational-data</loc>
<lastmod>2026-08-24</lastmod>
<changefreq>yearly</changefreq>
<priority>0.5</priority>
</url>
<url>
<loc>https://www.rukon.dev/blog/rebuilding-a-design-prototype-as-a-production-website</loc>
<lastmod>2026-08-28</lastmod>
<changefreq>yearly</changefreq>
<priority>0.5</priority>
</url>
<url>
<loc>https://www.rukon.dev/blog/verifying-a-static-site-you-built-by-hand</loc>
<lastmod>2026-08-31</lastmod>
<changefreq>yearly</changefreq>
<priority>0.5</priority>
</url>
<url>
<loc>https://www.rukon.dev/blog/cutting-a-page-image-payload-from-12mb-to-under-3mb</loc>
<lastmod>2026-09-03</lastmod>
<changefreq>yearly</changefreq>
<priority>0.5</priority>
</url>
<url>
<loc>https://www.rukon.dev/blog/making-an-llm-admit-the-paper-does-not-say</loc>
<lastmod>2026-09-05</lastmod>
<changefreq>yearly</changefreq>
<priority>0.5</priority>
</url>
<url>
<loc>https://www.rukon.dev/blog/when-not-to-fall-back-to-another-ai-provider</loc>
<lastmod>2026-09-06</lastmod>
<changefreq>yearly</changefreq>
<priority>0.5</priority>
</url>
<url>
<loc>https://www.rukon.dev/blog/every-policy-was-correct-and-every-policy-was-inert</loc>
<lastmod>2026-09-06</lastmod>
<changefreq>yearly</changefreq>
<priority>0.5</priority>
</url>
<url>
<loc>https://www.rukon.dev/blog/live-github-contribution-heatmap-in-nextjs</loc>
<lastmod>2026-09-24</lastmod>
<changefreq>yearly</changefreq>
<priority>0.5</priority>
</url>
<url>
<loc>https://www.rukon.dev/blog/gating-a-cv-download-behind-a-server-signed-grant</loc>
<lastmod>2026-09-24</lastmod>
<changefreq>yearly</changefreq>
<priority>0.5</priority>
</url>
<url>
<loc>https://www.rukon.dev/blog/one-storage-interface-three-backends</loc>
<lastmod>2026-09-24</lastmod>
<changefreq>yearly</changefreq>
<priority>0.5</priority>
</url>
<url>
<loc>https://www.rukon.dev/blog/staged-csv-import-for-operational-data</loc>
<lastmod>2026-09-24</lastmod>
<changefreq>yearly</changefreq>
<priority>0.5</priority>
</url>
<url>
<loc>https://www.rukon.dev/blog/the-business-day-is-not-the-server-day</loc>
<lastmod>2026-09-24</lastmod>
<changefreq>yearly</changefreq>
<priority>0.5</priority>
</url>
<url>
<loc>https://www.rukon.dev/blog/printing-labels-from-the-browser-over-web-bluetooth</loc>
<lastmod>2026-10-01</lastmod>
<changefreq>yearly</changefreq>
<priority>0.5</priority>
</url>
<url>
<loc>https://www.rukon.dev/blog/a-vision-model-that-only-observes</loc>
<lastmod>2026-10-01</lastmod>
<changefreq>yearly</changefreq>
<priority>0.5</priority>
</url>
<url>
<loc>https://www.rukon.dev/blog/building-software-in-cyberjaya-the-development-environment</loc>
<lastmod>2026-09-24</lastmod>
<changefreq>yearly</changefreq>
<priority>0.5</priority>
</url>
<url>
<loc>https://www.rukon.dev/blog/adding-label-printing-to-a-nextjs-app-through-a-relay-page</loc>
<lastmod>2026-10-02</lastmod>
<changefreq>yearly</changefreq>
<priority>0.5</priority>
</url>
<url>
<loc>https://www.rukon.dev/blog/analytics-retention-rollups-with-pg-cron</loc>
<lastmod>2026-10-02</lastmod>
<changefreq>yearly</changefreq>
<priority>0.5</priority>
</url>
<url>
<loc>https://www.rukon.dev/blog/app-group-swiftdata-store-was-never-the-one-in-use</loc>
<lastmod>2026-10-02</lastmod>
<changefreq>yearly</changefreq>
<priority>0.5</priority>
</url>
<url>
<loc>https://www.rukon.dev/blog/append-only-cloud-backup-supabase-storage-rls</loc>
<lastmod>2026-10-02</lastmod>
<changefreq>yearly</changefreq>
<priority>0.5</priority>
</url>
<url>
<loc>https://www.rukon.dev/blog/apple-foundation-models-structured-receipt-extraction</loc>
<lastmod>2026-10-02</lastmod>
<changefreq>yearly</changefreq>
<priority>0.5</priority>
</url>
<url>
<loc>https://www.rukon.dev/blog/audit-log-with-before-snapshots-for-destructive-actions</loc>
<lastmod>2026-10-02</lastmod>
<changefreq>yearly</changefreq>
<priority>0.5</priority>
</url>
<url>
<loc>https://www.rukon.dev/blog/barcode-scanner-web-app-scan-paste-and-beep</loc>
<lastmod>2026-10-02</lastmod>
<changefreq>yearly</changefreq>
<priority>0.5</priority>
</url>
<url>
<loc>https://www.rukon.dev/blog/benchmark-regression-gate-medians-noise-floor</loc>
<lastmod>2026-10-02</lastmod>
<changefreq>yearly</changefreq>
<priority>0.5</priority>
</url>
<url>
<loc>https://www.rukon.dev/blog/benchmarking-ollama-vision-models-the-cached-image-trap</loc>
<lastmod>2026-10-02</lastmod>
<changefreq>yearly</changefreq>
<priority>0.5</priority>
</url>
<url>
<loc>https://www.rukon.dev/blog/blank-is-not-zero-production-report-inputs</loc>
<lastmod>2026-10-02</lastmod>
<changefreq>yearly</changefreq>
<priority>0.5</priority>
</url>
<url>
<loc>https://www.rukon.dev/blog/caching-llm-results-by-content-hash-without-leaking-uploaders</loc>
<lastmod>2026-10-02</lastmod>
<changefreq>yearly</changefreq>
<priority>0.5</priority>
</url>
<url>
<loc>https://www.rukon.dev/blog/calling-postgrest-from-python-what-mocks-miss</loc>
<lastmod>2026-10-02</lastmod>
<changefreq>yearly</changefreq>
<priority>0.5</priority>
</url>
<url>
<loc>https://www.rukon.dev/blog/canonical-urls-apex-www-308-sitemap-redirects-nextjs</loc>
<lastmod>2026-10-02</lastmod>
<changefreq>yearly</changefreq>
<priority>0.5</priority>
</url>
<url>
<loc>https://www.rukon.dev/blog/capping-image-size-for-a-vision-model-inside-a-60-second-limit</loc>
<lastmod>2026-10-02</lastmod>
<changefreq>yearly</changefreq>
<priority>0.5</priority>
</url>
<url>
<loc>https://www.rukon.dev/blog/choosing-an-embedding-model-under-pgvectors-2000-dimension-limit</loc>
<lastmod>2026-10-02</lastmod>
<changefreq>yearly</changefreq>
<priority>0.5</priority>
</url>
<url>
<loc>https://www.rukon.dev/blog/chrome-background-tab-timer-throttling-web-worker</loc>
<lastmod>2026-10-02</lastmod>
<changefreq>yearly</changefreq>
<priority>0.5</priority>
</url>
<url>
<loc>https://www.rukon.dev/blog/comparison-baselines-for-an-operations-dashboard</loc>
<lastmod>2026-10-02</lastmod>
<changefreq>yearly</changefreq>
<priority>0.5</priority>
</url>
<url>
<loc>https://www.rukon.dev/blog/contact-form-spam-protection-without-captcha</loc>
<lastmod>2026-10-02</lastmod>
<changefreq>yearly</changefreq>
<priority>0.5</priority>
</url>
<url>
<loc>https://www.rukon.dev/blog/continuous-label-printing-page-counter-and-uncertain-jobs</loc>
<lastmod>2026-10-02</lastmod>
<changefreq>yearly</changefreq>
<priority>0.5</priority>
</url>
<url>
<loc>https://www.rukon.dev/blog/contributing-fixes-to-a-web-app-you-did-not-build</loc>
<lastmod>2026-10-02</lastmod>
<changefreq>yearly</changefreq>
<priority>0.5</priority>
</url>
<url>
<loc>https://www.rukon.dev/blog/cookieless-first-party-analytics-with-a-daily-salted-ip-hash</loc>
<lastmod>2026-10-02</lastmod>
<changefreq>yearly</changefreq>
<priority>0.5</priority>
</url>
<url>
<loc>https://www.rukon.dev/blog/counting-shared-packaging-consumption-across-days</loc>
<lastmod>2026-10-02</lastmod>
<changefreq>yearly</changefreq>
<priority>0.5</priority>
</url>
<url>
<loc>https://www.rukon.dev/blog/cross-app-printing-broadcastchannel-web-locks</loc>
<lastmod>2026-10-02</lastmod>
<changefreq>yearly</changefreq>
<priority>0.5</priority>
</url>
<url>
<loc>https://www.rukon.dev/blog/csv-formula-injection-in-exports</loc>
<lastmod>2026-10-02</lastmod>
<changefreq>yearly</changefreq>
<priority>0.5</priority>
</url>
<url>
<loc>https://www.rukon.dev/blog/data-preservation-check-before-production-release</loc>
<lastmod>2026-10-02</lastmod>
<changefreq>yearly</changefreq>
<priority>0.5</priority>
</url>
<url>
<loc>https://www.rukon.dev/blog/delivery-module-scan-boxes-never-type-serials</loc>
<lastmod>2026-10-02</lastmod>
<changefreq>yearly</changefreq>
<priority>0.5</priority>
</url>
<url>
<loc>https://www.rukon.dev/blog/dependent-drop-down-lists-excel-indirect-named-ranges</loc>
<lastmod>2026-10-02</lastmod>
<changefreq>yearly</changefreq>
<priority>0.5</priority>
</url>
<url>
<loc>https://www.rukon.dev/blog/derived-configuration-health-checks</loc>
<lastmod>2026-10-02</lastmod>
<changefreq>yearly</changefreq>
<priority>0.5</priority>
</url>
<url>
<loc>https://www.rukon.dev/blog/derived-inventory-from-a-ledger-not-a-stored-balance</loc>
<lastmod>2026-10-01</lastmod>
<changefreq>yearly</changefreq>
<priority>0.5</priority>
</url>
<url>
<loc>https://www.rukon.dev/blog/deterministic-rule-engine-for-vague-acceptance-criteria</loc>
<lastmod>2026-10-02</lastmod>
<changefreq>yearly</changefreq>
<priority>0.5</priority>
</url>
<url>
<loc>https://www.rukon.dev/blog/documenting-an-excel-tracker-for-non-technical-users</loc>
<lastmod>2026-10-02</lastmod>
<changefreq>yearly</changefreq>
<priority>0.5</priority>
</url>
<url>
<loc>https://www.rukon.dev/blog/enforcing-architecture-boundaries-with-a-test-in-nextjs</loc>
<lastmod>2026-10-02</lastmod>
<changefreq>yearly</changefreq>
<priority>0.5</priority>
</url>
<url>
<loc>https://www.rukon.dev/blog/evaluating-a-vision-model-with-only-thirteen-examples</loc>
<lastmod>2026-10-02</lastmod>
<changefreq>yearly</changefreq>
<priority>0.5</priority>
</url>
<url>
<loc>https://www.rukon.dev/blog/evaluating-an-llm-app-when-your-own-system-hides-the-result</loc>
<lastmod>2026-10-02</lastmod>
<changefreq>yearly</changefreq>
<priority>0.5</priority>
</url>
<url>
<loc>https://www.rukon.dev/blog/exposing-local-ollama-to-vercel-through-a-token-gateway</loc>
<lastmod>2026-10-02</lastmod>
<changefreq>yearly</changefreq>
<priority>0.5</priority>
</url>
<url>
<loc>https://www.rukon.dev/blog/express-5-pglite-api-jwt-security-tests</loc>
<lastmod>2026-10-02</lastmod>
<changefreq>yearly</changefreq>
<priority>0.5</priority>
</url>
<url>
<loc>https://www.rukon.dev/blog/extracting-text-from-academic-pdfs-with-pypdf</loc>
<lastmod>2026-10-02</lastmod>
<changefreq>yearly</changefreq>
<priority>0.5</priority>
</url>
<url>
<loc>https://www.rukon.dev/blog/fastapi-and-nextjs-as-two-services-on-one-vercel-origin</loc>
<lastmod>2026-10-01</lastmod>
<changefreq>yearly</changefreq>
<priority>0.5</priority>
</url>
<url>
<loc>https://www.rukon.dev/blog/fill-a-word-template-in-nodejs-with-jszip</loc>
<lastmod>2026-10-01</lastmod>
<changefreq>yearly</changefreq>
<priority>0.5</priority>
</url>
<url>
<loc>https://www.rukon.dev/blog/four-kinds-of-unclear-decision-states-for-an-ai-check</loc>
<lastmod>2026-10-02</lastmod>
<changefreq>yearly</changefreq>
<priority>0.5</priority>
</url>
<url>
<loc>https://www.rukon.dev/blog/free-tier-token-limit-smaller-than-one-request</loc>
<lastmod>2026-10-02</lastmod>
<changefreq>yearly</changefreq>
<priority>0.5</priority>
</url>
<url>
<loc>https://www.rukon.dev/blog/freezing-label-templates-with-raster-hash-tests</loc>
<lastmod>2026-10-02</lastmod>
<changefreq>yearly</changefreq>
<priority>0.5</priority>
</url>
<url>
<loc>https://www.rukon.dev/blog/gapless-monthly-request-numbers-in-postgres</loc>
<lastmod>2026-10-02</lastmod>
<changefreq>yearly</changefreq>
<priority>0.5</priority>
</url>
<url>
<loc>https://www.rukon.dev/blog/generating-an-xcode-project-file-from-a-script</loc>
<lastmod>2026-10-02</lastmod>
<changefreq>yearly</changefreq>
<priority>0.5</priority>
</url>
<url>
<loc>https://www.rukon.dev/blog/generating-inventory-skus-in-excel-with-let-and-textjoin</loc>
<lastmod>2026-10-01</lastmod>
<changefreq>yearly</changefreq>
<priority>0.5</priority>
</url>
<url>
<loc>https://www.rukon.dev/blog/google-oidc-pkce-device-provisioning-revocable-tokens</loc>
<lastmod>2026-10-02</lastmod>
<changefreq>yearly</changefreq>
<priority>0.5</priority>
</url>
<url>
<loc>https://www.rukon.dev/blog/hardening-a-public-photo-upload-exif-magic-bytes-and-re-encoding</loc>
<lastmod>2026-10-02</lastmod>
<changefreq>yearly</changefreq>
<priority>0.5</priority>
</url>
<url>
<loc>https://www.rukon.dev/blog/hmac-signed-session-cookies-without-a-library</loc>
<lastmod>2026-10-02</lastmod>
<changefreq>yearly</changefreq>
<priority>0.5</priority>
</url>
<url>
<loc>https://www.rukon.dev/blog/ignoring-advert-prices-when-reading-payment-screenshots</loc>
<lastmod>2026-10-01</lastmod>
<changefreq>yearly</changefreq>
<priority>0.5</priority>
</url>
<url>
<loc>https://www.rukon.dev/blog/immutable-reference-data-postgres-triggers-and-hash-pinning</loc>
<lastmod>2026-10-02</lastmod>
<changefreq>yearly</changefreq>
<priority>0.5</priority>
</url>
<url>
<loc>https://www.rukon.dev/blog/implemented-available-not-connected-status-honesty</loc>
<lastmod>2026-10-02</lastmod>
<changefreq>yearly</changefreq>
<priority>0.5</priority>
</url>
<url>
<loc>https://www.rukon.dev/blog/in-app-test-runner-and-xcuitest-for-an-ios-app</loc>
<lastmod>2026-10-02</lastmod>
<changefreq>yearly</changefreq>
<priority>0.5</priority>
</url>
<url>
<loc>https://www.rukon.dev/blog/instrumenting-a-web-bluetooth-print-pipeline</loc>
<lastmod>2026-10-02</lastmod>
<changefreq>yearly</changefreq>
<priority>0.5</priority>
</url>
<url>
<loc>https://www.rukon.dev/blog/ios-share-extension-ocr-shared-swiftdata-store</loc>
<lastmod>2026-10-02</lastmod>
<changefreq>yearly</changefreq>
<priority>0.5</priority>
</url>
<url>
<loc>https://www.rukon.dev/blog/keeping-contact-details-off-a-public-link-page</loc>
<lastmod>2026-10-02</lastmod>
<changefreq>yearly</changefreq>
<priority>0.5</priority>
</url>
<url>
<loc>https://www.rukon.dev/blog/literature-review-across-papers-from-stored-analyses</loc>
<lastmod>2026-10-02</lastmod>
<changefreq>yearly</changefreq>
<priority>0.5</priority>
</url>
<url>
<loc>https://www.rukon.dev/blog/llm-rate-limits-and-sdk-hidden-retries</loc>
<lastmod>2026-10-02</lastmod>
<changefreq>yearly</changefreq>
<priority>0.5</priority>
</url>
<url>
<loc>https://www.rukon.dev/blog/local-first-sync-conflict-policy-offline-pwa</loc>
<lastmod>2026-10-02</lastmod>
<changefreq>yearly</changefreq>
<priority>0.5</priority>
</url>
<url>
<loc>https://www.rukon.dev/blog/logging-apple-pay-purchases-with-app-intents-wallet-automation</loc>
<lastmod>2026-10-02</lastmod>
<changefreq>yearly</changefreq>
<priority>0.5</priority>
</url>
<url>
<loc>https://www.rukon.dev/blog/logging-status-changes-in-excel-with-vba-to-measure-stage-time</loc>
<lastmod>2026-10-01</lastmod>
<changefreq>yearly</changefreq>
<priority>0.5</priority>
</url>
<url>
<loc>https://www.rukon.dev/blog/logout-still-worked-for-30-seconds-token-cache-serverless</loc>
<lastmod>2026-10-02</lastmod>
<changefreq>yearly</changefreq>
<priority>0.5</priority>
</url>
<url>
<loc>https://www.rukon.dev/blog/making-an-invalid-config-state-unrepresentable-in-postgres</loc>
<lastmod>2026-10-02</lastmod>
<changefreq>yearly</changefreq>
<priority>0.5</priority>
</url>
<url>
<loc>https://www.rukon.dev/blog/malaysian-payment-screenshot-parser-false-positives</loc>
<lastmod>2026-10-02</lastmod>
<changefreq>yearly</changefreq>
<priority>0.5</priority>
</url>
<url>
<loc>https://www.rukon.dev/blog/mapping-an-excel-tracker-to-a-database-schema</loc>
<lastmod>2026-10-02</lastmod>
<changefreq>yearly</changefreq>
<priority>0.5</priority>
</url>
<url>
<loc>https://www.rukon.dev/blog/measured-vs-estimated-fuel-economy-full-tank-method</loc>
<lastmod>2026-10-02</lastmod>
<changefreq>yearly</changefreq>
<priority>0.5</priority>
</url>
<url>
<loc>https://www.rukon.dev/blog/modelling-a-refurbishment-pipeline-in-excel</loc>
<lastmod>2026-10-02</lastmod>
<changefreq>yearly</changefreq>
<priority>0.5</priority>
</url>
<url>
<loc>https://www.rukon.dev/blog/modelling-spending-cash-flow-and-who-owes-whom</loc>
<lastmod>2026-10-02</lastmod>
<changefreq>yearly</changefreq>
<priority>0.5</priority>
</url>
<url>
<loc>https://www.rukon.dev/blog/never-create-indexes-from-application-startup</loc>
<lastmod>2026-10-02</lastmod>
<changefreq>yearly</changefreq>
<priority>0.5</priority>
</url>
<url>
<loc>https://www.rukon.dev/blog/nextjs-16-proxy-ts-supabase-session-refresh</loc>
<lastmod>2026-10-02</lastmod>
<changefreq>yearly</changefreq>
<priority>0.5</priority>
</url>
<url>
<loc>https://www.rukon.dev/blog/nextjs-error-boundary-auto-retry-jitter</loc>
<lastmod>2026-10-02</lastmod>
<changefreq>yearly</changefreq>
<priority>0.5</priority>
</url>
<url>
<loc>https://www.rukon.dev/blog/nextjs-opengraph-metadata-replaces-not-merges</loc>
<lastmod>2026-10-02</lastmod>
<changefreq>yearly</changefreq>
<priority>0.5</priority>
</url>
<url>
<loc>https://www.rukon.dev/blog/niimbot-b1-pro-ble-protocol-print-sequence</loc>
<lastmod>2026-10-01</lastmod>
<changefreq>yearly</changefreq>
<priority>0.5</priority>
</url>
<url>
<loc>https://www.rukon.dev/blog/node-spawn-on-windows-program-files-path-and-stale-path</loc>
<lastmod>2026-10-02</lastmod>
<changefreq>yearly</changefreq>
<priority>0.5</priority>
</url>
<url>
<loc>https://www.rukon.dev/blog/odometer-ocr-tesseract-sharp-preprocessing-plausibility</loc>
<lastmod>2026-10-02</lastmod>
<changefreq>yearly</changefreq>
<priority>0.5</priority>
</url>
<url>
<loc>https://www.rukon.dev/blog/offline-sync-deletes-tombstones-last-write-wins</loc>
<lastmod>2026-10-02</lastmod>
<changefreq>yearly</changefreq>
<priority>0.5</priority>
</url>
<url>
<loc>https://www.rukon.dev/blog/one-json-ld-graph-person-referenced-by-id</loc>
<lastmod>2026-10-01</lastmod>
<changefreq>yearly</changefreq>
<priority>0.5</priority>
</url>
<url>
<loc>https://www.rukon.dev/blog/one-postgres-function-for-a-whole-analytics-dashboard</loc>
<lastmod>2026-10-02</lastmod>
<changefreq>yearly</changefreq>
<priority>0.5</priority>
</url>
<url>
<loc>https://www.rukon.dev/blog/one-pure-function-for-preview-and-commit</loc>
<lastmod>2026-10-02</lastmod>
<changefreq>yearly</changefreq>
<priority>0.5</priority>
</url>
<url>
<loc>https://www.rukon.dev/blog/one-pydantic-schema-two-llm-vendors-structured-output</loc>
<lastmod>2026-10-02</lastmod>
<changefreq>yearly</changefreq>
<priority>0.5</priority>
</url>
<url>
<loc>https://www.rukon.dev/blog/optimistic-concurrency-postgres-upsert-revision-409</loc>
<lastmod>2026-10-01</lastmod>
<changefreq>yearly</changefreq>
<priority>0.5</priority>
</url>
<url>
<loc>https://www.rukon.dev/blog/payment-channel-vs-funding-account-apple-pay-reconciliation</loc>
<lastmod>2026-10-02</lastmod>
<changefreq>yearly</changefreq>
<priority>0.5</priority>
</url>
<url>
<loc>https://www.rukon.dev/blog/photo-quality-gate-blur-glare-exposure-before-a-vision-model</loc>
<lastmod>2026-10-01</lastmod>
<changefreq>yearly</changefreq>
<priority>0.5</priority>
</url>
<url>
<loc>https://www.rukon.dev/blog/planning-a-university-project-like-a-production-system</loc>
<lastmod>2026-10-02</lastmod>
<changefreq>yearly</changefreq>
<priority>0.5</priority>
</url>
<url>
<loc>https://www.rukon.dev/blog/porting-a-static-page-to-nextjs-without-visual-drift</loc>
<lastmod>2026-10-02</lastmod>
<changefreq>yearly</changefreq>
<priority>0.5</priority>
</url>
<url>
<loc>https://www.rukon.dev/blog/postgres-bulk-insert-bind-parameter-limit-unnest</loc>
<lastmod>2026-10-02</lastmod>
<changefreq>yearly</changefreq>
<priority>0.5</priority>
</url>
<url>
<loc>https://www.rukon.dev/blog/postgres-js-jsonb-double-encoding-sql-json</loc>
<lastmod>2026-10-02</lastmod>
<changefreq>yearly</changefreq>
<priority>0.5</priority>
</url>
<url>
<loc>https://www.rukon.dev/blog/postgres-js-timestamptz-microseconds-lost-in-binding</loc>
<lastmod>2026-10-02</lastmod>
<changefreq>yearly</changefreq>
<priority>0.5</priority>
</url>
<url>
<loc>https://www.rukon.dev/blog/production-write-lock-read-only-mode-nextjs-middleware</loc>
<lastmod>2026-10-02</lastmod>
<changefreq>yearly</changefreq>
<priority>0.5</priority>
</url>
<url>
<loc>https://www.rukon.dev/blog/promise-race-timeout-leaks-postgres-connections</loc>
<lastmod>2026-10-02</lastmod>
<changefreq>yearly</changefreq>
<priority>0.5</priority>
</url>
<url>
<loc>https://www.rukon.dev/blog/qualification-gate-computing-what-a-model-is-allowed-to-decide</loc>
<lastmod>2026-10-02</lastmod>
<changefreq>yearly</changefreq>
<priority>0.5</priority>
</url>
<url>
<loc>https://www.rukon.dev/blog/rate-limiting-a-public-endpoint-on-serverless-hmac-of-ip</loc>
<lastmod>2026-10-02</lastmod>
<changefreq>yearly</changefreq>
<priority>0.5</priority>
</url>
<url>
<loc>https://www.rukon.dev/blog/remediating-a-code-audit-with-p0-findings</loc>
<lastmod>2026-10-02</lastmod>
<changefreq>yearly</changefreq>
<priority>0.5</priority>
</url>
<url>
<loc>https://www.rukon.dev/blog/removing-default-values-that-look-like-data</loc>
<lastmod>2026-10-02</lastmod>
<changefreq>yearly</changefreq>
<priority>0.5</priority>
</url>
<url>
<loc>https://www.rukon.dev/blog/rendering-labels-for-a-576-dot-thermal-printhead</loc>
<lastmod>2026-10-01</lastmod>
<changefreq>yearly</changefreq>
<priority>0.5</priority>
</url>
<url>
<loc>https://www.rukon.dev/blog/rtl-arabic-dashboard-in-nextjs-with-typed-i18n</loc>
<lastmod>2026-10-02</lastmod>
<changefreq>yearly</changefreq>
<priority>0.5</priority>
</url>
<url>
<loc>https://www.rukon.dev/blog/running-qwen2-5-vl-7b-on-intel-iris-xe-with-ollama-vulkan</loc>
<lastmod>2026-10-02</lastmod>
<changefreq>yearly</changefreq>
<priority>0.5</priority>
</url>
<url>
<loc>https://www.rukon.dev/blog/schema-setup-on-cold-start-without-a-race</loc>
<lastmod>2026-10-02</lastmod>
<changefreq>yearly</changefreq>
<priority>0.5</priority>
</url>
<url>
<loc>https://www.rukon.dev/blog/schema-skew-degrade-one-migration-at-a-time</loc>
<lastmod>2026-10-02</lastmod>
<changefreq>yearly</changefreq>
<priority>0.5</priority>
</url>
<url>
<loc>https://www.rukon.dev/blog/security-headers-for-a-web-bluetooth-pwa</loc>
<lastmod>2026-10-02</lastmod>
<changefreq>yearly</changefreq>
<priority>0.5</priority>
</url>
<url>
<loc>https://www.rukon.dev/blog/security-headers-nextjs-and-why-csp-waited</loc>
<lastmod>2026-10-02</lastmod>
<changefreq>yearly</changefreq>
<priority>0.5</priority>
</url>
<url>
<loc>https://www.rukon.dev/blog/self-hosting-node-postgresql-nginx-systemd-ubuntu</loc>
<lastmod>2026-10-02</lastmod>
<changefreq>yearly</changefreq>
<priority>0.5</priority>
</url>
<url>
<loc>https://www.rukon.dev/blog/sender-vs-recipient-bank-in-malaysian-transfer-receipts</loc>
<lastmod>2026-10-02</lastmod>
<changefreq>yearly</changefreq>
<priority>0.5</priority>
</url>
<url>
<loc>https://www.rukon.dev/blog/serial-number-model-detection-by-prefix-rules</loc>
<lastmod>2026-10-02</lastmod>
<changefreq>yearly</changefreq>
<priority>0.5</priority>
</url>
<url>
<loc>https://www.rukon.dev/blog/shadow-testing-a-replacement-model-with-nextjs-after</loc>
<lastmod>2026-10-02</lastmod>
<changefreq>yearly</changefreq>
<priority>0.5</priority>
</url>
<url>
<loc>https://www.rukon.dev/blog/sharing-one-supabase-project-between-two-apps</loc>
<lastmod>2026-10-02</lastmod>
<changefreq>yearly</changefreq>
<priority>0.5</priority>
</url>
<url>
<loc>https://www.rukon.dev/blog/sorting-vision-text-observations-into-rows</loc>
<lastmod>2026-10-02</lastmod>
<changefreq>yearly</changefreq>
<priority>0.5</priority>
</url>
<url>
<loc>https://www.rukon.dev/blog/splitting-a-bill-in-integer-sen-largest-remainder</loc>
<lastmod>2026-10-02</lastmod>
<changefreq>yearly</changefreq>
<priority>0.5</priority>
</url>
<url>
<loc>https://www.rukon.dev/blog/stale-responses-overwrite-newer-filter-results-react</loc>
<lastmod>2026-10-02</lastmod>
<changefreq>yearly</changefreq>
<priority>0.5</priority>
</url>
<url>
<loc>https://www.rukon.dev/blog/stock-request-workflow-with-a-state-machine-and-event-log</loc>
<lastmod>2026-10-02</lastmod>
<changefreq>yearly</changefreq>
<priority>0.5</priority>
</url>
<url>
<loc>https://www.rukon.dev/blog/stop-vercel-preview-deployments-using-production-database</loc>
<lastmod>2026-10-02</lastmod>
<changefreq>yearly</changefreq>
<priority>0.5</priority>
</url>
<url>
<loc>https://www.rukon.dev/blog/storing-uploaded-photos-in-postgres-bytea-admin-only</loc>
<lastmod>2026-10-02</lastmod>
<changefreq>yearly</changefreq>
<priority>0.5</priority>
</url>
<url>
<loc>https://www.rukon.dev/blog/structured-data-for-a-local-recycling-business</loc>
<lastmod>2026-10-02</lastmod>
<changefreq>yearly</changefreq>
<priority>0.5</priority>
</url>
<url>
<loc>https://www.rukon.dev/blog/supabase-free-plan-backup-json-export-restore</loc>
<lastmod>2026-10-02</lastmod>
<changefreq>yearly</changefreq>
<priority>0.5</priority>
</url>
<url>
<loc>https://www.rukon.dev/blog/supabase-google-sign-in-ios-pkce-without-google-sdk</loc>
<lastmod>2026-10-02</lastmod>
<changefreq>yearly</changefreq>
<priority>0.5</priority>
</url>
<url>
<loc>https://www.rukon.dev/blog/supabase-google-sign-in-redirects-to-localhost-with-token</loc>
<lastmod>2026-10-02</lastmod>
<changefreq>yearly</changefreq>
<priority>0.5</priority>
</url>
<url>
<loc>https://www.rukon.dev/blog/supabase-session-pooler-emaxconnsession-postmortem</loc>
<lastmod>2026-10-01</lastmod>
<changefreq>yearly</changefreq>
<priority>0.5</priority>
</url>
<url>
<loc>https://www.rukon.dev/blog/swiftdata-versioned-schema-migration-without-losing-data</loc>
<lastmod>2026-10-02</lastmod>
<changefreq>yearly</changefreq>
<priority>0.5</priority>
</url>
<url>
<loc>https://www.rukon.dev/blog/testing-an-llm-app-without-calling-paid-apis</loc>
<lastmod>2026-10-02</lastmod>
<changefreq>yearly</changefreq>
<priority>0.5</priority>
</url>
<url>
<loc>https://www.rukon.dev/blog/testing-every-nextjs-api-route-refuses-without-session</loc>
<lastmod>2026-10-02</lastmod>
<changefreq>yearly</changefreq>
<priority>0.5</priority>
</url>
<url>
<loc>https://www.rukon.dev/blog/testing-postgres-in-vitest-with-pglite-and-postgres-js</loc>
<lastmod>2026-10-02</lastmod>
<changefreq>yearly</changefreq>
<priority>0.5</priority>
</url>
<url>
<loc>https://www.rukon.dev/blog/testing-pwa-offline-boot-headless-chrome-devtools-protocol</loc>
<lastmod>2026-10-02</lastmod>
<changefreq>yearly</changefreq>
<priority>0.5</priority>
</url>
<url>
<loc>https://www.rukon.dev/blog/testing-without-paid-apis-or-hardware-and-where-fakes-lie</loc>
<lastmod>2026-10-02</lastmod>
<changefreq>yearly</changefreq>
<priority>0.5</priority>
</url>
<url>
<loc>https://www.rukon.dev/blog/theme-specific-logos-without-a-flash</loc>
<lastmod>2026-10-02</lastmod>
<changefreq>yearly</changefreq>
<priority>0.5</priority>
</url>
<url>
<loc>https://www.rukon.dev/blog/two-ways-to-use-supabase-row-level-security</loc>
<lastmod>2026-10-02</lastmod>
<changefreq>yearly</changefreq>
<priority>0.5</priority>
</url>
<url>
<loc>https://www.rukon.dev/blog/vba-map-columns-by-header-name-not-column-number</loc>
<lastmod>2026-10-02</lastmod>
<changefreq>yearly</changefreq>
<priority>0.5</priority>
</url>
<url>
<loc>https://www.rukon.dev/blog/vercel-or-a-self-hosted-ubuntu-server-choosing-per-app</loc>
<lastmod>2026-10-02</lastmod>
<changefreq>yearly</changefreq>
<priority>0.5</priority>
</url>
<url>
<loc>https://www.rukon.dev/blog/versioning-an-operational-spreadsheet-like-software</loc>
<lastmod>2026-10-02</lastmod>
<changefreq>yearly</changefreq>
<priority>0.5</priority>
</url>
<url>
<loc>https://www.rukon.dev/blog/what-a-dedicated-inference-server-will-and-wont-fix</loc>
<lastmod>2026-10-02</lastmod>
<changefreq>yearly</changefreq>
<priority>0.5</priority>
</url>
<url>
<loc>https://www.rukon.dev/blog/when-production-breaks-and-nothing-changed-paused-free-tier-database</loc>
<lastmod>2026-10-02</lastmod>
<changefreq>yearly</changefreq>
<priority>0.5</priority>
</url>
<url>
<loc>https://www.rukon.dev/blog/whole-document-context-instead-of-rag-for-paper-analysis</loc>
<lastmod>2026-10-02</lastmod>
<changefreq>yearly</changefreq>
<priority>0.5</priority>
</url>
<url>
<loc>https://www.rukon.dev/blog/workbox-conflicting-precache-entries-empty-cache</loc>
<lastmod>2026-10-02</lastmod>
<changefreq>yearly</changefreq>
<priority>0.5</priority>
</url>
<url>
<loc>https://www.rukon.dev/blog/writing-a-page-ai-answer-engines-can-quote</loc>
<lastmod>2026-10-02</lastmod>
<changefreq>yearly</changefreq>
<priority>0.5</priority>
</url>
<url>
<loc>https://www.rukon.dev/blog/wrong-supabase-key-returns-200-and-zero-rows</loc>
<lastmod>2026-10-02</lastmod>
<changefreq>yearly</changefreq>
<priority>0.5</priority>
</url>
<url>
<loc>https://www.rukon.dev/blog/supabase-connection-pool-exhaustion-supavisor-production</loc>
<lastmod>2026-10-13</lastmod>
<changefreq>yearly</changefreq>
<priority>0.5</priority>
</url>
<url>
<loc>https://www.rukon.dev/blog/swiftdata-local-first-outbox-sync-engine</loc>
<lastmod>2026-10-13</lastmod>
<changefreq>yearly</changefreq>
<priority>0.5</priority>
</url>
<url>
<loc>https://www.rukon.dev/blog/hardware-identity-vs-generated-stock-prefixes-refurbishment</loc>
<lastmod>2026-10-13</lastmod>
<changefreq>yearly</changefreq>
<priority>0.5</priority>
</url>
<url>
<loc>https://www.rukon.dev/blog/excluding-damaged-monitor-strip-windows-appbar-api</loc>
<lastmod>2026-10-13</lastmod>
<changefreq>yearly</changefreq>
<priority>0.5</priority>
</url>
<url>
<loc>https://www.rukon.dev/blog/lan-serial-number-extraction-across-router-vendors</loc>
<lastmod>2026-10-13</lastmod>
<changefreq>yearly</changefreq>
<priority>0.5</priority>
</url>
<url>
<loc>https://www.rukon.dev/blog/offline-receipt-ocr-on-android-with-ml-kit</loc>
<lastmod>2026-10-13</lastmod>
<changefreq>yearly</changefreq>
<priority>0.5</priority>
</url>
<url>
<loc>https://www.rukon.dev/blog/sending-labels-between-browser-tabs-broadcastchannel-coop-window-opener</loc>
<lastmod>2026-10-20</lastmod>
<changefreq>yearly</changefreq>
<priority>0.5</priority>
</url>
<url>
<loc>https://www.rukon.dev/blog/refusing-runtime-ddl-on-production-schema-stamps-and-a-gate</loc>
<lastmod>2026-10-20</lastmod>
<changefreq>yearly</changefreq>
<priority>0.5</priority>
</url>
<url>
<loc>https://www.rukon.dev/blog/one-live-record-per-router-per-session-partial-unique-index</loc>
<lastmod>2026-10-20</lastmod>
<changefreq>yearly</changefreq>
<priority>0.5</priority>
</url>
<url>
<loc>https://www.rukon.dev/blog/sorting-on-the-column-the-index-serves-250000-routers</loc>
<lastmod>2026-10-20</lastmod>
<changefreq>yearly</changefreq>
<priority>0.5</priority>
</url>
<url>
<loc>https://www.rukon.dev/blog/google-sign-in-server-side-pkce-per-service-grants-read-every-request</loc>
<lastmod>2026-10-20</lastmod>
<changefreq>yearly</changefreq>
<priority>0.5</priority>
</url>
<url>
<loc>https://www.rukon.dev/blog/installing-drivers-from-official-sources-only-allow-lists-hashes-authenticode</loc>
<lastmod>2026-10-20</lastmod>
<changefreq>yearly</changefreq>
<priority>0.5</priority>
</url>
</urlset>
