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

bsky-cli

v1.0.2

Published

Command-line interface for Bluesky/ATProto social networking

Readme

Bluesky CLI

npm version npm downloads License: MIT

A powerful command-line interface for the Bluesky social network, built on the AT Protocol. Post, interact, and manage your Bluesky presence directly from your terminal.

Features

  • 🔐 Authentication - Secure login with app passwords, persistent session management
  • 📝 Posting - Create posts with images, replies, and quotes
  • 📰 Timeline - View your home feed, notifications, and user posts
  • 👥 Social - Follow/unfollow users, search, view profiles and follower lists
  • 💬 Direct Messages - Send and receive DMs in conversations
  • 🎨 Rich Output - Colored, formatted output with JSON support
  • Fast - Built with Bun for blazing-fast performance

Installation

Using npm

npm install -g bsky-cli

Using Bun

bun install -g bsky-cli

Using npx (no install)

npx bsky-cli login
npx bsky-cli post "Hello world!"

Quick Start

# Login to your Bluesky account
bsky login

# Post a message
bsky post "Hello from the command line!"

# View your home timeline
bsky timeline

# Follow someone
bsky follow @user.bsky.social

# Send a direct message
bsky dm send @user.bsky.social "Hey there!"

# View your DM conversations
bsky dm list

# Read a conversation
bsky dm read @user.bsky.social

Command Reference

Authentication Commands

bsky login

Authenticate with your Bluesky account using an app password.

bsky login
# Interactive prompts for handle and app password

Options:

  • --json - Output response as JSON

Notes:

  • Creates an app password at: https://bsky.app/settings/app-passwords
  • Session is stored securely in ~/.config/bluesky-cli/session.json

bsky logout

Clear your authentication session.

bsky logout

Options:

  • --json - Output response as JSON

bsky whoami

Display information about the currently authenticated user.

bsky whoami

Options:

  • --json - Output response as JSON

Posting Commands

bsky post

Create a new post on Bluesky.

# Post text
bsky post "Your message here"

# Post from stdin
echo "Your message" | bsky post

# Post with image
bsky post "Check this out!" --image ./photo.jpg

# Post with multiple images and alt text
bsky post "Gallery" --image img1.jpg --image img2.jpg --alt "First" --alt "Second"

# Reply to a post
bsky post "Great point!" --reply-to at://did:plc:.../app.bsky.feed.post/...

# Quote a post
bsky post "Interesting take" --quote at://did:plc:.../app.bsky.feed.post/...

Arguments:

  • [text] - Post text (or read from stdin if not provided)

Options:

  • -i, --image <path> - Attach image (can be used up to 4 times)
  • -a, --alt <text> - Alt text for images (in order, one per image)
  • -r, --reply-to <uri> - AT URI of post to reply to
  • -q, --quote <uri> - AT URI of post to quote
  • --json - Output response as JSON

Limits:

  • Max post length: 300 characters
  • Max images: 4 per post
  • Max image size: 1MB
  • Supported formats: JPEG, PNG, WebP, GIF

bsky delete

Delete a post by its AT URI.

bsky delete at://did:plc:.../app.bsky.feed.post/...

Arguments:

  • <uri> - AT URI of the post to delete

Options:

  • --json - Output response as JSON

Timeline Commands

bsky timeline

View your home timeline feed.

# View latest posts
bsky timeline

# View more posts
bsky timeline --limit 50

# JSON output
bsky timeline --json

Options:

  • -l, --limit <number> - Number of posts to fetch (default: 20)
  • --json - Output response as JSON

bsky posts

View posts from a specific user.

# View your own posts
bsky posts

# View another user's posts
bsky posts @user.bsky.social

# View more posts
bsky posts @user.bsky.social --limit 50

Arguments:

  • [handle] - User handle (defaults to authenticated user)

Options:

  • -l, --limit <number> - Number of posts to fetch (default: 20)
  • --json - Output response as JSON

bsky notifications

View your notifications.

# View latest notifications
bsky notifications

# View more notifications
bsky notifications --limit 50

# JSON output
bsky notifications --json

Options:

  • -l, --limit <number> - Number of notifications to fetch (default: 20)
  • --json - Output response as JSON

Notification Types:

  • Likes on your posts
  • Reposts of your posts
  • Replies to your posts
  • Mentions of your handle
  • Follows from other users
  • Quotes of your posts

Social Commands

bsky follow

Follow a user.

bsky follow @user.bsky.social

Arguments:

  • <handle> - User handle to follow

Options:

  • --json - Output response as JSON

bsky unfollow

Unfollow a user.

bsky unfollow @user.bsky.social

Arguments:

  • <handle> - User handle to unfollow

Options:

  • --json - Output response as JSON

bsky followers

View followers of a user.

# View your own followers
bsky followers

# View another user's followers
bsky followers @user.bsky.social

# View more followers
bsky followers @user.bsky.social --limit 100

Arguments:

  • [handle] - User handle (defaults to authenticated user)

Options:

  • -l, --limit <number> - Number of followers to fetch (default: 50)
  • --json - Output response as JSON

bsky following

View users that a user is following.

# View who you're following
bsky following

# View who another user is following
bsky following @user.bsky.social

# View more
bsky following @user.bsky.social --limit 100

Arguments:

  • [handle] - User handle (defaults to authenticated user)

Options:

  • -l, --limit <number> - Number of users to fetch (default: 50)
  • --json - Output response as JSON

bsky profile

View detailed profile information for a user.

# View your own profile
bsky profile

# View another user's profile
bsky profile @user.bsky.social

Arguments:

  • [handle] - User handle (defaults to authenticated user)

Options:

  • --json - Output response as JSON

Profile Information:

  • Display name
  • Handle
  • Description/bio
  • Avatar and banner images
  • Follower/following counts
  • Post count
  • Labels and moderation status

bsky search

Search for users by handle or display name.

# Search for users
bsky search "Alice"

# Get more results
bsky search "Alice" --limit 50

# JSON output
bsky search "Alice" --json

Arguments:

  • <query> - Search query

Options:

  • -l, --limit <number> - Number of results to fetch (default: 20)
  • --json - Output response as JSON

Direct Message Commands

bsky dm list

List your direct message conversations.

# View conversations
bsky dm list

# View more conversations
bsky dm list --limit 50

# JSON output
bsky dm list --json

Options:

  • -l, --limit <number> - Number of conversations to fetch (default: 20)
  • --json - Output response as JSON

Output:

  • Conversation participants
  • Last message preview
  • Timestamp of last message
  • Unread count

bsky dm send

Send a direct message to a user.

# Send a message
bsky dm send @user.bsky.social "Hello there!"

# Send from stdin
echo "Hello there!" | bsky dm send @user.bsky.social

Arguments:

  • <handle> - User handle to message
  • [message] - Message text (or read from stdin)

Options:

  • --json - Output response as JSON

bsky dm read

Read messages in a conversation with a user.

# Read messages
bsky dm read @user.bsky.social

# Read more messages
bsky dm read @user.bsky.social --limit 100

# JSON output
bsky dm read @user.bsky.social --json

Arguments:

  • <handle> - User handle of conversation

Options:

  • -l, --limit <number> - Number of messages to fetch (default: 50)
  • --json - Output response as JSON

Output:

  • Messages in chronological order
  • Sender identification
  • Timestamps
  • Message content

Configuration

The CLI stores configuration and session data in:

  • macOS/Linux: ~/.config/bluesky-cli/
  • Windows: %APPDATA%/bluesky-cli/

Files

  • config.json - Configuration settings
  • session.json - Authentication session (keep secure!)

Configuration Options

The config.json file supports:

{
  "apiEndpoint": "https://bsky.social",
  "colorOutput": true
}
  • apiEndpoint - Bluesky API endpoint (default: https://bsky.social)
  • colorOutput - Enable colored terminal output (default: true)

Disable Colors

bsky --no-color timeline

Common Workflows

Daily Timeline Check

# Check timeline and notifications
bsky timeline --limit 30
bsky notifications

Post with Media

# Post photo with description
bsky post "Beautiful sunset!" \
  --image sunset.jpg \
  --alt "Orange and pink sky over the ocean"

Engage in Conversation

# View a user's posts to find what to reply to
bsky posts @user.bsky.social

# Reply to a specific post
bsky post "Great insight!" --reply-to at://did:plc:.../app.bsky.feed.post/...

Manage DMs

# Check for new conversations
bsky dm list

# Read and respond
bsky dm read @user.bsky.social
bsky dm send @user.bsky.social "Thanks for reaching out!"

Search and Follow

# Find users interested in a topic
bsky search "TypeScript"

# Follow interesting accounts
bsky follow @dev.bsky.social
bsky follow @typescript.bsky.social

Scripting and Automation

Post from Script

#!/bin/bash
# daily-post.sh
DATE=$(date +"%Y-%m-%d")
bsky post "Daily update for $DATE: All systems operational! ✅"

Monitor Notifications

#!/bin/bash
# check-notifications.sh
COUNT=$(bsky notifications --json | jq '. | length')
if [ $COUNT -gt 0 ]; then
  echo "You have $COUNT new notifications!"
  bsky notifications
fi

Batch Follow from List

#!/bin/bash
# follow-list.sh
while read handle; do
  echo "Following $handle..."
  bsky follow "$handle"
  sleep 1  # Be nice to the API
done < users.txt

Contributing

Contributions are welcome! This project is built with TypeScript and Bun.

Development Setup

# Clone the repository
git clone https://github.com/agileguy/bluesky-cli.git
cd bluesky-cli

# Install dependencies
bun install

# Run in development mode
bun run dev

# Run tests
bun test

# Build for production
bun run build

# Run linter
bun run lint

# Format code
bun run format

Project Structure

bluesky-cli/
├── src/
│   ├── commands/        # Command implementations
│   ├── lib/            # Core libraries (auth, config, output)
│   └── index.ts        # Main entry point
├── dist/               # Built output
└── package.json

Guidelines

  • Follow the existing code style
  • Add tests for new features
  • Update documentation for new commands
  • Use TypeScript strict mode
  • Keep dependencies minimal

Troubleshooting

"Not logged in" Error

Run bsky login and authenticate with your app password.

"Invalid AT URI" Error

Ensure you're using the complete AT URI format: at://did:plc:abc123.../app.bsky.feed.post/xyz789...

You can get post URIs from:

  • The --json output of commands
  • The Bluesky web interface (share menu)

Image Upload Fails

Check that:

  • Image is under 1MB in size
  • Image format is JPEG, PNG, WebP, or GIF
  • File path is correct and accessible

Rate Limiting

If you encounter rate limits, wait a few minutes before retrying. The Bluesky API has rate limits to prevent abuse.

License

MIT License - see LICENSE file for details.

Related Projects

Support


Built with ❤️ using Bun and the AT Protocol