What is Membrane?

Stateful serverless TypeScript for internal tools.

FEATURES
EXAMPLES
example discord bot
Discord bot that responds to the /weather 'city-name' command.
Reference to a Discord Guild
Subscribe to Discord's slash command.
Get weather information for a city
Respond slash command with weather details
import { nodes, root, state } from "membrane";

export async function configure({ guildId }) {
  const gref = nodes.discord.guilds.one({ id: guildId });

  await gref.createCommand({
    name: "weather",
    description: "Get the weather for a location",
    options: [
      {
        type: 3,
        description: "The city to get the weather for",
        name: "city",
      },
    ],
  });

  await gref.onSlashCommand.$subscribe(root.handleEvent);   
}
        
export async function handleEvent(_, { event }) {
  const { token, application_id, options } = await event;

  const [data] = JSON.parse(options);
  const city = data.value;

  const weather = await nodes.weather
    .now({ city })
    .$query(`{ temp feels_like }`);

  await nodes.discord.followUpWebhook({
    token,
    application_id,
    message: {
      content: `The weather in ${city.toUpperCase()} 
      is ${weather.temp} degrees, 
      but feels like ${weather.feels_like}.`,
    },
  });
}

What is Membrane?

Stateful serverless TypeScript for internal tools.

FEATURES
EXAMPLES
Discord bot that responds to the /weather 'city-name' command.
Reference to a Discord Guild
Subscribe to Discord's slash command.
Get weather information for a city
Respond slash command with weather details
import { nodes, root, state } from "membrane";

export async function configure({ guildId }) {
  const gref = nodes.discord.guilds.one({ id: guildId });

  await gref.createCommand({
    name: "weather",
    description: "Get the weather for a location",
    options: [
      {
        type: 3,
        description: "The city to get the weather for",
        name: "city",
      },
    ],
  });

  await gref.onSlashCommand.$subscribe(root.handleEvent);   
}
        
export async function handleEvent(_, { event }) {
  const { token, application_id, options } = await event;

  const [data] = JSON.parse(options);
  const city = data.value;

  const weather = await nodes.weather
    .now({ city })
    .$query(`{ temp feels_like }`);

  await nodes.discord.followUpWebhook({
    token,
    application_id,
    message: {
      content: `The weather in ${city.toUpperCase()} 
      is ${weather.temp} degrees, 
      but feels like ${weather.feels_like}.`,
    },
  });
}
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

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

Communication


Enter your email for occasional updates