What is Membrane?

A fast, powerful way to write internal tools in TypeScript, connecting the apps you already use at work.

FEATURES
EXAMPLES
example mailchimp to airtable
Adds a new record to an Airtable Base when a new Mailchimp subscriber is added.
Subscribe to event.
GraphQL query
New Airtable record.
import { nodes, root, state } from "membrane";

export async function configure({ audienceId, tableId }) {
  const audience = await nodes.audiences.one({ id: audienceId });
  await audience.subscriptions.$subscribe(root.handleEvent);

  state.table = nodes.tables.one({ id: tableId });
}

export async function handleEvent(_, { event }) {
  const data = await event.member.$query(
    `{ email_address, status, timestamp_opt }`
  );

  const record = {
    email: data.email_address,
    status: data.status,
    timestamp: data.timestamp_opt,
  };
  await state.table.createRecord({ fields: record });
}
What is Membrane?

A fast, powerful way to write internal tools in TypeScript, connecting the apps you already use at work.

FEATURES
EXAMPLES
Adds a new record to an Airtable Base when a new Mailchimp subscriber is added.
Subscribe to event.
GraphQL query
New Airtable record.
import { nodes, root, state } from "membrane";

export async function configure({ audienceId, tableId }) {
  const audience = await nodes.audiences.one({ id: audienceId });
  await audience.subscriptions.$subscribe(root.handleEvent);

  state.table = nodes.tables.one({ id: tableId });
}

export async function handleEvent(_, { event }) {
  const data = await event.member.$query(
    `{ email_address, status, timestamp_opt }`
  );

  const record = {
    email: data.email_address,
    status: data.status,
    timestamp: data.timestamp_opt,
  };
  await state.table.createRecord({ fields: record });
}
Communication

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