Logins for people and AI agents.Unlimited users and unlimited enterprise SSO for $299 a month, flat. Hobby is free, no card needed.
I built Signet for the day a big customer asks for SSO. You add their identity provider in settings and your bill stays the same. Every user, session and API key is a row in a database that’s yours.
Already on better-auth? Keep your client and change one URL.
baseURL: "https://old-vendor.example.com", baseURL: "https://auth.acme.com",
Herman Geldenhuys, GeldenTech Inc., Montreal. Signet’s own console signs in through Signet.
Type your app’s name. The passport is drawn from it, so no two come out the same.
People, services and agents. Three kinds of access. One way to cancel any of them.
People get a session. End it and they are signed out.
A person signs in with a passkey, an email code or, on Team, their company’s SSO. Tear the session and its row is deleted outright. The audit log keeps who did it and when.
Services get an API key. It works until you revoke it.
Your billing worker and your webhook relay carry API keys. They last until you give them an end date or revoke them, and revoking is one call.
Agents get a token that runs out within the hour.
An agent acts for one person, inside a scope you set, through MCP. Its token expires on its own even if nobody remembers to cancel it. A renewal is a new token, so you can cancel that one too.
- Nothing cancelled yet. Tear the boarding pass, void the badge, or wait out the visa.
In a real instance, all three are rows in your own database.
What ships today.
- Email + password
- Passkeys
- Magic links
- Email codes
- Two-factor with backup codes
- Social sign-in
- Organisations + invitations
- API keys
- Device codes
- MCP auth for AI agents
- Agent tokens that run out within the hour
- Session + token revocation
- SAML + OIDC single sign-on
- SSO certificate rotation in one call
- SCIM with Microsoft Entra
- Audit log that refuses edits
All of this works today. The product page marks the few features my tests don’t fully cover yet.
What your users see.
Every Signet instance serves its own sign-in page at /login, with sign-up and password reset beside it. Send people there, or keep your own screens and call the same API with the better-auth client.
/login page.The certificate changes. The connection stays. Your customer’s identity provider replaces its signing certificate. You make one call.
Identity providers replace their SAML signing certificates every few years. In better-auth’s SSO plugin there is no stock way to do that once people have signed in. You delete the connection and register it again. That unlinks everyone who signed in through it. With domain checks on, sign-in stays blocked until your customer publishes a new DNS record (issue 11471, open on 10 Oct 2026).
In Signet you send the new certificate in one call. The callback URL stays the same. The connection and its members stay, and nothing changes in DNS. The change goes into the audit log. Signet checks that the new certificate is in date before it accepts it.
Signet swaps the certificate. It never trusts the old one and the new one at the same time. So sign-ins through that connection fail between your customer’s switch and your call. Make the call right after they switch.
What I’ve checked, and when.
- SAML sign-in and certificate rotation, driven against a live Microsoft Entra tenant on 10 Oct 2026.
- A SAML round trip with Okta on 16 Aug 2026.
- OIDC sign-in with multi-factor, driven against a live Microsoft Entra tenant.
- Signet refuses an identity provider’s expired certificate by default.
- SSO adds new members to an organisation only after the organisation proves its domain in DNS.
- SCIM provisioning and deprovisioning with Microsoft Entra.
- The audit log refuses edits, and you export it as NDJSON through the admin API.
Move from better-auth. Your users keep their passwords and their sessions.
Keep the better-auth client you already ship and change one URL. User rows, password hashes and live sessions copy across, so nobody resets a password. If you roll back, every session issued before the cutover is still valid.
import { createAuthClient } from "better-auth/client" export const auth = createAuthClient({ baseURL: "https://old-vendor.example.com", baseURL: "https://auth.acme.com",})
It’s the stock client: bun add better-auth. Tested against better-auth 1.6.23 on 22 July 2026.
One flat price. Add users and SSO connections. The price stays put.
Every enterprise customer brings its own SSO connection. Your fifteenth costs what your first did, which is nothing extra.
WorkOS lists SSO at $125 per connection a month for the first 15 connections (workos.com/pricing, checked 4 Oct 2026).
Prices effective 2026-08-07. Team runs on a PostgreSQL database dedicated to you. Hobby is free and keeps your data in encrypted SQLite.
- Per user$0
- Per SSO connection$0
- Overage$0
- Renewal true-up$0
- Flat, monthly$299
Those lines stay at $0 because Signet doesn’t count active users at all.
Ask for an NDA before sign-in. Keep a record of exactly what they accepted.
Attach an NDA, a licence or a pledge on personal data to an app that signs people in through Signet as its OAuth provider. Signet shows people the full text and lets them in only after they accept.
13b0b8fa 60b8d396 81226ae7 ed1d4c60
Also kept: the app, the IP address and the browser.
- Declining records nothing, and the person is not signed in. They can come back any time.
- Publish a new version and Signet asks again at the next sign-in or token refresh. So does a renewal date, if you set one. The page says why.
- Signet checks it wherever it issues a token for the app: browser sign-in, code exchange, device sign-in, refresh and signed assertions. Not only the login page.
- List every record, or export it as CSV. A record stays even if you delete the person’s account.
- Acceptance stays apart from OAuth consent. Consent is what the app may read. The agreement is the person’s own word. Revoking consent removes no acceptance.
It is a record, not legal advice: I can’t tell you whether a click is enough for your agreement.
Anything to declare? Yes. Four things I don’t have yet.
Your security reviewer would find these anyway, so here they are up front.
If one of them rules Signet out, you should know now and not six weeks into a review. The vendor pack has the rest on one page: legal entity, subprocessors and how to leave.
Every instance, yours included, publishes its own test results at /certification. The security page tracks what’s still missing.
Do you have anything to declare?
We declare:
- No compliance report or certification, and no third-party penetration test yet.
- No uptime SLA outside a signed contract.
- You can’t yet make SSO the only way in for a domain. A person with a password can still sign in with it.
- The OAuth provider does not claim full OpenID Connect conformance.
Leaving takes one command. On PostgreSQL, one pg_dump exports every user, session and secret.
Hosted, you ask and I hand you the file. On your own servers you run it yourself. Hobby uses encrypted SQLite, which takes one more step: the export guide.
- Nothing phones home, and licences are checked offline.
- No sign-in ever calls our servers.
pg_dump --no-owner "$SIGNET_DATABASE_URL" > signet.sql
Start free on Hobby.
Sign up and your instance is running in a few minutes, no call needed. Want Signet on your own servers? That’s an enterprise licence, and you’ll talk to me directly.