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

@tallpond/cli

v0.0.8

Published

The tallpond developer CLI — sign in, register an app, and deploy schema + frontend with one command.

Readme

@tallpond/cli

The tallpond CLI is the whole developer workflow for tallpond: sign in once, register an app, and ship schema + frontend with one command. No dashboard steps, no hand-provisioned OAuth clients, no shared secrets.

Install

Run it without installing:

npx @tallpond/cli login

or install globally so the tallpond command is on your PATH:

npm i -g @tallpond/cli

Quick start

tallpond login                 # sign in (browser approval), saves a developer token
tallpond apps create "My App"  # registers the app + its OAuth client, writes tallpond.json
tallpond deploy                # applies .tallpond.schema.ts and publishes ./dist

A deployed app is served at https://<slug>.tallpond.app with the schema live behind the gateway.

tallpond login

Device-flow sign-in: the CLI prints an approval URL with a short confirmation code, you approve it in the browser using your existing tallpond session, and the CLI receives a developer token saved to ~/.config/tallpond/credentials.json (mode 600). The code in the URL can only approve — it can never mint a token, so a leaked link doesn't compromise the login.

TALLPOND_DEV_TOKEN overrides the saved token (for CI / non-interactive agents). tallpond logout forgets it; tallpond whoami prints the signed-in user.

tallpond deploy [schemaFile] [--dir dist] [--no-bundle]

Applies .tallpond.schema.ts (compiled locally) and uploads ./dist as a new immutable version, then flips the live pointer in one call. Safe schema changes apply automatically; destructive ones are blocked pending an explicit migration.

The schema file is TypeScript: the CLI compiles it in-process (via esbuild) so it runs on any supported Node — no bun or global TS loader required.

Functions

If the project has a functions/ directory, tallpond deploy also deploys it. The convention: each .ts/.js file directly under functions/ is one invokable function, named after the file, and must export default its handler:

// functions/submitMove.ts — invoked as tallpond.functions.invoke('submitMove', args)
import type { FunctionContext } from '@tallpond/sdk' // type-only; nothing bundled

export default async (ctx: FunctionContext, args: { resourceId: string; move: unknown }) => {
  await ctx.db.query({
    scope: { kind: 'resource', resourceId: args.resourceId },
    table: 'moves',
    op: 'insert',
    values: { move: args.move },
  })
  return { ok: true }
}

The ctx surface is exactly userId, resourceId, fn, invocationId, db.query/db.batch (raw /v1/db wire shape), and gateway(path, body?, opts?) (POST by default, { method: 'GET' } for read routes) — annotate with FunctionContext so the compiler enforces it. Full contract: https://tallpond.com/docs/functions/.

File names must be identifiers (letters/digits/underscores). Shared helpers and types belong in a subdirectory (e.g. functions/lib/) — subdirectories aren't scanned, and handlers can import from them freely (everything is bundled). A top-level file without a default export is skipped with a warning rather than deployed.

tallpond test-session [--user name]

End-to-end testing without a browser: mints a bearer token for a synthetic test user of your app. Test users have no wallet — their usage bills your own balance directly (bounded by your per-app budget), and tokens expire after 24h. The token alone goes to stdout:

ALICE=$(tallpond test-session --user alice)
curl -H "Authorization: Bearer $ALICE" https://api.tallpond.com/v1/users/me

It authenticates on every user-facing route — tables, resources, functions, files, AI — as that user, metering normally. Mint two names for multi-user flows.

Full command reference: https://tallpond.com → docs → CLI.

License

MIT