BETA Early software. Test with non-sensitive accounts.
MAYOAUTH / 0.1.0-BETA.1

Start small. Own it.

The public website offers a browser-only sample workspace. The Community repository contains the real self-hosted OIDC server, administration API, console, and CLI.

Run the Community server

Requires Node.js 24 LTS. No vendor account is needed. Choose an instance directory on persistent storage. The default is a private .mayoauth directory in your working folder.

git clone https://github.com/securelyprogramming/MayoAuth.git
cd MayoAuth
npm ci
npm link

# Bash: read a password without echo or command history
read -r -s -p "Admin password: " MAYOAUTH_INIT_PASSWORD
printf '%s' "$MAYOAUTH_INIT_PASSWORD" | mayoauth init \
  --issuer http://localhost:8787 \
  --admin-email admin@example.test --password-stdin
unset MAYOAUTH_INIT_PASSWORD

mayoauth serve
# Open http://localhost:8787/login

The issuer must exactly match the origin that applications use. For a deployed instance, initialize with its HTTPS origin. Do not change the issuer of an active instance casually. Instance keys, encrypted-connector keys, and the local CLI token are saved with private file permissions.

One console. One API. One CLI.

mayoauth status
mayoauth doctor
mayoauth users list
mayoauth apps add --name "My app" \
  --redirect-uri http://localhost:3000/callback
mayoauth connectors list
mayoauth logs --export > audit.json
mayoauth --help

Use --data-dir to select an instance. For a remote server, set MAYOAUTH_URL and MAYOAUTH_TOKEN in a private environment. Passwords and connector secrets are accepted on stdin, never as command arguments. Remote CLI connections require HTTPS.

The CLI is installed from the repository today. There is no published npm package or shell installer to download yet.

Standard OIDC, explicit trust

Discovery is at /.well-known/openid-configuration. The issuer supports authorization code with required PKCE S256, signed ID tokens, a JWKS endpoint, consent, and userinfo. Applications use exact registered callback URLs. Public dynamic registration is disabled.

Upstream connectors use openid-client to validate state, nonce, PKCE, and tokens. Configure the callback as INSTANCE_ORIGIN/connectors/callback. An administrator must map the upstream provider’s immutable sub to an existing local user. MayoAuth never auto-links accounts just because email addresses match.

Google, Microsoft, GitHub, and other named providers are not individually certified in this beta. A generic OIDC connector must be tested with your own tenant before use. GitHub’s regular OAuth login is not itself a generic OIDC provider.

Bounded by design

Resource Default boundary
SQLite main database 256 MiB, enforced with max_page_count
SQLite page cache 8 MiB configured cache budget
Audit history 10,000 events / 30 days, whichever expires first
OIDC transient records 10,000 rows, with expiry cleanup
Container 256 MiB memory, 0.5 CPU, 80 processes
Temporary filesystem / logs 16 MiB tmpfs / 2 × 5 MiB log files

The beta uses one SQLite process with DELETE journaling. The database-file cap excludes rollback journals, backups, and filesystem overhead. The page-cache setting is a budget, not a total-process memory limit; the container enforces the latter. Allow at least 1 GiB of dedicated storage headroom and apply a host filesystem quota for a hard directory-level ceiling. A full database rejects writes; it never silently removes identities.

Use mayoauth status or the console’s storage panel to inspect usage. The public website/demo creates no server-side identity database.

The Community / Premium boundary

Capability Community beta Managed Premium plan
OIDC, users, connectors, CLI Included Same foundation
Audit export & basic metrics Included Longer managed retention & alerts
User count No license cap Managed capacity beyond planned 20-user free tier
Hosting, updates, backups You operate We operate
Support & availability Community issues Planned priority support and service commitments

Cloud Free and Premium are planned services. No hosted production tenants, subscription checkout, or payments are implemented. The public demo is not the future Cloud service. We have not set Premium pricing.

Beta means beta.

Use non-sensitive test accounts. The project has not undergone an independent security assessment. The beta is an inspectable starting point, with explicit limits.

Implemented: single-instance OIDC, local passwords, explicit upstream OIDC account linking, user suspension, application registration, bounded audit data, basic metrics, console, and CLI.

Not implemented: built-in MFA/passkeys, account self-service or recovery, email delivery/verification, SAML, SCIM, directory synchronization, refresh-token flows, distributed deployment, managed tenant isolation, billing, or support SLAs. Built-in MFA belongs in Community when implemented.

Account suspension revokes persisted sessions and grants. Already issued ID tokens may remain verifiable until their short expiry; relying applications must enforce their own sessions and revocation strategy. This beta is not a full Okta replacement.

Keep the demo synthetic

The demo saves sample users, apps, connectors, and events in your browser’s local storage. Use sample addresses ending in @example.test. It never creates real accounts, contacts identity providers, sends email, or issues identity tokens. Resetting the demo removes this sample data.

The site has no analytics scripts, tracking cookies, or third-party fonts. The hosting reverse proxy may retain normal request logs. Self-hosted instance data remains on the infrastructure you operate.

Read the code. Open an issue. Make it better. ↗