Pithos vs Effect: Different Tools for Different Problems
Most TypeScript projects don't need a full effect runtime. If you're looking for a lightweight alternative, Pithos might be what you need. What about yours?
Pithos and Effect solve problems at different scales: Pithos provides lightweight, modular utilities for common use cases (80% of projects), while Effect is a comprehensive framework for orchestrating complex systems (the remaining 20%). If you're wondering which one to choose, Pithos will likely be enough for most cases!
Effect is a comprehensive functional programming framework for TypeScript, often compared to ZIO in the JS ecosystem. It provides a runtime with dependency injection, structured concurrency, streams, and a full platform package ecosystem. It's a powerful architectural commitment, but comes with a significant learning curve and conceptual overhead.
Pithos is a lightweight modular ecosystem. You pick the modules you need (utilities, validation, error handling) and ship only what you use. No runtime, no lock-in, no paradigm to learn. Familiar APIs, zero configuration, immediate productivity.
At a Glance
| Aspect | Pithos | Effect |
|---|---|---|
| Philosophy | Modular ecosystem | Full FP runtime |
| Bundle impact | Per-function imports | Per-module imports (175+ namespaces) |
| Learning curve | Low, familiar APIs (Lodash-like, Zod-like, Neverthrow-like) | Steep, new paradigm (effects, layers, fibers) |
| Error handling | Result, Either, Option, CodedError | Effect<A, E, R>, Cause, Defects |
| Validation | Kanon (Zod-like, JIT-compiled) | Schema (bidirectional, AST-based) |
| Concurrency | Lightweight async helpers (retry, parallel, guard) | Fibers, streams, queues, semaphores, STM |
| Dependency injection | None (not in scope) | Context + Layer system |
| Lodash replacement | Yes (Arkhe + Taphos) | No |
| Runtime required | No | Yes |
| Dependencies | Zero | @standard-schema/spec, fast-check |
Where They Overlap
Pithos and Effect share some foundational building blocks. The overlap is roughly 25% of what Effect offers.
Either & Option
Both provide discriminated union types for representing success/failure and presence/absence. The core API is similar. The difference is in what each library adds on top: Effect adds structural equality, hashing, gen() syntax, and the Pipeable interface. Pithos sticks with simple object literals, no prototype chains, no conceptual overhead.
pipe
Both implement typed pipe with overloads. Effect also provides dual() so every function works both data-first and data-last.
Pithos uses data-first style: the data you're operating on is always the first argument. This is the most natural calling convention in JavaScript and doesn't require pipe to be readable.
Array, String, Object Utilities
| Category | Pithos | Effect |
|---|---|---|
| Array (chunk, zip, groupBy, partition...) | Broad coverage (Arkhe) | Essential coverage |
| String (case conversion, template, truncate...) | Broad coverage (Arkhe) | Limited coverage |
| Object (pick, omit, mapValues, deepClone...) | Broad coverage (Arkhe) | Essential coverage (Record) |
| Predicates & guards | Broad coverage | Essential coverage |
Pithos has broader coverage, closer to Lodash. Effect covers the essentials but it's not its main focus.
Validation
Both provide schema validation with TypeScript inference:
- Kanon has Zod-like ergonomics with JIT compilation.
- Effect Schema has more features (bidirectional transformations, AST introspection, arbitrary generation) but with more complexity, larger bundle weight, and reduced performance.
Both also allow composing validation + error handling. With Pithos, ensure() combines Kanon and Zygos to return a Result<T, string>. With Effect, Schema.decode() directly returns an Effect<A, ParseError, R>. Same concept, different approaches: Pithos stays with values without a runtime, Effect integrates it into the Effect type with dependency tracking.
The trade-off is clear: Kanon might be enough for better DX and UX (bundle size + performance), while Effect Schema is the choice if you need advanced features.
Validation Performance
On real-world scenarios, Kanon V3.0 is consistently 2x to 6x faster than Effect Schema. The gap widens on complex schemas with nested objects, arrays, and conditional validation.
| Test | @kanon/V3.0 | @kanon/JIT | Effect |
|---|---|---|---|
| Critical | |||
Login Form Validation CRITICAL | 5 pts | 7.30M ops/s (1.47x) | 10.75M ops/s fastest | 2.69M ops/s (3.99x) |
Payment Form (conditional validation) CRITICAL | 5 pts | 5.54M ops/s (3.54x) | 19.57M ops/s fastest | 861.76K ops/s (22.71x) |
User Registration (with password confirm) CRITICAL | 5 pts | 5.04M ops/s (1.26x) | 6.37M ops/s fastest | 1.04M ops/s (6.1x) |
| High | |||
API Response (discriminated union) HIGH | 3 pts | 8.54M ops/s (3.06x) | 26.14M ops/s fastest | 2.88M ops/s (9.07x) |
Blog Post with Comments HIGH | 3 pts | 2.53M ops/s (2.64x) | 6.70M ops/s fastest | 570.87K ops/s (11.73x) |
E-commerce Product HIGH | 3 pts | 4.93M ops/s (2.92x) | 14.40M ops/s fastest | 803.89K ops/s (17.92x) |
Event Booking HIGH | 3 pts | 1.65M ops/s (5.57x) | 9.16M ops/s fastest | 379.42K ops/s (24.15x) |
Invalid Login (error handling) HIGH | 3 pts | 5.76M ops/s (1.61x) | 9.26M ops/s fastest | 265.91K ops/s (34.81x) |
| Medium | |||
Search Params (with coercion) MEDIUM | 1 pts | 5.05M ops/s (4.63x) | 23.37M ops/s fastest | 1.36M ops/s (17.23x) |
User Profile Update (optional fields) MEDIUM | 1 pts | 6.02M ops/s (3.08x) | 18.58M ops/s fastest | 2.72M ops/s (6.84x) |
This makes sense: Kanon compiles validators to optimized functions, while Effect Schema interprets an AST at runtime. Effect trades raw speed for bidirectional transforms and introspection. If you need it, it's a good trade-off. If you don't, it's dead weight.
For full benchmark results with all libraries, see the Kanon performance benchmarks.
Where Effect Goes Further
This is not a gap. It's a different scope.
Effect provides a set of capabilities that belong to the framework world, not the utility ecosystem:
- Effect<A, E, R>: a type that encodes success, error, AND dependencies. The compiler tracks requirements through composition.
- Layer & Context: typed dependency injection. Build, compose, and provide services at the type level.
- Fiber & structured concurrency: lightweight threads with cancellation, supervision, and resource safety.
- Stream & Channel: reactive data processing with backpressure.
- STM: software transactional memory for concurrent state.
- Schedule: declarative retry and repeat policies.
- Metrics, Tracing, Logging: built-in observability primitives.
- Platform packages: Node, Bun, browser adapters with typed file system, HTTP, etc.
- First-party integrations: SQL, RPC, CLI, AI.
If your project needs all of this, Effect is a solid choice. Pithos doesn't play in this space, and that's intentional.
Where Pithos Goes Further
- Lodash replacement: Arkhe + Taphos provide a complete migration path from Lodash with per-function tree-shaking. Effect doesn't play in this space.
- Bundle size: every Pithos function is independently importable. You pay only for what you use.
- Neverthrow compatibility: Zygos Result is a 100% API-compatible drop-in replacement for Neverthrow. Effect has no equivalent migration story.
- JIT-compiled validation: Kanon compiles validators at runtime for maximum throughput. Effect Schema interprets an AST.
- Zero runtime: Pithos is just functions. No runtime to bootstrap, no framework to learn.
When to Choose What
Simple rule: if you're wondering, start with Pithos. You'll know very quickly if you need Effect (and it will be obvious - complex dependency injection, structured concurrency, distributed service orchestration). For everything else, Pithos is more than enough.
Choose Pithos if:
- You want to replace Lodash, Zod, or Neverthrow with lighter and faster alternatives
- Bundle size matters (web apps, dashboards, edge functions)
- You want familiar APIs with minimal learning curve
- You need utilities, validation, or error handling, not an effect system
- You're building an application or library and don't want a framework for your utils
Choose Effect if:
- You're building complex backend services with many dependencies to orchestrate
- You need structured concurrency (fibers, cancellation, resource management)
- You want typed dependency injection at the framework level
- You're ready to invest in a new paradigm, and so is your team
- You need the full ecosystem (SQL, RPC, OpenTelemetry, etc.)
Use both:
Pithos has no runtime and no global state. Nothing prevents you from using Arkhe for your utilities and Kanon for API input validation, while letting Effect handle service orchestration. They compose without friction.
Further Reading
- Kanon performance benchmarks: full validation benchmark results with all libraries
- Zygos vs Neverthrow: drop-in Result replacement comparison
- Kanon vs Zod: validation library comparison
- Arkhe vs Lodash: utility library comparison
- Comparison Overview: when to use each Pithos module
- Equivalence Table: full library equivalence across all modules