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

@atrotos/sillie

v0.1.5

Published

Terminal in your browser

Readme

sillie

A terminal in your browser. Runs a local Node.js server that spawns real PTY sessions and pipes them to a React + xterm.js frontend over WebSockets.

Why

Sometimes you want a terminal that lives in a browser tab. Maybe you're on a machine where the native terminal is limited, or you want tabs and splits without tmux, or you just like the idea. Sillie does that with minimal setup.

What you get

  • Real shell sessions (zsh, bash, whatever you use) via node-pty
  • Tabs, split panes (horizontal and vertical), and per-tab pane trees
  • WebGL-accelerated rendering, ligatures, image protocol support, clickable links
  • Find-in-terminal search
  • 8 built-in color themes (Tokyo Night, Dracula, Catppuccin Mocha, Gruvbox, Nord, Kanagawa, Solarized Dark, One Dark)
  • Command palette (Ctrl+Shift+P) with fuzzy search - quickly find and run any action or switch themes
  • Broadcast mode - type in one pane, input goes to all panes in the tab
  • Session persistence - disconnect and reconnect without losing scrollback
  • Token-based auth so it's not just open on localhost
  • macOS launchd integration - runs on login, stays alive

Install

npm install -g @atrotos/sillie

Requires Node 18+. The node-pty dependency needs a C++ toolchain (Xcode command line tools on macOS).

Quick start

sillie install

This does three things: generates a config with a random auth token, registers a launchd daemon, and opens the terminal in your browser.

The server listens on 127.0.0.1:3777 by default. It's localhost-only.

CLI

sillie install      # set up daemon, open browser
sillie uninstall    # remove daemon
sillie start        # run server in foreground (no daemon)
sillie stop         # restart the daemon
sillie status       # show whether it's running, port, URL
sillie open         # open browser to your sillie instance

Keyboard shortcuts

All shortcuts use Ctrl+Shift to avoid stepping on terminal sequences (Ctrl+C, Ctrl+D, etc.) or browser defaults.

| Shortcut | Action | |---|---| | Ctrl+Shift+P | Command palette | | Ctrl+Shift+T | New tab | | Ctrl+Shift+W | Close tab | | Ctrl+Shift+1-9 | Switch to tab N | | Ctrl+Shift+D | Split pane down | | Ctrl+Shift+E | Split pane right | | Ctrl+Shift+K | Clear terminal | | Ctrl+Shift+F | Find in terminal | | Ctrl+Shift+B | Toggle broadcast mode | | Ctrl+Shift+, | Settings | | Ctrl+Shift+= | Zoom in | | Ctrl+Shift+- | Zoom out | | Ctrl+Shift+0 | Reset zoom |

Config

Stored at ~/.config/sillie/config.json. Created on first run.

{
  "port": 3777,
  "token": "auto-generated hex string",
  "shell": "/bin/zsh",
  "theme": {
    "fontFamily": "monospace",
    "fontSize": 14,
    "background": "#1a1b26",
    "foreground": "#c0caf5"
  }
}

You can also change theme, font, and font size from the settings modal in the UI.

Development

# install dependencies
npm install
cd client && npm install && cd ..

# run server and client dev server in separate terminals
npm run dev:server
npm run dev:client

The Vite dev server proxies WebSocket connections to the backend. The server runs on port 3777, Vite on whatever it picks (usually 5173).

# run tests
npm test

# build the client for production
npm run build:client

How it works

The server is Express + ws. When a WebSocket connects, the client can send create, input, resize, and close messages. Each create spawns a node-pty process. Output flows back as output messages. If the WebSocket disconnects, PTY sessions stay alive and buffer scrollback for reconnection.

The frontend is React with xterm.js. Each terminal pane gets its own xterm instance with WebGL rendering. The pane tree is a recursive split structure - you can nest splits arbitrarily.

Auth is a token passed as a query parameter. The token is generated once and saved in the config file.

License

MIT