What is Membrane?

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

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?

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

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}`);
}
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