What is Membrane?

Stateful serverless TypeScript for internal tools.

FEATURES
EXAMPLES
example weekly report
Example of a Membrane program to generate a weekly report on issues, pull requests, and commits in a GitHub organization
Set up a cron-job that generates report every Friday.
New Google Doc
Find Issues & Pull Requests
Append Issue & PR Details
Search & Select Commits
Append details of commits
import { root, nodes, state } from "membrane";

export async function configure({ org }) {
  state.org = org;
  root.report.$cron(`0 0 17 ? * FRI`);
}
    
export async function report() {
  const [weekAgo, now] = getDateRangeString();
  const { org } = state;

  const doc = await nodes.gdocs.documents.create({
    title: `Last Week Report - ${now}`,
  });
  
  await doc.insertText({
    text: `Weekly Report (${weekAgo} to ${now})`,
  });

  const issuesAndPr = await nodes.github.search
    .issues({ q: `org:${org}+created:${weekAgo}..${now}` })
    .$query(`{ items { html_url title created_at user {login}}}`);
  
  await doc.insertText({ text: `Issues and Pull Requests:` });
  for (let event of issuesAndPr.items!) {
    await doc.insertText({ 
      text: `${event.user!.login}: ${event.created_at!}`
    });
    await doc.insertLink({
      text: `${event.title}`, url: event.html_url
    });
  }

  const commits = await nodes.github.search
    .commits({ q: `org:${org}+committer-date:${weekAgo}..${now}` })
    .$query(`{ items { sha html_url message date author {login}}}`);
  
  await doc.insertText({ text: `Commits Summary:` });
  for (let event of commits.items!) {
    await doc.insertBullet({ 
      text: `${event.author!.login}: ${event.date!} - ` });

    await doc.insertLink({ 
      text: `${event.message!.replace(/g, "")}`,
      url: event.html_url 
    });
  }

  const url = await doc.url;
  console.log(`Report generated at ${url}`);
}

What is Membrane?

Stateful serverless TypeScript for internal tools.

FEATURES
EXAMPLES
Example of a Membrane program to generate a weekly report on issues, pull requests, and commits in a GitHub organization
Set up a cron-job that generates report every Friday.
New Google Doc
Find Issues & Pull Requests
Append Issue & PR Details
Search & Select Commits
Append details of commits
import { root, nodes, state } from "membrane";

export async function configure({ org }) {
  state.org = org;
  root.report.$cron(`0 0 17 ? * FRI`);
}
    
export async function report() {
  const [weekAgo, now] = getDateRangeString();
  const { org } = state;

  const doc = await nodes.gdocs.documents.create({
    title: `Last Week Report - ${now}`,
  });
  
  await doc.insertText({
    text: `Weekly Report (${weekAgo} to ${now})`,
  });

  const issuesAndPr = await nodes.github.search
    .issues({ q: `org:${org}+created:${weekAgo}..${now}` })
    .$query(`{ items { html_url title created_at user {login}}}`);
  
  await doc.insertText({ text: `Issues and Pull Requests:` });
  for (let event of issuesAndPr.items!) {
    await doc.insertText({ 
      text: `${event.user!.login}: ${event.created_at!}`
    });
    await doc.insertLink({
      text: `${event.title}`, url: event.html_url
    });
  }

  const commits = await nodes.github.search
    .commits({ q: `org:${org}+committer-date:${weekAgo}..${now}` })
    .$query(`{ items { sha html_url message date author {login}}}`);
  
  await doc.insertText({ text: `Commits Summary:` });
  for (let event of commits.items!) {
    await doc.insertBullet({ 
      text: `${event.author!.login}: ${event.date!} - ` });

    await doc.insertLink({ 
      text: `${event.message!.replace(/g, "")}`,
      url: event.html_url 
    });
  }

  const url = await doc.url;
  console.log(`Report generated at ${url}`);
}
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