<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"><channel><title>Pete Newcombe | newcombe.dev — Today I Learned</title><description>Short technical notes, commands, fixes and behaviours learned while building and operating real systems.</description><link>https://newcombe.dev/</link><item><title>write memory Makes a Second Source of Truth</title><link>https://newcombe.dev/til/write-memory-makes-a-second-source-of-truth/</link><guid isPermaLink="true">https://newcombe.dev/til/write-memory-makes-a-second-source-of-truth/</guid><description>On FRR, a change made in vtysh is gone after a restart unless you save it. Save it on a router whose config file Ansible manages, and the next playbook run quietly puts the old file back.</description><pubDate>Thu, 05 Nov 2026 00:00:00 GMT</pubDate></item><item><title>PyInstaller Cannot See a Streamlit App&apos;s Imports</title><link>https://newcombe.dev/til/pyinstaller-cannot-see-a-streamlit-apps-imports/</link><guid isPermaLink="true">https://newcombe.dev/til/pyinstaller-cannot-see-a-streamlit-apps-imports/</guid><description>A Streamlit app is launched by file path, so PyInstaller never analyses it, and every module it imports is missing from the frozen build. Declare them — then derive the list, or test it against the filesystem, so a new module cannot be forgotten.</description><pubDate>Tue, 27 Oct 2026 00:00:00 GMT</pubDate></item><item><title>Reasoning Tokens Are Not Counted the Same Way Everywhere</title><link>https://newcombe.dev/til/reasoning-tokens-are-not-counted-the-same-way/</link><guid isPermaLink="true">https://newcombe.dev/til/reasoning-tokens-are-not-counted-the-same-way/</guid><description>Through the same Chat Completions endpoint, GPT models counted their hidden reasoning inside completion tokens, and Grok reported it on top. Adding up completion tokens across models adds up different things.</description><pubDate>Thu, 22 Oct 2026 00:00:00 GMT</pubDate></item><item><title>Format-Table in a Loop Captures Formatting, Not Data</title><link>https://newcombe.dev/til/format-table-in-a-loop-captures-formatting-not-data/</link><guid isPermaLink="true">https://newcombe.dev/til/format-table-in-a-loop-captures-formatting-not-data/</guid><description>Pipe each iteration of a loop into Format-Table and assign the loop to a variable, and you collect PowerShell&apos;s internal formatting instructions instead of your objects. The export afterwards succeeds and contains nothing useful.</description><pubDate>Tue, 13 Oct 2026 00:00:00 GMT</pubDate></item><item><title>In promtool, 1x5 Means Six Samples</title><link>https://newcombe.dev/til/promtool-1x5-means-six-samples/</link><guid isPermaLink="true">https://newcombe.dev/til/promtool-1x5-means-six-samples/</guid><description>Prometheus&apos;s rule-test series notation a+bxn expands to n+1 values, not n. Off by one, every alert&apos;s timing in a test shifts by a scrape interval.</description><pubDate>Thu, 08 Oct 2026 00:00:00 GMT</pubDate></item><item><title>Google Cloud Renewal by Learning Buys One Year</title><link>https://newcombe.dev/til/google-cloud-renewal-by-learning-buys-one-year/</link><guid isPermaLink="true">https://newcombe.dev/til/google-cloud-renewal-by-learning-buys-one-year/</guid><description>Renewing a Google Cloud certification through Google Skills activities extends it by one year. The shorter renewal exam extends it by two, but its window opens far later.</description><pubDate>Tue, 29 Sep 2026 00:00:00 GMT</pubDate></item><item><title>A Stale Socket File Makes a Make Target Lie</title><link>https://newcombe.dev/til/a-stale-socket-file-makes-a-make-target-lie/</link><guid isPermaLink="true">https://newcombe.dev/til/a-stale-socket-file-makes-a-make-target-lie/</guid><description>A start target that checks whether a socket path exists will skip starting the daemon after a crash, then report success. Test for a live listener, not for a file.</description><pubDate>Sat, 19 Sep 2026 00:00:00 GMT</pubDate></item><item><title>AppArmor Blocks a vTPM Socket Outside Home</title><link>https://newcombe.dev/til/apparmor-blocks-a-vtpm-socket-outside-home/</link><guid isPermaLink="true">https://newcombe.dev/til/apparmor-blocks-a-vtpm-socket-outside-home/</guid><description>A lab VM with a virtual TPM works from the home directory and fails from a second data volume. The profile permits socket creation under one path pattern only, and the denial is not in the tool&apos;s output.</description><pubDate>Sat, 19 Sep 2026 00:00:00 GMT</pubDate></item><item><title>The Default localnet ACL Is Wider Than Your Lab</title><link>https://newcombe.dev/til/default-proxy-acl-is-wider-than-your-lab/</link><guid isPermaLink="true">https://newcombe.dev/til/default-proxy-acl-is-wider-than-your-lab/</guid><description>Uncommenting the stock localnet ACL so a lab network can reach a proxy also admits every other private range, including the wifi the laptop happens to be sitting on.</description><pubDate>Sat, 19 Sep 2026 00:00:00 GMT</pubDate></item><item><title>Headless RDP Needs an Unlocked Keyring First</title><link>https://newcombe.dev/til/headless-remote-desktop-needs-an-unlocked-keyring/</link><guid isPermaLink="true">https://newcombe.dev/til/headless-remote-desktop-needs-an-unlocked-keyring/</guid><description>Remote desktop credentials go into the login keyring, and the keyring stays locked until someone logs in at the console. Setting them on a headless machine appears to succeed and produces a connect-then-drop fault.</description><pubDate>Sat, 19 Sep 2026 00:00:00 GMT</pubDate></item><item><title>OpenSSL 3 Writes PKCS#8, FreeRDP Wants PKCS#1</title><link>https://newcombe.dev/til/openssl-3-writes-pkcs8-freerdp-wants-pkcs1/</link><guid isPermaLink="true">https://newcombe.dev/til/openssl-3-writes-pkcs8-freerdp-wants-pkcs1/</guid><description>A self-signed key generated the usual way is rejected with no useful error. The certificate is fine and the key is fine; the private key container format is not.</description><pubDate>Sat, 19 Sep 2026 00:00:00 GMT</pubDate></item><item><title>OSC 52 Gets You Copy, Not Paste</title><link>https://newcombe.dev/til/osc-52-clipboard-is-copy-only/</link><guid isPermaLink="true">https://newcombe.dev/til/osc-52-clipboard-is-copy-only/</guid><description>The terminal escape sequence that lets a remote editor write to your local clipboard has no reliable read half. Configure copy through it and leave paste to the terminal.</description><pubDate>Sat, 19 Sep 2026 00:00:00 GMT</pubDate></item><item><title>SSH Agent Starts at the Console, Not Over SSH</title><link>https://newcombe.dev/til/profile-does-not-run-on-ssh-logins/</link><guid isPermaLink="true">https://newcombe.dev/til/profile-does-not-run-on-ssh-logins/</guid><description>Agent start-up logic in ~/.profile works when you log in at the machine and silently does nothing when you connect over SSH. Which startup file runs depends on how the shell was invoked.</description><pubDate>Sat, 19 Sep 2026 00:00:00 GMT</pubDate></item><item><title>VRF-Sourced Traffic Needs tcp_l3mdev_accept</title><link>https://newcombe.dev/til/vrf-traffic-needs-tcp-l3mdev-accept/</link><guid isPermaLink="true">https://newcombe.dev/til/vrf-traffic-needs-tcp-l3mdev-accept/</guid><description>A service bound to 0.0.0.0 will not accept connections arriving inside a VRF unless the kernel is told to allow it. The listener looks correct, the route is correct, and the connection is refused.</description><pubDate>Sat, 19 Sep 2026 00:00:00 GMT</pubDate></item><item><title>Cloudflare Access Checks Must Fail Closed</title><link>https://newcombe.dev/til/access-external-evaluation-fail-closed/</link><guid isPermaLink="true">https://newcombe.dev/til/access-external-evaluation-fail-closed/</guid><description>For a training-compliance Access evaluator, I treat missing users, invalid requests and database errors as deny conditions instead of accidental allows.</description><pubDate>Wed, 19 Aug 2026 00:00:00 GMT</pubDate></item><item><title>Bounded Retries for Cloudflare API Calls</title><link>https://newcombe.dev/til/bounded-retries-cloudflare-api-lookups/</link><guid isPermaLink="true">https://newcombe.dev/til/bounded-retries-cloudflare-api-lookups/</guid><description>Short-lived Cloudflare API failures can justify a retry, but diagnostic Workers still need a bounded attempt count and a useful fallback value.</description><pubDate>Wed, 19 Aug 2026 00:00:00 GMT</pubDate></item><item><title>Resolve Gateway Rule IDs Before Showing Them</title><link>https://newcombe.dev/til/cloudflare-gateway-rule-id-to-name/</link><guid isPermaLink="true">https://newcombe.dev/til/cloudflare-gateway-rule-id-to-name/</guid><description>Cloudflare Gateway can provide a rule ID to a custom block page, but resolving that UUID to the rule name makes support diagnostics much more useful.</description><pubDate>Wed, 19 Aug 2026 00:00:00 GMT</pubDate></item><item><title>Device Registrations Assign Virtual IPs</title><link>https://newcombe.dev/til/cloudflare-one-client-virtual-ips-from-device-registrations/</link><guid isPermaLink="true">https://newcombe.dev/til/cloudflare-one-client-virtual-ips-from-device-registrations/</guid><description>When a Zero Trust diagnostic page needs the virtual IPv4/IPv6 assigned to a device, the active device registration is the useful object to query.</description><pubDate>Wed, 19 Aug 2026 00:00:00 GMT</pubDate></item><item><title>CSP Nonces in Cloudflare Workers</title><link>https://newcombe.dev/til/csp-nonces-cloudflare-workers/</link><guid isPermaLink="true">https://newcombe.dev/til/csp-nonces-cloudflare-workers/</guid><description>For dynamically generated security pages, I use a per-response nonce so required inline script/style can run without falling back to a broad unsafe-inline CSP.</description><pubDate>Wed, 19 Aug 2026 00:00:00 GMT</pubDate></item><item><title>Gateway Block Pages Need Policy Context</title><link>https://newcombe.dev/til/gateway-block-page-require-context/</link><guid isPermaLink="true">https://newcombe.dev/til/gateway-block-page-require-context/</guid><description>A CF-Ray header alone does not prove a request came from Gateway, so my Worker requires Gateway-specific query context before rendering diagnostic output.</description><pubDate>Wed, 19 Aug 2026 00:00:00 GMT</pubDate></item><item><title>Separate Lifecycle for Terraform Backends</title><link>https://newcombe.dev/til/terraform-backend-separate-lifecycle/</link><guid isPermaLink="true">https://newcombe.dev/til/terraform-backend-separate-lifecycle/</guid><description>A rebuildable demo environment should not destroy the backend that stores its state, so I manage the S3/DynamoDB backend as a separate Terraform project.</description><pubDate>Wed, 19 Aug 2026 00:00:00 GMT</pubDate></item><item><title>Turning Remote Feeds into Terraform Policy Inputs</title><link>https://newcombe.dev/til/terraform-http-data-sources-policy-inputs/</link><guid isPermaLink="true">https://newcombe.dev/til/terraform-http-data-sources-policy-inputs/</guid><description>An HTTP data source can retrieve an external domain feed, but the useful pattern is to validate and normalize it before Terraform materializes enforcement objects.</description><pubDate>Wed, 19 Aug 2026 00:00:00 GMT</pubDate></item><item><title>Derive WARP Routes from Infrastructure</title><link>https://newcombe.dev/til/warp-routing-subnets-derived-from-infrastructure/</link><guid isPermaLink="true">https://newcombe.dev/til/warp-routing-subnets-derived-from-infrastructure/</guid><description>When Terraform already knows the cloud subnets, those values can become inputs to WARP routing instead of being copied into a second manually maintained list.</description><pubDate>Wed, 19 Aug 2026 00:00:00 GMT</pubDate></item><item><title>Workers KV Is Backup, Not Source of Truth</title><link>https://newcombe.dev/til/workers-kv-backup-not-source-of-truth/</link><guid isPermaLink="true">https://newcombe.dev/til/workers-kv-backup-not-source-of-truth/</guid><description>In my Gateway allow-list Worker, Cloudflare lists remain the enforcement state while Workers KV stores backup and synchronization metadata.</description><pubDate>Wed, 19 Aug 2026 00:00:00 GMT</pubDate></item><item><title>Why I Tag Container Images With the Commit SHA</title><link>https://newcombe.dev/til/container-image-tags-git-commit-sha/</link><guid isPermaLink="true">https://newcombe.dev/til/container-image-tags-git-commit-sha/</guid><description>Using the Git commit SHA as a container image tag creates a direct, immutable link between source code, pipeline and deployed artifact.</description><pubDate>Wed, 12 Aug 2026 00:00:00 GMT</pubDate></item><item><title>Deploy Manually Before Automating CI/CD</title><link>https://newcombe.dev/til/manual-deployment-before-ci-cd/</link><guid isPermaLink="true">https://newcombe.dev/til/manual-deployment-before-ci-cd/</guid><description>When learning a new platform, proving the deployment manually first turns CI/CD into automation of a known-good process.</description><pubDate>Wed, 12 Aug 2026 00:00:00 GMT</pubDate></item><item><title>NXDOMAIN Caching Beyond the Windows DNS Cache</title><link>https://newcombe.dev/til/negative-dns-caching-beyond-windows/</link><guid isPermaLink="true">https://newcombe.dev/til/negative-dns-caching-beyond-windows/</guid><description>A hostname can continue returning NXDOMAIN after its DNS record exists if another resolver layer has cached the earlier negative response.</description><pubDate>Wed, 12 Aug 2026 00:00:00 GMT</pubDate></item><item><title>Windows and WSL CLI Credential Sharing</title><link>https://newcombe.dev/til/windows-wsl-cli-credentials/</link><guid isPermaLink="true">https://newcombe.dev/til/windows-wsl-cli-credentials/</guid><description>A CLI working in PowerShell does not mean the same authentication or configuration will automatically exist inside WSL.</description><pubDate>Wed, 12 Aug 2026 00:00:00 GMT</pubDate></item><item><title>AD lastLogon vs lastLogonTimestamp</title><link>https://newcombe.dev/til/ad-lastlogon-vs-lastlogontimestamp/</link><guid isPermaLink="true">https://newcombe.dev/til/ad-lastlogon-vs-lastlogontimestamp/</guid><description>Why Active Directory exposes multiple logon attributes and why choosing the wrong one can give misleading results.</description><pubDate>Sat, 08 Aug 2026 00:00:00 GMT</pubDate></item><item><title>Show Astro Drafts Only in Development</title><link>https://newcombe.dev/til/astro-drafts-local-development/</link><guid isPermaLink="true">https://newcombe.dev/til/astro-drafts-local-development/</guid><description>A small Astro content-filtering pattern that makes draft posts visible during local development without publishing them.</description><pubDate>Sat, 08 Aug 2026 00:00:00 GMT</pubDate></item><item><title>Astro: GitHub to Cloudflare Workers</title><link>https://newcombe.dev/til/cloudflare-workers-github-deployment/</link><guid isPermaLink="true">https://newcombe.dev/til/cloudflare-workers-github-deployment/</guid><description>The small deployment workflow behind this site: test Astro locally, push to GitHub and let Cloudflare build the production site.</description><pubDate>Sat, 08 Aug 2026 00:00:00 GMT</pubDate></item><item><title>Cloudflare www-to-Apex Redirect</title><link>https://newcombe.dev/til/cloudflare-www-to-apex-redirect/</link><guid isPermaLink="true">https://newcombe.dev/til/cloudflare-www-to-apex-redirect/</guid><description>The simple 301 redirect pattern I use to keep one canonical hostname for a site.</description><pubDate>Sat, 08 Aug 2026 00:00:00 GMT</pubDate></item><item><title>DNS Names vs IPs for Egress Policy</title><link>https://newcombe.dev/til/domain-aware-egress-policy/</link><guid isPermaLink="true">https://newcombe.dev/til/domain-aware-egress-policy/</guid><description>Cloud and SaaS services move between addresses. Policy often expresses intent more accurately when it follows the application hostname.</description><pubDate>Sat, 08 Aug 2026 00:00:00 GMT</pubDate></item><item><title>Three Git Commands I Run Before Publishing</title><link>https://newcombe.dev/til/git-check-before-publish/</link><guid isPermaLink="true">https://newcombe.dev/til/git-check-before-publish/</guid><description>A simple pre-push check for seeing changed, unstaged and staged content before it reaches a public repository.</description><pubDate>Sat, 08 Aug 2026 00:00:00 GMT</pubDate></item><item><title>PowerShell Process-Scope Execution Policy</title><link>https://newcombe.dev/til/powershell-execution-policy-process-scope/</link><guid isPermaLink="true">https://newcombe.dev/til/powershell-execution-policy-process-scope/</guid><description>When a local script is blocked by execution policy, Process scope can be useful for a temporary session without changing the machine-wide setting.</description><pubDate>Sat, 08 Aug 2026 00:00:00 GMT</pubDate></item><item><title>Testing HTTP Redirects with curl.exe</title><link>https://newcombe.dev/til/testing-http-redirects-curl/</link><guid isPermaLink="true">https://newcombe.dev/til/testing-http-redirects-curl/</guid><description>Use a HEAD request to see the HTTP status and Location header without downloading the complete page.</description><pubDate>Sat, 08 Aug 2026 00:00:00 GMT</pubDate></item><item><title>WARP Fallback Domains vs Split Tunnels</title><link>https://newcombe.dev/til/warp-fallback-domains-vs-split-tunnels/</link><guid isPermaLink="true">https://newcombe.dev/til/warp-fallback-domains-vs-split-tunnels/</guid><description>DNS resolution and packet routing are related, but a WARP configuration often needs you to reason about them separately.</description><pubDate>Sat, 08 Aug 2026 00:00:00 GMT</pubDate></item><item><title>Zero Trust: Find the Failed Control Plane</title><link>https://newcombe.dev/til/zero-trust-troubleshoot-control-plane/</link><guid isPermaLink="true">https://newcombe.dev/til/zero-trust-troubleshoot-control-plane/</guid><description>Before creating an emergency bypass, work out whether the failure is identity, posture, policy, DNS, tunnel or origin.</description><pubDate>Sat, 08 Aug 2026 00:00:00 GMT</pubDate></item></channel></rss>