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

aimono

v0.1.1

Published

An Nx monorepo built to be operated by AI agents: every app ships with an AGENTS.md that is generated from the project graph, not written by hand.

Readme

aimono

Drop an AI agent into a monorepo it has never seen and watch what happens. It greps around for a while, finds a package.json, and runs npm test in the root because that's the command it knows. In an Nx workspace that's the wrong command, and the agent has no way to find out except by failing.

The usual fix is to write an AGENTS.md by hand. That works for about three weeks. Then someone renames a target, someone else adds an app, and the file quietly starts lying. A lying AGENTS.md is worse than no file at all, because now the agent trusts it.

aimono takes the part of that file which can be derived and derives it. Targets, commands, paths, tags and dependencies come out of the Nx project graph. Everything a person knows and a graph doesn't stays in a region the tool never touches. A check in CI fails the build when the derived part goes stale, so it can't rot without someone noticing.

What you get

npx aimono new acme        # Nx workspace with Biome, Husky and a root AGENTS.md
cd acme
npx ai app web --type=next # an app that ships with its own AGENTS.md
npx ai sync                # rewrite every generated region from the graph
npx ai sync --check        # exit non-zero if any of them is stale

ai is a thin alias over Nx. ai app web --type=next is nx g aimono:app web --type=next, and you can use either. Nothing is hidden behind the alias, which matters when an agent needs to compose a command the alias doesn't cover.

The file it writes

<!-- ai:generated -->
# web

Nx application (next) rooted at `apps/web`.

## Commands

| Target | Command |
| --- | --- |
| build | `nx build web` |
| serve | `nx serve web` |
| test | `nx test web` |
<!-- /ai:generated -->

## Decisions and traps

Anything below this heading belongs to whoever works here. `ai sync` never touches it.

The importer runs single-threaded on purpose. The upstream API rate limits at 10 rps.

Everything between the markers is regenerated. Everything outside survives byte for byte, and that's enforced by tests, not by good intentions. Write what you learned the hard way under ## Decisions and traps, because that's the half a project graph can never tell you.

How staleness is caught

ai init registers the generator in nx.json under sync.globalGenerators, so nx sync and nx sync:check pick it up like any other Nx sync generator. The Husky pre-commit hook runs the check, and so should your CI. If a target gets renamed and nobody reruns ai sync, the commit fails and says which file drifted.

Why Biome and not ESLint

One process instead of two, and the Nx generators are pointed at linter: none so they don't install the pair. ai init and ai app both delete a .prettierrc if a wrapped generator writes one, because they do, and a formatter that reflows markdown tables will fight the sync check forever. That fight is covered by an end-to-end test.

Use npm 11, or pnpm

npm 10 crashes with Cannot read properties of null (reading 'edgesOut') while resolving the peer set that the Nx app generators pull in, somewhere around vitest and vite. It is a bug in npm's arborist, not in Nx and not here, and it reproduces on a plain npm install with no generator involved. The nasty part is the aftermath: the install dies half done, and the next Nx command fails with something unrelated-looking from the project graph. ai new and ai app check your npm version and say so before you lose an hour to it.

Status

Version 0.1. It creates workspaces, generates next and node apps, and keeps every AGENTS.md honest. Libraries, more frameworks and adopting an existing workspace aren't in yet.

Requires Nx 21 or newer and Node 20 or newer.

License

MIT