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

@asyncify-hq/cli

v0.2.0

Published

Asyncify dev CLI — managed tunnel with automatic webhook rewiring, and an agent scaffolder

Readme

@asyncify-hq/cli

Dev tooling for Asyncify agents. Two commands, zero runtime dependencies:

  • asyncify dev — runs a managed cloudflared tunnel, publishes its public URL to your local Asyncify stack, rewires every channel webhook, and keeps the tunnel healthy — auto-rotating and re-wiring when cloudflared drops.
  • asyncify create-agent <dir> — scaffolds a runnable bridge-agent starter.
npx @asyncify-hq/cli dev
npx @asyncify-hq/cli create-agent my-bot

asyncify dev

asyncify dev [--port 3000] [--api-url http://localhost:3000] [--api-key <key>] [--no-env-write]

| Flag | Default | Meaning | |------|---------|---------| | --port | 3000 | Local port your Asyncify stack listens on (tunnel target). | | --api-url | http://localhost:3000 | Asyncify API base URL. | | --api-key | $ASYNCIFY_API_KEY, else the dev seed dev-api-key-123 | Tenant API key. | | --no-env-write | off | Do not rewrite PUBLIC_URL in ./.env. |

When the dev seed key is used (no env var, no flag), dev prints a notice so you know which tenant you are targeting.

What it automates

  • Publishes the tunnel URL via PUT /v1/ops/public-url.
  • Updates PUBLIC_URL in ./.env (if the file exists; skip with --no-env-write).
  • Telegram: reconnects each active connection automatically and verifies the new webhook took (one retry if Telegram reports a stale URL).
  • Health-checks the tunnel every 20s and rotates it on failure (3 strikes) or if cloudflared exits — re-running the full rewire against the new URL.

What still needs a human paste

Slack and email webhooks live in third-party consoles, so dev prints a table of the exact URLs and where to paste them (● marks a row that changed since the last run):

  • Slack Events → Slack app config → Event Subscriptions → Request URL.
  • Slack Interactivity → Slack app config → Interactivity & Shortcuts → Request URL.
  • Email → Postmark → Servers → Default Inbound Stream → Settings → Webhook.

Prerequisite

cloudflared must be on PATH. dev checks at startup and prints install instructions (winget / brew / apt) if it is missing.

asyncify create-agent

asyncify create-agent my-bot [--identifier my-bot]

Scaffolds package.json, a self-registering agent.ts, .env.example, README.md, and .gitignore into the target directory (which must be empty). The agent registers itself with Asyncify on first run and serves a signed bridge; edit agent.ts to build your brain.

--identifier defaults to the slugified directory basename ([a-z0-9-]).

The scaffolded project runs with tsx --env-file=.env, which needs Node >= 20.6.

Engines

Requires Node >= 20.6.