v1.10.0
Forge Framework v1.10.0 (2026-09-02T18:50:05Z)
Welcome to this new release of Forge Framework!
Changelog
New Features
- 2e0d08c: feat(client): accept a per-call staleTime in all three adapters (@juicycleff)
- 2e3ccb6: feat(client): carry staleTime through x-forge-stale-time (@juicycleff)
- 5f78f6d: feat(client): classify a changed staleTime as compatible in diff (@juicycleff)
- 3e4d813: feat(client): declare a per-endpoint staleTime on a route (@juicycleff)
- 75367d0: feat(client): emit one module per operation and per hook (@juicycleff)
- 1c31d3d: feat(client): emit staleTime into the generated manifest (@juicycleff)
- d20fdba: feat(client): resolve the entity behind an undeclared collection envelope (@juicycleff)
- 23f4250: feat(client-core): add binderSnapshot for stream inspection (@juicycleff)
- b42ce4d: feat(client-core): add drop(key), clear() narrowed to one query (@juicycleff)
- fc35e71: feat(client-core): add poll, an interval refetch on an injected clock (@juicycleff)
- 18518df: feat(client-core): add revalidate, the seam ambient triggers drive (@juicycleff)
- 384dfba: feat(client-core): carry a codec reference, not only an id (@juicycleff)
- a31a03e: feat(client-core): carry the frame batch on the frames observer event (@juicycleff)
- 4201b40: feat(client-core): carry the settle time across hydration (@juicycleff)
- 3d3485d: feat(client-core): expose tracked records for the inspector (@juicycleff)
- 5396877: feat(client-core): refetch a time-expired query when it mounts (@juicycleff)
- feb56ad: feat(client-core): resolve a staleTime per subscriber, strictest wins (@juicycleff)
- 0b98dd4: feat(client-core): revalidate on focus and on reconnect, opt in (@juicycleff)
- 428da9e: feat(client-core): stamp a settle time from an injected clock (@juicycleff)
- 060a9bc: feat(client-devtools): add opt-in stream frame capture (@juicycleff)
- 1afd051: feat(client-devtools): add the action layer, kept separate from the reads (@juicycleff)
- cde5b0a: feat(client-devtools): add the panel shell beside the lean overlay (@juicycleff)
- 38727fd: feat(client-devtools): add the query detail and stream binder reads (@juicycleff)
- f3d8c08: feat(client-devtools): add the query detail pane and the action bar (@juicycleff)
- 0ec6969: feat(client-devtools): add the streams and frames tabs (@juicycleff)
- bb53b3a: feat(client-react): refresh a query the component does not hold (@juicycleff)
- f95d8d1: feat(client-react-devtools): mount the devtools from React (@juicycleff)
- 0b03fc2: feat(client-vue,client-angular): read staleTime reactively (@juicycleff)
- 947f246: feat(client-vue,client-angular): refresh a query the component does not hold (@juicycleff)
- c7bdd23: feat(core): add a shared scheduler for periodic work (@juicycleff)
Bug Fixes
- 404f2df: fix(client): make a dropped extension declaration say so (@juicycleff)
- 484983e: fix(client): return two InferEntity call sites to their author (@juicycleff)
- 9c48e0e: fix(client): say something when a $ref names a component that isn't there (@juicycleff)
- d954509: fix(client): strip every service prefix, not just the client's own (@juicycleff)
- db3861d: fix(client): two ways the generated entity table came out wrong (@juicycleff)
- 9915b49: fix(client): warn instead of silently dropping staleTime on a write (@juicycleff)
- c91495d: fix(client): warn on a GET/HEAD x-forge-stale-time that isn't usable (@juicycleff)
- f3ce3c5: fix(client-core): refuse to request a URL with an unsubstituted path parameter (@juicycleff)
- 000cd2d: fix(client-core): separate drop(key) from discardInflight(record) to keep Record_ internal (@juicycleff)
- 6ddccd9: fix(client-devtools): cap object width in the bounded copy walkers (@juicycleff)
- ae484e9: fix(client-devtools): document refetch's rejection and pin the guard with a test (@juicycleff)
- fd4f47f: fix(client-devtools): give the panel's entity rows a detail pane of their own (@juicycleff)
- 8448ccd: fix(client-devtools): revert bucket-count ruling, restore rAF coalescing (@juicycleff)
- 854d3fd: fix(client-react-devtools): address review findings (@juicycleff)
- 9edba92: fix(client-react-devtools): declare the client-devtools peer (@juicycleff)
- 79ae327: fix(deps): move every module to grpc 1.83.2 (@juicycleff)
Performance Improvements
- dd204d3: perf(app): serve health probes from cache, and start extensions in levels (@juicycleff)
- 966484b: perf(client): emit one module per codec (@juicycleff)
- 61541c2: perf(client-devtools): add a bulk record read and use it for the header buckets (@juicycleff)
- 0163c45: perf(health): stop discovery registering a check per container service (@juicycleff)
- 8832b4d: perf(metrics): keep the time-series store from rescanning itself (@juicycleff)
- 2fd1b49: perf(metrics): stream the scrape instead of building it as maps (@juicycleff)
- 1fb696a: perf(router): call standard and context handlers directly, not through reflect (@juicycleff)
- 69e1fc8: perf(router): hand reflect an interface-typed context argument (@juicycleff)
- c8c635a: perf(router): install extension middleware as one chain (@juicycleff)
- 62f2419: perf(router): stop publishing the legacy params map from the bunrouter adapter (@juicycleff)
Documentation Updates
- 0653ed2: docs(changelog): update CHANGELOG.md for v1.9.15 (@github-actions[bot])
- 05aa9bb: docs(changelog): update CHANGELOG.md for v1.9.16 (@github-actions[bot])
- 3c85909: docs(client-core): bring the size budget section back in step with the config (@juicycleff)
- 2a1afe0: docs(client-core): drop the em dashes from the README (@juicycleff)
- 8c225ae: docs(client-devtools): describe the panel, the action layer and seven core changes (@juicycleff)
- f314c8d: docs(client-packages): correct two budget notes that said the wrong thing (@juicycleff)
- d853494: docs(web-client): correct poll/throttle claims, document staleTime limits (@juicycleff)
- d5083b1: docs(web-client): correct the not-yet-shipped list against the code (@juicycleff)
- bdbeb56: docs(web-client): document staleTime and the revalidation installers (@juicycleff)
Build System
- 44409fa: build(client-core): raise the REST-only budget from 9417 B to 9700 B (@juicycleff)
- f7bc6f1: build(client-core): raise the query engine budget from 9.32 kB to 9.6 kB (@juicycleff)
- 8f013ea: build(client-devtools): raise the combined budget from 8.5 kB to 9 kB (@juicycleff)
- 530f74b: build(client-packages): filter the streams budget, raise the inspection one (@juicycleff)
- 3e49518: build: bump go-utils to v1.2.1 for the binder allocation work (@juicycleff)
- 66b3e0a: build: bump go-utils to v1.2.2, and benchmark a realistic request (@juicycleff)
Other Changes
- b2f80c5: chore(client-packages): bump the committed versions to 1.9.10 (@juicycleff)
- f1e87e9: chore(client-packages): drop two unused type imports from tests (@juicycleff)
- 7c97340: ci(client-packages): publish client-react-devtools (@juicycleff)
- 4a601f0: ci(client-packages): run client-react-devtools in the adapter matrix (@juicycleff)
- 037f569: test(client-core): cover poll's hidden-document branch (@juicycleff)
- 704e9c2: test(client-core): isolate revalidate's three skip conditions (@juicycleff)
- d3a0841: test(client-devtools): cover the populated streams and frames tabs (@juicycleff)
- 0ba97cd: test(client-devtools): cover the stream binder snapshot (@juicycleff)
- 8ad02b4: test(client-devtools): prove the panel and the React entry cost production nothing (@juicycleff)
- fc7e832: test(client-react-devtools): make the zero-cost test able to fail (@juicycleff)
Installation
Using Go Install
go install github.com/xraph/forge/cmd/forge@v1.10.0Download Binary
Download the appropriate binary for your platform from the assets below.
Using Package Managers
# Homebrew (macOS/Linux)
brew install xraph/tap/forge
# Scoop (Windows)
scoop bucket add xraph https://github.com/xraph/scoop-bucket
scoop install forgeWhat's Changed
Full changelog: v1.9.16...v1.10.0