Files
netris-nestri/packages/auth
Wanjohi 39e4bebf64 feat(auth): draw code fields as one box per character
The emailed code and the device code are now typed into a row of boxes,
with a dash drawn between the device code's two halves. Typing moves to
the next box, backspace on an empty box goes back, the arrow keys move,
and a pasted or autofilled code, dashes and all, is spread across them.

It is an enhancement of the field and not a replacement for it. The
server still sends the single plain input, which works on its own with
script off; a short inline script draws the boxes over it and keeps it
in step. The real input is still the one that submits and the one whose
validity dims the button, so nothing else had to learn about boxes.
Pressing the button early moves to the first empty box, since the
browser's own message would point at a field nobody can see.
2026-10-02 06:00:08 +03:00
..
2026-08-06 22:13:51 +03:00
2026-08-06 22:32:33 +03:00
2026-08-06 22:13:51 +03:00

packages/auth (@nestri/auth)

Framework-agnostic OpenAuth implementation for Nestri — the OAuth/OIDC issuer, client, subjects, and the login UI. A vendored/forked build of OpenAuth.

What it does

Everything needed to run your own authentication provider:

  • issuer.ts — the authorization server: routes for /authorize, /callback, /token, /userinfo, .well-known/*, plus the login UI (React renderer).
  • client.ts — createClient to verify JWTs against the issuer ("who is this token?").
  • subject.ts — typed JWT subjects (zod schemas for the token payload).
  • provider/* — drop-in OAuth/OIDC providers (steam, discord, github, google, apple, microsoft, slack, spotify, twitch, x, yahoo, facebook, linkedin, cognito, keycloak, jumpcloud, oauth2, oidc, password, ssh, code, arctic).
  • storage/* — persistence adapters for keys/sessions/codes: memory, cloudflare (KV), aws, dynamo.
  • ui/* — the login page components (forms, password, code, theme, CSS).
  • jwt.ts, keys.ts, pkce.ts, random.ts — signing, keypair management, PKCE, randomness.

Usage

Consumed by the apps/auth worker, e.g.:

import { issuer } from '@nestri/auth/index';
import { CloudflareStorage } from '@nestri/auth/storage/cloudflare';
import { SteamProvider } from '@nestri/auth/provider/steam';

The API uses createClient (from @openauth/openauth/client) or the bundled client.ts to verify tokens against the issuer URL.

Scripts

bun test      # run tests
bun run build # build (see script/build.ts)

Note

@openauthjs is the upstream project; this package's exports are meant to be API-compatible with a pinned preference toward tree-shaking-friendly imports. Prefer importing subpaths over the barrel (@nestri/auth/index).