@radonsdk/auth50 providersAuthentication you actually own.
Email codes, magic links, passwords, and 50 OAuth providers — over any database, wired into your framework in a few lines. Stateless JWT sessions you verify in your own middleware, or DB-backed sessions you can revoke. No hosted service, no per-MAU pricing.
import { Radon } from "@radonsdk/auth";
import { postgresAdapter } from "@radonsdk/auth/adapters/postgres";
const auth = new Radon({
adapter: postgresAdapter(pool),
session: { secret: process.env.RADON_SECRET! },
providers: {
magicLink: { sender, baseUrl: "https://app.com/verify" },
google: { clientId, clientSecret },
},
});Passwordless & password
Email one-time codes, magic links, and email + password with reset — secrets are hashed before they touch your database.
50 OAuth providers
GitHub to Shopify, all on one OAuth2/OIDC engine. Each provider is a one-liner; custom presets need no fork.
Passkeys, 2FA & phone OTP
WebAuthn passkeys, TOTP with recovery codes, and SMS OTP — the modern second factors, Pro-gated.
Bring your own database
Seven adapters — Postgres, MySQL, SQLite, MongoDB, Supabase, Firebase — plus a clean adapter contract for anything else.
Ten framework integrations
Next.js, Express, Fastify, Hono free; Koa, NestJS, SvelteKit, Nuxt, Remix, Astro on Pro. One handler, mounted your way.
Orgs, API keys & GDPR
Teams with roles, hashed API keys, impersonation, and one-call data export/delete — the surface real apps need.
1 free, 49 on Pro — same call for every one.
A small, typed surface.
new Radon(config)Construct with an adapter, a session secret, and the providers you use.
auth.magicLink.sendLink({ email }): Promise<{ url; expiresAt }>Send a signed magic link; verify() on the callback returns the user.
auth.emailCode.verify({ email, code }): Promise<{ user; created }>Verify a one-time code and resolve (or create) the user.
auth.oauth("github").getAuthUrl(): { url; state }PROStart any of the 50 OAuth flows on the shared engine.
auth.createSessionToken(userId): { token; expiresAt }Mint a stateless HS256 session you verify anywhere with verifyToken().
auth.getSessionUser(token): Promise<RadonUser>Resolve the current user from a session token.
import { radonNextHandler } from "@radonsdk/auth/integrations/next";
import { auth } from "@/lib/auth";
// app/api/auth/[...radon]/route.ts
export const POST = radonNextHandler(auth);
export const GET = radonNextHandler(auth);Pro verifies once, and fails closed
Configure any Pro provider and you must call await auth.init() — it verifies your license key once per process and throws if it can't. Free-tier auth (codes, links, password, Google) needs no init() at all.