Install Now

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
Communication


Enter your email for occasional updates