Zero Accessby Railman
Packages

Zero-vault

Getting started with @railman/zero-vault — create, daily unlock, and recovery reset.

Getting started — Zero-vault

@railman/zero-vault is an additional browser product. It creates and unlocks MEKs locally. It publishes through authClient.zeroAccess and calls authClient.elevate only before privileged writes. Client boundaries.

Guide: Vault · Demo: /vault

Install

pnpm add @railman/zero-vault @railman/auth-zero-access @railman/auth-zero-access-passkey

Setup

import { createAuthClient } from "better-auth/client";
import { passkeyClient } from "@better-auth/passkey/client";
import { elevateClient } from "@railman/auth-elevate/client";
import { zeroAccessClient } from "@railman/auth-zero-access/client";
import { defineZeroAccessPasskeyCryptoConfig } from "@railman/auth-zero-access-passkey/client";
import { createVaultClient } from "@railman/zero-vault";

const authClient = createAuthClient({
  plugins: [passkeyClient(), elevateClient(), zeroAccessClient()],
});

const cryptoConfig = defineZeroAccessPasskeyCryptoConfig({
  salt: process.env.NEXT_PUBLIC_PRF_SALT!,
});

const vault = createVaultClient({
  userId,
  cryptoConfig,
  authClient,
});

await authClient.elevate.withPasskey();
const created = await vault.createVault({ password });
created.init.exportRecoveryPhrase();
await vault.persistCreatedVault(created, { authClient });
await vault.unlockWithPasskey();

Typical surface:

MethodRole
createVaultLocal WebCrypto. Returns mekBody + slots + phrase. No HTTP.
persistCreatedVaultSugar: POST those bodies via authClient.zeroAccess (or fetch). Not authClient.createMek.
unlockWithPasskeyList wraps → local PRF get → unlockDaily (not elevate, not login)
unlockDailyExplicit PRF secret and/or vault password
buildAccountRecoveryEnrollBodyPossession-proof body for POST /account-recovery/enroll
resetWithRecoveryPhraseBreak-glass reset
reenrollDailyMethodsAfter recovery

Requirements

  • Server: zeroAccess() + passkey stack in the same Better Auth instance (zero-access)
  • PRF salt only in browser crypto config
  • Recovery phrase for reset, not everyday unlock

Next

On this page