<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="https://blog.knj.network/wp-sitemap.xsl" ?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"><url><loc>https://blog.knj.network/phase-1-foundations/</loc><lastmod>2026-10-16T09:02:22+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-2-servers-packages-security-tooling/</loc><lastmod>2026-10-16T09:02:22+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-3-a-real-course-correction/</loc><lastmod>2026-10-16T09:02:23+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-4-the-core-loop-actually-works/</loc><lastmod>2026-10-16T09:02:23+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-5-file-manager-and-a-security-issue-caught-in-testing/</loc><lastmod>2026-10-16T09:02:23+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-6-the-ssl-manager-and-two-more-bugs-caught-live/</loc><lastmod>2026-10-16T09:02:23+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-7-a-real-database-manager-then-an-app-installer-built-on-top-of-it/</loc><lastmod>2026-10-16T09:02:23+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-8-a-real-mail-server-and-a-genuinely-hard-debugging-session/</loc><lastmod>2026-10-16T09:02:23+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-9-a-real-nameserver-and-the-panels-own-dns-zone-editor/</loc><lastmod>2026-10-16T09:02:23+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-10-the-first-full-security-audit/</loc><lastmod>2026-10-16T09:02:23+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-11-closing-out-the-audit-follow-ups/</loc><lastmod>2026-10-16T09:02:23+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-12-filling-in-the-services-section/</loc><lastmod>2026-10-16T09:02:23+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-13-checked-against-the-real-thing/</loc><lastmod>2026-10-16T09:02:23+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-14-a-second-server-a-real-install-script-and-multi-php-finally-working/</loc><lastmod>2026-10-16T09:02:23+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-15-rethinking-the-install-flow-client-panel-polish-and-a-second-audit/</loc><lastmod>2026-10-16T09:02:23+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-16-the-dns-roadmap-closed-out/</loc><lastmod>2026-10-16T09:02:23+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-17-a-real-mail-admin-toolkit/</loc><lastmod>2026-10-16T09:02:23+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-18-ten-client-panel-features-one-day/</loc><lastmod>2026-10-16T09:02:23+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-19-knowing-whats-running-and-keeping-it-current/</loc><lastmod>2026-10-16T09:02:23+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-20-a-real-webmail-client/</loc><lastmod>2026-10-16T09:02:23+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-21-choosing-your-own-password-on-account-creation/</loc><lastmod>2026-10-16T09:02:23+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-22-the-webmail-choice-built-before-theres-a-choice-to-make/</loc><lastmod>2026-10-16T09:02:23+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-23-our-own-webmail-client-not-just-a-reskin/</loc><lastmod>2026-10-16T09:02:23+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-24-knj-webmail-starts-looking-like-a-real-mail-client/</loc><lastmod>2026-10-16T09:02:23+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-25-your-own-folders-filed-by-dragging/</loc><lastmod>2026-10-16T09:02:23+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-26-rules-and-a-settings-page-to-hold-them/</loc><lastmod>2026-10-16T09:02:23+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-27-handling-a-batch-of-messages-at-once/</loc><lastmod>2026-10-16T09:02:23+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-28-rich-compose-and-a-sanitizer-that-had-to-earn-its-keep/</loc><lastmod>2026-10-16T09:02:23+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-29-contacts-and-the-original-scope-is-now-complete/</loc><lastmod>2026-10-16T09:02:23+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-30-track-dns-server-settings-and-raw-log-download/</loc><lastmod>2026-10-16T09:02:23+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-31-resolver-config-server-contacts-reboot-csr-generator-contact-import/</loc><lastmod>2026-10-16T09:02:23+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-32-modify-an-account-suspend-unsuspend-and-a-real-bug-hunt/</loc><lastmod>2026-10-16T09:02:23+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-33-disk-quotas-that-actually-block-writes-and-bandwidth-from-real-logs/</loc><lastmod>2026-10-16T09:02:23+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-34-the-second-full-security-audit/</loc><lastmod>2026-10-16T09:02:23+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-35-ftp-built-the-same-way-mail-already-was/</loc><lastmod>2026-10-16T09:02:23+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-36-ftp-settings-and-a-sandbox-gap-that-predated-it/</loc><lastmod>2026-10-16T09:02:23+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-37-backups-and-locking-in-a-real-path-to-v1-0/</loc><lastmod>2026-10-16T09:02:23+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-38-locking-the-front-door-brute-force-protection-and-2fa/</loc><lastmod>2026-10-16T09:02:24+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-39-cron-jobs-the-boring-way-which-is-the-right-way/</loc><lastmod>2026-10-16T09:02:24+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-40-licensing-and-where-the-line-sits/</loc><lastmod>2026-10-16T09:02:24+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-41-the-third-full-security-audit-and-the-first-to-cross-three-servers/</loc><lastmod>2026-10-16T09:02:24+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-42-the-release-pipeline-and-the-three-bugs-it-took-to-prove-it/</loc><lastmod>2026-10-16T09:02:24+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-43-my-profile-could-2fa-and-nothing-else/</loc><lastmod>2026-10-16T09:02:24+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-44-the-first-real-install-on-a-server-that-had-never-seen-this-panel-before/</loc><lastmod>2026-10-16T09:02:24+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-45-the-fourth-full-security-audit-and-two-scripts-that-modified-themselves/</loc><lastmod>2026-10-16T09:02:24+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-46-closing-out-service-configuration/</loc><lastmod>2026-10-16T09:02:24+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-47-finishing-accounts-and-finding-two-that-were-already-done/</loc><lastmod>2026-10-16T09:02:24+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-48-a-firewall-bug-that-only-failed-through-the-real-app/</loc><lastmod>2026-10-16T09:02:24+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-49-api-tokens-and-the-security-section-closed/</loc><lastmod>2026-10-16T09:02:24+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-50-the-fifth-full-security-audit/</loc><lastmod>2026-10-16T09:02:24+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-51-the-ssl-tls-section-closed-out/</loc><lastmod>2026-10-16T09:02:24+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-52-the-databases-section-closed-out/</loc><lastmod>2026-10-16T09:02:24+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-53-os-package-management-and-software-php-closed-out/</loc><lastmod>2026-10-16T09:02:24+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-54-packages-resellers-closed-out/</loc><lastmod>2026-10-16T09:02:24+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-55-live-resource-monitoring-and-backup-server-status-closed-out/</loc><lastmod>2026-10-16T09:02:24+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-56-server-configuration-and-what-done-actually-means-here/</loc><lastmod>2026-10-16T09:02:24+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-57-everything-else-and-a-dead-setting-found-along-the-way/</loc><lastmod>2026-10-16T09:02:24+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-58-the-admin-roadmap-verified-against-the-real-code/</loc><lastmod>2026-10-16T09:02:24+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-59-the-client-email-section-and-a-bug-the-whole-phase-kept-hiding/</loc><lastmod>2026-10-16T09:02:24+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-60-the-client-domains-section-and-two-bugs-older-than-this-build/</loc><lastmod>2026-10-16T09:02:24+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-61-the-client-files-section-and-a-roadmap-row-that-was-already-true/</loc><lastmod>2026-10-16T09:02:24+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-62-the-client-databases-section-a-ci-blind-spot-and-a-real-remote-connection/</loc><lastmod>2026-10-16T09:02:24+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-63-the-client-metrics-section-closed-out/</loc><lastmod>2026-10-16T09:02:24+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-64-the-client-security-section-closed-out/</loc><lastmod>2026-10-16T09:02:24+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-65-the-client-advanced-section-closed-out-and-a-second-stale-roadmap-row/</loc><lastmod>2026-10-16T09:02:24+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-66-team-access-and-the-44-controller-pass-that-made-it-real/</loc><lastmod>2026-10-16T09:02:24+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-67-real-phpmyadmin-and-two-bugs-only-a-live-server-would-show/</loc><lastmod>2026-10-16T09:02:24+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-68-security-audit-07-and-the-escalation-path-a-fix-almost-opened/</loc><lastmod>2026-10-16T09:02:24+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-69-the-app-installer-becomes-a-real-catalog-and-phpbb-takes-some-work/</loc><lastmod>2026-10-16T09:02:24+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-70-a-roadmap-that-was-stale-in-both-directions-and-two-cleanup-bugs/</loc><lastmod>2026-10-16T09:02:24+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-71-five-quiet-days-checked-properly-instead-of-assumed/</loc><lastmod>2026-10-16T09:02:24+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-72-a-real-feature-audit-and-the-feature-that-said-no-to-itself/</loc><lastmod>2026-10-16T09:02:24+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-73-a-real-home-screen-for-the-account-panel/</loc><lastmod>2026-10-16T09:02:25+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-74-a-search-box-that-lives-where-youre-already-looking/</loc><lastmod>2026-10-16T09:02:25+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-75-working-down-the-gap-list/</loc><lastmod>2026-10-16T09:02:25+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-76-a-certificate-repository-instead-of-a-site-list/</loc><lastmod>2026-10-16T09:02:25+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-77-a-feature-that-wasnt-there-to-build/</loc><lastmod>2026-10-16T09:02:25+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-78-a-feature-toggle-that-actually-toggles/</loc><lastmod>2026-10-16T09:02:25+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-79-the-feature-that-cost-nothing-to-build/</loc><lastmod>2026-10-16T09:02:25+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-80-the-real-thing-not-a-reimplementation/</loc><lastmod>2026-10-16T09:02:25+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-81-ground-truth-before-a-single-line-of-code/</loc><lastmod>2026-10-16T09:02:25+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-82-the-same-door-reachable-from-both-sides/</loc><lastmod>2026-10-16T09:02:25+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-83-eight-packages-verified-one-at-a-time/</loc><lastmod>2026-10-16T09:02:25+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-84-the-smallest-gap-on-the-list/</loc><lastmod>2026-10-16T09:02:25+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-85-the-update-mechanism-updates-everything-except-the-part-that-updates-it/</loc><lastmod>2026-10-16T09:02:25+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-86-restoring-the-one-file-not-the-whole-account/</loc><lastmod>2026-10-16T09:02:25+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-87-closing-the-loop-on-the-package-install-fix/</loc><lastmod>2026-10-16T09:02:25+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-88-boxtrapper-actually-releases-your-mail/</loc><lastmod>2026-10-16T09:02:25+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-89-restoring-a-real-cpanel-account-not-a-reimplementation-of-our-own/</loc><lastmod>2026-10-16T09:02:25+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-90-restoring-a-cpanel-backup-into-an-account-you-already-have/</loc><lastmod>2026-10-16T09:02:25+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-91-database-search-replace/</loc><lastmod>2026-10-16T09:02:25+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-92-transfer-tool/</loc><lastmod>2026-10-16T09:02:25+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-93-convert-addon-domain-to-account/</loc><lastmod>2026-10-16T09:02:25+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-94-fix-everything-then-audit-it/</loc><lastmod>2026-10-16T09:02:25+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-95-finishing-what-audit-11-left-open/</loc><lastmod>2026-10-16T09:02:25+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-96-two-small-ones-user-manager-and-the-postfix-config-gap/</loc><lastmod>2026-10-16T09:02:25+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-97-return-to-admin-and-making-0-15-99-real/</loc><lastmod>2026-10-16T09:02:25+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-98-first-run-setup-wizard/</loc><lastmod>2026-10-16T09:02:25+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-99-dns-only-server-role/</loc><lastmod>2026-10-16T09:02:25+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-100-install-script-fixes-a-login-bug-they-uncovered-and-a-licence-gap/</loc><lastmod>2026-10-16T09:02:25+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-101-deploy-from-git-rebuild-and-a-real-subdomains-feature-to-build-it-on/</loc><lastmod>2026-10-16T09:02:25+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-102-two-key-server-linking-replacing-the-shared-token/</loc><lastmod>2026-10-16T09:02:25+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-103-closing-out-dns-only-feature-parity/</loc><lastmod>2026-10-16T09:02:25+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-104-mail-only-stage-1-linking-role-gate-bootstrap/</loc><lastmod>2026-10-16T09:02:25+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-105-mail-only-stage-2-the-dispatcher-and-a-real-selector/</loc><lastmod>2026-10-16T09:02:25+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-106-mail-only-syncing-existing-accounts-to-a-new-mail-server/</loc><lastmod>2026-10-16T09:02:25+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-107-a-webmail-login-bug-with-two-separate-causes/</loc><lastmod>2026-10-16T09:02:25+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-108-mail-only-stage-3-begins-webmail-routing-and-a-bug-three-levels-deep/</loc><lastmod>2026-10-16T09:02:26+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-109-mail-only-stage-3-continues-the-rest-of-the-dispatcher-migration/</loc><lastmod>2026-10-16T09:02:26+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-110-mail-only-stage-3-wraps-up-service-status-stops-lying-about-where-mail-runs/</loc><lastmod>2026-10-16T09:02:26+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-111-mail-only-stage-4-cross-server-admin-sso/</loc><lastmod>2026-10-16T09:02:26+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-112-mail-only-fully-closed-out/</loc><lastmod>2026-10-16T09:02:26+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-113-audit-12-the-setup-wizards-missing-invariant/</loc><lastmod>2026-10-16T09:02:26+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-114-audit-13-dns-only-reviewed-as-a-role-not-a-diff/</loc><lastmod>2026-10-16T09:02:26+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-115-audit-14-a-secret-worth-more-than-it-should-have-been/</loc><lastmod>2026-10-16T09:02:26+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-116-line-by-line-bug-sweep-correctness-not-security/</loc><lastmod>2026-10-16T09:02:26+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-117-dns-only-comparison-audit/</loc><lastmod>2026-10-16T09:02:26+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-118-webmail-domain-and-domain-com-webmail/</loc><lastmod>2026-10-16T09:02:26+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-119-ftp-account-controller-shortcuts-and-closing-the-www-ssl-gap/</loc><lastmod>2026-10-16T09:02:26+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-120-dns-zone-file-import-export/</loc><lastmod>2026-10-16T09:02:26+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-121-mail-client-autoconfiguration/</loc><lastmod>2026-10-16T09:02:26+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-122-email-disk-usage-cleanup/</loc><lastmod>2026-10-16T09:02:26+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-123-per-mailbox-quota-and-suspension/</loc><lastmod>2026-10-16T09:02:26+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-124-off-site-backup-destinations/</loc><lastmod>2026-10-16T09:02:26+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-125-virus-malware-scanning/</loc><lastmod>2026-10-16T09:02:26+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-126-email-archiving/</loc><lastmod>2026-10-16T09:02:26+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-127-subscribers-marketing-email-and-a-blade-bug-hiding-in-plain-sight/</loc><lastmod>2026-10-16T09:02:26+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-128-web-application-firewall-modsecurity-owasp-crs/</loc><lastmod>2026-10-16T09:02:26+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-129-caldav-carddav-calendars-contacts-sync/</loc><lastmod>2026-10-16T09:02:26+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-130-audit-15-a-toggle-that-didnt-do-what-it-said/</loc><lastmod>2026-10-16T09:02:26+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-131-alerting-the-part-that-was-missing-from-every-health-check/</loc><lastmod>2026-10-16T09:02:26+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-132-file-manager-gets-a-real-code-editor/</loc><lastmod>2026-10-16T09:02:26+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-133-one-page-for-every-alert/</loc><lastmod>2026-10-16T09:02:26+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-134-audit-16-verifying-every-live-row-is-actually-true/</loc><lastmod>2026-10-16T09:02:26+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-135-a-morning-of-bug-reports-and-one-that-took-two-passes/</loc><lastmod>2026-10-16T09:02:26+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-136-the-placeholder-logo-nobody-had-replaced/</loc><lastmod>2026-10-15T15:15:06+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-137-the-half-of-a-server-switch-nobody-had-built/</loc><lastmod>2026-10-16T09:02:26+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-138-the-dashboard-mail-only-never-got/</loc><lastmod>2026-10-16T09:02:26+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-139-real-nameserver-management-and-dns-that-actually-follows-mail/</loc><lastmod>2026-10-16T09:02:26+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-140-the-ptr-check-was-looking-at-the-wrong-server/</loc><lastmod>2026-10-16T09:02:26+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-141-roundcube-was-installed-on-mail-only-just-never-wired-up/</loc><lastmod>2026-10-16T09:02:26+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-142-a-webmail-key-that-was-the-wrong-length/</loc><lastmod>2026-10-16T09:02:26+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-143-when-the-fix-runs-clean-and-the-bug-doesnt-care/</loc><lastmod>2026-10-16T09:02:27+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-144-the-directory-roundcube-could-never-write-to/</loc><lastmod>2026-10-16T09:02:27+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-145-trusting-the-guard-less/</loc><lastmod>2026-10-16T09:02:27+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-146-one-of-two-and-only-one-of-two/</loc><lastmod>2026-10-16T09:02:27+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-147-not-explaining-it-just-ending-it/</loc><lastmod>2026-10-16T09:02:27+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-148-the-fix-that-broke-itself/</loc><lastmod>2026-10-16T09:02:27+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-149-asking-instead-of-guessing/</loc><lastmod>2026-10-16T09:02:27+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-150-the-log-that-was-never-being-written/</loc><lastmod>2026-10-16T09:02:27+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-151-array-first-finally-last/</loc><lastmod>2026-10-16T09:02:27+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-152-guarding-what-should-never-have-needed-guarding/</loc><lastmod>2026-10-16T09:02:27+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-153-the-quota-plugin-that-needed-a-friend/</loc><lastmod>2026-10-16T09:02:27+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-154-a-mail-setting-that-was-never-switched-on/</loc><lastmod>2026-10-16T09:02:27+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-155-the-self-heal-that-healed-nothing/</loc><lastmod>2026-10-16T09:02:27+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-156-the-uniqueness-check-that-didnt-understand-the-point/</loc><lastmod>2026-10-16T09:02:27+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-157-the-autofill-nobody-asked-for/</loc><lastmod>2026-10-16T09:02:27+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-158-the-nameserver-that-couldnt-vouch-for-itself/</loc><lastmod>2026-10-16T09:02:27+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-159-dogfooding-the-deploy-button/</loc><lastmod>2026-10-16T09:02:27+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-160-three-things-the-real-servers-wanted/</loc><lastmod>2026-10-16T09:02:27+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-161-the-address-bar-problem/</loc><lastmod>2026-10-16T09:02:27+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-162-the-save-button-nobody-knew-they-had-to-click/</loc><lastmod>2026-10-16T09:02:27+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-163-a-report-nobody-has-to-remember-to-check/</loc><lastmod>2026-10-16T09:02:27+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-164-the-account-that-wouldnt-leave/</loc><lastmod>2026-10-16T09:02:27+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-165-the-box-was-too-small-for-its-own-text/</loc><lastmod>2026-10-16T09:02:27+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-166-the-4gb-limit-that-was-never-real/</loc><lastmod>2026-10-16T09:02:27+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-167-the-save-that-ate-its-own-response/</loc><lastmod>2026-10-16T09:02:27+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-168-closing-the-loop-on-the-body-size-fix/</loc><lastmod>2026-10-16T09:02:27+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-169-the-upload-that-vanished/</loc><lastmod>2026-10-16T09:02:27+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-170-the-password-nobody-should-be-able-to-reuse/</loc><lastmod>2026-10-16T09:02:27+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-171-a-firewall-page-that-actually-does-something/</loc><lastmod>2026-10-16T09:02:27+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-172-what-a-real-world-restore-actually-breaks/</loc><lastmod>2026-10-16T09:02:27+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-173-not-every-warning-deserves-the-same-button/</loc><lastmod>2026-10-16T09:02:27+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-174-scanning-whole-accounts-for-malware/</loc><lastmod>2026-10-16T09:02:27+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-175-the-password-that-broke-its-own-config/</loc><lastmod>2026-10-16T09:02:27+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-176-the-subdomain-that-never-got-its-address/</loc><lastmod>2026-10-16T09:02:27+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-177-your-domain-your-port-your-certificate/</loc><lastmod>2026-10-16T09:02:27+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-178-closing-the-loop-on-two-patterns/</loc><lastmod>2026-10-16T09:02:28+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-179-the-address-book-nobody-went-looking-for/</loc><lastmod>2026-10-16T09:02:28+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-180-the-page-that-was-never-going-to-load/</loc><lastmod>2026-10-16T09:02:28+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-181-the-filesystem-nobody-was-watching/</loc><lastmod>2026-10-16T09:02:28+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-182-what-else-were-we-not-looking-for/</loc><lastmod>2026-10-16T09:02:28+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-183-the-fix-that-wasnt-the-whole-fix/</loc><lastmod>2026-10-16T09:02:28+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-184-teaching-the-restore-itself-to-look/</loc><lastmod>2026-10-16T09:02:28+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-185-the-tool-that-checked-itself/</loc><lastmod>2026-10-16T09:02:28+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-186-the-shortcut-that-didnt-ask/</loc><lastmod>2026-10-16T09:02:28+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-187-a-wrong-answer-beats-a-random-one/</loc><lastmod>2026-10-16T09:02:28+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-188-the-shortcut-that-called-itself/</loc><lastmod>2026-10-16T09:02:28+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-189-the-page-that-grew-instead-of-scrolling/</loc><lastmod>2026-10-16T09:02:28+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-190-the-file-that-came-from-somewhere-else/</loc><lastmod>2026-10-16T09:02:28+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-191-a-rule-that-only-applies-to-one-kind-of-asking/</loc><lastmod>2026-10-16T09:02:28+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-192-the-same-symptom-a-different-door/</loc><lastmod>2026-10-16T09:02:28+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-193-the-list-that-needed-one-more-name/</loc><lastmod>2026-10-16T09:02:28+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-194-standing-in-someone-elses-shoes-correctly/</loc><lastmod>2026-10-16T09:02:28+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-195-two-doors-both-assumed-open/</loc><lastmod>2026-10-16T09:02:28+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-196-waiting-in-line-twice/</loc><lastmod>2026-10-16T09:02:28+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-197-four-ways-to-find-out/</loc><lastmod>2026-10-16T09:02:28+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-198-the-animation-that-only-ran-when-nobody-was-watching/</loc><lastmod>2026-10-16T09:02:28+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-199-the-menu-that-wouldnt-stop-growing/</loc><lastmod>2026-10-16T09:02:28+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-200-the-alarm-that-only-covered-its-own-front-door/</loc><lastmod>2026-10-16T09:02:28+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-201-one-click-instead-of-one-account-at-a-time/</loc><lastmod>2026-10-16T09:02:28+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-202-the-folder-that-was-never-really-there/</loc><lastmod>2026-10-16T09:02:28+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-203-a-weekend-of-someone-else-actually-using-it/</loc><lastmod>2026-10-16T09:02:28+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-204-the-bar-that-had-nothing-to-measure/</loc><lastmod>2026-10-16T09:02:28+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-205-the-other-update-button-learns-the-same-trick/</loc><lastmod>2026-10-16T09:02:28+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-206-the-answer-that-never-got-asked-again/</loc><lastmod>2026-10-16T09:02:28+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-207-the-server-that-wasnt-in-its-own-table/</loc><lastmod>2026-10-16T09:02:28+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-208-completed-isnt-the-same-as-nothing-to-do/</loc><lastmod>2026-09-09T09:07:00+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-209-the-two-groups-that-got-to-fold-up/</loc><lastmod>2026-09-09T09:14:00+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-210-nothing-happened-as-far-as-anyone-could-tell/</loc><lastmod>2026-09-09T09:21:00+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-211-the-answer-nobody-asked-for-rejecting-itself/</loc><lastmod>2026-10-16T09:02:28+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-212-the-app-that-lived-at-someone-elses-address/</loc><lastmod>2026-10-16T09:02:28+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-213-the-tool-that-would-only-add/</loc><lastmod>2026-10-16T09:02:28+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-214-the-address-that-worked-the-first-time/</loc><lastmod>2026-10-16T09:02:28+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-215-the-address-that-worked-then-didnt/</loc><lastmod>2026-10-16T09:02:28+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-216-the-tools-that-forgot-there-were-others/</loc><lastmod>2026-10-16T09:02:28+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-217-the-box-that-had-to-say-something/</loc><lastmod>2026-10-16T09:02:29+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-218-the-column-that-could-only-mean-one-thing/</loc><lastmod>2026-10-16T09:02:29+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-219-the-mailbox-that-went-dark/</loc><lastmod>2026-10-16T09:02:29+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-220-the-state-nobody-ever-entered/</loc><lastmod>2026-10-16T09:02:29+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-221-the-table-that-only-ever-said-one-thing/</loc><lastmod>2026-10-16T09:02:29+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-222-the-index-that-was-secretly-load-bearing/</loc><lastmod>2026-10-16T09:02:29+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-223-the-installs-list-that-only-showed-one-answer/</loc><lastmod>2026-10-16T09:02:29+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-224-the-scan-that-found-its-own-neighbours/</loc><lastmod>2026-10-16T09:02:29+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-225-the-list-that-remembered-when-not-what/</loc><lastmod>2026-09-11T09:07:00+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-226-one-order-everywhere/</loc><lastmod>2026-10-16T09:02:29+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-227-the-report-that-couldnt-say-zero/</loc><lastmod>2026-10-16T09:02:29+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-228-a-name-borrowed-from-someone-elses-house/</loc><lastmod>2026-10-16T09:02:29+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-229-what-moving-out-forgot-to-take/</loc><lastmod>2026-10-16T09:02:29+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-230-database-access-scoped-to-the-account/</loc><lastmod>2026-10-16T09:02:29+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-231-a-record-of-the-reader/</loc><lastmod>2026-10-16T09:02:29+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-232-one-door-for-every-room/</loc><lastmod>2026-10-16T09:02:29+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-233-the-badge-that-did-too-much-work/</loc><lastmod>2026-10-16T09:02:29+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-234-the-badges-quieter-sibling/</loc><lastmod>2026-09-11T10:10:00+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-235-a-cache-with-nobody-left-to-fill-it/</loc><lastmod>2026-10-16T09:02:29+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-236-a-dropdown-standing-in-the-wrong-doorway/</loc><lastmod>2026-09-11T10:24:00+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-237-a-guard-that-was-only-ever-hired-once/</loc><lastmod>2026-10-16T09:02:29+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-238-a-name-before-anyone-asked-for-one/</loc><lastmod>2026-10-16T09:02:29+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-239-what-a-real-first-day-actually-looks-like/</loc><lastmod>2026-10-16T09:02:29+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-240-the-reminder-that-only-fires-once/</loc><lastmod>2026-09-16T09:14:00+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-241-the-address-that-needed-two-stories/</loc><lastmod>2026-10-16T09:02:29+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-242-the-zone-that-had-to-exist-first/</loc><lastmod>2026-10-16T09:02:29+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-243-the-broom-that-didnt-look-first/</loc><lastmod>2026-10-16T09:02:29+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-244-the-fix-that-only-fixed-half-the-door/</loc><lastmod>2026-10-16T09:02:29+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-245-the-repair-that-measured-wrong-every-time/</loc><lastmod>2026-10-16T09:02:29+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-246-the-bug-hiding-behind-the-workaround/</loc><lastmod>2026-10-16T09:02:29+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-247-the-backups-that-lived-on-the-wrong-server/</loc><lastmod>2026-10-16T09:02:29+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-248-the-folder-name-the-script-wouldnt-accept/</loc><lastmod>2026-10-16T09:02:29+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-249-one-clock-not-two/</loc><lastmod>2026-10-16T09:02:29+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-250-the-link-that-was-fine/</loc><lastmod>2026-10-16T09:02:29+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-251-the-run-that-had-already-happened/</loc><lastmod>2026-10-16T09:02:29+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-252-the-link-that-trusted-the-visitor/</loc><lastmod>2026-10-16T09:02:29+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-253-the-folder-inside-the-customers-reach/</loc><lastmod>2026-10-16T09:02:29+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-254-the-server-that-was-too-open-to-its-own-customers/</loc><lastmod>2026-10-16T09:02:29+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-255-two-lists-one-click/</loc><lastmod>2026-10-16T09:02:30+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-256-the-page-that-showed-zeros-politely/</loc><lastmod>2026-10-16T09:02:30+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-257-the-file-the-panel-was-not-allowed-to-touch/</loc><lastmod>2026-10-16T09:02:30+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-258-the-file-manager-that-learned-to-forgive/</loc><lastmod>2026-10-16T09:02:30+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-259-the-fix-that-passed-everywhere-but-production/</loc><lastmod>2026-10-16T09:02:30+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-260-the-queue-that-waited-for-a-backup-server/</loc><lastmod>2026-10-16T09:02:30+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-261-the-test-that-found-nothing-to-break/</loc><lastmod>2026-10-16T09:02:30+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-262-the-docs-site-that-deployed-itself/</loc><lastmod>2026-10-16T09:02:30+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-263-the-tool-nobody-should-be-able-to-find/</loc><lastmod>2026-10-16T09:02:30+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-264-the-script-the-app-could-edit/</loc><lastmod>2026-10-16T09:02:30+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-265-the-documentation-audit/</loc><lastmod>2026-10-16T09:02:30+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-266-a-support-desk-built-in/</loc><lastmod>2026-10-20T14:39:09+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-267-a-new-look-and-pages-that-stay-put/</loc><lastmod>2026-10-20T14:39:19+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-268-the-sign-ups-that-said-thanks/</loc><lastmod>2026-10-22T11:16:55+01:00</lastmod></url><url><loc>https://blog.knj.network/phase-269-mail-that-left-unsigned/</loc><lastmod>2026-10-22T11:17:06+01:00</lastmod></url></urlset>
