ozaco is a set of runtime-agnostic TypeScript packages: an effect and results system, and an IO and Server layer that runs the same on Bun, Node and the Web.
Four properties the runtime holds, and the API that gives each one — guarantees about shape, not speed.
An operation settles as a Result. Nothing is thrown, so the type says what can go wrong.
isFailure(result)A spawned task cannot outlive its scope. Closing one halts its children and waits for them.
yield* spawn(worker)Cleanup is registered on the way in. It runs however the body leaves — return, failure or halt.
yield* ensure(close)The same code on Bun, Node and the Web. The backend is picked at the import, not in your logic.
yield* IO.actions.mkdir(...)Everything else — the server, the CLI, the database layer — is built on the same effect system and the same result type.
bun add @ozaco/std