// the find
Effect-TS/effect
Build production-ready applications in TypeScript
Effect is a TypeScript framework built around a functional effect system — think Haskell's IO monad but designed for production TypeScript. It gives you structured concurrency, typed errors tracked in signatures, dependency injection via Layers, and a 35+ package ecosystem (SQL, CLI, AI, distributed actors, durable workflows) all composable through the same primitives. This is for teams who want to treat side effects, failures, and dependencies as first-class concerns rather than bolting them on after the fact.
- Errors are part of the type signature — Effect<A, E, R> forces callers to acknowledge what can fail and with what, which eliminates a whole class of silent-failure bugs that plague standard Promise-based code
- The fiber-based concurrency model gets structured concurrency right: cancellation propagates correctly, resources are always cleaned up, and race/zip/timeout combinators compose without the footguns of raw Promise.race
- The ecosystem depth is real — @effect/sql covers Postgres, MySQL, SQLite, D1, and Drizzle/Kysely adapters, all through the same Layer DI, and @effect/cluster ships a working distributed actor model that most TypeScript frameworks don't attempt at all
- Schema is a serious runtime validation library integrated at the core, not a third-party afterthought — it drives codegen, serialization, and type derivation rather than just being a validator you call at the boundary
- The onboarding cliff is steep: you need to understand Layers, fibers, and the Effect type before writing anything non-trivial, and most developers will spend a week confused before it clicks — there's no shallow end of this pool
- Going all-in is essentially required — mixing Effect code with regular Promise-based libraries produces impedance mismatch and boilerplate wrappers everywhere; teams that adopt it partially end up with the worst of both worlds
- The API surface is genuinely enormous and the docs cover the basics but leave large gaps at the advanced end; you will end up reading source code or asking on Discord to understand behavior in non-obvious edge cases
- Bundle size is a concern for browser targets — even with tree-shaking, the core package is large, and pulling in @effect/platform-browser on top makes this a hard sell for anything latency-sensitive on the client