lift-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 f9f4e37d6945
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 23e397d8a5d5bf7756362640
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
src/lib/bounded.ts
// One Bounded session per tab: a guest account created on first use, or the person's own account
// once they choose to keep their log on all devices. No sign-up to start, ever.
import { init, getCurrentUser, getLoginReturnError, signInAnonymously, loginWithRedirect, logout } from "@bounded-sh/client";
import { APP_ID } from "../../functions/lib/config";

/** The app this page is served for: the host injects it, so a preview talks to its own data. Local dev falls back to config. */
export const SERVED_APP_ID =
  (typeof document !== "undefined" && document.getElementById("__bounded-first-live-bridge")?.getAttribute("data-app-id")) || APP_ID;

export interface Me { id: string; email: string | null; guest: boolean }

let session: Promise<Me> | null = null;
let loginError: string | null = null;

/** Resolves to this browser's lifter: the signed-in account, or a guest created once. */
export function me(): Promise<Me> {
  session ??= (async () => {
    if (!SERVED_APP_ID) throw new Error("Lift is not connected yet. Your log is saved on this device.");
    await init({ appId: SERVED_APP_ID });
    const err = getLoginReturnError();
    if (err) loginError = explain(err);
    const user = getCurrentUser() || (await signInAnonymously());
    if (!user?.id) throw new Error("Could not start a session.");
    return { id: user.id as string, email: (user.email as string | null) ?? null, guest: Boolean(user.isAnonymous) };
  })().catch((err) => {
    session = null;
    throw err;
  });
  return session;
}

/** A hosted sign-in that came back with an error, once. */
export function takeLoginError(): string | null {
  const e = loginError;
  loginError = null;
  return e;
}

/** Hosted email sign-in. The page leaves and comes back signed in. */
export async function signIn(): Promise<void> {
  await loginWithRedirect({ methods: ["email"] });
}

export async function signOut(): Promise<void> {
  await logout();
}

/** A sentence a person can read for a failed write or read. */
export function explain(err: unknown): string {
  const e = err as { message?: string; decline?: { message?: string } };
  if (e?.decline?.message && !/data constraint/i.test(e.decline.message)) return e.decline.message;
  const msg = String(e?.message || err || "");
  if (/network|fetch|Failed to fetch/i.test(msg)) return "You seem to be offline. Your log is saved on this device.";
  if (/denied|403|forbidden|constraint/i.test(msg)) return "That change was not allowed.";
  return msg || "Something went wrong. Try again.";
}

Change history

Point OpenApps store links to openapps.free
f9f4e37d69 · 17 hours ago
Add favicon.ico, local share image and openapi.json for links and guides
2796c0063c · 17 hours ago
Bind agent address in policy constants
cf80a3ca66 · 19 hours ago
Add OpenApp contribution strip and OpenApps source links
5e4cc2b9f3 · 19 hours ago
Bounded source sync
ca4a3d3631 · 1 day ago
Bounded source sync
7351063f4d · 1 day ago
Bounded source sync
0ce3238c46 · 1 day ago