subs-free.openapps.xyz

Source

This app’s code and revision history are public. Download a copy or explore the files below.

Public
The app’s code and revision history are public.
Owned app · rev 1ae4feb2bebf
Run it yourself
Take the whole tree and run it on your own machine. The download needs no account. Cloning needs a sign-in.
Download .zip
bounded clone 5af1a249bbbef1db1b4c5ec8
A copy you download is not bounded. The guarantees this app runs under - declared egress, proven invariants, writes that fail closed - live in the runtime serving this page, not in the files. What you get is auditable source you can read and run, with no runtime guarantees attached.
← All files
scripts/catalog.mjs
// Refreshes src/lib/catalog.json, the copy of the OpenApps store's catalog that Subs ships with, so
// free alternatives show even before the live list loads (or when it cannot).
// Usage: npm run catalog [-- <catalog.json file or URL>]
// With no argument it asks the store's MCP server (list_free_apps), the same source the app reads live.
import fs from "node:fs";

const MCP = "https://functions.openapps.xyz/apps/82875c5f2cbb469c47e29ec8/mcp";
const source = process.argv[2];

async function read() {
  if (source && !/^https?:/.test(source)) return JSON.parse(fs.readFileSync(source, "utf8")).apps;
  if (source) return (await (await fetch(source)).json()).apps;
  const res = await fetch(MCP, {
    method: "POST",
    headers: { "content-type": "application/json", accept: "application/json, text/event-stream" },
    body: JSON.stringify({ jsonrpc: "2.0", id: 1, method: "tools/call", params: { name: "list_free_apps", arguments: {} } }),
  });
  return (await res.json()).result.structuredContent.apps;
}

const apps = (await read())
  .filter((a) => a.url && a.slug !== "subs")
  .map((a) => ({
    slug: a.slug,
    name: a.name,
    url: a.url,
    tagline: a.tagline,
    freeAlternativeTo: (a.freeAlternativeTo || []).map((x) => (typeof x === "string" ? x : x.name)),
  }));
const out = { updated: new Date().toISOString().slice(0, 10), apps };
fs.writeFileSync(new URL("../src/lib/catalog.json", import.meta.url), JSON.stringify(out, null, 1) + "\n");
console.log(`src/lib/catalog.json: ${apps.length} apps`);

Change history

Point store links to openapps.free
1ae4feb2be · 17 hours ago
Bind agent address in policy
99bbab3f0c · 19 hours ago
Use OpenApps service URLs and add contribution strip
781c3c23e5 · 19 hours ago
Bounded source sync
048e3257a5 · 1 day ago
Bounded source sync
7a358a3be6 · 1 day ago
Bounded source sync
0c833fcb0e · 1 day ago