Runtimes
The runtimes every Zap Studio package supports, the shared baseline, and the four packages that ask for more.
Every package targets the same baseline. Four packages need more than it, because of the browser API they build on.
The Baseline
| Runtime | Minimum version |
|---|---|
| Node.js | 18.0.0 |
| Bun | 1.0.0 |
| Deno | 1.42 |
| Cloudflare Workers | Any current release |
| Browsers | Chrome/Edge 98, Firefox 97, Safari 15.4 |
Nothing here uses a runtime-specific API. The packages are built on fetch, Request/Response, AbortSignal and crypto.subtle — web standards that every runtime above implements.
Deno 1.42 is the first release that installs packages from JSR, which is how Deno gets them: deno add jsr:@zap-studio/fetch.
Where a Package Asks for More
| Package | Extra requirement |
|---|---|
fetch |
A global fetch. Native from Node.js 18. |
webhooks |
The verification helper needs globalThis.crypto.subtle: global from Node.js 19, or Node.js 18 with --experimental-global-webcrypto. Browsers need a secure context (HTTPS). The router itself only needs Request/Response. |
retry |
Cancellation reads AbortSignal.reason, which sets the browser minimums in the table above. |
webmcp |
A browser with the native WebMCP API — today Chrome/Edge behind a flag. Everywhere else it is a safe no-op, so server rendering never breaks. |
react-hooks runs wherever React runs. Individual hooks wrap browser APIs of varying maturity, and each one fails closed — a hook reports supported: false instead of throwing when its API is missing. The useExperimental* prefix marks those.
oxfmt and oxlint are configuration presets. They run in your linter or formatter, not in your application, so the table above does not apply to them.
Server Rendering
Nothing touches window, document or navigator at module scope, so importing any package on the server is safe. The two browser-facing packages go further:
react-hooksreads browser APIs inside effects or behind guards, so server renders never throw and hydration never mismatches.webmcpregisters tools only when a realdocument.modelContextexists.
Modules
Every package ships standard ESM only, with no CommonJS build. Node.js resolves it through the exports field, so a require() call fails on purpose rather than loading a stale bundle.