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

hop-shell

v0.6.0

Published

🐰 Hop into your terminal from anywhere. Secure remote shell access with 2FA via Cloudflare Tunnel.

Readme

🐰 hop

Hop into your terminal from anywhere in the world.

Access your Mac's terminal from your phone, tablet, or any browser β€” secured with password + 2FA, tunneled through Cloudflare.

🍎 macOS only β€” Requires Homebrew for dependencies (ttyd, tmux, cloudflared)

           (\(\ 
           ( -.-)    "hop into your shell"
           o_(")(")

✨ Features

  • πŸ” Password + 2FA β€” Optional password plus TOTP (required for custom domains)
  • 🌍 Access Anywhere β€” Cloudflare tunnel, no port forwarding
  • 🌐 Custom Domains + Multi‑User β€” Share subdomains with per‑user credentials
  • πŸ“± Mobile Virtual Keyboard β€” Custom keyboard with Esc, Ctrl, Alt, arrows, and more
  • ⌨️ Native Keyboard Support β€” Tap the blue button for dictation, spellcheck & autocomplete
  • πŸͺŸ Multi-Session β€” Create and switch between named sessions
  • πŸ”Œ Port Sessions β€” Proxy a local HTTP/WS service via hop
  • πŸ”„ Quick Session Switching β€” Floating menu to switch sessions without leaving the terminal
  • 🎨 Modern UI β€” Clean, minimal iOS-style design
  • ⚑ Auto-Attach β€” Multiple terminals share the same tunnel

πŸš€ Quick Install

From npm (easiest)

npm install -g hop-shell

Then just run:

hop

One-liner from source

git clone https://github.com/jzthree/hop.git ~/.hop && \
cd ~/.hop && npm install && \
sudo ln -sf ~/.hop/hop /usr/local/bin/hop

Manual Install from source

# Clone the repo
git clone https://github.com/jzthree/hop.git ~/.hop

# Install dependencies
cd ~/.hop && npm install

# Add to PATH (pick one)
# Option A: Symlink (requires sudo)
sudo ln -sf ~/.hop/hop /usr/local/bin/hop

# Option B: Add to PATH
echo 'export PATH="$HOME/.hop:$PATH"' >> ~/.zshrc
source ~/.zshrc

🐰 Usage

# Start hopping!
hop

# Use iTerm control mode for local session
hop --iterm

First time:

  1. (Optional) Set a password: hop password set
  2. Scan the QR code with your authenticator app (Google Authenticator, Authy, 1Password, etc.)
  3. Note the URL displayed
  4. Press Enter to start your local session

From your phone:

  1. Open the URL in your browser
  2. Enter your password (if enabled) and 6‑digit code
  3. Pick or create a session
  4. 🐰 You're in! Use the virtual keyboard for terminal keys, or tap the blue button for native input

πŸͺŸ Sessions

Create multiple independent terminal sessions from the Session Picker (/sessions):

  • Create: Type a name and click Create
  • Join: Click Join on any existing session
  • Sessions are shared: Multiple devices can view the same session

You can also create Port Sessions that proxy to a local HTTP/WS service on your machine. Use the Session Picker or:

hop session add myapp --port 3000

🌐 Custom Domains & Multi‑User

Admin (your machine)

  1. Set a password (required for custom domains):
    hop password set
  2. Configure your domain:
    hop domain hop.yourdomain.com
  3. Add a user + export credentials:
    hop user add alice
    hop user export alice
  4. Send the exported folder to the user.

User (their machine)

npm install -g hop-shell
hop client ./credentials.json

First run prompts them to set a password + scan a TOTP QR code.
They then log in at their URL, e.g. https://alice.hop.yourdomain.com.

πŸ“± Mobile Keyboard

On mobile devices, Hop provides a custom virtual keyboard designed for terminal use:

Accessory Row:

  • Esc Tab Ctrl Alt β€” Essential terminal keys
  • ← ↓ ↑ β†’ β€” Arrow keys for navigation
  • πŸ”΅ Blue keyboard button β€” Opens native iOS keyboard for dictation, spellcheck & autocomplete

Floating Menu (top-right button):

  • Toggle Keyboard β€” Show/hide the virtual keyboard
  • Session List β€” Quick-switch between sessions
  • All Sessions β€” Return to session picker

Tips:

  • The floating button is draggable β€” move it anywhere
  • First-time users will see a tooltip pointing to the native keyboard button
  • Use the native keyboard for longer text input with autocomplete

πŸ–₯️ iTerm Integration

hop --iterm

Uses tmux control mode (-CC) for native scrolling, copy/paste, splits, and search. Session remains accessible via web.

πŸ”Œ Port Sessions

Expose local HTTP/WebSocket services through your tunnel:

hop session add myapp --port 3000
# Access at: https://your-tunnel-url/s/myapp/

Works with dev servers, Jupyter, APIs β€” anything on localhost. Supports WebSocket.

πŸ”§ Commands

| Command | Description | |---------|-------------| | hop | Start hop (or attach to existing tunnel) | | hop --iterm | Use iTerm tmux control mode for local session | | hop url | Print current tunnel URL | | hop qr | Show QR code for current URL | | hop domain <hostname> | Set custom domain (named tunnel) | | hop domain-clear | Remove custom domain, use random URLs | | hop password set | Set/change password | | hop password clear | Remove password protection | | hop user list | List users | | hop user add <name> | Add user + subdomain | | hop user remove <name> | Remove user | | hop user export <name> | Export user credentials | | hop session list | List sessions | | hop session add <name> | Create a terminal session | | hop session add <name> --port N | Create a port session (proxy) | | hop session remove <name> | Remove a session | | hop client <credentials> | Run hop with exported credentials | | hop wipe | Kill all hop tmux sessions | | quit | Type at exit prompt to shutdown tunnel |

πŸ“¦ Dependencies

Installed automatically via Homebrew:

  • tmux β€” Terminal multiplexer
  • ttyd β€” Web terminal
  • cloudflared β€” Cloudflare tunnel

Node.js packages:

  • http-proxy β€” Request proxying
  • otplib β€” TOTP authentication
  • qrcode-terminal β€” QR code display
  • cookie β€” Session cookies

πŸ›‘οΈ Security

  • Password + TOTP β€” Password optional, but required for custom domains
  • Rate Limiting β€” Exponential backoff on failed attempts
  • Secure Cookies β€” httpOnly, secure, sameSite=lax
  • Random URL β€” Unguessable tunnel URL for quick tunnels
  • Fixed URL β€” Custom domains keep a stable URL
  • Local Binding β€” ttyd only listens on 127.0.0.1
  • End-to-End TLS β€” Cloudflare Tunnel encryption

Passwords: Recommended for any public URL; required for custom domains.

Secrets: Stored in ~/.hop-shell/ (treat like ~/.ssh/)

πŸ› Troubleshooting

QR code not working? Delete .auth_secret and restart hop to generate a new code.

Client reset (user mode)? Delete ~/.hop-shell/clients/<tunnel-id>/ and run hop client again.

Tunnel not starting? Make sure cloudflared is installed: brew install cloudflared

Stuck processes?

pkill ttyd; pkill cloudflared; tmux kill-server

πŸ“ License

MIT


Made with 🐰 for hopping around

   ____
  /    \
 | ^  ^ |     hop hop hop
 |  ..  |
  \ -- /
   ||||