Join Discord

Enter your email to get updates
What is Membrane?
Membrane is a hosted TypeScript runtime specifically designed to build personal automation tools and interact with APIs more easily.
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 }) { = org;$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
    .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
    .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: `${!.login}: ${!} - ` });

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

  const url = await doc.url;
  console.log(`Report generated at ${url}`);
Install From VS Code
Dev Blog