Effect-TS/effect: a TypeScript runtime for typed errors, DI and structured concurrency
Build production-ready applications in TypeScript. Effect Effect is a library for building reliable, maintainable, type-safe, and production grade applications in TypeScript.
At a glance
- What is it?
- Effect is an MIT-licensed TypeScript library that folds typed errors, dependency injection, structured concurrency and schema validation into one runtime. The v4 line is a release candidate, so the decision is less about capability than about whether you can live on the rc tag.
- Who is it for?
- Adopt Effect if you already run strict TypeScript and your pain is untyped thrown errors, ad-hoc dependency wiring or unstructured concurrency; the rc tag is a deliberate trade, not a hidden one. Do not adopt it for a small script, a team that will not enable the strict flag, or a project pinned to TypeScript below 5.9, because the README states strict type-checking is required and that TypeScript 5.9 or newer is the floor.
- Can I use it commercially?
- Yes. MIT is a permissive licence: you can use, modify and sell software built on it, as long as you keep its copyright and licence notices.
- Is it still maintained?
- Yes. The repository last received commits 3 days ago.
- What is it written in?
- Mainly TypeScript, according to GitHub's language statistics.
Answers come from the project's GitHub data, last synced on September 26, 2026, and from our analysis. They are not legal advice.
Editorial analysis
The problem Effect-TS/effect targets: errors, wiring and concurrency in one type
Most TypeScript services accumulate the same three failures. A function throws, and the throw is invisible in its signature, so the caller learns about the error path from production. Dependencies get passed as constructor arguments or module singletons, and the graph is only legible by reading every file. Concurrent work is spawned with promises that nobody owns, so cancellation and cleanup are best-effort.
Effect addresses all three through one abstraction. The README lists what it covers: typed errors, dependency injection, structured concurrency, scheduling, tracing, and unified schema validation. The audience is the team that has already hit the wall where a plain async function plus a try/catch no longer describes what the code can do. It is not aimed at scripts, and the README's own requirements make that explicit: strict type-checking must be enabled in tsconfig.json. A codebase that has not turned on strict is not a partial fit. It is the wrong starting point.
How the monorepo is arranged and what the rc tag means for upgrades
This is a pnpm workspace, not a single package. The root package.json declares packageManager [email protected] and marks the root private, while the published artifacts live under packages/. The core is the effect package; everything else extends it. The README describes the split, and the package table is the clearest map of scope: platform packages for node, bun, deno and browser, SQL clients for PostgreSQL, MySQL, MSSQL, ClickHouse, libSQL, Cloudflare D1 and several SQLite targets, AI providers for Anthropic, OpenAI, OpenRouter and OpenAI-compatible endpoints, and UI bindings for React, SolidJS and Vue through Effect Atom.
The versioning decision matters more than the package list. The README states plainly that Effect V4 is currently a release candidate and that the main branch contains v4 development. All v4 packages publish under the rc tag on npm. The v3 source lives on the v3 branch, and the README says issues and pull requests meant for v3 should be targeted there. So a team has two coherent positions: stay on v3, or build on the rc line and accept that the API surface is still moving. What the README does not document is a rollback path between rc releases, and the repository has no upgrade guide for v4 at the time of writing. MIGRATION.md exists at the top level, which suggests migration material is maintained, but the README itself does not walk through the v3 to v4 move.
Installing Effect TS and running a first typed program
The README gives one install command for the release candidate. Run it in a project that already has TypeScript 5.9 or newer and strict enabled in tsconfig.json; TypeScript 7 is recommended for performance and for compatibility with Effect's TypeScript tooling.
npm install effect@rcThat is the only install instruction the README provides. It does not include a worked first program, and the README does not show an import statement for the core package, so the smallest honest next step is to open the v4 API documentation linked from the package table at effect.website and follow the examples there rather than copying an unverified snippet.
For runtime-specific services, install the matching platform package. The README names @effect/platform-node for Node.js and @effect/platform-bun for Bun, and notes that some integration packages have higher runtime floors than the general Node.js 18 minimum. @effect/sql-sqlite-node is the example it gives, requiring Node.js 22.16 or newer.
Where Effect-TS/effect is the wrong tool
The strict flag requirement is the first real boundary. Effect's types are the product, and they lean on inference that a non-strict compiler will not carry. If your tsconfig.json cannot enable strict, the library's central guarantee is unavailable to you, and you would be paying the abstraction cost for a fraction of the benefit.
The release-candidate status is the second. Any team that cannot ship on an rc tag, or that has a policy against depending on prerelease versions in production, should look at the v3 branch instead of main. The README does not promise API stability for v4, and it does not describe a deprecation window between rc releases.
The third boundary is scale of problem. For a single script, a small CLI, or a service with two endpoints and no shared dependency graph, the runtime and its type machinery are overhead. Plain async/await with a Result-shaped return type covers that ground with fewer concepts. The README's own framing, production grade applications at scale, is a fair signal of where the library expects to be useful.
Effect vs zod plus a hand-rolled dependency container
The most common alternative stack is a validation library such as zod for parsing, a DI container or manual factory functions for wiring, and try/catch for errors. That combination works, and it is easier to introduce incrementally, because each piece is adopted on its own.
The difference in approach is that those tools do not share a type. A zod schema validates at the boundary; it does not describe what a function can fail with. A DI container resolves instances; it does not track what a function requires in its return type. Effect's claim, per the README, is unified schema validation alongside typed errors and dependency injection, so the same value carries its requirements, its error type and its success type. That unification is the reason the learning curve is steeper: you are not adding a library, you are changing the signature of your program. The other side of the comparison is @effect/opentelemetry, which the README lists for tracing, so observability is part of the same system rather than a separate instrumentation layer.
Licence and the cost of tracking an rc line
The repository is MIT licensed, which permits commercial use and modification with the usual attribution requirement. This is a statement about the licence text, not legal advice; if your organisation has a review process for dependencies, the MIT identifier is what it will be evaluated against.
The upgrade cost is the part worth budgeting. Because v4 publishes under the rc tag, a version bump is a deliberate act: npm install effect@rc moves you to whatever the latest release candidate is, and the README does not describe a compatibility shim between candidates. The repository carries a .changeset/ directory and a changeset-version script in the root package.json, so release notes are generated per change, which is the mechanism to read before bumping. There is also a migration/ directory at the top level alongside MIGRATION.md, which is where the project keeps migration material. What is not documented in the README is a support window for older rc versions, so pinning an exact rc version is the safer default than floating on the tag.
Editorial conclusion
Adopt Effect if you already run strict TypeScript and your pain is untyped thrown errors, ad-hoc dependency wiring or unstructured concurrency; the rc tag is a deliberate trade, not a hidden one. Do not adopt it for a small script, a team that will not enable the strict flag, or a project pinned to TypeScript below 5.9, because the README states strict type-checking is required and that TypeScript 5.9 or newer is the floor. Before committing, verify three things in your own repository: that npm install effect@rc resolves to the version you expect, that tsc -b passes with strict enabled, and that any integration package you need (for example @effect/sql-sqlite-node, which the README says requires Node.js 22.16 or newer) matches your runtime.
Frequently asked questions
What is Effect-TS/effect?
It is a TypeScript library for building production applications, and the README lists typed errors, dependency injection, structured concurrency, scheduling, tracing and unified schema validation as what it covers. It ships as the core effect package plus integration packages for platforms, SQL clients, AI providers and UI bindings.
How do I install Effect-TS/effect?
The README gives npm install effect@rc for the v4 release candidate. Your project needs TypeScript 5.9 or newer with the strict flag enabled in tsconfig.json, and Node.js 18 or newer as the general runtime minimum.
Is Effect-TS/effect the same as the everyday word effect?
No. The library is a TypeScript package published on npm whose documentation lives at effect.website, and its subject is application architecture rather than the noun or the verb affect.
Official sources
Add this badge to your README
If you maintain this project, the badge below links readers to this analysis and shows its maintenance status from the daily GitHub snapshot. Paste the markdown into your README; add ?metric=license or ?metric=stars to the image URL for a different field.
[](https://hysenlabs.com/projects/effect-ts-effect)