{
  "schema": "http://google-preview.miscsubjects.com/schemas/jarticle.json",
  "status": "published",
  "slug": "cloudflare-os-xl-08-reaching-private-things",
  "title": "Cloudflare OS XL part 8: reaching things that are not public",
  "kind": "systems",
  "summary": "Cloudflare OS XL part 8: reaching things that are not public",
  "created": "2026-08-06T03:24:50.826Z",
  "body": [
    "*Part 8 of [Cloudflare OS XL](/a/cloudflare-os-xl), an inventory of the Cloudflare platform this build does not have installed.*\n\nEverything this build reaches is reachable over the public internet. Every integration is an HTTPS call to a vendor endpoint with a bearer token: Stripe, Meta, Google, the messaging provider, the model providers. Every one of those is public by design and the arrangement is correct.\n\nThe exceptions are the interesting part. There are two things this build talks to that are not public services, and both are handled badly.\n\nThe first is the owner's machine. Around forty tool rows execute there, through a bridge process, reached by a mechanism that is not a network boundary so much as an absence of one.\n\nThe second is any database that is not D1. There is a `CLI_PSQL` row. There is no way for a Worker to hold a connection to a Postgres instance, because Workers do not do connection pools.\n\nFour products address this space, and this is the part of the series where the honest answer is mostly \"not yet\".\n\n## Hyperdrive\n\nHyperdrive accelerates access to an existing database from Workers with global connection pooling and query caching. It is the answer to the structural problem that a Worker is not a long-lived process and therefore cannot hold a connection pool the way a server does — Hyperdrive holds it on the Worker's behalf and caches read queries at the edge.\n\n```\nwrangler hyperdrive create loop-pg --connection-string=\"postgres://...\"\n```\n\n```toml\n[[hyperdrive]]\nbinding = \"PG\"\nid = \"<config-id>\"\n```\n\nThe account has zero configs, which is correct today: there is no external Postgres. Everything relational lives in D1.\n\nWhat would change that is a specific, foreseeable thing. D1 has size and write-throughput limits that suit a content spine and suit an event ledger up to a point. If the lead pipeline, the outbound record or the analytics store outgrows D1 — or if a partner's data has to be read where it already lives — Hyperdrive is what makes that reachable from a Worker without giving up on Workers.\n\n**Verdict: no, today. Install the day an external database exists.** Listing it as a current gap would be inventing a need.\n\n## Workers VPC\n\nWorkers VPC securely connects a private cloud to Cloudflare, so a Worker can reach services that have no public endpoint.\n\nSame shape of answer as Hyperdrive: this build has no private cloud. There is no VPC, no internal service, no bastion. Every dependency is either a public SaaS API or a binding.\n\nIt is worth naming for one reason. The most likely future that changes it is the wholesale side of the business — an inventory system, a fulfilment integration, or a partner's internal API that is not exposed publicly. That is a business event, not an infrastructure one, and the infrastructure answer is already known when it happens.\n\n**Verdict: no, today.**\n\n## Cloudflare Tunnel\n\nThis one is different, because the private thing already exists.\n\nThe owner's Mac runs a bridge process, and Workers reach it. Tunnel is the product designed for precisely that: `cloudflared` runs on the machine, establishes an outbound-only connection to Cloudflare, and exposes a chosen local service at a hostname on the account — with no inbound port, no static IP, and Access policy in front of it if wanted.\n\nThe improvements over what exists are concrete rather than theoretical:\n\n- **Outbound-only.** Nothing on the laptop listens for inbound connections from the internet.\n- **A real hostname with a real certificate.** The bridge becomes `bridge.<domain>` rather than an arrangement.\n- **Authentication in front of it.** With Access (Part 9), the tunnel can require a service token, so a Worker proves identity rather than knowing an address.\n- **Observability.** Tunnel connection state is visible on the account. When the bridge is down, that is a fact the dashboard knows, rather than a tool timeout an agent has to interpret.\n\nThe important thing this does *not* do is fix the underlying liability. A tunnel to a sleeping laptop is a tunnel to nothing. Part 3's answer — move the transformation work into Containers — is the actual repair. Tunnel is the right way to handle what genuinely must stay local: the screen, the clipboard, the logged-in browser, the message history.\n\n**Verdict: install, alongside the Containers migration.** Tunnel for what must stay local; Containers for everything that does not.\n\n## mTLS certificates\n\nA Worker can hold a client certificate as a binding and present it when calling an API that requires mutual TLS.\n\nNo current integration requires it. Payment processors, ad platforms and messaging providers here all authenticate with bearer tokens. Where mTLS tends to appear is in the more regulated end of B2B — a distributor, a laboratory, a pharmacy system — which is a plausible direction for the wholesale business and is not where it is now.\n\n**Verdict: no, today.** One binding away when a partner asks.\n\n## Why three \"no\"s in one part\n\nThis is the part of the platform this build has least need of, and that is a finding rather than a gap. A system whose dependencies are all public APIs and whose data is all in first-party bindings genuinely does not need private connectivity. The one place it *does* have a private dependency — the laptop — is a dependency it should be removing rather than better connecting.\n\nThe exception is worth stating precisely: install Tunnel for the residue that is irreducibly local, and treat the size of that residue as a number that should be going down.\n\n## Verdicts\n\n| Product | What it replaces here | Verdict |\n| --- | --- | --- |\n| Cloudflare Tunnel | An ad-hoc bridge to the owner's Mac with no identity or hostname | **install** — for the irreducibly local |\n| Hyperdrive | Nothing today; there is no external database | **no** — until one exists |\n| Workers VPC | Nothing today; there is no private cloud | **no** — until one exists |\n| mTLS certificates | Nothing today; every partner uses bearer tokens | **no** — one binding away when asked |\n\nNext: [Part 9 — the security surface](/a/cloudflare-os-xl-09-the-security-surface)."
  ],
  "facts": {
    "converted_from": "markdown",
    "original_updated": "2026-08-06T03:24:50.864Z",
    "register": null,
    "category": "systems"
  },
  "hero": "https://miscsubjects.com/img/gen/arcads-gpt-image-4f076ff3-df5f-4e58-96df-92294437d9ef.png",
  "model": "Opus 5 (Claude Code)",
  "tags": [
    "cloudflare",
    "tunnel",
    "hyperdrive",
    "networking",
    "workers-vpc"
  ],
  "sources": [
    {
      "id": "s-hyperdrive",
      "type": "documentation",
      "url": "https://developers.cloudflare.com/hyperdrive/",
      "title": "Cloudflare Hyperdrive documentation",
      "quote": "Accelerate access to your existing databases from Cloudflare Workers with Hyperdrive's global connection pooling and query caching.",
      "accessed_at": "2026-08-06T03:10:11.161Z",
      "prev": "genesis",
      "hash": "b0f649fc268d32d925a0b85b25e11b593c7a470d7d3afa182ae07d51fe0d850e",
      "quote_sha256": "ffe58b6f21985d3727e99868b02cbe31d5981d9b61e7ff0b3df2b3165c91dec8"
    },
    {
      "id": "s-vpc",
      "type": "documentation",
      "url": "https://developers.cloudflare.com/workers-vpc/",
      "title": "Workers VPC documentation",
      "quote": "Securely connect your private cloud to Cloudflare to build cross-cloud apps.",
      "accessed_at": "2026-08-06T03:10:11.161Z",
      "prev": "b0f649fc268d32d925a0b85b25e11b593c7a470d7d3afa182ae07d51fe0d850e",
      "hash": "e9d63a147b54340d10e64ace4ce04511588839fb71779cdc51775bdfa58dcf83",
      "quote_sha256": "e91a685a72e48d3aa353316640bfca16cf4798f80d5087b9d5633fce53a93e12"
    }
  ],
  "claims": [
    {
      "id": "c1",
      "text": "Every integration this build depends on is a public HTTPS API authenticated with a bearer token, so the account has almost no need of private connectivity.",
      "tier": "observational",
      "source_ids": [],
      "why_material": "Three of the four products in this part therefore carry a verdict of no."
    },
    {
      "id": "c2",
      "text": "Hyperdrive provides global connection pooling and query caching so a Worker can use an existing database despite not being a long-lived process able to hold a pool.",
      "tier": "definition",
      "source_ids": [
        "s-hyperdrive"
      ],
      "why_material": "It becomes necessary the day any relational data lives outside D1."
    },
    {
      "id": "c3",
      "text": "Workers VPC connects a private cloud to Cloudflare so a Worker can reach services with no public endpoint, and this account has no private cloud to connect.",
      "tier": "definition",
      "source_ids": [
        "s-vpc"
      ],
      "why_material": "The event that changes this is commercial rather than technical."
    },
    {
      "id": "c4",
      "text": "Cloudflare Tunnel would give the owner Mac bridge an outbound-only connection, a real hostname, an identity check in front of it and connection state visible on the account.",
      "tier": "expert",
      "source_ids": [],
      "why_material": "Today that bridge has none of those four properties."
    },
    {
      "id": "c5",
      "text": "A tunnel to a sleeping laptop is still a tunnel to nothing, so Tunnel is the right handling for what must stay local and not a substitute for moving transformation work into Containers.",
      "tier": "expert",
      "source_ids": [],
      "why_material": "It keeps the actual repair from being mistaken for a better connection to the problem."
    }
  ],
  "type": "article",
  "updated": "2026-10-08T11:31:29.942Z",
  "version": 1,
  "hash": "977b424403ef22b55a92b8bd0691451379f3ccace41885f45e00817ef9488311",
  "styling": {
    "scope": "shared",
    "how": "no value on the page is set by hand: each comes from this theme, and each theme value becomes the CSS variable named beside it. PATCH http://google-preview.miscsubjects.com/api/jarticles/theme changes them.",
    "widget_style": {
      "what": "every widget may carry style: {…}; these are the only keys it reads",
      "rotate": "degrees, a number",
      "offset_x": "pixels, a number",
      "offset_y": "pixels, a number",
      "pulse": "true to pulse"
    },
    "theme": {
      "color": {
        "page_bg": "#f5f5f7",
        "sheet_bg": "#ffffff",
        "ink": "#1d1d1f",
        "soft": "#424245",
        "muted": "#6e6e73",
        "dim": "#86868b",
        "line": "#d2d2d7",
        "accent": "#0071e3",
        "accent_soft": "rgba(0,113,227,0.08)",
        "link": "#0066cc",
        "selection": "rgba(0,113,227,0.18)",
        "widget_bg": "#f5f5f7",
        "widget_border": "#d2d2d7",
        "card_bg": "#ffffff",
        "code_bg": "#f5f5f7",
        "json_bg": "#161b19",
        "json_ink": "#e6e1d4",
        "json_key": "#7fd3c3",
        "json_string": "#e9c46a",
        "json_number": "#f4a261",
        "json_bool": "#c792ea",
        "json_null": "#928d7e",
        "json_punct": "#6b6759",
        "json_bar": "#0e1512",
        "kind_badge_bg": "#0e6e60",
        "kind_badge_ink": "#ffffff"
      },
      "color_dark": {
        "page_bg": "#000000",
        "sheet_bg": "#1d1d1f",
        "ink": "#f5f5f7",
        "soft": "#d2d2d7",
        "muted": "#a1a1a6",
        "dim": "#86868b",
        "line": "#424245",
        "accent": "#2997ff",
        "accent_soft": "rgba(41,151,255,0.12)",
        "link": "#2997ff",
        "selection": "rgba(41,151,255,0.25)",
        "widget_bg": "#2c2c2e",
        "widget_border": "#424245",
        "card_bg": "#1d1d1f",
        "code_bg": "#2c2c2e",
        "json_bg": "#0a0d0c",
        "json_ink": "#e6e1d4",
        "json_key": "#7fd3c3",
        "json_string": "#e9c46a",
        "json_number": "#f4a261",
        "json_bool": "#c792ea",
        "json_null": "#757062",
        "json_punct": "#5d665f",
        "json_bar": "#060807",
        "kind_badge_bg": "#4fc1ab",
        "kind_badge_ink": "#0b0f0d"
      },
      "font": {
        "display": "-apple-system,BlinkMacSystemFont,\"SF Pro Display\",\"SF Pro Text\",\"Helvetica Neue\",Helvetica,Arial,sans-serif",
        "body": "-apple-system,BlinkMacSystemFont,\"SF Pro Display\",\"SF Pro Text\",\"Helvetica Neue\",Helvetica,Arial,sans-serif",
        "mono": "ui-monospace,SFMono-Regular,\"SF Mono\",Menlo,Consolas,monospace",
        "google_fonts": ""
      },
      "size": {
        "body": "17px",
        "small": "17px",
        "eye": "17px",
        "lead": "17px",
        "h1": "52px",
        "h2": "34px",
        "h3": "22px",
        "byline": "17px",
        "h1_measure": "none",
        "code": "17px",
        "json": "17px",
        "widget_title": "17px"
      },
      "leading": {
        "body": "1.7",
        "head": "1.18",
        "lead": "1.5",
        "json": "1.6"
      },
      "weight": {
        "display": "700",
        "head": "700",
        "body": "400",
        "strong": "700",
        "eye": "700"
      },
      "tracking": {
        "eye": "0.14em",
        "display": "-0.03em",
        "body": "-0.006em",
        "badge": "0.08em"
      },
      "layout": {
        "sheet_width": "1000px",
        "text_width": "880px",
        "gutter": "16px",
        "sheet_padding": "56px 64px 64px",
        "sheet_padding_mobile": "24px 18px 40px",
        "sheet_margin": "28px auto 72px",
        "block_gap": "1.15em",
        "widget_gap": "28px",
        "grid_gap": "14px"
      },
      "border": {
        "sheet": "0px solid",
        "sheet_radius": "30px",
        "widget": "1px solid",
        "widget_radius": "24px",
        "card_radius": "24px",
        "badge_radius": "999px",
        "rule": "1px solid",
        "code_radius": "18px",
        "accent_bar": "3px"
      },
      "shadow": {
        "sheet": "0 1px 1px rgba(0,0,0,.02),0 6px 26px rgba(0,0,0,.05)",
        "widget": "none",
        "card_hover": "0 10px 28px -16px rgba(28,27,23,0.35)"
      },
      "motion": {
        "hover": "160ms ease"
      }
    }
  },
  "page": "http://google-preview.miscsubjects.com/a/cloudflare-os-xl-08-reaching-private-things",
  "json": "http://google-preview.miscsubjects.com/a/cloudflare-os-xl-08-reaching-private-things.json",
  "markdown": "http://google-preview.miscsubjects.com/a/cloudflare-os-xl-08-reaching-private-things.md",
  "theme": "http://google-preview.miscsubjects.com/article-theme.json",
  "calls": [
    {
      "what": "this article as a page (no key)",
      "method": "GET",
      "url": "http://google-preview.miscsubjects.com/a/cloudflare-os-xl-08-reaching-private-things",
      "headers": {}
    },
    {
      "what": "this article as its object (no key)",
      "method": "GET",
      "url": "http://google-preview.miscsubjects.com/a/cloudflare-os-xl-08-reaching-private-things.json",
      "headers": {}
    },
    {
      "what": "this article as Markdown (no key)",
      "method": "GET",
      "url": "http://google-preview.miscsubjects.com/a/cloudflare-os-xl-08-reaching-private-things.md",
      "headers": {}
    },
    {
      "what": "the object with its hash, drafts too",
      "method": "GET",
      "url": "http://google-preview.miscsubjects.com/api/jarticles/cloudflare-os-xl-08-reaching-private-things",
      "headers": {
        "x-sheets-key": "$(cat /Users/cyrusmassoumi/.misc-sheets-key)"
      }
    },
    {
      "what": "one piece and that piece’s hash",
      "method": "GET",
      "url": "http://google-preview.miscsubjects.com/api/jarticles/cloudflare-os-xl-08-reaching-private-things/at?path=facts",
      "headers": {
        "x-sheets-key": "$(cat /Users/cyrusmassoumi/.misc-sheets-key)"
      }
    },
    {
      "what": "grep: every key or value that matches, with the path to change it",
      "method": "GET",
      "url": "http://google-preview.miscsubjects.com/api/jarticles/cloudflare-os-xl-08-reaching-private-things/grep?q=owner",
      "headers": {
        "x-sheets-key": "$(cat /Users/cyrusmassoumi/.misc-sheets-key)"
      }
    },
    {
      "what": "change pieces (set, merge, delete, append, insert, move); if-match is the hash",
      "method": "PATCH",
      "url": "http://google-preview.miscsubjects.com/api/jarticles/cloudflare-os-xl-08-reaching-private-things",
      "headers": {
        "x-sheets-key": "$(cat /Users/cyrusmassoumi/.misc-sheets-key)",
        "content-type": "application/json",
        "if-match": "<hash from the read>"
      },
      "body": {
        "ops": [
          {
            "op": "set",
            "path": "facts.example",
            "value": 1
          }
        ]
      }
    },
    {
      "what": "replace the whole object",
      "method": "PUT",
      "url": "http://google-preview.miscsubjects.com/api/jarticles/cloudflare-os-xl-08-reaching-private-things",
      "headers": {
        "x-sheets-key": "$(cat /Users/cyrusmassoumi/.misc-sheets-key)",
        "content-type": "application/json",
        "if-match": "<hash>"
      },
      "body": {
        "slug": "cloudflare-os-xl-08-reaching-private-things",
        "title": "…"
      }
    },
    {
      "what": "fetch every source, hash what came back and check the quote is in it",
      "method": "POST",
      "url": "http://google-preview.miscsubjects.com/api/jarticles/cloudflare-os-xl-08-reaching-private-things/verify",
      "headers": {
        "x-sheets-key": "$(cat /Users/cyrusmassoumi/.misc-sheets-key)",
        "content-type": "application/json"
      },
      "body": {}
    },
    {
      "what": "an Obsidian-style command",
      "method": "POST",
      "url": "http://google-preview.miscsubjects.com/api/jarticles/cli",
      "headers": {
        "x-sheets-key": "$(cat /Users/cyrusmassoumi/.misc-sheets-key)",
        "content-type": "application/json"
      },
      "body": {
        "command": "backlinks",
        "file": "cloudflare-os-xl-08-reaching-private-things"
      }
    }
  ]
}