github Effect-TS/effect effect@4.0.0

Patch Changes

  • #8580 cbfc7b4 Thanks @gcanti! - Restrict Schema.brand to a single concrete identifier and require Schema.fromBrand to use the constructor's sole brand key. Apply brand or fromBrand repeatedly when composing distinct brands. For enum brand keys, pass the enum member instead of its string value.

  • #8601 5a81a6f Thanks @RizgarOzan! - Prevent a stale Atom.family finalizer from evicting a newer cached atom.

  • #8576 68b6394 Thanks @tim-smart! - Prevent stale concurrent workflow resumes from clearing a newer completed reply. Custom message storage implementations must honor the optional expected reply ID on clearReplies to provide this safety guarantee.

  • #8589 5250ca6 Thanks @marek-hanzal! - Fix lost synchronous successes and failures in concurrent Atom.fn calls.

  • #8625 5f9c9d1 Thanks @tim-smart! - Fix MutableHashMap retaining previously used equal object keys after they are replaced or removed, including when Cache and ScopedCache refresh entries on hits.

  • #8619 3278821 Thanks @tim-smart! - Keep Queue.takeN suspended when only part of its requested batch is available. Previously a single offer woke the batch taker in a synchronous retry loop that starved the host. Queue.State.takers now holds Queue.Taker entries: call entry.resume(...) instead of calling the entry as a function.

  • #8607 83429b4 Thanks @mannyc2! - Interrupt losers in Effect.race, Effect.raceFirst, Effect.raceAll and Effect.raceAllFirst when the race settles or is interrupted while other effects are still starting.

  • #8626 0af6d0c Thanks @tim-smart! - The RpcMessage.ExitEncoded interrupt fiberId type now admits the null emitted by JSON encoding. Consumers reading encoded interrupts should handle null alongside undefined.

  • #8614 927e01e Thanks @gcanti! - Fix SchemaRepresentation.toCodeDocument to preserve the grouping of branded union types in generated TypeScript code.

  • #8617 10d8524 Thanks @gcanti! - Fix Schema.toType and Schema.toEncoded losing parent checks when projecting checked children without transformations. Suspended children remain opaque, and structural checks continue to be preserved.

  • #8583 35ac25a Thanks @KhraksMamtsov! - Array, Chunk, Effect, and Record partition, their separate helpers, and Option.partitionMap now return successes before failures, matching Stream.partition. Swap the tuple when moving from the previous [failures, successes] order.

  • #8585 29e0aa7 Thanks @roninjin10! - Preserve sibling and callback cleanup failures alongside interruption in concurrent Effect.forEach / Effect.all, including shared Layer.build.

  • #8593 8783536 Thanks @tim-smart! - Fail in-flight RPC calls when a socket misses a pong, even with transient connection retries enabled. Missed pongs no longer invoke onTransientError; connection-open failures still do.

  • #8579 df77fff Thanks @jasonkuhrt! - Fix union-of-tag inference for flat RPC clients and AtomRpc.query and AtomRpc.mutation. Payloads and results now reflect the selected RPCs instead of resolving to never.

  • #8628 ef7d77f Thanks @gcanti! - Make Schema.brand type-only: brand identifiers are no longer stored in AST annotations or preserved by SchemaRepresentation. Reapply Schema.brand after rebuilding a representation when a branded TypeScript type is required; checks added by Schema.fromBrand remain preserved. Preserve the order of equal-priority union members that share an AST when deriving JSON and string-tree codecs.

  • #8597 035e369 Thanks @Ceereals! - Speed up JIT and AOT Schema decoding of transformations whose source has checks, such as a pattern-checked string decoded to a number. Fix compiled TemplateLiteral validation to enforce oneOf parts and preserve interpreter diagnostics when templates appear in transformation chains.

  • #8630 f72790c Thanks @gcanti! - Fix duplicate references in decoded and encoded schema representations when reusing schemas through optional or mutable keys.

  • #8555 aa19472 Thanks @front-depiction! - Resolve a Schema union's candidate parsers once per union instead of on every decode, so union decoding and encoding allocate less and run faster.

  • #8598 988c467 Thanks @tim-smart! - Close server WebSockets with 1000 on success, 1001 on interruption, or 1011 on failure, while preserving explicit close codes. HTTP request scopes retain the handler's failure exit through response handling and middleware.

  • #8632 735b77b Thanks @gcanti! - Add succeedEffect, failEffect, and verifyRoundTripEffect to TestSchema so assertions can use the calling Effect's services, test clock, and interruption, and mark the module and its public APIs as unstable. Preserve defects and interruption when they occur alongside schema validation failures. Rename verifyLosslessTransformation to verifyRoundTrip; existing callers must update to the new name.

  • #8575 e5f7d12 Thanks @tim-smart! - Retry failed workflow run resets instead of acknowledging deferred completion before the run resumes.

  • #8633 2c552f2 Thanks @IMax153! - Effect 4.0 is the first stable release of Effect v4. It replaces the 4.0.0 beta and release-candidate series, whose per-release notes remain below under the 4.0.0-beta.* and 4.0.0-rc.* headings. To upgrade from Effect 3, follow the migration guide.

    Packaging and versioning

    • All Effect packages share one version number and are released together. Use the same version of effect and every @effect/* package.
    • @effect/platform, @effect/rpc, @effect/cluster, @effect/cli, @effect/ai, @effect/sql, @effect/workflow, @effect/experimental and similar packages are merged into effect. Separate packages remain only for platforms (@effect/platform-*), SQL drivers (@effect/sql-*), AI providers (@effect/ai-*), framework bindings (@effect/atom-*), OpenTelemetry, Vitest and tooling.
    • Modules such as effect/http, effect/http-api, effect/rpc, effect/cluster, effect/workflow, effect/ai, effect/cli, effect/sql and effect/schema import from effect/<area>. APIs tagged @stability unstable may have breaking changes in minor releases. APIs without a stability tag follow semver.
    • APIs that expose a third-party dependency are tagged @stability unstable, because that dependency's releases can change them. This covers NodeRedis, DenoRedis, BunRedis, @effect/platform-node/Undici and the undici dispatcher APIs, the ws options and re-exports in the platform packages, driver-specific options and clients in @effect/sql-clickhouse, @effect/sql-d1, @effect/sql-libsql, @effect/sql-mssql, @effect/sql-mysql2, @effect/sql-pglite and @effect/sql-sqlite-do, the provider clients, models and generated schemas in the @effect/ai-* packages, @effect/opentelemetry, and the vitest re-export in @effect/vitest.
    • effect has no runtime dependencies.
    • New packages in v4: @effect/platform-deno, @effect/sql-pglite, @effect/ai-openai-compat, @effect/ai-typesafe, @effect/atom-react, @effect/atom-solid, @effect/atom-vue, @effect/openapi-generator and @effect/doctest. @effect/docgen now lives in this repository.

    Core

    • The fiber runtime was rewritten for lower memory use and faster execution, with smaller bundles and better tree-shaking.
    • Services are defined with Context.Service, FiberRef is replaced by Context.Reference, Cause has a flat structure, and many combinators were renamed. See the migration guide for the full list.
    • Software transactional memory is built into Effect.tx, with TxRef, TxQueue, TxHashMap, TxPubSub, TxSemaphore and related Tx* data types.
    • Clock separates wall-clock time from monotonic time.
    • New modules include Semaphore, Latch, LayerRef, ErrorReporter, ByteSize, Newtype and Crypto. Arbitrary is now a native property-based testing module and no longer depends on fast-check.

    Schema

    • Schema v4 is a new implementation with faster parsing, class-based schemas, make constructors on every schema, and effectful decoding with services.
    • SchemaRepresentation powers JSON Schema (Draft-04, Draft-07, 2020-12 and OpenAPI 3.0/3.1) import and export, TypeScript code generation, and AI structured output.
    • SchemaBinary provides a compact binary codec and is the default wire format for cluster transports.
    • Optional JIT and AOT schema compilers are available as experimental modules.

    Platform, HTTP and RPC

    • HttpApi supports typed response headers, streaming and SSE responses, the HTTP QUERY method, HttpApiTest for in-memory testing, and much faster type checking for large APIs.
    • The HTTP modules add static file serving, response compression, rate-limited clients and graceful server shutdown.
    • Socket has a pull-based reader with backpressure and STARTTLS support. Network addresses are modeled by effect/net.
    • RPC serialization is schema-aware and supports server-originated requests and notifications.
    • @effect/platform-deno adds full Deno support. The Node, Bun, Deno and browser packages all provide the platform Crypto service, and the browser package adds IndexedDB support.

    Cluster and Workflow

    • Workflows can be declared with class syntax, and DurableQueue and an in-memory WorkflowEngine are available.
    • Runner memory can be bounded with ShardingConfig limits. Shutdown, entity movement and persisted replies are more reliable.

    SQL

    • @effect/sql-pg uses a built-in PostgreSQL client with pipelining, prepared statements and binary codecs, and no longer depends on pg.
    • @effect/sql-sqlite-node uses Node's built-in node:sqlite and requires Node 22.16 or newer.
    • SqlError exposes structured reasons such as UniqueViolation.

    AI

    • effect/ai adds EmbeddingModel, the DecisionModel classification and rating API, dynamic tools and tool approvals.
    • The MCP server supports protocol versions 2024-11-05 through 2026-07-28, including elicitation, sampling with tools, resource subscriptions and typed tool output.
    • Provider packages cover Anthropic, OpenAI, OpenAI-compatible APIs and OpenRouter.

    CLI, Atom, observability and testing

    • effect/cli adds global flags, command aliases and examples, an interactive wizard mode, and shell completions for Bash, Zsh and Fish.
    • effect/reactivity and the @effect/atom-* bindings add SSR hydration, stale-while-revalidate atoms and serializable RPC and HttpApi queries.
    • The OTLP exporters can be configured with standard OpenTelemetry environment variables, and @effect/opentelemetry aligns logs and spans with the OpenTelemetry specification.
    • @effect/vitest runs property tests with the native Arbitrary module and supports Vitest fixtures.

    Requirements

    • TypeScript 5.9 or newer. TypeScript 7 is recommended.
    • @effect/vitest and @effect/doctest require Vitest 5.
    • @effect/atom-react requires React 19.
    • @effect/platform-deno requires Deno 2.8.3 or newer.

Don't miss a new effect release

NewReleases is sending notifications on new releases.