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

@emito/cli

v0.1.0

Published

Installer CLI for Emito — detects your stack, installs the @emito/* packages, migrates the schema, and generates the backend glue files.

Downloads

169

Readme

@emito/cli

The installer CLI for Emito — emito init.

License Types

TypeScript Node.js

What it is

@emito/cli installs Emito into an existing project. Adopting Emito by hand means vendoring packages, wiring a JWT auth bridge, mounting a server handler, writing config, and migrating a schema — this CLI does that work for you and leaves behind two generated files you own outright.

It ships one binary, emito, with two commands:

| Command | What it does | | --- | --- | | emito init | Detects your stack, installs the right @emito/* packages, migrates the schema, and generates emito.config.ts + emito.mount.ts. | | emito agent-skill | Drops an AI coding agent skill into .claude/skills/emito-init/ so an agent can run the install and wire the mount call into your entrypoint. |

The generated files are yours, shadcn-style — not a hidden library call. emito init writes the same hand-assembled scaffold the docs walk you through, then gets out of the way. Edit them freely.

Install

@emito/cli is not yet published to npm. Once it is, the intended usage is:

npx @emito/cli@latest init

Until then, install it from the tarball attached to a GitHub Release — the repo is public, so the URL resolves directly:

pnpm add -D https://github.com/emito-pro/emito/releases/download/v0.1.0/emito-cli-0.1.0.tgz
pnpm exec emito init

The @emito/* packages the CLI then installs have to resolve too, which needs one overrides block pointing at the same release — the install page has the copy-pasteable version.

Working from a checkout of the monorepo instead? Build and invoke it directly:

git clone https://github.com/emito-pro/emito.git
cd emito && pnpm install
pnpm --filter @emito/cli build

# then, from your own project:
node /path/to/emito/packages/cli/dist/index.js init

emito init

emito init

The run is a wizard, and nothing is written until you confirm the plan:

  1. Preflight (read-only). Detects your package manager from the lockfile and your backend framework from package.json (express, fastify, hono, next, or the generic Node adapter). Checks that DATABASE_URL and REDIS_URL are set and reachable, prompting for anything missing. Aborts before touching anything if a prerequisite is unreachable, naming which service failed and why.
  2. Plan confirmation. Prints exactly what will be installed and generated.
  3. Execution. Installs the packages, appends the Emito block to .env.example, runs the Emito schema migration (in its own migrations table, isolated from yours), and writes emito.config.ts + emito.mount.ts.
  4. Summary. Reports what was generated, what is left to do by hand, and the freshly generated EMITO_JWT_SECRET for you to paste into your real .env.

An existing emito.config.ts or emito.mount.ts aborts the run — the CLI never silently overwrites files it did not write.

Flags

| Flag | Description | | --- | --- | | -y, --yes | Skip every prompt and take the defaults (in-app only, auto-confirm the plan); requires DATABASE_URL and REDIS_URL to already be set. | | --channels <list> | Comma-separated channels beyond in-app: --channels email,sms. | | --framework <name> | Backend framework, skipping detection: express, fastify, hono, nextjs, or node. |

emito init --yes --channels email,sms --framework fastify

The last step is yours

emito init generates the glue but does not edit your entrypoint — it can't safely infer arbitrary existing code structure. It finishes with manual-mount-required and tells you the one line to add:

import { buildEmitoServer, mountEmito } from "./emito.mount";

const { server, cleanup } = await buildEmitoServer();
mountEmito(app, server); // signature varies by framework — the generated file shows yours

emito agent-skill

emito agent-skill

Copies the bundled skill into .claude/skills/emito-init/SKILL.md. Ask an AI coding agent to "install Emito" and it runs emito init, then closes the gap the CLI leaves open: it locates your real entrypoint, inserts the import and mountEmito call at a safe point, and runs your typecheck as proof it didn't break anything.

An existing SKILL.md is left untouched — delete it and re-run to take a fresh copy.

Generated files

| File | Contents | | --- | --- | | emito.config.ts | createEmitoRuntime() — the Drizzle repositories bundle, per-channel providers (falling back to mock providers when the API keys are absent), and createEmito(...) with a starter category/event to edit. | | emito.mount.ts | buildEmitoServer()createEmitoServer(...) wired to JWT auth, returning { server, emito, repositories, cleanup } — plus a mountEmito(...) using the adapter matching your framework. |

Before production: the generated resolveWorkspaceRole grants workspace-admin to every authenticated subscriber. Replace it with real workspace-role resolution — the generated file flags this with a SECURITY TODO.

Part of Emito

@emito/cli is one package in the Emito monorepo — self-hosted, provider-agnostic notification infrastructure for Node.js and TypeScript.

License

MIT — part of the Emito project.