LAUNCH

Develop in prod

A new and powerful way to quickly build internal tools, automations, admin panels, and much more.

Durable JavaScript

Dramatically simplify development of stateful applications.

Membrane programs run in a durable runtime, tightly integrated with the OS to safely and transparently persist memory changes.

There's no need to store data in a database (although you can!). Any JavaScript object can persist indefinitely because Membrane's execution timeout is effectively ♾️.

Keep long-lived values in state.
import { state } from "membrane";
state.notes = state.notes ?? []
export async function saveNote({ args }) {
  state.notes.push(args.note);
}

Observability

The most time-consuming part of bugfixing can often be reproducing the issue in the first place. We didn't like that, so we fixed it!

In Membrane, every side-effect is first written to the program's write-ahead log and then processed. HTTP requests and responses, source code changes, queries, etc are all program side-effects.

This log gives you clear understanding plus the ability to replay history so that reproducing bugs is a walk in the park.

Membrane logs are not just text output; they are the source of truth!

The Graph

In Membrane, each program defines a graph API to expose its data and functionality to other programs. You can think of the graph as objects that can be referenced by other programs, allowing you to easily compose functionality.

In this video we showcase the graph in a quick tour of the Membrane IDE.

Showcase
FEATURES
EXAMPLES
the graph
Membrane programs communicate with the outside world and each other, through an unified interface that we call The Graph. The Graph is a simple, yet powerful abstraction over external APIs and your own data that enables quick and easy composition of functionality.
Simplicity comes from the fact that everything is a node and every node is typed. For example, nodes can be of type String, Int, Email, Repository, etc.
The graph contains three types of nodes:
  • Fields: Nodes which can be read/queried.
  • Actions: Nodes which can be invoked.
  • Events: Node which can be emitted.
API drivers (i.e. connectors) as well as your programs expose their functionality as nodes which can then be referenced and used by other programs.
Intuitively, GET requests are mapped to fields, POST/PUT/DELETE/etc requests (anything effectful) are mapped to actions, and webhooks are mapped to events.
The beauty of this approach is that you can build on top of these nodes and create custom abstractions which are also nodes in the graph. Have you ever wanted to combine Jira, Github and Airtable to build a workflow that matches your mental model? Membrane is where you do that.
Every node in your graph is referenceable by a URL-like string called a Handle. Handles exists as typed objects in TypeScript world, like a file descriptor but for everything.

Try APIs from the Graph Navigator.
Drag from The Graph to use programmatically.
Make your own abstractions.
Double space, oops.

Capabilities
FEATURES
Membrane programs communicate with the outside world and each other, through an unified interface that we call The Graph. The Graph is a simple, yet powerful abstraction over external APIs and your own data that enables quick and easy composition of functionality.
Simplicity comes from the fact that everything is a node and every node is typed. For example, nodes can be of type String, Int, Email, Repository, etc.
The graph contains three types of nodes:
  • Fields: Nodes which can be read/queried.
  • Actions: Nodes which can be invoked.
  • Events: Node which can be emitted.
API drivers (i.e. connectors) as well as your programs expose their functionality as nodes which can then be referenced and used by other programs.
Intuitively, GET requests are mapped to fields, POST/PUT/DELETE/etc requests (anything effectful) are mapped to actions, and webhooks are mapped to events.
The beauty of this approach is that you can build on top of these nodes and create custom abstractions which are also nodes in the graph. Have you ever wanted to combine Jira, Github and Airtable to build a workflow that matches your mental model? Membrane is where you do that.
Every node in your graph is referenceable by a URL-like string called a Handle. Handles exists as typed objects in TypeScript world, like a file descriptor but for everything.

Try APIs from the Graph Navigator.
Drag from The Graph to use programmatically.
Make your own abstractions.
Double space, oops.


EXAMPLES
The Write-Ahead Blog

If you're curious about Membrane's architecture, Juan joined the devtools.fm podcast to talk through the nuts and bolts.



Enter your email for occasional updates