<?xml version="1.0" encoding="UTF-8"?><?xml-stylesheet type="text/xsl" href="//uppinote.dev/blog/sitemap.xsl"?><urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9" xmlns:image="http://www.google.com/schemas/sitemap-image/1.1"><url><loc>https://uppinote.dev/blog/typescript-per-instance-service-orphan-leak-cleanup/</loc><lastmod>2026-05-22T00:00:00.000Z</lastmod><image:image><image:loc>https://uppinote.dev/blog/content/images/2026/05/typescript-per-instance-service-orphan-leak-cleanup-01.png</image:loc><image:caption>typescript-per-instance-service-orphan-leak-cleanup-01.png</image:caption></image:image></url><url><loc>https://uppinote.dev/blog/obsidian-airtable-database-provider-abstraction-refactor/</loc><lastmod>2026-05-21T00:00:00.000Z</lastmod><image:image><image:loc>https://uppinote.dev/blog/content/images/2026/05/obsidian-airtable-database-provider-abstraction-refactor-01.png</image:loc><image:caption>obsidian-airtable-database-provider-abstraction-refactor-01.png</image:caption></image:image></url><url><loc>https://uppinote.dev/blog/obsidian-plugin-multi-config-architecture-airtable/</loc><lastmod>2026-05-20T00:00:00.000Z</lastmod><image:image><image:loc>https://uppinote.dev/blog/content/images/2026/05/obsidian-plugin-multi-config-architecture-airtable-01.png</image:loc><image:caption>obsidian-plugin-multi-config-architecture-airtable-01.png</image:caption></image:image></url><url><loc>https://uppinote.dev/blog/ghost-mcp-v1-0-1-update-prototype-to-oss/</loc><lastmod>2026-05-19T00:00:00.000Z</lastmod><image:image><image:loc>https://uppinote.dev/blog/content/images/2026/05/ghost-mcp-v1-0-1-update-prototype-to-oss-01.png</image:loc><image:caption>ghost-mcp-v1-0-1-update-prototype-to-oss-01.png</image:caption></image:image></url><url><loc>https://uppinote.dev/blog/bidirectional-link-test-coverage-tested-covers-marker/</loc><lastmod>2026-05-18T00:00:00.000Z</lastmod><image:image><image:loc>https://uppinote.dev/blog/content/images/2026/05/bidirectional-link-test-coverage-tested-covers-marker-01.png</image:loc><image:caption>bidirectional-link-test-coverage-tested-covers-marker-01.png</image:caption></image:image></url><url><loc>https://uppinote.dev/blog/markdown-multi-format-auto-detection-parser-design/</loc><lastmod>2026-05-15T00:00:00.000Z</lastmod><image:image><image:loc>https://uppinote.dev/blog/content/images/2026/05/markdown-multi-format-auto-detection-parser-design-01.png</image:loc><image:caption>markdown-multi-format-auto-detection-parser-design-01.png</image:caption></image:image></url><url><loc>https://uppinote.dev/blog/mcp-server-path-traversal-defense-llm-file-path/</loc><lastmod>2026-05-14T00:00:00.000Z</lastmod><image:image><image:loc>https://uppinote.dev/blog/content/images/2026/05/mcp-server-path-traversal-defense-llm-file-path-01.png</image:loc><image:caption>mcp-server-path-traversal-defense-llm-file-path-01.png</image:caption></image:image></url><url><loc>https://uppinote.dev/blog/typescript-readonly-status-type-boundary-ghost-sent/</loc><lastmod>2026-05-13T00:00:00.000Z</lastmod><image:image><image:loc>https://uppinote.dev/blog/content/images/2026/05/typescript-readonly-status-type-boundary-ghost-sent-01.png</image:loc><image:caption>typescript-readonly-status-type-boundary-ghost-sent-01.png</image:caption></image:image></url><url><loc>https://uppinote.dev/blog/ghost-api-empty-array-patch-tag-clearing/</loc><lastmod>2026-05-12T14:19:34.000Z</lastmod><image:image><image:loc>https://uppinote.dev/blog/content/images/2026/05/ghost-api-empty-array-patch-tag-clearing-01.png</image:loc><image:caption>ghost-api-empty-array-patch-tag-clearing-01.png</image:caption></image:image></url><url><loc>https://uppinote.dev/blog/ghost-backup-automation/</loc><lastmod>2026-05-12T05:49:36.000Z</lastmod><image:image><image:loc>https://uppinote.dev/blog/content/images/2026/05/ghost-backup-automation-01.png</image:loc><image:caption>ghost-backup-automation-01.png</image:caption></image:image></url><url><loc>https://uppinote.dev/blog/oracle-cloud-free-server-setup/</loc><lastmod>2026-05-12T05:49:35.000Z</lastmod><image:image><image:loc>https://uppinote.dev/blog/content/images/2026/05/oracle-cloud-free-server-setup-01.png</image:loc><image:caption>oracle-cloud-free-server-setup-01.png</image:caption></image:image></url><url><loc>https://uppinote.dev/blog/ghost-upgrade-guide/</loc><lastmod>2026-05-12T05:49:34.000Z</lastmod><image:image><image:loc>https://uppinote.dev/blog/content/images/2026/05/ghost-upgrade-guide-01.png</image:loc><image:caption>ghost-upgrade-guide-01.png</image:caption></image:image></url><url><loc>https://uppinote.dev/blog/ghost-activitypub-fediverse-setup/</loc><lastmod>2026-05-12T05:49:33.000Z</lastmod><image:image><image:loc>https://uppinote.dev/blog/content/images/2026/05/ghost-activitypub-fediverse-setup-01.png</image:loc><image:caption>ghost-activitypub-fediverse-setup-01.png</image:caption></image:image></url><url><loc>https://uppinote.dev/blog/ghost-seo-search-engine-registration/</loc><lastmod>2026-05-12T05:49:32.000Z</lastmod><image:image><image:loc>https://uppinote.dev/blog/content/images/2026/05/ghost-seo-search-engine-registration-01.png</image:loc><image:caption>ghost-seo-search-engine-registration-01.png</image:caption></image:image></url><url><loc>https://uppinote.dev/blog/ghost-analytics-tinybird-setup/</loc><lastmod>2026-05-12T05:49:31.000Z</lastmod><image:image><image:loc>https://uppinote.dev/blog/content/images/2026/05/ghost-analytics-tinybird-setup-01.png</image:loc><image:caption>ghost-analytics-tinybird-setup-01.png</image:caption></image:image></url><url><loc>https://uppinote.dev/blog/claude-dashboard-plugin-guide/</loc><lastmod>2026-05-12T05:49:30.000Z</lastmod><image:image><image:loc>https://uppinote.dev/blog/content/images/2026/05/claude-dashboard-plugin-guide-01.png</image:loc><image:caption>claude-dashboard-plugin-guide-01.png</image:caption></image:image></url><url><loc>https://uppinote.dev/blog/tailscale-ssh-iphone-mac-remote-access/</loc><lastmod>2026-05-12T05:49:29.000Z</lastmod><image:image><image:loc>https://uppinote.dev/blog/content/images/2026/05/tailscale-ssh-iphone-mac-remote-access-01.png</image:loc><image:caption>tailscale-ssh-iphone-mac-remote-access-01.png</image:caption></image:image></url><url><loc>https://uppinote.dev/blog/ubuntu-server-security-hardening/</loc><lastmod>2026-05-12T05:49:28.000Z</lastmod><image:image><image:loc>https://uppinote.dev/blog/content/images/2026/05/ubuntu-server-security-hardening-01.png</image:loc><image:caption>ubuntu-server-security-hardening-01.png</image:caption></image:image></url><url><loc>https://uppinote.dev/blog/ghost-knowledge-graph-d3js-implementation/</loc><lastmod>2026-05-12T05:49:28.000Z</lastmod><image:image><image:loc>https://uppinote.dev/blog/content/images/2026/05/ghost-knowledge-graph-d3js-implementation-01.png</image:loc><image:caption>ghost-knowledge-graph-d3js-implementation-01.png</image:caption></image:image></url><url><loc>https://uppinote.dev/blog/ghost-floating-toc-scroll-spy/</loc><lastmod>2026-05-12T05:49:27.000Z</lastmod><image:image><image:loc>https://uppinote.dev/blog/content/images/2026/05/ghost-floating-toc-scroll-spy-01.png</image:loc><image:caption>ghost-floating-toc-scroll-spy-01.png</image:caption></image:image></url><url><loc>https://uppinote.dev/blog/ghost-blog-monetization-korea/</loc><lastmod>2026-05-12T05:49:26.000Z</lastmod><image:image><image:loc>https://uppinote.dev/blog/content/images/2026/05/ghost-blog-monetization-korea-01.png</image:loc><image:caption>ghost-blog-monetization-korea-01.png</image:caption></image:image></url><url><loc>https://uppinote.dev/blog/ghost-scheduled-publishing/</loc><lastmod>2026-05-12T05:49:25.000Z</lastmod><image:image><image:loc>https://uppinote.dev/blog/content/images/2026/05/ghost-scheduled-publishing-01.png</image:loc><image:caption>ghost-scheduled-publishing-01.png</image:caption></image:image></url><url><loc>https://uppinote.dev/blog/git-worktree-guide-create-manage-cleanup/</loc><lastmod>2026-05-12T05:49:17.000Z</lastmod><image:image><image:loc>https://uppinote.dev/blog/content/images/2026/05/git-worktree-guide-create-manage-cleanup-01.png</image:loc><image:caption>git-worktree-guide-create-manage-cleanup-01.png</image:caption></image:image></url><url><loc>https://uppinote.dev/blog/ghost-newsletter-growth/</loc><lastmod>2026-05-12T05:49:16.000Z</lastmod><image:image><image:loc>https://uppinote.dev/blog/content/images/2026/05/ghost-newsletter-growth-01.png</image:loc><image:caption>ghost-newsletter-growth-01.png</image:caption></image:image></url><url><loc>https://uppinote.dev/blog/claude-code-soul-md-claude-md-optimization-2026/</loc><lastmod>2026-05-12T05:49:15.000Z</lastmod><image:image><image:loc>https://uppinote.dev/blog/content/images/2026/05/claude-code-soul-md-claude-md-optimization-2026-01.png</image:loc><image:caption>claude-code-soul-md-claude-md-optimization-2026-01.png</image:caption></image:image></url><url><loc>https://uppinote.dev/blog/ghostty-lazygit-claude-code-terminal-dev-setup/</loc><lastmod>2026-05-12T05:49:14.000Z</lastmod><image:image><image:loc>https://uppinote.dev/blog/content/images/2026/05/ghostty-lazygit-claude-code-terminal-dev-setup-01.png</image:loc><image:caption>ghostty-lazygit-claude-code-terminal-dev-setup-01.png</image:caption></image:image></url><url><loc>https://uppinote.dev/blog/claude-codex-gemini-cli-usage-dashboard/</loc><lastmod>2026-05-12T05:49:13.000Z</lastmod><image:image><image:loc>https://uppinote.dev/blog/content/images/2026/05/claude-codex-gemini-cli-usage-dashboard-01.png</image:loc><image:caption>claude-codex-gemini-cli-usage-dashboard-01.png</image:caption></image:image></url><url><loc>https://uppinote.dev/blog/claude-code-session-cleanup/</loc><lastmod>2026-05-12T05:49:12.000Z</lastmod><image:image><image:loc>https://uppinote.dev/blog/content/images/2026/05/claude-code-session-cleanup-01.png</image:loc><image:caption>claude-code-session-cleanup-01.png</image:caption></image:image></url><url><loc>https://uppinote.dev/blog/claude-code-hooks-blog-automation/</loc><lastmod>2026-05-12T05:49:11.000Z</lastmod><image:image><image:loc>https://uppinote.dev/blog/content/images/2026/05/claude-code-hooks-blog-automation-01.png</image:loc><image:caption>claude-code-hooks-blog-automation-01.png</image:caption></image:image></url><url><loc>https://uppinote.dev/blog/ghost-admin-api-blog-management/</loc><lastmod>2026-05-12T05:49:10.000Z</lastmod><image:image><image:loc>https://uppinote.dev/blog/content/images/2026/05/ghost-admin-api-blog-management-01.png</image:loc><image:caption>ghost-admin-api-blog-management-01.png</image:caption></image:image></url><url><loc>https://uppinote.dev/blog/claude-code-review-github-action-broken-fix/</loc><lastmod>2026-05-12T05:49:10.000Z</lastmod><image:image><image:loc>https://uppinote.dev/blog/content/images/2026/05/claude-code-review-github-action-broken-fix-01.png</image:loc><image:caption>claude-code-review-github-action-broken-fix-01.png</image:caption></image:image></url><url><loc>https://uppinote.dev/blog/javascript-url-comparison-normalization/</loc><lastmod>2026-05-12T05:49:08.000Z</lastmod><image:image><image:loc>https://uppinote.dev/blog/content/images/2026/05/javascript-url-comparison-normalization-01.png</image:loc><image:caption>javascript-url-comparison-normalization-01.png</image:caption></image:image></url><url><loc>https://uppinote.dev/blog/web-crypto-pbkdf2-hashing/</loc><lastmod>2026-05-12T05:49:07.000Z</lastmod><image:image><image:loc>https://uppinote.dev/blog/content/images/2026/05/web-crypto-pbkdf2-hashing-01.png</image:loc><image:caption>web-crypto-pbkdf2-hashing-01.png</image:caption></image:image></url><url><loc>https://uppinote.dev/blog/n8n-mcp-docker-integration-guide/</loc><lastmod>2026-05-12T05:49:06.000Z</lastmod><image:image><image:loc>https://uppinote.dev/blog/content/images/2026/05/n8n-mcp-docker-integration-guide-01.png</image:loc><image:caption>n8n-mcp-docker-integration-guide-01.png</image:caption></image:image></url><url><loc>https://uppinote.dev/blog/n8n-self-hosting-sso-auth-gateway/</loc><lastmod>2026-05-12T05:49:05.000Z</lastmod><image:image><image:loc>https://uppinote.dev/blog/content/images/2026/05/n8n-self-hosting-sso-auth-gateway-01.png</image:loc><image:caption>n8n-self-hosting-sso-auth-gateway-01.png</image:caption></image:image></url><url><loc>https://uppinote.dev/blog/n8n-ai-tag-classification/</loc><lastmod>2026-05-12T05:49:04.000Z</lastmod><image:image><image:loc>https://uppinote.dev/blog/content/images/2026/05/n8n-ai-tag-classification-01.png</image:loc><image:caption>n8n-ai-tag-classification-01.png</image:caption></image:image></url><url><loc>https://uppinote.dev/blog/typescript-refactoring-n8n-node/</loc><lastmod>2026-05-12T05:49:04.000Z</lastmod><image:image><image:loc>https://uppinote.dev/blog/content/images/2026/05/typescript-refactoring-n8n-node-01.png</image:loc><image:caption>typescript-refactoring-n8n-node-01.png</image:caption></image:image></url><url><loc>https://uppinote.dev/blog/css-variables-dark-mode/</loc><lastmod>2026-05-12T05:48:56.000Z</lastmod><image:image><image:loc>https://uppinote.dev/blog/content/images/2026/05/css-variables-dark-mode-01.png</image:loc><image:caption>css-variables-dark-mode-01.png</image:caption></image:image></url><url><loc>https://uppinote.dev/blog/nextjs16-prerendering-error/</loc><lastmod>2026-05-12T05:48:55.000Z</lastmod><image:image><image:loc>https://uppinote.dev/blog/content/images/2026/05/nextjs16-prerendering-error-01.png</image:loc><image:caption>nextjs16-prerendering-error-01.png</image:caption></image:image></url><url><loc>https://uppinote.dev/blog/ghost-adsense-ads-txt-npm-docker-setup/</loc><lastmod>2026-05-12T05:48:54.000Z</lastmod><image:image><image:loc>https://uppinote.dev/blog/content/images/2026/05/ghost-adsense-ads-txt-npm-docker-setup-01.png</image:loc><image:caption>ghost-adsense-ads-txt-npm-docker-setup-01.png</image:caption></image:image></url><url><loc>https://uppinote.dev/blog/obsidian-plugin-e2e-testing-cdp-electron-remote-debugging/</loc><lastmod>2026-05-12T05:48:53.000Z</lastmod><image:image><image:loc>https://uppinote.dev/blog/content/images/2026/05/obsidian-plugin-e2e-testing-cdp-electron-remote-debugging-01.png</image:loc><image:caption>obsidian-plugin-e2e-testing-cdp-electron-remote-debugging-01.png</image:caption></image:image></url><url><loc>https://uppinote.dev/blog/ghost-self-hosted-cloudflare-cache-speed-optimization/</loc><lastmod>2026-05-12T05:48:52.000Z</lastmod><image:image><image:loc>https://uppinote.dev/blog/content/images/2026/05/ghost-self-hosted-cloudflare-cache-speed-optimization-01.png</image:loc><image:caption>ghost-self-hosted-cloudflare-cache-speed-optimization-01.png</image:caption></image:image></url><url><loc>https://uppinote.dev/blog/claude-dashboard-v1-10-to-v1-13-theme-performance-alias/</loc><lastmod>2026-05-12T05:48:51.000Z</lastmod><image:image><image:loc>https://uppinote.dev/blog/content/images/2026/05/claude-dashboard-v1-10-to-v1-13-theme-performance-alias-01.png</image:loc><image:caption>claude-dashboard-v1-10-to-v1-13-theme-performance-alias-01.png</image:caption></image:image></url><url><loc>https://uppinote.dev/blog/tailscale-oracle-cloud-ssh-security/</loc><lastmod>2026-05-12T05:48:50.000Z</lastmod><image:image><image:loc>https://uppinote.dev/blog/content/images/2026/05/tailscale-oracle-cloud-ssh-security-01.png</image:loc><image:caption>tailscale-oracle-cloud-ssh-security-01.png</image:caption></image:image></url><url><loc>https://uppinote.dev/blog/bidirectional-link-system/</loc><lastmod>2026-05-12T05:48:49.000Z</lastmod><image:image><image:loc>https://uppinote.dev/blog/content/images/2026/05/bidirectional-link-system-01.png</image:loc><image:caption>bidirectional-link-system-01.png</image:caption></image:image></url><url><loc>https://uppinote.dev/blog/ghost-mcp-blog-audit-automation/</loc><lastmod>2026-05-12T05:48:48.000Z</lastmod><image:image><image:loc>https://uppinote.dev/blog/content/images/2026/05/ghost-mcp-blog-audit-automation-01.png</image:loc><image:caption>ghost-mcp-blog-audit-automation-01.png</image:caption></image:image></url><url><loc>https://uppinote.dev/blog/audit-logging-sensitive-data/</loc><lastmod>2026-05-12T05:48:47.000Z</lastmod><image:image><image:loc>https://uppinote.dev/blog/content/images/2026/05/audit-logging-sensitive-data-01.png</image:loc><image:caption>audit-logging-sensitive-data-01.png</image:caption></image:image></url><url><loc>https://uppinote.dev/blog/express-proxy-layer-file-encryption/</loc><lastmod>2026-05-12T05:48:46.000Z</lastmod><image:image><image:loc>https://uppinote.dev/blog/content/images/2026/05/express-proxy-layer-file-encryption-01.png</image:loc><image:caption>express-proxy-layer-file-encryption-01.png</image:caption></image:image></url><url><loc>https://uppinote.dev/blog/prisma-decimal-silent-number-coercion/</loc><lastmod>2026-05-12T05:48:45.000Z</lastmod><image:image><image:loc>https://uppinote.dev/blog/content/images/2026/05/prisma-decimal-silent-number-coercion-01.png</image:loc><image:caption>prisma-decimal-silent-number-coercion-01.png</image:caption></image:image></url><url><loc>https://uppinote.dev/blog/prisma-n1-query-optimization/</loc><lastmod>2026-05-12T05:48:44.000Z</lastmod><image:image><image:loc>https://uppinote.dev/blog/content/images/2026/05/prisma-n1-query-optimization-01.png</image:loc><image:caption>prisma-n1-query-optimization-01.png</image:caption></image:image></url><url><loc>https://uppinote.dev/blog/astro-starlight-vercel-documentation-site-guide/</loc><lastmod>2026-05-12T05:48:43.000Z</lastmod><image:image><image:loc>https://uppinote.dev/blog/content/images/2026/05/astro-starlight-vercel-documentation-site-guide-01.png</image:loc><image:caption>astro-starlight-vercel-documentation-site-guide-01.png</image:caption></image:image></url><url><loc>https://uppinote.dev/blog/chrome-extension-folder-structure-refactoring/</loc><lastmod>2026-05-12T05:48:42.000Z</lastmod><image:image><image:loc>https://uppinote.dev/blog/content/images/2026/05/chrome-extension-folder-structure-refactoring-01.png</image:loc><image:caption>chrome-extension-folder-structure-refactoring-01.png</image:caption></image:image></url><url><loc>https://uppinote.dev/blog/chrome-extension-shared-modules-refactoring/</loc><lastmod>2026-05-12T05:48:33.000Z</lastmod><image:image><image:loc>https://uppinote.dev/blog/content/images/2026/05/chrome-extension-shared-modules-refactoring-01.png</image:loc><image:caption>chrome-extension-shared-modules-refactoring-01.png</image:caption></image:image></url><url><loc>https://uppinote.dev/blog/pyenv-rehash-lock-file-troubleshooting/</loc><lastmod>2026-05-12T05:48:32.000Z</lastmod><image:image><image:loc>https://uppinote.dev/blog/content/images/2026/05/pyenv-rehash-lock-file-troubleshooting-01.png</image:loc><image:caption>pyenv-rehash-lock-file-troubleshooting-01.png</image:caption></image:image></url><url><loc>https://uppinote.dev/blog/vitest-msw-react-hook-testing/</loc><lastmod>2026-05-12T05:48:31.000Z</lastmod><image:image><image:loc>https://uppinote.dev/blog/content/images/2026/05/vitest-msw-react-hook-testing-01.png</image:loc><image:caption>vitest-msw-react-hook-testing-01.png</image:caption></image:image></url><url><loc>https://uppinote.dev/blog/prisma-extension-field-encryption/</loc><lastmod>2026-05-12T05:48:30.000Z</lastmod><image:image><image:loc>https://uppinote.dev/blog/content/images/2026/05/prisma-extension-field-encryption-01.png</image:loc><image:caption>prisma-extension-field-encryption-01.png</image:caption></image:image></url><url><loc>https://uppinote.dev/blog/prisma-transaction-lock-batch-update/</loc><lastmod>2026-05-12T05:48:29.000Z</lastmod><image:image><image:loc>https://uppinote.dev/blog/content/images/2026/05/prisma-transaction-lock-batch-update-01.png</image:loc><image:caption>prisma-transaction-lock-batch-update-01.png</image:caption></image:image></url><url><loc>https://uppinote.dev/blog/github-issues-epic-sub-issues-labels-management-guide/</loc><lastmod>2026-05-12T05:48:28.000Z</lastmod><image:image><image:loc>https://uppinote.dev/blog/content/images/2026/05/github-issues-epic-sub-issues-labels-management-guide-01.png</image:loc><image:caption>github-issues-epic-sub-issues-labels-management-guide-01.png</image:caption></image:image></url><url><loc>https://uppinote.dev/blog/api-rate-limiting-implementation/</loc><lastmod>2026-05-12T05:48:27.000Z</lastmod><image:image><image:loc>https://uppinote.dev/blog/content/images/2026/05/api-rate-limiting-implementation-01.png</image:loc><image:caption>api-rate-limiting-implementation-01.png</image:caption></image:image></url><url><loc>https://uppinote.dev/blog/timezone-safe-date-handling/</loc><lastmod>2026-05-12T05:48:26.000Z</lastmod><image:image><image:loc>https://uppinote.dev/blog/content/images/2026/05/timezone-safe-date-handling-01.png</image:loc><image:caption>timezone-safe-date-handling-01.png</image:caption></image:image></url><url><loc>https://uppinote.dev/blog/error-tracking-with-errorid/</loc><lastmod>2026-05-12T05:48:25.000Z</lastmod><image:image><image:loc>https://uppinote.dev/blog/content/images/2026/05/error-tracking-with-errorid-01.png</image:loc><image:caption>error-tracking-with-errorid-01.png</image:caption></image:image></url><url><loc>https://uppinote.dev/blog/rust-cli-distribution-homebrew-scoop-installer/</loc><lastmod>2026-05-12T05:48:24.000Z</lastmod><image:image><image:loc>https://uppinote.dev/blog/content/images/2026/05/rust-cli-distribution-homebrew-scoop-installer-01.png</image:loc><image:caption>rust-cli-distribution-homebrew-scoop-installer-01.png</image:caption></image:image></url><url><loc>https://uppinote.dev/blog/promise-allsettled-partial-failure/</loc><lastmod>2026-05-12T05:48:23.000Z</lastmod><image:image><image:loc>https://uppinote.dev/blog/content/images/2026/05/promise-allsettled-partial-failure-01.png</image:loc><image:caption>promise-allsettled-partial-failure-01.png</image:caption></image:image></url><url><loc>https://uppinote.dev/blog/airgapped-pypi-mirror-docker-setup/</loc><lastmod>2026-05-12T05:48:23.000Z</lastmod><image:image><image:loc>https://uppinote.dev/blog/content/images/2026/05/airgapped-pypi-mirror-docker-setup-01.png</image:loc><image:caption>airgapped-pypi-mirror-docker-setup-01.png</image:caption></image:image></url><url><loc>https://uppinote.dev/blog/typescript-branded-types/</loc><lastmod>2026-05-12T05:48:22.000Z</lastmod><image:image><image:loc>https://uppinote.dev/blog/content/images/2026/05/typescript-branded-types-01.png</image:loc><image:caption>typescript-branded-types-01.png</image:caption></image:image></url><url><loc>https://uppinote.dev/blog/api-error-handling-standardization/</loc><lastmod>2026-05-12T05:48:21.000Z</lastmod><image:image><image:loc>https://uppinote.dev/blog/content/images/2026/05/api-error-handling-standardization-01.png</image:loc><image:caption>api-error-handling-standardization-01.png</image:caption></image:image></url><url><loc>https://uppinote.dev/blog/tailscale-github-actions-ssh-deploy-fix/</loc><lastmod>2026-05-12T05:48:20.000Z</lastmod><image:image><image:loc>https://uppinote.dev/blog/content/images/2026/05/tailscale-github-actions-ssh-deploy-fix-01.png</image:loc><image:caption>tailscale-github-actions-ssh-deploy-fix-01.png</image:caption></image:image></url><url><loc>https://uppinote.dev/blog/chrome-extension-state-sync-storage-onchanged/</loc><lastmod>2026-05-12T05:48:12.000Z</lastmod><image:image><image:loc>https://uppinote.dev/blog/content/images/2026/05/chrome-extension-state-sync-storage-onchanged-01.png</image:loc><image:caption>chrome-extension-state-sync-storage-onchanged-01.png</image:caption></image:image></url><url><loc>https://uppinote.dev/blog/claude-code-imessage-channel-setup-troubleshooting/</loc><lastmod>2026-05-12T05:48:11.000Z</lastmod><image:image><image:loc>https://uppinote.dev/blog/content/images/2026/05/claude-code-imessage-channel-setup-troubleshooting-01.png</image:loc><image:caption>claude-code-imessage-channel-setup-troubleshooting-01.png</image:caption></image:image></url><url><loc>https://uppinote.dev/blog/chrome-extension-i18n-runtime-language-switch/</loc><lastmod>2026-05-12T05:48:10.000Z</lastmod><image:image><image:loc>https://uppinote.dev/blog/content/images/2026/05/chrome-extension-i18n-runtime-language-switch-01.png</image:loc><image:caption>chrome-extension-i18n-runtime-language-switch-01.png</image:caption></image:image></url><url><loc>https://uppinote.dev/blog/last30days-skill-setup-reddit-comments-free-optimization/</loc><lastmod>2026-05-12T05:48:09.000Z</lastmod><image:image><image:loc>https://uppinote.dev/blog/content/images/2026/05/last30days-skill-setup-reddit-comments-free-optimization-01.png</image:loc><image:caption>last30days-skill-setup-reddit-comments-free-optimization-01.png</image:caption></image:image></url><url><loc>https://uppinote.dev/blog/nextjs-localhost-http-to-https-migration-nextauth-cookie/</loc><lastmod>2026-05-12T05:48:08.000Z</lastmod><image:image><image:loc>https://uppinote.dev/blog/content/images/2026/05/nextjs-localhost-http-to-https-migration-nextauth-cookie-01.png</image:loc><image:caption>nextjs-localhost-http-to-https-migration-nextauth-cookie-01.png</image:caption></image:image></url><url><loc>https://uppinote.dev/blog/chrome-extension-alarms-api-auto-lock/</loc><lastmod>2026-05-12T05:48:07.000Z</lastmod><image:image><image:loc>https://uppinote.dev/blog/content/images/2026/05/chrome-extension-alarms-api-auto-lock-01.png</image:loc><image:caption>chrome-extension-alarms-api-auto-lock-01.png</image:caption></image:image></url><url><loc>https://uppinote.dev/blog/chrome-extension-csp-security-hardening/</loc><lastmod>2026-05-12T05:48:06.000Z</lastmod><image:image><image:loc>https://uppinote.dev/blog/content/images/2026/05/chrome-extension-csp-security-hardening-01.png</image:loc><image:caption>chrome-extension-csp-security-hardening-01.png</image:caption></image:image></url><url><loc>https://uppinote.dev/blog/nextjs-csrf-token-management/</loc><lastmod>2026-05-12T05:48:05.000Z</lastmod><image:image><image:loc>https://uppinote.dev/blog/content/images/2026/05/nextjs-csrf-token-management-01.png</image:loc><image:caption>nextjs-csrf-token-management-01.png</image:caption></image:image></url><url><loc>https://uppinote.dev/blog/rust-tui-screenshot-gif-ratatui-alternate-screen/</loc><lastmod>2026-05-12T05:48:04.000Z</lastmod><image:image><image:loc>https://uppinote.dev/blog/content/images/2026/05/rust-tui-screenshot-gif-ratatui-alternate-screen-01.png</image:loc><image:caption>rust-tui-screenshot-gif-ratatui-alternate-screen-01.png</image:caption></image:image></url><url><loc>https://uppinote.dev/blog/git-from-hell-modern-commands-branch-cleanup/</loc><lastmod>2026-05-12T05:48:03.000Z</lastmod><image:image><image:loc>https://uppinote.dev/blog/content/images/2026/05/git-from-hell-modern-commands-branch-cleanup-01.png</image:loc><image:caption>git-from-hell-modern-commands-branch-cleanup-01.png</image:caption></image:image></url><url><loc>https://uppinote.dev/blog/tz-aware-iso-week-intl-datetimeformat/</loc><lastmod>2026-05-12T05:48:02.000Z</lastmod><image:image><image:loc>https://uppinote.dev/blog/content/images/2026/05/tz-aware-iso-week-intl-datetimeformat-01.png</image:loc><image:caption>tz-aware-iso-week-intl-datetimeformat-01.png</image:caption></image:image></url><url><loc>https://uppinote.dev/blog/prisma-get-or-create-race-condition-p2002/</loc><lastmod>2026-05-12T05:48:00.000Z</lastmod><image:image><image:loc>https://uppinote.dev/blog/content/images/2026/05/prisma-get-or-create-race-condition-p2002-01.png</image:loc><image:caption>prisma-get-or-create-race-condition-p2002-01.png</image:caption></image:image></url><url><loc>https://uppinote.dev/blog/append-only-status-log-historical-weekly-report/</loc><lastmod>2026-05-12T05:47:59.000Z</lastmod><image:image><image:loc>https://uppinote.dev/blog/content/images/2026/05/append-only-status-log-historical-weekly-report-01.png</image:loc><image:caption>append-only-status-log-historical-weekly-report-01.png</image:caption></image:image></url><url><loc>https://uppinote.dev/blog/api-performance-parallelize-loop-batch-queries/</loc><lastmod>2026-05-12T05:47:59.000Z</lastmod><image:image><image:loc>https://uppinote.dev/blog/content/images/2026/05/api-performance-parallelize-loop-batch-queries-01.png</image:loc><image:caption>api-performance-parallelize-loop-batch-queries-01.png</image:caption></image:image></url><url><loc>https://uppinote.dev/blog/historical-latest-sprint-week-report/</loc><lastmod>2026-05-12T05:47:58.000Z</lastmod><image:image><image:loc>https://uppinote.dev/blog/content/images/2026/05/historical-latest-sprint-week-report-01.png</image:loc><image:caption>historical-latest-sprint-week-report-01.png</image:caption></image:image></url><url><loc>https://uppinote.dev/blog/weekly-task-state-query-semantics/</loc><lastmod>2026-05-12T05:47:51.000Z</lastmod><image:image><image:loc>https://uppinote.dev/blog/content/images/2026/05/weekly-task-state-query-semantics-01.png</image:loc><image:caption>weekly-task-state-query-semantics-01.png</image:caption></image:image></url><url><loc>https://uppinote.dev/blog/prisma-extends-transaction-tenant-manual-injection/</loc><lastmod>2026-05-12T05:47:50.000Z</lastmod><image:image><image:loc>https://uppinote.dev/blog/content/images/2026/05/prisma-extends-transaction-tenant-manual-injection-01.png</image:loc><image:caption>prisma-extends-transaction-tenant-manual-injection-01.png</image:caption></image:image></url><url><loc>https://uppinote.dev/blog/test-fixtures-date-utc-ci-local-drift/</loc><lastmod>2026-05-12T05:47:49.000Z</lastmod><image:image><image:loc>https://uppinote.dev/blog/content/images/2026/05/test-fixtures-date-utc-ci-local-drift-01.png</image:loc><image:caption>test-fixtures-date-utc-ci-local-drift-01.png</image:caption></image:image></url><url><loc>https://uppinote.dev/blog/api-input-length-limits-defensive-validation/</loc><lastmod>2026-05-12T05:47:48.000Z</lastmod><image:image><image:loc>https://uppinote.dev/blog/content/images/2026/05/api-input-length-limits-defensive-validation-01.png</image:loc><image:caption>api-input-length-limits-defensive-validation-01.png</image:caption></image:image></url><url><loc>https://uppinote.dev/blog/two-tier-timezone-validation-ui-api/</loc><lastmod>2026-05-12T05:47:47.000Z</lastmod><image:image><image:loc>https://uppinote.dev/blog/content/images/2026/05/two-tier-timezone-validation-ui-api-01.png</image:loc><image:caption>two-tier-timezone-validation-ui-api-01.png</image:caption></image:image></url><url><loc>https://uppinote.dev/blog/url-state-inline-fullscreen-nextjs/</loc><lastmod>2026-05-12T05:47:46.000Z</lastmod><image:image><image:loc>https://uppinote.dev/blog/content/images/2026/05/url-state-inline-fullscreen-nextjs-01.png</image:loc><image:caption>url-state-inline-fullscreen-nextjs-01.png</image:caption></image:image></url><url><loc>https://uppinote.dev/blog/test-pyramid-single-feature-coverage/</loc><lastmod>2026-05-12T05:47:45.000Z</lastmod><image:image><image:loc>https://uppinote.dev/blog/content/images/2026/05/test-pyramid-single-feature-coverage-01.png</image:loc><image:caption>test-pyramid-single-feature-coverage-01.png</image:caption></image:image></url><url><loc>https://uppinote.dev/blog/claude-code-project-folder-name-decoding-greedy-filesystem-matching/</loc><lastmod>2026-05-12T05:47:44.000Z</lastmod><image:image><image:loc>https://uppinote.dev/blog/content/images/2026/05/claude-code-project-folder-name-decoding-greedy-filesystem-matching-01.png</image:loc><image:caption>claude-code-project-folder-name-decoding-greedy-filesystem-matching-01.png</image:caption></image:image></url><url><loc>https://uppinote.dev/blog/ratatui-miller-columns-3-pane-navigation-ui-rust/</loc><lastmod>2026-05-12T05:47:43.000Z</lastmod><image:image><image:loc>https://uppinote.dev/blog/content/images/2026/05/ratatui-miller-columns-3-pane-navigation-ui-rust-01.png</image:loc><image:caption>ratatui-miller-columns-3-pane-navigation-ui-rust-01.png</image:caption></image:image></url><url><loc>https://uppinote.dev/blog/terminal-colorfgbg-dark-light-theme-auto-detection-rust/</loc><lastmod>2026-05-12T05:47:42.000Z</lastmod><image:image><image:loc>https://uppinote.dev/blog/content/images/2026/05/terminal-colorfgbg-dark-light-theme-auto-detection-rust-01.png</image:loc><image:caption>terminal-colorfgbg-dark-light-theme-auto-detection-rust-01.png</image:caption></image:image></url><url><loc>https://uppinote.dev/blog/docker-desktop-alternatives-comparison-2026/</loc><lastmod>2026-05-12T05:47:41.000Z</lastmod><image:image><image:loc>https://uppinote.dev/blog/content/images/2026/05/docker-desktop-alternatives-comparison-2026-01.png</image:loc><image:caption>docker-desktop-alternatives-comparison-2026-01.png</image:caption></image:image></url><url><loc>https://uppinote.dev/blog/claude-dashboard-v1-14-to-v1-24-stdin-osc8-parser/</loc><lastmod>2026-05-12T05:47:40.000Z</lastmod><image:image><image:loc>https://uppinote.dev/blog/content/images/2026/05/claude-dashboard-v1-14-to-v1-24-stdin-osc8-parser-01.png</image:loc><image:caption>claude-dashboard-v1-14-to-v1-24-stdin-osc8-parser-01.png</image:caption></image:image></url><url><loc>https://uppinote.dev/blog/terminal-osc8-clickable-links-with-security-pitfalls/</loc><lastmod>2026-05-12T05:47:39.000Z</lastmod><image:image><image:loc>https://uppinote.dev/blog/content/images/2026/05/terminal-osc8-clickable-links-01.png</image:loc><image:caption>terminal-osc8-clickable-links-01.png</image:caption></image:image></url><url><loc>https://uppinote.dev/blog/api-client-negative-caching-discriminated-union-typescript/</loc><lastmod>2026-05-12T05:47:37.000Z</lastmod><image:image><image:loc>https://uppinote.dev/blog/content/images/2026/05/api-client-negative-caching-01.png</image:loc><image:caption>api-client-negative-caching-01.png</image:caption></image:image></url><url><loc>https://uppinote.dev/blog/claude-dashboard-v1-25-to-v1-26-sub-widgets-community-contributions/</loc><lastmod>2026-05-12T05:47:36.000Z</lastmod><image:image><image:loc>https://uppinote.dev/blog/content/images/2026/05/claude-dashboard-v1-25-to-v1-26-01.png</image:loc><image:caption>claude-dashboard-v1-25-to-v1-26-01.png</image:caption></image:image></url><url><loc>https://uppinote.dev/blog/nextjs-2fa-totp-implementation/</loc><lastmod>2026-05-12T05:36:24.000Z</lastmod><image:image><image:loc>https://uppinote.dev/blog/content/images/2026/05/nextjs-2fa-totp-implementation-01.png</image:loc><image:caption>nextjs-2fa-totp-implementation-01.png</image:caption></image:image></url><url><loc>https://uppinote.dev/blog/n8n-workflow-automation-ghost/</loc><lastmod>2026-05-12T05:36:23.000Z</lastmod><image:image><image:loc>https://uppinote.dev/blog/content/images/2026/05/n8n-workflow-automation-ghost-01.png</image:loc><image:caption>n8n-workflow-automation-ghost-01.png</image:caption></image:image></url><url><loc>https://uppinote.dev/blog/ghost-docker-installation/</loc><lastmod>2026-05-12T05:36:22.000Z</lastmod><image:image><image:loc>https://uppinote.dev/blog/content/images/2026/05/ghost-docker-installation-01.png</image:loc><image:caption>ghost-docker-installation-01.png</image:caption></image:image></url></urlset>