Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
324 commits
Select commit Hold shift + click to select a range
ac6c409
feat(devflare): C17 - schema entries for mTLS / Dispatch / Workflows-…
Refzlund Apr 20, 2026
88fd7d7
refactor(devflare): R1 step 2 - extract shared binding-resolution hel…
Refzlund Apr 20, 2026
7ed88d4
refactor(devflare): R1 step 3 - brand DeployConfig/LocalConfig and ti…
Refzlund Apr 20, 2026
6f14141
chore(devflare): ignore _tr_*.txt test scratch files
Refzlund Apr 20, 2026
8c25abe
refactor(devflare): F49 step 1 - extract bridge-backed startup helpers
Refzlund Apr 20, 2026
fa36776
refactor(devflare): F35 step 1 - extract Vite DO discovery helpers
Refzlund Apr 20, 2026
4a2cc56
refactor(devflare): F45 step 1 - extract Miniflare binding translators
Refzlund Apr 20, 2026
2ff35a5
refactor(devflare): CR1 - opt-in alreadyResolved flag for compileBuil…
Refzlund Apr 20, 2026
faba162
refactor(devflare): F49 step 2 - extract resolveHandlerPaths helper
Refzlund Apr 20, 2026
020bc80
refactor(devflare): F35+F45 step 2 - extract plugin-context and serve…
Refzlund Apr 20, 2026
e7795d8
refactor(devflare): F49 step 3 - extract transport decoders
Refzlund Apr 20, 2026
c96b2bf
refactor(devflare): F49 step 4 - extract applyMultiWorkerConfig
Refzlund Apr 20, 2026
a2abd8a
refactor(devflare): F49 step 5 - extract buildInlineBridgeMfConfig
Refzlund Apr 20, 2026
dc183a5
refactor(devflare): F45 step 3 - extract Miniflare worker-config buil…
Refzlund Apr 20, 2026
8fff57a
refactor(devflare): F35 step 3 - extract programmatic helpers (getClo…
Refzlund Apr 20, 2026
5d8d3a1
refactor(devflare): F35 step 4 - extract config() hook helpers
Refzlund Apr 20, 2026
9627afd
refactor(devflare): F35 step 5 - dedupe config-load between configRes…
Refzlund Apr 20, 2026
4b7d725
refactor(devflare): F45 step 4 - extract buildMiniflareDevConfig orch…
Refzlund Apr 20, 2026
d33ae10
refactor(devflare): F45 step 6 - extract resolveWorkerConfigWatchPath
Refzlund Apr 20, 2026
df65c1c
refactor(devflare): F49 step 6 - extract buildRemoteAndStaticBindings
Refzlund Apr 20, 2026
0b68a50
refactor(devflare): F35 step 6 - extract runDevflareTransform helper
Refzlund Apr 20, 2026
f379063
refactor(devflare): F49 step 7 - extract surface-handler wiring + env…
Refzlund Apr 20, 2026
d796c02
refactor(devflare): F49 step 8 - extract config resolution and dispos…
Refzlund Apr 20, 2026
a8adc4f
refactor(devflare): F45 step 7 - extract applyWatcherTargetDiff helper
Refzlund Apr 20, 2026
8ec2afb
refactor(devflare): F35 step 7 - extract buildPluginConfigHookResult
Refzlund Apr 20, 2026
72c8545
refactor(devflare): F45 step 8 - extract maybeStartBrowserShim helper
Refzlund Apr 20, 2026
18c7bcc
refactor(devflare): F45 step 9 - extract maybeStartDOBundler helper
Refzlund Apr 20, 2026
f64ed47
refactor(devflare): F45 step 10 - extract resolveViteIntegration helper
Refzlund Apr 20, 2026
9f23cdc
docs: log 2026-04-22 helper-extraction pass in REMAINING.md
Refzlund Apr 20, 2026
18d00d1
chore(devflare): close-out F35/F45/F49 in-flight work + Wave 1 docs (…
Refzlund Apr 21, 2026
57e51e2
refactor(devflare): V3 - composed-worker returns absolute path
Refzlund Apr 21, 2026
fdea7a7
refactor(devflare): V2 - share SUPPORTED_WORKER_EXTENSIONS across wor…
Refzlund Apr 21, 2026
6030f96
refactor(devflare): R2 - alias ContextUnavailableError to ContextAcce…
Refzlund Apr 21, 2026
798498d
refactor(devflare): R3 - unify proxy factories under createContextPro…
Refzlund Apr 21, 2026
b18b6e5
refactor(devflare): R4 - co-locate router under runtime/router/
Refzlund Apr 21, 2026
5f38af0
refactor(devflare): D1 - always assemble miniflare workers array
Refzlund Apr 21, 2026
12d2d47
refactor(devflare): B5 - surface silent bridge catches via DEVFLARE_D…
Refzlund Apr 21, 2026
d154726
refactor(devflare): B6 - mark bridgeEnv as @internal
Refzlund Apr 21, 2026
044a4e6
refactor(devflare): C2 prep - make resolveResources phase a strict su…
Refzlund Apr 21, 2026
acf1922
refactor(devflare): C2 step 1 - route compile path through resolveRes…
Refzlund Apr 21, 2026
5cb157d
refactor(devflare): C2 step 2 - route Vite plugin through resolveReso…
Refzlund Apr 21, 2026
20b73a2
refactor(devflare): C2 step 3 - route deploy path through resolveReso…
Refzlund Apr 21, 2026
3e6efbd
docs(devflare): C2 step 4 - mark legacy resolver entry points @internal
Refzlund Apr 21, 2026
b9a8ab3
refactor(devflare): V1 - share durable-object-discovery helper across…
Refzlund Apr 21, 2026
6af7dce
refactor(devflare): C5 - consolidate config validation in Zod, keep c…
Refzlund Apr 21, 2026
38d75aa
refactor(devflare): P2 - use wrangler versions view --json output, dr…
Refzlund Apr 21, 2026
4dd0a82
refactor(devflare): R1 - warn on middleware param-name sniffing; stri…
Refzlund Apr 21, 2026
468a30e
refactor(devflare): R1 - warn on middleware param-name sniffing; stri…
Refzlund Apr 21, 2026
c14ae5b
refactor(devflare): C3 - add kind discriminant on DO binding refs
Refzlund Apr 21, 2026
bc2081b
refactor(devflare): C4 - resolve DO ref proxy access against actual b…
Refzlund Apr 21, 2026
68cd5ad
refactor(devflare): P1 - declare DevflareEnv global once in src/env.ts
Refzlund Apr 21, 2026
eef9e64
refactor(devflare): B3 - namespace all bridge RPC operations with bin…
Refzlund Apr 21, 2026
778ce6e
docs(devflare): B4 - document namespaced bridge RPC convention; resol…
Refzlund Apr 21, 2026
954331d
docs: close out REMAINING.md - move all 20 items to FINDINGS.md, reco…
Refzlund Apr 21, 2026
75ce9d2
docs: scrub stale REMAINING.md content - keep closeout summary only
Refzlund Apr 21, 2026
7800351
refactor(devflare): V4-defaults — extract createWorkerdBundlerDefaults
Refzlund Apr 21, 2026
34539cf
refactor(devflare): D2-removal — drop createBridgeTestContext from pu…
Refzlund Apr 21, 2026
783d4fb
refactor(devflare): C2-public — remove resolveConfigForLocalRuntime +…
Refzlund Apr 21, 2026
ccf798f
refactor(devflare): R1-strict — drop parameter-name fallback, require…
Refzlund Apr 21, 2026
f1e8dde
refactor(devflare): B3-final — remove legacy bare-verb / stub.* / stm…
Refzlund Apr 21, 2026
e7e61c1
refactor(devflare): B5-frame — add structured wire-error frame to bri…
Refzlund Apr 21, 2026
b1d7313
refactor(devflare): P1-codegen — pin generated DevflareEnv shape with…
Refzlund Apr 21, 2026
07a313b
docs: REMAINING.md - mark Wave-4 follow-ups complete (V4/D2/C2/R1/B3/…
Refzlund Apr 21, 2026
c8c05d1
fix(devflare): drop leaky bun module mock for wrapEnvSendEmailBinding…
Refzlund Apr 21, 2026
a847202
fix(devflare): make dev-server-state vite-process mock resolve dispos…
Refzlund Apr 21, 2026
6a3ff54
fix(devflare): only auto-run refresh-permission-groups main() when in…
Refzlund Apr 21, 2026
5b918fd
fix(devflare): rebase deploy artefact main/assets paths from build di…
Refzlund Apr 21, 2026
a4bca2c
fix(cli): avoid ref proxy resolution during source-config hashing
Refzlund Apr 21, 2026
6f94712
test(integration): make cleanupTempDirs tolerant of CI rm failures
Refzlund Apr 21, 2026
e14a3aa
chore(cloudflare): include response body in non-envelope/JSON parse e…
Refzlund Apr 21, 2026
04d981a
fix(cloudflare): accept bare `{result}` envelopes from CF Queues API
Refzlund Apr 21, 2026
a607a4e
fix(testing): allow Hyperdrive POSTGRES preview to fall back to base …
Refzlund Apr 21, 2026
5994840
fix(ci): pass --json to wrangler versions view in testing preview ver…
Refzlund Apr 21, 2026
2bdd202
fix(preview): materialize preview scope inside hyperdrive object form
Refzlund Apr 21, 2026
dad456e
test(verifier): expect Hyperdrive object form with previewFallback
Refzlund Apr 21, 2026
b5ee7ea
fix(testing): add ctx parameter to fetch handler
Refzlund Apr 21, 2026
48b6949
harden: close fragility gaps that masked the PR-1 cascade
Refzlund Apr 21, 2026
d469c65
verifier: gate branch-preview live probe behind Cloudflare Access creds
Refzlund Apr 21, 2026
c93015e
test(devflare): use 3-arg queue/scheduled fixtures for new R1-strict …
Refzlund Apr 21, 2026
f7e7104
chore: update .env.example with Cloudflare Access details and improve…
Refzlund Apr 21, 2026
317511e
feat: enhance SvelteKit integration with improved build artifact hand…
Refzlund Apr 21, 2026
6a81f73
Add unit tests for offline bindings, service resolution, and context …
Refzlund Apr 26, 2026
d527b0a
Add comprehensive tests for documentation integrity
Refzlund Apr 26, 2026
74f101c
Add comprehensive tests for config schema bindings and runtime config…
Refzlund Apr 27, 2026
7e39355
Fix preview deploy and CI validation flake
Refzlund Apr 27, 2026
840fbea
Stabilize preview verification and runtime tests
Refzlund Apr 27, 2026
093becf
Avoid Wrangler import for local dev vars
Refzlund Apr 27, 2026
05f10cc
Improve documentation coverage and navigation
Refzlund Apr 27, 2026
eed236f
Improve offline bindings and documentation clarity
Refzlund Apr 27, 2026
76bae98
Handle missing Miniflare log level export
Refzlund Apr 27, 2026
cafc596
Omit Miniflare custom log when export is missing
Refzlund Apr 27, 2026
82b004a
Defer missing Miniflare helper failures
Refzlund Apr 27, 2026
275eb47
Use wrapped bindings for local Secrets Store values
Refzlund Apr 27, 2026
00ee4c6
Guard optional Miniflare dispose helper
Refzlund Apr 27, 2026
0af6f19
Use primary worker for Miniflare bindings
Refzlund Apr 27, 2026
83712d8
Stabilize local secret binding access
Refzlund Apr 27, 2026
dc16e60
Stabilize send email context integration test
Refzlund Apr 27, 2026
bc554c7
Verify offline-first local bindings
Refzlund Apr 27, 2026
cecf3e3
style: visually center pill + commit logo
Refzlund Apr 27, 2026
98e0de9
refactor: update social metadata and replace favicon with logo
Refzlund Apr 27, 2026
5264156
Generate documentation social cards
Refzlund Apr 28, 2026
58960bc
Isolate social card Svelte rendering
Refzlund Apr 28, 2026
0e3cf54
Avoid social card generation during install
Refzlund Apr 28, 2026
06e71c8
Cache documentation social cards
Refzlund Apr 28, 2026
8f27e44
Fix local dev service bindings
Refzlund Apr 28, 2026
f4745b2
Harden root env dev-server test
Refzlund Apr 28, 2026
5194070
Stabilize sendEmail dev-server tests
Refzlund Apr 28, 2026
3e040e5
Fix SvelteKit service binding bridge
Refzlund Apr 28, 2026
e056f66
feat: add typed config env vars
Refzlund May 1, 2026
5b3d40f
fix: clarify custom domain routing
Refzlund May 1, 2026
c318df0
test: keep docs integrity checks focused
Refzlund May 1, 2026
580cf6e
fix: resolve typed env vars for deploy
Refzlund May 1, 2026
9c2f55d
fix: include zone permissions in managed tokens
Refzlund May 2, 2026
a235ee6
fix: split account and zone token policies
Refzlund May 2, 2026
9eb6d63
fix: clean package dist before build
Refzlund May 2, 2026
43e10e3
feat: enhance article and TOC components with dynamic content offset …
Refzlund May 10, 2026
7127e49
fix: update Floating TOC styles for improved layout and interaction
Refzlund May 10, 2026
e25ea0a
refactor: simplify content offset calculations and improve title widt…
Refzlund May 10, 2026
2303d83
feat(devflare): add `server` dev host/port config + changesets next-t…
Refzlund Jun 28, 2026
6b7356d
chore(release): version packages [skip ci]
github-actions[bot] Jun 28, 2026
51e8463
fix(ci): publish.yml — drop --tag (forbidden in pre mode) + pre-mode-…
Refzlund Jun 28, 2026
3973c8a
fix(ci): configure git identity unconditionally in publish workflow
Refzlund Jun 28, 2026
db83da3
feat(devflare): Phase A — freeze API contract + release/stability pol…
Refzlund Jun 28, 2026
6eeebd5
chore(release): version packages [skip ci]
github-actions[bot] Jun 28, 2026
3cd03ab
feat(devflare): Phase B — close unfinished bridge/shim code paths
Refzlund Jun 28, 2026
131e8e8
chore(release): version packages [skip ci]
github-actions[bot] Jun 28, 2026
dcc56e7
feat(devflare): Phase C — model v4 deploy-policy options + Cloudflare…
Refzlund Jun 28, 2026
9b77884
chore(release): version packages [skip ci]
github-actions[bot] Jun 28, 2026
38f576f
feat(devflare): Phase D — deploy & secrets maturity guide + clearer p…
Refzlund Jun 28, 2026
357fd7f
chore(release): version packages [skip ci]
github-actions[bot] Jun 28, 2026
e27dd17
feat(devflare): Phase E — enforce lint + gate publish on tests + fix …
Refzlund Jun 28, 2026
458898c
chore(release): version packages [skip ci]
github-actions[bot] Jun 28, 2026
3f9f0d7
docs(devflare): Phase F — architecture & docs debt close-out
Refzlund Jun 28, 2026
f7e7992
chore(release): version packages [skip ci]
github-actions[bot] Jun 28, 2026
e7b82e3
chore(devflare): packaging & release hygiene (LICENSE, node bin, expo…
Refzlund Jun 28, 2026
023b0e3
chore(release): version packages [skip ci]
github-actions[bot] Jun 28, 2026
0b47000
fix(devflare): docs & contract honesty (entrypoint rows, bridge ports…
Refzlund Jun 28, 2026
db91029
chore(release): version packages [skip ci]
github-actions[bot] Jun 28, 2026
cd82c4e
fix(devflare): repair DO WebSocket relay through the live gateway + c…
Refzlund Jun 28, 2026
55604c0
chore(release): version packages [skip ci]
github-actions[bot] Jun 28, 2026
c813821
docs(devflare): accurate Cloudflare support matrix + offline-binding …
Refzlund Jun 28, 2026
de4bc5a
chore(release): version packages [skip ci]
github-actions[bot] Jun 28, 2026
bef00b5
test(devflare): fix NaN error messages, ratchet lint to error, harden…
Refzlund Jun 28, 2026
f322db8
chore(release): version packages [skip ci]
github-actions[bot] Jun 28, 2026
22d4986
chore(devflare): final QA sweep — bridge WS frame guard, docs notes, …
Refzlund Jun 28, 2026
d08f0c4
fix(devflare): build importable bundles with rolldown + verify dist b…
Refzlund Jun 28, 2026
35ad35b
ci(devflare): run build before the unit gate + bun 1.3.14 in publish
Refzlund Jun 28, 2026
445b501
test(devflare): move nested-Miniflare worker-loader test to a serial …
Refzlund Jun 28, 2026
8938d0e
chore(release): version packages [skip ci]
github-actions[bot] Jun 28, 2026
db98dd9
fix(devflare): declare typescript as a runtime dependency
Refzlund Jun 28, 2026
17411f2
chore(release): version packages [skip ci]
github-actions[bot] Jun 28, 2026
6fab0de
fix(devflare): CLI bin runs dist under node + robust dependency packa…
Refzlund Jun 28, 2026
d8e8abc
chore(release): version packages [skip ci]
github-actions[bot] Jun 28, 2026
feab91d
feat(devflare): remote flag + preview/jurisdiction/migration on core …
Refzlund Jun 28, 2026
1420744
chore(release): version packages [skip ci]
github-actions[bot] Jun 28, 2026
81b4c63
feat(devflare): Stream, VPC services/networks, and Flagship bindings …
Refzlund Jun 29, 2026
a2aeef6
chore(release): version packages [skip ci]
github-actions[bot] Jun 29, 2026
54f4566
feat(devflare): wire Analytics Engine + tail consumers + mTLS remote …
Refzlund Jun 29, 2026
fd4f874
chore(release): version packages [skip ci]
github-actions[bot] Jun 29, 2026
b3f6771
feat(devflare): offline mocks for Vectorize + Analytics Engine, cf.al…
Refzlund Jun 29, 2026
acd012f
chore(release): version packages [skip ci]
github-actions[bot] Jun 29, 2026
e267951
fix(devflare): honest offline-support classification for Durable Obje…
Refzlund Jun 29, 2026
9765278
chore(release): version packages [skip ci]
github-actions[bot] Jun 29, 2026
49aad79
feat(devflare): gradual/percentage deploy + devflare tail command (CF…
Refzlund Jun 29, 2026
67a0af0
chore(release): version packages [skip ci]
github-actions[bot] Jun 29, 2026
15fed0f
feat(devflare): cron grammar validation + build-time 2-arg fetch chec…
Refzlund Jun 29, 2026
0d68f4d
chore(release): version packages [skip ci]
github-actions[bot] Jun 29, 2026
f1209e4
fix(devflare): typed env/vars proxies assignable to augmented Devflar…
Refzlund Jun 29, 2026
9c06ba8
chore(release): version packages [skip ci]
github-actions[bot] Jun 29, 2026
53347f3
docs(devflare): CF-7 boundaries — DO WS hibernation (covered), unsafe…
Refzlund Jun 29, 2026
804bc79
feat(devflare): close CF-8 config-coverage gaps (queue/service/stream…
Refzlund Jun 29, 2026
c2e2206
chore(release): version packages [skip ci]
github-actions[bot] Jun 29, 2026
848e41f
feat(devflare): productions deployments history subcommand + observab…
Refzlund Jun 29, 2026
acc5a0e
chore(release): version packages [skip ci]
github-actions[bot] Jun 29, 2026
fb5dff4
feat(devflare): sendEmail pure-offline test parity — createMockSendEm…
Refzlund Jun 29, 2026
2af2b04
chore(release): version packages [skip ci]
github-actions[bot] Jun 29, 2026
23650d8
feat(devflare): server.liveReload + server.cf local-dev options (CF-15)
Refzlund Jun 29, 2026
b54cf56
chore(release): version packages [skip ci]
github-actions[bot] Jun 29, 2026
0ba2da4
fix(devflare): streamingTailConsumers rejects environment (wrangler S…
Refzlund Jun 29, 2026
06da2a8
chore(release): version packages [skip ci]
github-actions[bot] Jun 29, 2026
50a2474
feat(devflare): model Durable Objects binding environment sub-field (…
Refzlund Jun 29, 2026
088a0c2
chore(release): version packages [skip ci]
github-actions[bot] Jun 29, 2026
95b548f
fix(devflare): fold service-binding environment into the service name…
Refzlund Jun 29, 2026
9d5854d
chore(release): version packages [skip ci]
github-actions[bot] Jun 29, 2026
8e71c14
docs(devflare): generalize esbuild bundling-flag passthrough boundary…
Refzlund Jun 29, 2026
0ad0536
feat(devflare): reject route flags on non-custom-domain routes + add …
Refzlund Jun 29, 2026
5248085
chore(release): version packages [skip ci]
github-actions[bot] Jun 29, 2026
cd9efe6
feat(devflare): model+wire server.publicUrl local-dev knob (CF-28)
Refzlund Jun 29, 2026
9a2dcb5
chore(release): version packages [skip ci]
github-actions[bot] Jun 29, 2026
f3e1256
docs(devflare): record CF-29/CF-30 convergence — gap loop closed (zer…
Refzlund Jun 29, 2026
3e27fa5
feat(devflare): R2 presigned PUT/GET URLs with dev/prod symmetry
Refzlund Jul 11, 2026
fd33304
chore(release): version packages [skip ci]
github-actions[bot] Jul 11, 2026
50c14ab
fix(dev): bridge DO RPC methods past a custom fetch handler
Refzlund Jul 16, 2026
2d4643c
chore(release): version packages [skip ci]
github-actions[bot] Jul 16, 2026
4477cc9
fix(dev): relay Durable Object WebSocket-hibernation broadcast across…
Refzlund Jul 16, 2026
158aba5
chore(release): version packages [skip ci]
github-actions[bot] Jul 16, 2026
e8cd40f
fix(dev): forward app-route WebSocket upgrades to the app worker
Refzlund Jul 16, 2026
6fa9740
chore(release): version packages [skip ci]
github-actions[bot] Jul 16, 2026
03d550c
fix(bridge): preserve multiple Set-Cookie headers relayed through the…
Refzlund Jul 17, 2026
da69c22
chore(release): version packages [skip ci]
github-actions[bot] Jul 17, 2026
844e4e1
feat(dev-server): DEVFLARE_PERSIST_DIR env override for the persist d…
Refzlund Jul 17, 2026
9f01e44
chore(release): version packages [skip ci]
github-actions[bot] Jul 17, 2026
69a9d38
feat(devflare): workspace dev — run several apps in one Miniflare wit…
Refzlund Jul 17, 2026
a977ed4
chore(release): version packages [skip ci]
github-actions[bot] Jul 17, 2026
cd794ad
fix(dev-server): workspace dev crashed at startup for any app owning …
Refzlund Jul 17, 2026
ebadf79
chore(release): version packages [skip ci]
github-actions[bot] Jul 17, 2026
0b7ebc9
fix(sveltekit): ride out transient bridge outages when creating the d…
Refzlund Jul 21, 2026
ea7abcd
chore(release): version packages [skip ci]
github-actions[bot] Jul 21, 2026
2b42355
fix(bridge,sveltekit): a retried connect could dismantle the connecti…
Refzlund Jul 30, 2026
902ed96
chore(release): version packages [skip ci]
github-actions[bot] Jul 30, 2026
a53ad70
fix(dev-server): notice when the runtime dies, instead of serving 500…
Refzlund Jul 30, 2026
c4ddb2a
chore(release): version packages [skip ci]
github-actions[bot] Jul 30, 2026
0d3055f
fix(bundler): stop the inlineDynamicImports warning on every dev star…
Refzlund Jul 30, 2026
8384f9e
feat: let two instances share an app directory via DEVFLARE_DIR
Refzlund Jul 31, 2026
4bc6476
docs: regenerate the LLM handbook for DEVFLARE_DIR
Refzlund Jul 31, 2026
ce0d343
chore(release): version packages [skip ci]
github-actions[bot] Jul 31, 2026
4ac411f
fix: DEVFLARE_DIR was ignored on the path that actually runs
Refzlund Jul 31, 2026
d08148c
chore(release): version packages [skip ci]
github-actions[bot] Jul 31, 2026
48bab1b
feat: let the browser shim be moved off 8788, from the CLI
Refzlund Jul 31, 2026
0ce4104
chore(release): version packages [skip ci]
github-actions[bot] Jul 31, 2026
4c34bfb
fix: the browser shim served @cloudflare/puppeteer 1.0.x's endpoints …
Refzlund Aug 1, 2026
9a9431f
fix: the browser shim's sessions and history lists lacked their envelope
Refzlund Aug 1, 2026
d2b3b6d
chore(release): version packages [skip ci]
github-actions[bot] Aug 1, 2026
8c1284c
fix(bundler): stop the unresolved-import warning for Node builtin sub…
Refzlund Aug 2, 2026
092d1d0
chore(release): version packages [skip ci]
github-actions[bot] Aug 2, 2026
facd6b9
test: pin that a second test context starts with empty storage
Refzlund Aug 2, 2026
1cfb463
perf: createTestContext() reloaded the config for every context
Refzlund Aug 2, 2026
5fcd74a
fix: a suite with Durable Objects could only run one test file per pr…
Refzlund Aug 2, 2026
d543a5f
chore(release): version packages [skip ci]
github-actions[bot] Aug 2, 2026
67feb43
feat(email): outbox, SMTP relay with a recipient pin, and an IMAP inb…
Refzlund Aug 6, 2026
ac1d671
chore(release): version packages [skip ci]
github-actions[bot] Aug 6, 2026
45938ee
feat(config): a committed env tier, and a var that is required to bui…
Refzlund Aug 7, 2026
ddea3a0
chore(release): version packages [skip ci]
github-actions[bot] Aug 7, 2026
587f86c
feat(config): zones — Email Routing rules and DNS records, declared a…
Refzlund Aug 7, 2026
a25b3e0
chore(release): version packages [skip ci]
github-actions[bot] Aug 7, 2026
a20aa35
feat(config): zones.emailSending — check, and optionally perform, sen…
Refzlund Aug 7, 2026
a69d3c2
chore(release): version packages [skip ci]
github-actions[bot] Aug 7, 2026
166a389
feat(config): eventSubscriptions — platform events onto a Queue, reco…
Refzlund Aug 7, 2026
e02aaca
chore(release): version packages [skip ci]
github-actions[bot] Aug 7, 2026
dd5d525
fix(config): create forward destinations before the rules — the verif…
Refzlund Aug 7, 2026
1a8bd5c
fix(dev-server,sveltekit): a reloading runtime is not a dev server th…
Refzlund Aug 7, 2026
fe3614c
chore(release): version packages [skip ci]
github-actions[bot] Aug 7, 2026
9f93d43
fix(email): the outbound loopback listener let one open socket hold t…
Refzlund Aug 7, 2026
c6b32a9
chore(release): version packages [skip ci]
github-actions[bot] Aug 7, 2026
a74e46f
fix(config): a DNS record Cloudflare OWNS is reported, not attempted
Refzlund Aug 7, 2026
50bc536
chore(release): version packages [skip ci]
github-actions[bot] Aug 7, 2026
c5ab77e
fix(dev-server,bridge,test): a rate limit binding carries its namespa…
Refzlund Aug 7, 2026
1c0bdd1
chore(release): version packages [skip ci]
github-actions[bot] Aug 7, 2026
437a6f9
fix(dev-server,bridge,test): a WebSocket route that refuses is a refu…
Refzlund Aug 10, 2026
1c7f506
chore(release): version packages [skip ci]
github-actions[bot] Aug 10, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
8 changes: 8 additions & 0 deletions .changeset/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
# Changesets

Hello and welcome! This folder has been automatically generated by `@changesets/cli`, a build tool that works
with multi-package repos, or single-package repos to help you version and publish your code. You can
find the full documentation for it [in our repository](https://github.com/changesets/changesets).

We have a quick list of common questions to get you started engaging with this project in
[our documentation](https://github.com/changesets/changesets/blob/main/docs/common-questions.md).
16 changes: 16 additions & 0 deletions .changeset/absent-in-dev-honours-a-real-value.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
---
'devflare': patch
---

Correct what `.absentInDev()` promises. It said the key is "omitted entirely in dev"; what it
actually does — and always did — is omit the key when NOTHING supplies a value. A value that is
genuinely present still wins, in dev as everywhere else.

That is the intended escape hatch: a developer who deliberately exports a sender to point their
machine at a real one gets it. But the absolute phrasing invited the pairing that defeats the
descriptor entirely — writing the value into `.env.public`, which is committed, so it reaches
every checkout and hands the exact placeholder to every laptop the descriptor exists to withhold.
The documentation now says both halves, and a test pins the behaviour so the warning cannot
quietly become false.

No behaviour change.
28 changes: 28 additions & 0 deletions .changeset/bridge-app-route-websocket-forward.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
---
'devflare': patch
---

Fix `devflare dev`: forward app-route WebSocket upgrades to the app worker.

In worker mode the dev gateway runs as the entry worker (`routes: ['*']`) with
the app (e.g. SvelteKit) worker as a service binding. A browser opening
`new WebSocket('/api/doc/:id/subscribe')` — whose handler does
`return stub.fetch(clientUpgradeRequest)` and returns the Durable Object's `101`
— never reached that handler: the gateway hijacked **every** unmatched WebSocket
upgrade into its in-worker bridge RPC socket. The socket appeared to upgrade
(`101`), but the app route never ran, so a DO's hibernation broadcast never
crossed tabs and a second concurrent connection could not share the DO instance.

This is distinct from the programmatic `stub.connect()` path fixed in the prior
release; it is the path a Worker/SvelteKit route takes when it forwards a client
WebSocket upgrade to a DO.

The gateway now forwards an unmatched WebSocket upgrade to the app worker and
passes its response through when the app answers with a genuine upgrade
(`101` + a `webSocket`), so `stub.fetch(clientUpgradeRequest)` reaches the DO and
its client socket streams back to the browser — two tabs then share one DO
instance and `ctx.getWebSockets()` broadcasts (and `webSocketClose` leave frames)
work. It falls back to the bridge RPC socket only when the app does not answer
with an upgrade (the bridge client path, which exists only when there is no app
worker). The `/_devflare/do-ws` connect() path, configured `wsRoutes`, and the
native DO RPC path are unchanged.
19 changes: 19 additions & 0 deletions .changeset/bridge-do-rpc-native-dispatch.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
---
'devflare': patch
---

Fix `devflare dev`: bridge Durable Object RPC **method** calls (e.g.
`stub.push(arg)`, `stub.pull(since)`) when the DO also defines a custom `fetch()`
handler.

The local dev gateway routed every DO method call through the DO's `fetch()`
using an internal `_rpc` convention. A DO that `extends DurableObject` and
overrides `fetch()` — for example a websocket-only handler that returns `426`
for non-upgrade requests — received that probe on its own `fetch()`, returned a
non-JSON body, and the call failed with a bogus `... is not valid JSON` error.

The gateway now dispatches method calls natively (`stub[method](...args)`) —
exactly as on real Cloudflare, and matching what `devflare/test` already did —
and only falls back to the `_rpc` fetch convention for Durable Objects that are
not RPC-enabled. The `.fetch()`/WebSocket bridge paths are unchanged and still
reach the user handler.
24 changes: 24 additions & 0 deletions .changeset/bridge-do-websocket-fix.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
---
"devflare": patch
---

Fix the Durable Object WebSocket relay through the live dev gateway, and harden
proxied-response limits:

- **DO WebSocket `stub.connect()` was broken in both directions.** The live
gateway (`gateway-runtime.ts`) and the bridge client disagreed on the WS-data
wire format: the client sent/expected binary `WsData` frames while the gateway
only read string frames inbound and emitted a JSON `ws.data` envelope outbound,
so every payload was silently dropped. The gateway now speaks the same binary
`WsData` frame format as the client (matching `wire.ts`/`server.ts`) in both
directions, honoring the TEXT flag. Added an end-to-end integration test that
round-trips binary (both directions) and a text frame through the real gateway.
- **Oversized proxied responses now throw a clear error** instead of being
silently truncated. DO and service-binding `fetch()` responses reached through
the bridge are delivered inline over the WebSocket and are capped at 512 KB
(workerd's ~1 MB message limit); a larger body now throws, with the boundary
documented in the Cloudflare support matrix. Large R2 objects remain exempt
(HTTP transfer side-channel).
- The gateway handshake now advertises only the capabilities it actually
implements end-to-end (`ws-relay`, `http-transfer`); `streams` is no longer
advertised since proxied responses are inlined, not streamed.
31 changes: 31 additions & 0 deletions .changeset/bridge-do-websocket-hibernation-broadcast.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
---
'devflare': patch
---

Fix `devflare dev`: relay a Durable Object's WebSocket-hibernation cross-socket
broadcast.

Two WebSocket clients connecting to the SAME DO instance
(`env.DOC_ROOM.getByName(id)` twice) could not see each other's messages when the
DO used the hibernation API (`ctx.acceptWebSocket()` with the runtime-dispatched
`webSocketMessage`/`webSocketClose` handlers and a `ctx.getWebSockets()`
broadcast). The upgrade succeeded (`101`) and both sockets landed on one instance
(`ctx.getWebSockets().length` reached 2), but `webSocketMessage` never fired, so
a frame sent by one client was never delivered to the other.

Root cause: the bridge gateway pumped the DO's WebSocket **in-process** (it called
`stub.fetch(upgrade)` and drove the returned client socket with
`accept()`/`send()`). An in-process-pumped partner socket does not trigger
workerd's hibernation dispatch — only a genuine inbound connection does. The
`devflare/test` gateway had no DO WebSocket handler at all, so `stub.connect()`
hung there.

Durable Object `connect()` now opens a real pass-through WebSocket to a new
`/_devflare/do-ws` gateway endpoint, which forwards the upgrade to the DO and
returns its `101` response verbatim (the same pattern the browser WebSocket routes
already use). miniflare then wires the inbound connection to the DO's client
socket, so the runtime dispatches the hibernation handlers and delivers
`ctx.getWebSockets()` broadcasts across every connected client — exactly as on
real Cloudflare. Both the `devflare dev` and `devflare/test` gateways are covered.
The single-socket WebSocket path, the legacy in-process relay (`createWsProxy`),
and the native DO RPC path are unchanged.
27 changes: 27 additions & 0 deletions .changeset/bridge-set-cookie-fidelity.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
---
'devflare': patch
---

Fix multi-`Set-Cookie` corruption when a response is relayed through the dev
bridge.

When a Durable Object or service-binding `fetch()` response set **more than one**
cookie (e.g. a session cookie plus a CSRF cookie), the bridge flattened the
response headers with `Headers.entries()`/`forEach()`. Per the Fetch spec's
sort-and-combine, those APIs fold multiple `Set-Cookie` headers into a single
comma-joined value, so the browser received one corrupted
`Set-Cookie: a=1; Path=/; SameSite=Lax, b=2; Path=/; HttpOnly` — the second
cookie was lost and the first mangled. This bit any response relayed via a
service-binding or DO `fetch` through the local bridge whenever the gateway ran
under a compatibility date before `2023-08-01` (where workerd still combines
`Set-Cookie` and has no `getSetCookie()`).

The bridge now enumerates `Set-Cookie` separately and carries each value as its
own entry through serialize → deserialize (reconstructed with `append`, never a
join), so every cookie survives byte-faithfully with all attributes intact. It
reads cookies via the standard `Headers.getSetCookie()` and falls back to
workerd's legacy `getAll('set-cookie')`; when a runtime exposes neither, the
combined value is preserved verbatim rather than dropped. Both the workerd
gateway (`GATEWAY_RUNTIME_JS`) and the host-side (`server.ts`) serialization
paths are fixed, for `Request` and `Response` alike. Single-cookie and
non-cookie headers are unchanged.
30 changes: 30 additions & 0 deletions .changeset/bridge-superseded-socket-isolation.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
---
"devflare": patch
---

Stop a retried bridge connect from tearing down the connection it just established,
and stop the SvelteKit handle from blaming a request's own error on the platform.

**`BridgeClient` — a superseded socket could dismantle the live connection.** A refused
socket rejects on `error` but stays alive until its `close` arrives, so a caller that
retries in between replaces `this.ws` while the old socket is still wired to its
handlers. Those handlers were unconditional: the abandoned socket's `close` ran
`handleDisconnect()` — clearing `isConnected`, dropping the codec and rejecting every
in-flight call on the connection that had just replaced it — while a late `open`
installed a second codec over the live one, and either could clear another attempt's
in-flight marker. The connect timeout, too, closed whichever socket was current rather
than the one that attempt opened. Every handler now acts only while its own socket is
still the client's, and settles its own attempt. Overlapping attempts were rare when a
request connected once; `connectBridgeWithRetry` (added in the previous release) retries
~20 times inside a single request, which makes them routine — so a bridge that blinked
during an HMR reload could leave the client wedged rather than reconnected.

**`devflare/sveltekit` — the platform fallback caught the whole request.** The `try` in
`handle`/`createHandle` spanned both `createDevflarePlatform()` and `resolve(event)`, so
an error thrown anywhere downstream was logged as `[devflare] Failed to create platform`
— hiding the real cause behind a wrong diagnosis — and the request was then re-run via
the fallback. That re-run repeated every side effect the first pass had already
performed, and ran outside the request context devflare had established for it, so
`getContext()`/`env()` throw during the retry. The fallback is now scoped to building the
platform: a request that fails on its own merits propagates, once. A genuine platform
failure still falls through to an unbridged `resolve()` exactly as before.
23 changes: 23 additions & 0 deletions .changeset/browser-shim-port-flag.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
---
'devflare': patch
---

Let the local Browser Rendering shim be moved off 8788, via `--browser-shim-port` / `DEVFLARE_BROWSER_SHIM_PORT`.

The shim is a listener of its own beside the Miniflare runtime, and its port was only reachable
from `createDevServer()` — never from the CLI. So two `devflare dev` servers that both declared a
`browser` binding collided on 8788 no matter how their runtime ports were arranged, which is
exactly the multi-instance setup `--runtime-port 8788` and `DEVFLARE_DIR` otherwise make possible.
8788 is also a popular port to have already taken, being one off the 8787 runtime default.

Both dev commands now take the port:

```bash
bunx --bun devflare dev --runtime-port 8790 --browser-shim-port 8791
DEVFLARE_BROWSER_SHIM_PORT=8791 bunx --bun devflare dev
```

`workspace dev` reads the same flag as the FIRST port of its per-app block (each app that binds
browser rendering listens on that plus its index), which otherwise starts at 9700. The flag beats
the environment variable, and either one is rejected with a clear error rather than quietly
falling back when it is not a usable port. Unset, both commands bind exactly as before.
29 changes: 29 additions & 0 deletions .changeset/browser-shim-puppeteer-1-1-endpoints.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
---
'devflare': patch
---

Serve the endpoints `@cloudflare/puppeteer` 1.1.0 and later actually call, so `puppeteer.launch(env.BROWSER)` works again.

The local Browser Rendering shim was built against `@cloudflare/puppeteer` 1.0.x and still
served only its URLs. 1.1.0 moved every one of them without a major bump, so a current client
never reached the shim at all — `launch()` failed at the first call with
`Unable to create new browser: code: 404: message: Not found`, which is the shim's own 404
travelling back through the binding.

| client | acquire | devtools websocket |
| ------- | ----------------------------- | ------------------------------------------- |
| ≤ 1.0.7 | `GET /v1/acquire?…` | `GET /v1/connectDevtools?browser_session=…` |
| ≥ 1.1.0 | `POST /v1/devtools/browser?…` | `GET /v1/devtools/browser/<sessionId>` |

Both generations are now served, on one route table, so which client version an app pins stays
the app's decision rather than devflare's.

The same release also dropped the transport's chunk framing — up to 1.0.7 every CDP message
travelled as binary frames behind a 4-byte length header, with a keep-alive ping each second,
and from 1.1.0 it is plain unframed JSON. Fixing only the paths would therefore have moved the
failure rather than removed it: the session would open and then the first `Browser.getVersion`
would arrive wrapped in a header the client no longer unwraps. The binding worker now picks its
framing from the path the client connected on, which is exactly as reliable a signal, the two
having changed in the same release.

`/v1/sessions`, `/v1/history` and `/v1/limits` never moved and are untouched.
17 changes: 17 additions & 0 deletions .changeset/browser-shim-sessions-envelope.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
---
'devflare': patch
---

Return the browser shim's session and history lists in the envelope `@cloudflare/puppeteer` reads them from.

`puppeteer.sessions(env.BROWSER)` and `.history(env.BROWSER)` both resolved to `undefined`
against the local shim. The client does `JSON.parse(text).sessions` and `JSON.parse(text).history`
— it has in every version it has shipped, and its own types say so (`SessionsResponse`,
`HistoryResponse`) — while the shim answered with a bare array, so the field it looked for was
never there.

Unlike the endpoint move alongside this, that was never a version skew: it was equally wrong for
every client. `/v1/limits` was already correct and is untouched.

Anything reading `/v1/sessions` or `/v1/history` off the shim directly rather than through
puppeteer now finds the array one field in.
27 changes: 27 additions & 0 deletions .changeset/builtin-subpath-externals.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
---
"devflare": patch
---

Stop the `[UNRESOLVED_IMPORT] Could not resolve 'fs/promises'` warning that rolldown
printed on every `devflare dev` start-up for a dependency that imports a Node builtin
**subpath**.

The bundler's external list was hand-maintained and named only ~20 bare builtins, so
every subpath — `fs/promises`, `stream/web`, `stream/promises`, `timers/promises`,
`dns/promises`, `util/types`, `assert/strict`, `path/posix`, … — fell through it, as did
whole builtins the list never gained (`timers`, `process`, `worker_threads`,
`perf_hooks`, `diagnostics_channel`, `http2`, …). A dependency only has to
`await import('fs/promises')` in a Node-only branch, as `@cloudflare/puppeteer` does, for
the worker-compat transform to hoist it into a static import and turn it into a warning
on every build.

The list is now derived from the runtime's own `builtinModules`, so it cannot drift from
Node's builtin set again. Rolldown already externalized these specifiers after warning
about them, so the bundle it writes is byte-identical — only the warning goes away.

One behaviour change worth knowing: a bare builtin name now resolves to the builtin even
when an npm package of the same name is installed. That was already true for `fs`,
`path`, `stream`, `crypto`, `events`, `util`, `url`, `assert` and the rest of the old
list; it now also holds for the builtins it missed, `punycode` among them. Packages that
only a non-Node host reports as builtins — Bun lists `ws` and `undici` — are excluded, so
they keep being bundled from `node_modules`.
12 changes: 12 additions & 0 deletions .changeset/cf-binding-remote-preview-fields.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
---
"devflare": minor
---

Model the `remote` flag and preview/jurisdiction/migration fields on the core
resource bindings. KV, D1, R2, queue producers, and service bindings now accept
`remote?: boolean` (use the real remote resource during local dev), and KV
(`previewId`), D1 (`previewDatabaseId`, `migrationsTable`, `migrationsDir`), and
R2 (`previewBucketName`, `jurisdiction`) accept their preview/jurisdiction/
migration fields — all compiled to the matching wrangler keys. R2 buckets and
queue producers now accept an object form (`{ bucketName | queue, remote, … }`)
in addition to the existing string shorthand, which keeps working unchanged.
16 changes: 16 additions & 0 deletions .changeset/cf-cron-fetch-lint-secrets.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
---
"devflare": minor
---

Add build-time safety checks and cron validation. Cron expressions are now
validated against Cloudflare's 5-field grammar (`src/config/cron.ts`) at
config-parse time (a `.superRefine()` on `triggers.crons`) and in
`cf.scheduled.trigger(cron)`, so a typo like `cf.scheduled.trigger('* * *')`
fails with an actionable message instead of silently passing. The explicit
2-arg fetch-handler style requirement is now also checked at dev-start / `build`
time (`validateFetchHandlerStyle()` in the shared worker-load chokepoint),
reusing the exact same resolver and style markers as the request-time check —
zero false positives, with the runtime check kept as the backstop. Finally, a
successful **production** deploy prints a one-line hint that runtime secrets are
set via `wrangler secret put` / the dashboard (devflare never sends secret
values to Cloudflare); the hint never fires on preview or dry-run deploys.
11 changes: 11 additions & 0 deletions .changeset/cf-deploy-lifecycle.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
---
"devflare": minor
---

Add deploy-lifecycle parity. `devflare deploy --prod --percentage <n>` performs a
gradual/canary rollout (uploads a new version with `wrangler versions upload`,
then shifts `<n>%` of traffic to it via `wrangler versions deploy <id>@<n>`, with
an optional `--version` to pin the version keeping the remainder) — production
only, never shifting traffic on preview/dry-run. New `devflare tail` command
streams a deployed worker's live logs over Cloudflare's tail API (`--format
pretty|json`, clean teardown on exit).
11 changes: 11 additions & 0 deletions .changeset/cf-local-dev-wiring.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
---
"devflare": minor
---

Wire deploy-modeled-only bindings into local development. Analytics Engine now
binds in local dev (Miniflare's write-only no-op stub, so `writeDataPoint()` no
longer throws), tail consumers are delivered locally when the consumer Worker is
present in the same dev instance (the tail handler was already testable via
`cf.tail.trigger()`), and the mTLS `remote` flag is forwarded to the local
binding so deploy and local dev agree on the binding shape. Wired consistently
across the dev server, the cross-process bridge, and the test context.
10 changes: 10 additions & 0 deletions .changeset/cf-stale-claims.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
---
"devflare": patch
---

Correct stale offline-support classifications. Durable Objects and Service
bindings are no longer mislabelled "no offline support" — they run fully locally
under `createTestContext()` (Miniflare executes the DO class / resolves the
service binding), classified honestly as offline-native with the caveat that
there is no pure in-memory `createMockEnv()` mock for them. (Vectorize was
reclassified to an offline fixture in the previous release.)
14 changes: 14 additions & 0 deletions .changeset/cf-stream-vpc-flagship-bindings.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
---
"devflare": minor
---

Add first-class support for three more Cloudflare bindings: **Stream**
(`bindings.stream`), **VPC** (`bindings.vpcServices` / `bindings.vpcNetworks`),
and **Flagship** (`bindings.flagship`). Each is schema-validated, compiled to the
matching wrangler keys (`stream`, `vpc_services`, `vpc_networks`, `flagship`),
typed on the generated `env`, and documented in the support matrix. Stream runs
locally through Miniflare with a deterministic pure mock (`createMockStreamBinding`)
for hosted operations; Flagship has a configured-value pure mock
(`createMockFlagshipBinding`) — its local Miniflare plugin returns call defaults,
not evaluated flags; VPC services/networks are a remote boundary (Miniflare only
proxies them) testable via a custom fake injected through `createMockEnv`.
Loading