Get Started

What is Membrane?

Stateful serverless TypeScript for internal tools.

FEATURES
EXAMPLES
example google sheets hn jobs
Tracks Hacker News Jobs, based on keywords, and saves them to a Google Sheet.
Cronjob invokes watchJobs every hour.
Fetch top jobs from hn.
Append New Google Sheets row
import { nodes, root, state } from "membrane";

export async function configure({ keywords }) {
  state.keywords = keywords;

  root.watchJobs.$cron(`0 0 * * * *`)
}

export async function watchJobs() {
  const query = `{ title url time }`
  const topStories = await nodes.stories.items.$query(query);

  const keywords = state.keywords
    .split(",")
    .map((k) => k.toLowerCase());

  const matchedStories = topStories.filter((story) => {
    if (!story.url) {
      return false;
    }
    const title = story.title?.toLowerCase();
    return keywords.some((k) => title?.includes(k));
  });

  const data = matchedStories.map((story) => {
    const date = new Date(story.time! * 1000)
      .toLocaleDateString("en-US");
    return [story.title, date, story.url];
  });

  await nodes.sheet.append({ values: data });
}

What is Membrane?

Stateful serverless TypeScript for internal tools.

FEATURES
EXAMPLES
Tracks Hacker News Jobs, based on keywords, and saves them to a Google Sheet.
Cronjob invokes watchJobs every hour.
Fetch top jobs from hn.
Append New Google Sheets row
import { nodes, root, state } from "membrane";

export async function configure({ keywords }) {
  state.keywords = keywords;

  root.watchJobs.$cron(`0 0 * * * *`)
}

export async function watchJobs() {
  const query = `{ title url time }`
  const topStories = await nodes.stories.items.$query(query);

  const keywords = state.keywords
    .split(",")
    .map((k) => k.toLowerCase());

  const matchedStories = topStories.filter((story) => {
    if (!story.url) {
      return false;
    }
    const title = story.title?.toLowerCase();
    return keywords.some((k) => title?.includes(k));
  });

  const data = matchedStories.map((story) => {
    const date = new Date(story.time! * 1000)
      .toLocaleDateString("en-US");
    return [story.title, date, story.url];
  });

  await nodes.sheet.append({ values: data });
}
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