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

atproto-inspect

v0.1.0

Published

Interactive terminal inspector for debugging ATProto (Bluesky) repositories and records.

Downloads

136

Readme

atp — ATProto record inspector

An interactive terminal app for debugging ATProto / Bluesky repositories. Give it a handle or DID and browse the identity, its collections, and every record — with syntax-highlighted JSON, live search, and blob inspection. Built with Ink (React for the terminal), the same stack Claude Code's CLI uses.

Read-only and unauthenticated: it inspects public repo data only. No login, no writes.

Install

Run it without installing anything (once published to npm):

npx atproto-inspect srtfisher.bsky.social

Or install the atp command globally:

npm install -g atproto-inspect
atp srtfisher.bsky.social

From source

npm install
npm run build
npm link      # exposes the global `atp` command

Requires Node 20+.

Usage

atp srtfisher.bsky.social      # launch and browse
atp did:plc:xxxx               # a DID works too
atp                            # prompts for a handle

# Point at a specific PDS (bare host or full URL). With --pds, the PDS is
# queried directly and public identity resolution is skipped — so a self-hosted
# PDS + DID works even when the DID isn't in the public PLC directory:
atp did:plc:bvbng3pv43ugysgkvhhalfcw --pds pds.chicago-com.alley.dev

Navigation

Screens drill down like a nav stack: Identity → Collections → Records → Record → Blob.

| Key | Action | | ---------- | --------------------------------------- | | / j k | Move selection | | | Open / drill in | | esc / | Back | | / | Search & filter records (esc cancels) | | y | Copy record JSON to clipboard | | s | Save record JSON to a file | | b | Inspect blobs referenced by a record | | g / G | Jump to top / bottom of a record | | d | Toggle the DID document (identity screen)| | q | Quit |

Non-interactive (scripting)

atp <handle> --json                        # identity + collections as JSON
atp <handle> --dump app.bsky.feed.post     # all records of a collection as JSON
atp <handle> --pds https://my.pds          # override PDS discovery

How it works

  1. Resolve identity — handle → DID (@atproto/identity), then DID document → PDS endpoint, with a bi-directional handle-verification check. When --pds is given, this step is skipped: the PDS is queried directly via describeRepo, which returns the DID, handle, and DID document authoritatively.
  2. Describe repocom.atproto.repo.describeRepo lists collections.
  3. List / get recordslistRecords (paginated, loaded incrementally so you can browse as it fetches) and getRecord.
  4. Blobs — record values are scanned for blob refs; com.atproto.sync.getBlob fetches the bytes on demand.

Development

npm run dev        # tsup watch build
npm run typecheck  # tsc --noEmit
npm test           # vitest

Layout

src/
  atproto/   data layer — framework-free SDK wrapper (identity, repo, summaries)
  ui/        Ink components — nav stack, screens, shared widgets
  lib/       JSON highlighter, clipboard/file helpers
  cli.tsx    arg parsing + interactive/non-interactive entry
test/        vitest unit + render tests

The data layer has no React dependency and is unit-tested independently of the UI.

Releasing

Releases are tag-driven — bump the version and push the tag, and CI publishes to npm and cuts the GitHub release. See RELEASING.md.

License

MIT