import type { ReactNode } from "react"; import { Launcher, LauncherSkeleton } from "@/client/pages/launcher"; import { useSessionWithInitialPending } from "@/client/lib/auth-client"; import { useClientConfig } from "@/client/lib/config"; const metadatumLinkClass = "block truncate font-mono text-sm text-zinc-300 underline decoration-zinc-700 underline-offset-[6px] transition-colors hover:text-accent-400 hover:decoration-accent-500/60"; const Metadatum = ({ label, children }: { label: string; children: ReactNode }) => ( <>
{label}
{children}
); export const LandingPage = () => { const session = useSessionWithInitialPending(); const config = useClientConfig(); const issuerUrl = config?.status === "ok" ? config.issuer : null; // Signed-in users land on the app launcher (Notion/Linear pattern): // the marketing copy below is for first-time visitors and the not-yet- // signed-in. Avoiding navigate() here keeps the URL at `/` stable when // moving between launcher and settings — the user's "home" is always // the slash. if (session.data) { return ; } if (session.isInitialPending) { return ; } // Render the issuer host derived from /api/config so preview / staging // deploys reflect their own deployed origin instead of a hard-coded // production label. Falls back to the relative `/` (and a placeholder // label) until the config call resolves. const issuerLabel = issuerUrl ? new URL(issuerUrl).host : "—"; const issuerHref = issuerUrl ?? "/"; return (

Single sign-on for limic.

A hand-cut OAuth 2.1 and OpenID Connect provider. tessera issues one stable subject claim per human, recognized by anvil, bland,{" "} flamemail,{" "} git‑on‑cloudflare, and Cloudflare Access. Sign in with email, GitHub, or Google. Registration is invite-only.

); };