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

deploylog

v0.7.0

Published

Push changelog entries from the terminal

Readme


Install

npm i -g deploylog

Node 18+ required. Installs two equivalent commands: deploylog and the short alias dpl.

Authenticate

Create an API key in your dashboard at deploylog.dev/dashboard/api-keys, then:

deploylog login --key dk_xxx

Credentials are stored with conf in your OS's standard config directory.

Quick start

# Wire this repo to a project (writes .deploylog.yml)
deploylog init

# Draft an entry from your commits, rewritten by AI
deploylog push --from-git --ai-summarize

# Review it, then ship it
deploylog list --drafts
deploylog view dark-mode
deploylog publish dark-mode

The full lifecycle lives in the terminal: create, list, view, edit, publish, unpublish, delete. No dashboard detour.

Project config

deploylog init writes a .deploylog.yml at your repo root so you don't have to pass --project every time:

project: my-app
default_type: feature   # optional

Referencing entries

Entry commands accept a slug or an id (deploylog publish dark-mode, deploylog publish 3f2b8a1c-...). Slugs are matched against the 50 most recent entries; older entries need the id (deploylog list shows both). Note that editing a draft's title can change its slug, so scripts should prefer ids.

Machine-readable output

Every data command takes --json: raw JSON on stdout, errors as {"error":{"code","message"}} on stderr, and no interactive prompts, ever. Built for CI and AI agents.

deploylog list --drafts --json | jq -r '.[0].id'

Commands

deploylog login / deploylog logout

Authenticate with an API key (create one at deploylog.dev/dashboard/api-keys).

--key <key>       API key (starts with dk_)
--api-url <url>   API base URL (default: https://deploylog.dev)

deploylog init

Scaffold .deploylog.yml in the current directory. Picks the project interactively, or takes --project.

-p, --project <slug>   Project slug
-T, --type <type>      Default entry type for pushes from this repo
--force                Overwrite an existing .deploylog.yml

deploylog projects (alias: proj)

List projects in your organization.

deploylog projects create <name>

Create a project. The slug is generated from the name.

--url <url>   Project website URL

deploylog whoami

Show the authenticated org, plan, API key (name, prefix, permissions), and AI usage this month.

deploylog manual export

Export a project's whole manual as JSON: every version with its commit map, and every chapter with its claims. The payload is validated against the server's published schema before anything is written, and the export is available on every plan.

-p, --project <slug>   Project slug (or set in .deploylog.yml)
-o, --out <path>       Output file (default: ./<slug>-manual.json; - for stdout)

deploylog manual verify

Check the project's manual against the code it cites, at the commit you are on, from a terminal, a pre-push hook or any CI. Sends one request to the same endpoint the GitHub Action uses; no checking happens client-side. The exit code is the answer: 1 when a cited value moved (drift), 2 when the run could not vouch for the manual — either because you asked for that with --fail-on any, or because the run read claims and not one of them held, which fails at any --fail-on but none — and 0 otherwise. The summary line prints vouched N, the number that floor rests on: claims read and stood behind, which is evaluated minus the drifted and the unreadable.

-p, --project <slug>          Project slug (or set in .deploylog.yml)
--repository <owner/repo>     Repository to verify as (default: parsed from `git remote get-url origin`, HTTPS or SSH)
--ref <sha>                   Full commit sha to verify at (default: `git rev-parse HEAD`)
--changed-from <base>         Only claims citing files changed since <base> (default: the whole manual)
--fail-on <mode>              none | drift | any (default: drift)

--repository must be a repository the manual's commit map covers. A fork or a mirror is a GitHub remote with the wrong slug: the server re-pins only the slug you send, so claims citing the upstream keep their stored pin, and the CLI prints verified nothing at <ref>: no claim cites <repository> on stderr when that happens, whatever --fail-on is.

Two boundaries of that floor, both deliberate. A manual with one cited file, whose single claim cannot be read, vouches for nothing and so fails at the default — where a manual with two readable claims beside the same broken one passes; the floor asks whether the run stood behind anything, not whether everything went right. And --json prints the server's payload untouched, which has no vouched field: derive it as evaluated - confirmed - error, or read the summary line.

--changed-from sends git diff --name-only --no-renames <base>...HEAD. An empty diff is not a scope: the CLI verifies the whole manual instead and says so, because an empty list would evaluate no claim and report a clean sweep.

# In a pre-push hook: block the push on drift
deploylog manual verify || exit 1

# In CI, scoped to the branch, failing on anything the run could not vouch for
deploylog manual verify --changed-from origin/main --fail-on any --json

deploylog list (alias: ls)

List recent entries for a project. Prints each entry's slug and id.

-p, --project <slug>   Project slug (or set in .deploylog.yml)
--drafts               Only drafts
--published            Only published entries
-T, --type <type>      Filter by entry type
-n, --limit <n>        Max entries (1-50)

deploylog view <entry> (alias: show)

Show a full entry, including its Markdown body.

deploylog push

Create a new changelog entry.

-t, --title <title>       Entry title
-b, --body <markdown>     Entry body (Markdown)
-p, --project <slug>      Project slug (or set in .deploylog.yml)
-T, --type <type>         feature | fix | improvement | breaking | announcement
--version <version>       Semver (e.g. 1.2.3)
-P, --publish             Publish immediately
-D, --draft               Save as draft (default)
-g, --from-git            Derive title/body from commits since the last tag (alias: --git)
-a, --ai-summarize        Rewrite the entry with Claude Haiku (alias: --ai)
-y, --yes                 Skip interactive confirmation for AI-generated content

deploylog edit <entry>

Update an entry. With no field flags on an interactive terminal, your $EDITOR opens prefilled with the current body. If the server rejects an edited body, it is saved to a recovery file, never lost.

-t, --title <title>     New title (may change a draft's slug; the CLI tells you)
-T, --type <type>       Entry type
--version <version>     Semver version (pass "" to clear)
-b, --body <markdown>   New body
--body-file <path>      Read the new body from a file (- for stdin)

deploylog publish <entry> (alias: pub) / deploylog unpublish <entry> (alias: unpub)

Publish a draft, or revert a published entry to draft. Publishing is idempotent: re-running is a no-op, and the email digest (Pro) is sent at most once per entry, ever. Unpublishing resets the publish date; republishing gets a new one.

deploylog delete <entry> (alias: rm)

Delete an entry permanently. Prompts for confirmation on a terminal; requires --yes in CI or --json mode.

deploylog import github <repo>

Backfill your existing GitHub releases as draft entries. Takes owner/repo or a github.com URL. Skips versions you already imported.

-p, --project <slug>   Project slug (or set in .deploylog.yml)
--token <token>        GitHub PAT for private repos / rate limits (or DEPLOYLOG_GITHUB_TOKEN); never stored

deploylog open [entry] (alias: o)

Open the project's public changelog (or one entry's page) in your browser. Prints the URL when headless.

Recipes

Onboard a repo in one minute:

deploylog login --key dk_xxx
deploylog projects create "My App" --url https://myapp.dev
deploylog init
deploylog import github me/my-app     # backfill old releases as drafts
deploylog list --drafts               # review
deploylog publish v1-4-0

Draft from recent commits, ship after review:

deploylog push --from-git --ai-summarize
deploylog view <slug>        # read what the AI wrote
deploylog edit <slug>        # tweak in $EDITOR
deploylog publish <slug>

CI: publish on release, no prompts:

deploylog push --from-git --ai-summarize --yes --publish --json

For GitHub Actions specifically, prefer the official Action: deploylogdev/action.

Agent-driven usage: every command's --json output is stable and prompt-free; destructive operations refuse without an explicit --yes.

Related

License

MIT © DeployLog