Unify

Patterns

The screens every app has, built the same way: sign-in, first-run setup, /system and health.

Sign-in

One button and one notice that names the SSO — never its address. Accounts are created by the SSO, never by a form in the app. Known error codes get a friendly message.

Sign in to Folio

Your private contact book.

Continue with SSO

You will be redirected to the SSO to authenticate.

tsx
// app/login/page.tsx
<SignInPanel
  icon={<AppIcon {...ICON} size={56} />}
  appName="Folio"
  loginHref={`/api/auth/login?redirect=${encodeURIComponent(returnTo)}`}
  error={searchParams.error}
/>

First-run setup (/welcome)

After the first SSO sign-in the app asks only what it needs — with the SSO profile pre-filled — then never again. Until it is done, every private page redirects here.

  1. 01Sign in with SSOVerified email and name arrive from the SSO.
  2. 02Set up the appName, theme, and the app's own essentials (currency, languages, company…).
  3. 03Straight to the pageThe user lands where they were going, set up for good.

/system

Version (commit date, YYYY-MM-DD) and commit first, then runtime, packages, database and the app's own services. Never secrets or internal hosts.

App

Version
2026-10-12
Commit
a1b2c3d
Environment
production

Runtime

Node.js
v24.11.0
Platform
linux · x64

Packages

Next.js
16.4.0
React
19.3.0
Unify
2026-10-12 · e4207b9

Database

PostgreSQL
18.0
Latency
2 ms
tsx
// app/(app)/system/page.tsx
import { SystemInfo } from "@nashyvan/unify";
import { buildInfo } from "@/lib/build-info";

export default async function SystemPage() {
  await requireViewer("/system");
  return (
    <>
      <PageHeader title="System" description="The running build and its environment." />
      <SystemInfo build={buildInfo()} sections={[runtime(), packages(), await database()]} />
    </>
  );
}

/api/health

Public and fast: the deploy script, Docker and the uptime monitor all read it. 503 when the app cannot serve.

HTTP
GET /api/health → 200
{
  "status": "ok",
  "version": "2026-10-12",
  "commit": "a1b2c3d",
  "checks": { "database": "ok", "worker": "ok" }
}