npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

@simplepasskey/browser

v0.3.3

Published

Browser SDK for SimplePasskey — passkey authentication as a service

Readme

@simplepasskey/browser

Browser SDK for SimplePasskey — passkey authentication as a service.

Install

npm install @simplepasskey/browser @simplewebauthn/browser

Usage

import { SimplePasskey } from '@simplepasskey/browser';

const auth = new SimplePasskey({ clientId: 'your-client-id' });

// Register a new user
const { jwt, userId } = await auth.register({ displayName: 'Sam' });

// Sign in
const { jwt, userId } = await auth.signIn();

// Check auth state
if (auth.isAuthenticated()) {
  console.log('Logged in as', auth.getSession().userId);
}

// Auto-refresh on 401
const resp = await auth.fetch('/api/protected-endpoint');

// Listen for auth changes
auth.onAuthChange((session) => {
  if (session) console.log('Signed in');
  else console.log('Signed out');
});

// Logout
await auth.logout();

API

new SimplePasskey({ clientId, baseUrl?, autoRefresh? })

Create an instance. baseUrl defaults to https://api.simplepasskey.com. autoRefresh defaults to true.

auth.register({ displayName? }){ jwt, userId }

Register a new passkey. Prompts the user's authenticator.

auth.signIn(options?){ jwt, userId }

Authenticate with an existing passkey. Pass { useBrowserAutofill: true } to use conditional UI (autofill) instead of a modal.

auth.refresh(){ jwt }

Refresh an expired JWT using the HttpOnly refresh token cookie.

auth.logout()

Clear the session and invalidate the refresh token.

auth.getSession(){ jwt, userId, isExpired }

Get current session state.

auth.isAuthenticated()boolean

Check if the user has a valid (non-expired) JWT.

auth.fetch(url, options?)Response

Fetch with automatic JWT auth and 401 auto-refresh.

auth.onAuthChange(callback)() => void

Subscribe to auth state changes. Returns an unsubscribe function.

auth.readyPromise<Session>

A promise that resolves once auto-refresh on initialization is complete. Use await auth.ready to wait for session restoration.

Session Restoration

The SDK automatically refreshes expired JWTs on initialization:

const auth = new SimplePasskey({ clientId: 'your-client-id' });

// Wait for session restoration
const session = await auth.ready;
if (session.jwt) {
  console.log('Welcome back', session.userId);
} else {
  // Show login UI
}

Disable with autoRefresh: false if you handle refresh yourself.

Conditional UI (Autofill)

For a seamless sign-in experience, use browser autofill instead of a modal:

<input type="text" autocomplete="webauthn" placeholder="Sign in" />
// Call early on page load — the passkey appears in the autofill dropdown
const { jwt, userId } = await auth.signIn({ useBrowserAutofill: true });