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

@jankoritak/claude-bullhorn

v0.1.2

Published

Post to X from inside Claude Code. Draft from your session, review, approve, post. BYOK, write-only, local-only.

Readme

Bullhorn

Post to X (Twitter) from inside Claude Code. Draft a post from your current session context, review it, approve it, publish it. Nothing posts without your approval.

OSS, bring-your-own-keys, write-only, local-only. No backend. The plugin runs in your Claude Code and posts to your own X account with your own credentials, at about $0.01 per post.

Requirements

  • Node 20+ on your PATH. The plugin runs its bundled server with node, so this is required for both install methods (pnpm is needed only for the source install).
  • An X developer account (developer.x.com), not just a regular X account.
  • A small amount of API credits on that account. Posting is pay-per-use, about $0.01 per post.

X setup (one time)

Order matters. You need four OAuth 1.0a credentials:

  1. Create a Project and an App.
  2. In the App's User authentication settings, set permissions to Read and Write. Do this first.
  3. Generate the four values: API Key, API Secret, Access Token, Access Token Secret. Generate the Access Token and Secret after step 2, or they stay read-only and posting fails with a 403.
  4. Add billing/credits to the account, or posting fails with a 402.

Install

/plugin marketplace add jankoritak/bullhorn
/plugin install bullhorn@bullhorn

You install it through Claude Code — there is no npm install step.

From source:

pnpm install && pnpm build      # bundles the MCP server into plugin/bin/
claude --plugin-dir ./plugin

Configure (BYOK)

Export the four keys in the shell that launches Claude Code:

export BULLHORN_X_API_KEY="..." BULLHORN_X_API_SECRET="..."
export BULLHORN_X_ACCESS_TOKEN="..." BULLHORN_X_ACCESS_SECRET="..."

Keys are read from the environment only. They are never written to disk and never committed.

Dry-run: with no keys set, or with BULLHORN_DRY_RUN=1, Bullhorn renders exactly what would post without calling X. It falls back to dry-run automatically when any key is missing.

Commands

| Command | What it does | |---|---| | /bullhorn:post | Drafts a post from your current session and repo context. No argument. | | /bullhorn:suggest <angle> | Same context, steered by your angle or details. | | /bullhorn:doctor | Reports which keys are present and the dry-run status. Never posts, never prints secrets. |

Both drafting commands produce 2-3 variants (max 280 chars, developer voice, minimal hashtags). You pick or edit one, and it posts only after you explicitly approve. Longer content posts as a numbered reply-chain thread.

Optional nudge: set BULLHORN_NUDGE=1 and Claude proactively flags postable moments inline ("that looked postable, /bullhorn:post?"). Off by default. It only suggests, never drafts or posts on its own.

Troubleshooting

  • 403 oauth1-permissions: the access tokens are read-only. Set the App to Read and Write, then regenerate the Access Token and Secret.
  • 402 CreditsDepleted: the account has no API credits. Add billing in the developer portal.
  • Renders instead of posting: a key is missing or BULLHORN_DRY_RUN is set. Run /bullhorn:doctor to see which.

How it works

A small Turborepo monorepo:

  • @bullhorn/core: platform adapters (X first), OAuth 1.0a signing, config and dry-run resolution.
  • @bullhorn/mcp-server: a stdio MCP server exposing post and post_thread.
  • plugin/: the slash commands, the opt-in nudge hook, and a single self-contained bundled server.

The model drafts the text. The server only posts. Drafting never lives in the server.

Security

BYOK means your keys, your account, your cents. The plugin author never sees your credentials. Keys live only in your environment. Rotate them in the X portal if they are ever exposed.

License

MIT, © Jan Koriťák