Install Now

What is Membrane?

Stateful serverless TypeScript for internal tools.

FEATURES
EXAMPLES
example github discord tracker
Send a Discord message when a commit is pushed to Github.
Save repository and channel information in state
Subscribe to event
Send message to Discord
import { nodes, root, state } from "membrane";

export async function configure({ discordUrl, repo }) {
  const [user, repository] = repo.split("/");

  state.discordUrl = discordUrl;
  state.repository = repository;
  state.user = user;

  await nodes.github.users
    .one({ name: user })
    .repos.one({ name: repository })
    .pushes.$subscribe(root.handlePushEvent);
}

export async function handlePushEvent(_, { event }) {
  const res = await event.commit.$query(
    `{ message, html_url, author { login } }`
  );

  const body = {
    username: "Github alert",
    content: `${res.author.login} pushed to 
      ${state.user}/${state.repository}: - 
      ${res.message} (${res.html_url})`,
  };

  await fetch(state.discordUrl, {
    method: "POST",
    body: JSON.stringify(body),
    headers: {
      "Content-Type": "application/json",
    },
  });
}

What is Membrane?

Stateful serverless TypeScript for internal tools.

FEATURES
EXAMPLES
Send a Discord message when a commit is pushed to Github.
Save repository and channel information in state
Subscribe to event
Send message to Discord
import { nodes, root, state } from "membrane";

export async function configure({ discordUrl, repo }) {
  const [user, repository] = repo.split("/");

  state.discordUrl = discordUrl;
  state.repository = repository;
  state.user = user;

  await nodes.github.users
    .one({ name: user })
    .repos.one({ name: repository })
    .pushes.$subscribe(root.handlePushEvent);
}

export async function handlePushEvent(_, { event }) {
  const res = await event.commit.$query(
    `{ message, html_url, author { login } }`
  );

  const body = {
    username: "Github alert",
    content: `${res.author.login} pushed to 
      ${state.user}/${state.repository}: - 
      ${res.message} (${res.html_url})`,
  };

  await fetch(state.discordUrl, {
    method: "POST",
    body: JSON.stringify(body),
    headers: {
      "Content-Type": "application/json",
    },
  });
}
Features Walkthrough
In this video we discuss 3 of the most important features of Membrane: Durability, The Graph, and Observability.
Clickable poster of the Features Walkthrough video
Communication


Enter your email for occasional updates