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

talon-auth

v0.17.4

Published

Add login to any website. Passwordless sign up, sign in, social logins, and user management even without a server.

Downloads

306

Readme

talon-auth

Add login to any website. Passwordless sign up, sign in, social logins, and user management even without a server. Works with any framework, any runtime, plain HTML and it's offline-friendly.

Quick Start

The fastest way to integrate Talon Auth is with the MCP server. Add the following to your MCP configuration:

{
  "mcpServers": {
    "talon": {
      "command": "npx",
      "args": ["-y", "talon-mcp"]
    }
  }
}

Or use the login component directly in any HTML page:

<script type="module" src="https://esm.sh/talon-auth/login"></script>
<talon-login id="login" app-id="your-app-id"></talon-login>

Sign up at talon.codes to get your app ID.

Installation

npm install talon-auth

Client Usage

Browser

import { createClient } from 'talon-auth'

const auth = createClient({ appId: 'your-app-id' })

// Get the current user (fetches a fresh token)
const user = await auth.getUser()

// Get an access token
const token = await auth.getAccessToken()

// Get an authorization header for API calls
const header = await auth.getHeader()
// => "Bearer <token>"

// Log out the current device
await auth.logout()

In the browser, device keys are stored as non-extractable CryptoKey objects in IndexedDB so they cannot be read by injected scripts.

Node.js / Deno / Bun

For server-side or CLI usage, provide a FileStore:

import fs from 'node:fs/promises'
import { createClient, createFileStore } from 'talon-auth'

const auth = createClient({
  appId: 'your-app-id',
  store: createFileStore(fs, '.talon-auth.json'),
})

const user = await auth.getUser()

Multiple Devices

A single client can manage multiple devices (e.g. different browser profiles or accounts):

// List all devices for this app
const devices = await auth.listDevices()
// => [{ deviceId: "did:key:...", user: { id, email } }]

// Switch to a specific device
await auth.setDevice(devices[0].deviceId)

// Create a new device
await auth.createDevice()

Server-Side Token Verification

Verify access tokens on your backend with createVerifier:

import { createVerifier } from 'talon-auth'

const verifier = createVerifier({ appId: 'your-app-id' })

// Verify a Bearer token from an Authorization header
const { user, payload } = await verifier.verifyHeader(request.headers.get('Authorization'))
// user => { id: "...", email: "..." }

// Or verify a raw token string
const result = await verifier.verify(token)

Custom Stores

The client accepts any object implementing the KvStore interface:

interface KvStore<T> {
  getItem(key: string): Promise<T | null>
  setItem(key: string, value: T): Promise<void>
  removeItem(key: string): Promise<void>
  getAll(): Promise<T[]>
}

Built-in stores:

  • createIndexedDbStore() - Browser default. Supports non-extractable CryptoKeys.
  • createFileStore(fs, path) - File-based storage for Node.js/Deno/Bun.
  • createMemoryStore() - In-memory, useful for testing.

Login Component

The <talon-login> web component handles the full passwordless and social login flow. Import it from the talon-auth/login entry point:

import 'talon-auth/login'

Or load it from a CDN:

<script type="module" src="https://esm.sh/talon-auth/login"></script>

Then use it in your HTML:

<talon-login app-id="your-app-id"></talon-login>

The component supports 20+ theme presets via the Talon Auth dashboard.

License

MIT