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

@generativereality/cctabs

v0.4.0

Published

Claude Code tab manager. Terminal tabs as the UI, no tmux.

Readme

cctabs

Run a fleet of Claude Code sessions. From the CLI — or from Claude itself.

CLI command: cctabs · Website: cctabs.com

cctabs new auth ~/Dev/myapp       # new tab, claude starts
cctabs new api ~/Dev/myapp
cctabs new infra ~/Dev/myapp

cctabs sessions                   # what's running across all tabs
cctabs scrollback auth            # read what auth is doing without switching tabs
cctabs send api --file task.txt   # drop a prompt into any session
cctabs fork auth -n auth-v2       # branch a conversation, keep the original

No tmux. No dashboard. Your terminal tabs are the UI.


The idea

When you're running multiple Claude Code sessions in parallel, you lose track fast. Which tab is working on what? Did it finish? Is it waiting for input?

cctabs solves this with a simple CLI that treats terminal tabs as the unit of orchestration — open them by name, read their output, send them prompts, fork them, close them. Everything stays in sync: the tab title, the Claude session name, and the working directory.

The killer feature: Claude can run cctabs itself. Install the skill and your Claude Code session can spawn parallel sibling sessions, monitor their output, and coordinate across them — without you switching tabs.

Install

As a Claude Code plugin (recommended — installs the CLI + skill in one step):

Run these slash commands inside a Claude Code session:

❯ /plugin marketplace add generativereality/plugins
  ⎿  Successfully added marketplace: generativereality

❯ /plugin install cctabs@generativereality
  ⎿  ✓ Installed cctabs. Run /reload-plugins to activate.

❯ /reload-plugins
  ⎿  Reloaded: 1 plugin · 0 skills · 5 agents · 0 hooks · 0 plugin MCP servers · 0 plugin LSP servers

Note: These are Claude Code slash commands, not shell commands. Type them at the prompt inside a Claude Code session.

Via npm (CLI only, no Claude Code skill):

npm install -g cctabs

Skill only (if you already have the CLI installed via npm):

mkdir -p .claude/skills/cctabs
curl -fsSL https://raw.githubusercontent.com/generativereality/cctabs/main/skills/cctabs/SKILL.md \
  -o .claude/skills/cctabs/SKILL.md

Requirements: Wave Terminal · macOS · Node.js 20+

One-time: Wave needs Accessibility permission — System Settings → Privacy & Security → Accessibility → Wave ✓

Usage

cctabs sessions [--json]                 what's running (active/idle status)
cctabs list                              all workspaces, tabs, and blocks
cctabs new <name> [dir] [-w workspace]   open tab, start claude
cctabs new <name> [dir] -r <session-id>  open tab, resume an existing session by ID
cctabs resume <name> [dir]               open tab, run claude --continue
cctabs fork <tab> [-n new-name]          fork a session into a new tab
cctabs close <tab>                       close a tab
cctabs rename <tab> <new-name>           rename a tab
cctabs scrollback <tab> [lines]          read terminal output (default: 50 lines)
cctabs send <tab> [text] [--wait-for-prompt]   send input — arg, --file, or stdin pipe
cctabs restore [--manifest <file|->] [--create-missing]   reattach or spawn from a manifest
cctabs config                            show config path and values

Tab names match by prefix. Block IDs can be shortened to 8 chars.

Spin up a session fleet

cctabs sessions                 # check what's already running first

cctabs new auth ~/Dev/myapp
cctabs new payments ~/Dev/myapp
cctabs new infra ~/Dev/myapp

Each tab gets named, Claude's session name syncs to the tab title via --name.

Send a prompt

# From a file (good for long context-heavy prompts)
cctabs send auth --file ~/prompts/task.txt

# Via stdin
echo "focus on the edge cases in the OAuth flow" | cctabs send auth

# Quick reply or approval
cctabs send auth "yes\n"
cctabs send auth "/clear\n"

Check in without switching tabs

cctabs scrollback auth          # last 50 lines
cctabs scrollback auth 200      # last 200 lines

Resume a specific session in a new tab

# Useful when multiple sessions share the same dir — pass the exact session ID
cctabs new auth ~/Dev/myapp -r 19aae7b4-1234-…

# Combines with --worktree to resume inside an existing worktree
cctabs new auth ~/Dev/myapp -W -r 19aae7b4-…

cctabs resume <name> is the right tool when there's only one session for a dir. Use cctabs new ... --resume when you need to disambiguate by session ID.

Migrate a fleet between terminals

# On the source terminal, dump everything as a manifest
cctabs sessions --json > /tmp/fleet.json

# On the destination terminal, attach to any existing tabs and spawn the rest
cctabs restore --manifest /tmp/fleet.json --create-missing

# Or pipe directly
cctabs sessions --json | cctabs restore --manifest - --create-missing

Fork a session

# Try a different approach without losing the original conversation
cctabs fork auth -n auth-v2

Runs claude --resume <id> --fork-session — new independent session, full shared context from the original.

Target a workspace

cctabs new api ~/Dev/myapp -w work

Claude Code Skill

The real unlock: install the plugin (see Install) so Claude Code can run cctabs itself.

With the skill installed, Claude can:

  • Check what's running before starting duplicate work (cctabs sessions)
  • Spawn a parallel session for an independent subtask (cctabs new payments ~/Dev/myapp)
  • Monitor siblings without interrupting them (cctabs scrollback payments)
  • Drop a prompt into any session (cctabs send payments --file spec.txt)
  • Fork its own session to explore an alternative approach (cctabs fork auth)

Claude becomes the orchestrator of its own fleet.

Tip: pair with Claude Code Remote Control

Claude Code's Remote Control lets you access a local session from any device — phone, tablet, browser — via claude.ai/code. The session still runs on your machine, with full filesystem and tool access.

Paired with cctabs, the pattern is:

  1. Start a command session with Remote Control enabled:
    claude --remote-control "command"
  2. From your phone or browser, connect to that session and assign work:

    "Spawn three sessions — auth, payments, infra — and start them on these tasks..."

  3. The command session uses cctabs to open tabs, send prompts, and check in on workers
  4. You monitor and steer the whole fleet from your phone while the machine does the work

One remote-controlled session orchestrating a local fleet.

Config

# ~/.config/cctabs/config.toml

[claude]
# Flags passed to every claude invocation
flags = ["--allow-dangerously-skip-permissions"]

[defaults]
# Default Wave workspace for new sessions
# workspace = ""

Terminal support

| Terminal | Status | |----------|--------| | Wave Terminal | ✅ Full support | | Tabby | ✅ Full support (requires the tabby-cctabs companion plugin) | | iTerm2 | Planned | | Ghostty | Planned | | Warp | Planned |

Wave is supported via its unix socket RPC. Tabby is supported via a small companion plugin that exposes a localhost HTTP API the cctabs CLI talks to — install with cctabs install-tabby-plugin. Other terminals will follow as adapters — PRs welcome.

Login shells on macOS

cctabs-spawned tabs default to login shells (zsh -l, bash -l, etc.) so PATH is initialised the same way Tabby's UI-spawned tabs are. Without -l, macOS's /etc/zprofile doesn't run, path_helper doesn't populate /usr/local/bin and /opt/homebrew/bin from /etc/paths, and brand-new tabs are missing Node, Homebrew, and anything else that lives there. Symptoms: env: node: No such file or directory in Claude Code's Bash tool, plugin MCP servers failing to start with ENOENT when they shell out to npx, and cctabs CLI itself failing inside the tab it just spawned. See Tabby issue #2 for the historical context. Pass an explicit args array (including []) when calling the /tabs endpoint if you need a non-login shell.

License

MIT