The edge is a topology, not a requirement
Cloudflare Workers can begin a request close to the visitor, but that does not make every request local. A loader that immediately calls a centralized database or third-party API still pays for that network path. Moving the first hop can improve startup time while leaving the dominant latency untouched.
I start with one question: where are the dependencies? Static assets want to stay close to the reader. Server rendering, authentication checks, and request shaping may benefit from distributed execution. A transaction usually wants to run near the system that owns its data. The complete path matters more than the location of the first function.
Put clean boundaries in the Worker
React Router on Workers can give route loaders and actions access to Cloudflare bindings when the Worker entry passes them through the request context. That is a useful boundary: the route owns HTTP and product behavior, while a small server module owns D1, KV, R2, or another service. Bindings keep credentials out of request code and avoid routing Cloudflare-to-Cloudflare calls through public REST APIs.
This portfolio follows that shape. The Worker entry delegates requests to React Router; route actions validate intent; the guestbook module owns OAuth and D1 access. The layers are small, but each failure has a place to land. That matters more than splitting a modest application into many services.
Let the slow dependency choose placement
Smart Placement can move Worker execution closer to the upstream infrastructure receiving the most requests. That is valuable when a Worker repeatedly crosses the network to the same backend. It is not automatically valuable for asset delivery: Cloudflare's static assets are normally served close to the visitor, and forcing Worker code to run first can add a detour.
The practical sequence is to ship the simplest topology, measure real request timing, and place only the path with evidence of distance. If public assets and backend-heavy application requests want different locations, service bindings can separate them later without exposing an internal service to the public Internet.
Operational fit is part of the decision
Edge code still needs ordinary production discipline. Keep the compatibility date deliberate, generate binding types after configuration changes, store secrets outside source, and await work that must finish. Enable observability before an intermittent failure appears.
Uploaded source maps let Cloudflare translate a bundled stack trace back to the TypeScript that produced it. Structured logs make request paths and error categories searchable. Those details do not decide what belongs at the edge, but they decide whether the result remains understandable after deployment.