# Introduction to Effect Platform
import {
Aside,
Tabs,
TabItem,
Badge
} from "@astrojs/starlight/components"
`@effect/platform` is a library for building platform-independent abstractions in environments such as Node.js, Deno, Bun, and browsers.
With `@effect/platform`, you can integrate abstract services like [FileSystem](/docs/platform/file-system/) or [Terminal](/docs/platform/terminal/) into your program.
When assembling your final application, you can provide specific [layers](/docs/requirements-management/layers/) for the target platform using the corresponding packages:
- `@effect/platform-node` for Node.js or Deno
- `@effect/platform-bun` for Bun
- `@effect/platform-browser` for browsers
### Stable Modules
The following modules are stable and their documentation is available on this website:
| Module | Description | Status |
| ------------------------------------------------ | ---------------------------------------------------------- | ----------------------------------------- |
| [Command](/docs/platform/command/) | Provides a way to interact with the command line. | <Badge text="Stable" variant="success" /> |
| [FileSystem](/docs/platform/file-system/) | A module for file system operations. | <Badge text="Stable" variant="success" /> |
| [KeyValueStore](/docs/platform/key-value-store/) | Manages key-value pairs for data storage. | <Badge text="Stable" variant="success" /> |
| [Path](/docs/platform/path/) | Utilities for working with file paths. | <Badge text="Stable" variant="success" /> |
| [PlatformLogger](/docs/platform/platformlogger/) | Log messages to a file using the FileSystem APIs. | <Badge text="Stable" variant="success" /> |
| [Runtime](/docs/platform/runtime/) | Run your program with built-in error handling and logging. | <Badge text="Stable" variant="success" /> |
| [Terminal](/docs/platform/terminal/) | Tools for terminal interaction. | <Badge text="Stable" variant="success" /> |
### Unstable Modules
Some modules in `@effect/platform` are still in development or marked as experimental.
These features are subject to change.
| Module | Description | Status |
| ---------------------------------------------------------------------------------------------------- | ----------------------------------------------- | ------------------------------------------- |
| [Http API](https://github.com/Effect-TS/effect/blob/main/packages/platform/README.md#http-api) | Provide a declarative way to define HTTP APIs. | <Badge text="Unstable" variant="caution" /> |
| [Http Client](https://github.com/Effect-TS/effect/blob/main/packages/platform/README.md#http-client) | A client for making HTTP requests. | <Badge text="Unstable" variant="caution" /> |
| [Http Server](https://github.com/Effect-TS/effect/blob/main/packages/platform/README.md#http-server) | A server for handling HTTP requests. | <Badge text="Unstable" variant="caution" /> |
| [Socket](https://effect-ts.github.io/effect/platform/Socket.ts.html) | A module for socket-based communication. | <Badge text="Unstable" variant="caution" /> |
| [Worker](https://effect-ts.github.io/effect/platform/Worker.ts.html) | A module for running tasks in separate workers. | <Badge text="Unstable" variant="caution" /> |
For the most up-to-date documentation and details, please refer to the official [README](https://github.com/Effect-TS/effect/blob/main/packages/platform/README.md) of the package.
## Installation
To install the **beta** version:
<Tabs syncKey="package-manager">
<TabItem label="npm" icon="seti:npm">
```sh showLineNumbers=false
npm install @effect/platform
```
</TabItem>
<TabItem label="pnpm" icon="pnpm">
```sh showLineNumbers=false
pnpm add @effect/platform
```
</TabItem>
<TabItem label="Yarn" icon="yarn">
```sh showLineNumbers=false
yarn add @effect/platform
```
</TabItem>
<TabItem label="Bun" icon="bun">
```sh showLineNumbers=false
bun add @effect/platform
```
</TabItem>
<TabItem label="Deno" icon="deno">
```sh showLineNumbers=false
deno add npm:@effect/platform
```
</TabItem>
</Tabs>
## Getting Started with Cross-Platform Programming
Here's a basic example using the `Path` module to create a file path, which can run across different environments:
**Example** (Cross-Platform Path Handling)
```ts twoslash title="index.ts"
import { Path } from "@effect/platform"
import { Effect } from "effect"
const program = Effect.gen(function* () {
// Access the Path service
const path = yield* Path.Path
// Join parts of a path to create a complete file path
const mypath = path.join("tmp", "file.txt")
console.log(mypath)
})
```
### Running the Program in Node.js or Deno
First, install the Node.js-specific package:
<Tabs syncKey="package-manager">
<TabItem label="npm" icon="seti:npm">
```sh showLineNumbers=false
npm install @effect/platform-node
```
</TabItem>
<TabItem label="pnpm" icon="pnpm">
```sh showLineNumbers=false
pnpm add @effect/platform-node
```
</TabItem>
<TabItem label="Yarn" icon="yarn">
```sh showLineNumbers=false
yarn add @effect/platform-node
```
</TabItem>
<TabItem label="Deno" icon="deno">
```sh showLineNumbers=false
deno add npm:@effect/platform-node
```
</TabItem>
</Tabs>
Update the program to load the Node.js-specific context:
**Example** (Providing Node.js Context)
```ts twoslash title="index.ts" ins={3,15}
import { Path } from "@effect/platform"
import { Effect } from "effect"
import { NodeContext, NodeRuntime } from "@effect/platform-node"
const program = Effect.gen(function* () {
// Access the Path service
const path = yield* Path.Path
// Join parts of a path to create a complete file path
const mypath = path.join("tmp", "file.txt")
console.log(mypath)
})
NodeRuntime.runMain(program.pipe(Effect.provide(NodeContext.layer)))
```
Finally, run the program in Node.js using `tsx`, or directly in Deno:
<Tabs syncKey="package-manager">
<TabItem label="npm" icon="seti:npm">
```sh showLineNumbers=false
npx tsx index.ts
# Output: tmp/file.txt
```
</TabItem>
<TabItem label="pnpm" icon="pnpm">
```sh showLineNumbers=false
pnpm dlx tsx index.ts
# Output: tmp/file.txt
```
</TabItem>
<TabItem label="Yarn" icon="seti:yarn">
```sh showLineNumbers=false
yarn dlx tsx index.ts
# Output: tmp/file.txt
```
</TabItem>
<TabItem label="Deno" icon="deno">
```sh showLineNumbers=false
deno run index.ts
# Output: tmp/file.txt
# or
deno run -RE index.ts
# Output: tmp/file.txt
# (granting required Read and Environment permissions without being prompted)
```
</TabItem>
</Tabs>
### Running the Program in Bun
To run the same program in Bun, first install the Bun-specific package:
```sh showLineNumbers=false
bun add @effect/platform-bun
```
Update the program to use the Bun-specific context:
**Example** (Providing Bun Context)
```ts twoslash title="index.ts" ins={3,15}
import { Path } from "@effect/platform"
import { Effect } from "effect"
import { BunContext, BunRuntime } from "@effect/platform-bun"
const program = Effect.gen(function* () {
// Access the Path service
const path = yield* Path.Path
// Join parts of a path to create a complete file path
const mypath = path.join("tmp", "file.txt")
console.log(mypath)
})
BunRuntime.runMain(program.pipe(Effect.provide(BunContext.layer)))
```
Run the program in Bun:
```sh showLineNumbers=false
bun index.ts
tmp/file.txt
```
@effect/platform is a library for building platform-independent abstractions in environments such as Node.js, Deno, Bun, and browsers.
With @effect/platform, you can integrate abstract services like FileSystem or Terminal into your program.
When assembling your final application, you can provide specific layers for the target platform using the corresponding packages:
@effect/platform-node for Node.js or Deno
@effect/platform-bun for Bun
@effect/platform-browser for browsers
Stable Modules
The following modules are stable and their documentation is available on this website:
Provides a way to write effectful code using generator functions, simplifying
control flow and error handling.
When to Use
Effect.gen allows you to write code that looks and behaves like synchronous
code, but it can handle asynchronous tasks, errors, and complex control flow
(like loops and conditions). It helps make asynchronous code more readable
and easier to manage.
The generator functions work similarly to async/await but with more
explicit control over the execution of effects. You can yield* values from
effects and return the final result at the end.
The console module provides a simple debugging console that is similar to the
JavaScript console mechanism provided by web browsers.
The module exports two specific components:
A Console class with methods such as console.log(), console.error() and console.warn() that can be used to write to any Node.js stream.
A global console instance configured to write to process.stdout and
process.stderr. The global console can be used without importing the node:console module.
Warning: The global console object's methods are neither consistently
synchronous like the browser APIs they resemble, nor are they consistently
asynchronous like all other Node.js streams. See the note on process I/O for
more information.
Example using the global console:
console.log('hello world');
// Prints: hello world, to stdout
console.log('hello %s', 'world');
// Prints: hello world, to stdout
console.error(newError('Whoops, something bad happened'));
// Prints error message and stack trace to stderr:
// Error: Whoops, something bad happened
// at [eval]:5:15
// at Script.runInThisContext (node:vm:132:18)
// at Object.runInThisContext (node:vm:309:38)
// at node:internal/process/execution:77:19
// at [eval]-wrapper:6:22
// at evalScript (node:internal/process/execution:76:60)
// at node:internal/main/eval_string:23:3
constname='Will Robinson';
console.warn(`Danger ${name}! Danger!`);
// Prints: Danger Will Robinson! Danger!, to stderr
Example using the Console class:
constout=getStreamSomehow();
consterr=getStreamSomehow();
constmyConsole=new console.Console(out, err);
myConsole.log('hello world');
// Prints: hello world, to out
myConsole.log('hello %s', 'world');
// Prints: hello world, to out
myConsole.error(newError('Whoops, something bad happened'));
// Prints: [Error: Whoops, something bad happened], to err
Prints to stdout with newline. Multiple arguments can be passed, with the
first used as the primary message and all additional used as substitution
values similar to printf(3)
(the arguments are all passed to util.format()).
Provides a way to write effectful code using generator functions, simplifying
control flow and error handling.
When to Use
Effect.gen allows you to write code that looks and behaves like synchronous
code, but it can handle asynchronous tasks, errors, and complex control flow
(like loops and conditions). It helps make asynchronous code more readable
and easier to manage.
The generator functions work similarly to async/await but with more
explicit control over the execution of effects. You can yield* values from
effects and return the final result at the end.
The console module provides a simple debugging console that is similar to the
JavaScript console mechanism provided by web browsers.
The module exports two specific components:
A Console class with methods such as console.log(), console.error() and console.warn() that can be used to write to any Node.js stream.
A global console instance configured to write to process.stdout and
process.stderr. The global console can be used without importing the node:console module.
Warning: The global console object's methods are neither consistently
synchronous like the browser APIs they resemble, nor are they consistently
asynchronous like all other Node.js streams. See the note on process I/O for
more information.
Example using the global console:
console.log('hello world');
// Prints: hello world, to stdout
console.log('hello %s', 'world');
// Prints: hello world, to stdout
console.error(newError('Whoops, something bad happened'));
// Prints error message and stack trace to stderr:
// Error: Whoops, something bad happened
// at [eval]:5:15
// at Script.runInThisContext (node:vm:132:18)
// at Object.runInThisContext (node:vm:309:38)
// at node:internal/process/execution:77:19
// at [eval]-wrapper:6:22
// at evalScript (node:internal/process/execution:76:60)
// at node:internal/main/eval_string:23:3
constname='Will Robinson';
console.warn(`Danger ${name}! Danger!`);
// Prints: Danger Will Robinson! Danger!, to stderr
Example using the Console class:
constout=getStreamSomehow();
consterr=getStreamSomehow();
constmyConsole=new console.Console(out, err);
myConsole.log('hello world');
// Prints: hello world, to out
myConsole.log('hello %s', 'world');
// Prints: hello world, to out
myConsole.error(newError('Whoops, something bad happened'));
// Prints: [Error: Whoops, something bad happened], to err
Prints to stdout with newline. Multiple arguments can be passed, with the
first used as the primary message and all additional used as substitution
values similar to printf(3)
(the arguments are all passed to util.format()).
Helps you run a main effect with built-in error handling, logging, and signal management.
Details
This function launches an Effect as the main entry point, setting exit codes
based on success or failure, handling interrupts (e.g., Ctrl+C), and optionally
logging errors. By default, it logs errors and uses a "pretty" format, but both
behaviors can be turned off. You can also provide custom teardown logic to
finalize resources or produce different exit codes.
Options
An optional object that can include:
disableErrorReporting: Turn off automatic error logging.
disablePrettyLogger: Avoid adding the pretty logger.
teardown: Provide custom finalization logic.
When to Use
Use this function to run an Effect as your application’s main program, especially
when you need structured error handling, log management, interrupt support,
or advanced teardown capabilities.
constprovide: <NodeContext.NodeContext, never, never>(layer:Layer<NodeContext.NodeContext, never, never>) => <A, E, R>(self:Effect.Effect<A, E, R>) =>Effect.Effect<A, E, Exclude<R, NodeContext.NodeContext>> (+9overloads)
Provides necessary dependencies to an effect, removing its environmental
requirements.
Details
This function allows you to supply the required environment for an effect.
The environment can be provided in the form of one or more Layers, a
Context, a Runtime, or a ManagedRuntime. Once the environment is
provided, the effect can run without requiring external dependencies.
You can compose layers to create a modular and reusable way of setting up the
environment for effects. For example, layers can be used to configure
databases, logging services, or any other required dependencies.
Provides a way to write effectful code using generator functions, simplifying
control flow and error handling.
When to Use
Effect.gen allows you to write code that looks and behaves like synchronous
code, but it can handle asynchronous tasks, errors, and complex control flow
(like loops and conditions). It helps make asynchronous code more readable
and easier to manage.
The generator functions work similarly to async/await but with more
explicit control over the execution of effects. You can yield* values from
effects and return the final result at the end.
The console module provides a simple debugging console that is similar to the
JavaScript console mechanism provided by web browsers.
The module exports two specific components:
A Console class with methods such as console.log(), console.error() and console.warn() that can be used to write to any Node.js stream.
A global console instance configured to write to process.stdout and
process.stderr. The global console can be used without importing the node:console module.
Warning: The global console object's methods are neither consistently
synchronous like the browser APIs they resemble, nor are they consistently
asynchronous like all other Node.js streams. See the note on process I/O for
more information.
Example using the global console:
console.log('hello world');
// Prints: hello world, to stdout
console.log('hello %s', 'world');
// Prints: hello world, to stdout
console.error(newError('Whoops, something bad happened'));
// Prints error message and stack trace to stderr:
// Error: Whoops, something bad happened
// at [eval]:5:15
// at Script.runInThisContext (node:vm:132:18)
// at Object.runInThisContext (node:vm:309:38)
// at node:internal/process/execution:77:19
// at [eval]-wrapper:6:22
// at evalScript (node:internal/process/execution:76:60)
// at node:internal/main/eval_string:23:3
constname='Will Robinson';
console.warn(`Danger ${name}! Danger!`);
// Prints: Danger Will Robinson! Danger!, to stderr
Example using the Console class:
constout=getStreamSomehow();
consterr=getStreamSomehow();
constmyConsole=new console.Console(out, err);
myConsole.log('hello world');
// Prints: hello world, to out
myConsole.log('hello %s', 'world');
// Prints: hello world, to out
myConsole.error(newError('Whoops, something bad happened'));
// Prints: [Error: Whoops, something bad happened], to err
Prints to stdout with newline. Multiple arguments can be passed, with the
first used as the primary message and all additional used as substitution
values similar to printf(3)
(the arguments are all passed to util.format()).
Helps you run a main effect with built-in error handling, logging, and signal management.
Details
This function launches an Effect as the main entry point, setting exit codes
based on success or failure, handling interrupts (e.g., Ctrl+C), and optionally
logging errors. By default, it logs errors and uses a "pretty" format, but both
behaviors can be turned off. You can also provide custom teardown logic to
finalize resources or produce different exit codes.
Options
An optional object that can include:
disableErrorReporting: Turn off automatic error logging.
disablePrettyLogger: Avoid adding the pretty logger.
teardown: Provide custom finalization logic.
When to Use
Use this function to run an Effect as your application’s main program, especially
when you need structured error handling, log management, interrupt support,
or advanced teardown capabilities.
constprovide: <BunContext.BunContext, never, never>(layer:Layer<BunContext.BunContext, never, never>) => <A, E, R>(self:Effect.Effect<A, E, R>) =>Effect.Effect<A, E, Exclude<R, BunContext.BunContext>> (+9overloads)
Provides necessary dependencies to an effect, removing its environmental
requirements.
Details
This function allows you to supply the required environment for an effect.
The environment can be provided in the form of one or more Layers, a
Context, a Runtime, or a ManagedRuntime. Once the environment is
provided, the effect can run without requiring external dependencies.
You can compose layers to create a modular and reusable way of setting up the
environment for effects. For example, layers can be used to configure
databases, logging services, or any other required dependencies.