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 🙏

© 2025 – Pkg Stats / Ryan Hefner

@miaoosi/hop

v0.3.0

Published

Smart proxying made simple with interactive TUI.

Readme

🦘 hop

Smart proxying made simple.

An extensible port proxy and request enhancement CLI tool for local development.

Features

  • Easy Proxy Management: Add, list, remove, and edit proxies via interactive CLI.
  • Path-Based Routing: Forward specific paths to different targets.
  • Path Rewriting: Rewrite URL paths using regex patterns (e.g., /api/v1 -> /v2).
  • Custom Headers: Inject custom headers (e.g., Authorization cookies) into requests.
  • CORS Support: Automatically handles CORS preflight requests.
  • Local HTTPS: Auto-generated self-signed certificates for local HTTPS support.
  • Project-Level Config: Automatically detects hop.json in your current directory.
  • TUI Dashboard: Interactive terminal dashboard to monitor requests and responses in real-time.
  • Config Sharing: Export and import proxy configurations easily (Base64/JSON).
  • Plugin System: Extend functionality with custom JavaScript plugins.

Installation

npm install -g @miaoosi/hop

Quick Start

Option 1: Using the TUI (Recommended)

  1. Launch the management interface:

    hop
  2. Add a proxy:

    • Press a to add a new proxy
    • Your default editor will open with the config file
    • Add your proxy configuration (see examples below)
    • Save and exit
  3. Start/Stop proxies:

    • Press s to toggle the selected proxy
    • Or press Enter to view details, then s to start/stop

Option 2: Using CLI Commands

  1. Add a proxy:

    hop add

    Follow the interactive prompts to configure your proxy.

  2. Start the server:

    hop serve

    This will launch the interactive dashboard where you can monitor traffic.

Commands

  • hop: Launch the interactive TUI management interface (recommended).
  • hop add: Add a new proxy rule.
  • hop list: List all configured proxies.
  • hop edit: Edit an existing proxy (modify target, headers, rewrites, plugins, etc.).
  • hop remove: Remove a proxy.
  • hop serve [names...]: Start the proxy server(s) with request monitoring dashboard.
  • hop export [name]: Export configuration (Base64).
  • hop import <input>: Import configuration from Base64 string or file.

Configuration

hop supports both global and project-level configuration.

  1. Project Config (Recommended for teams): Create a hop.json in your project root. hop will prioritize this file if it exists.
  2. Global Config: Stored in ~/.hop/config.json.

Configuration Format (hop.json)

{
  "proxies": [
    {
      "name": "api-server",
      "port": 8080,
      "target": "http://localhost:3000",
      "https": true,
      "paths": ["/api", "/auth"], // [] means all paths
      "pathRewrite": {
        "^/api": ""
      },
      "headers": {
        "Authorization": "Bearer token"
      },
      "plugins": ["./my-plugin.js"]
    }
  ]
}

Plugin System

You can extend hop by attaching custom JavaScript plugins to your proxies.

1. Create a plugin file (e.g., logger.js):

module.exports = {
  // Executed before request is forwarded
  onRequest: (req, res, next) => {
    console.log('Request:', req.url);
    req.headers['x-custom-header'] = 'hello';
    next();
  },

  // Executed after response is received
  onResponse: (proxyRes, req, res) => {
    console.log('Status:', proxyRes.statusCode);
  }
};

2. Add it to your proxy:

  • Via CLI: Select "Plugins" when adding/editing.
  • Via Config: Add "plugins": ["./logger.js"] to your hop.json.

TUI Interface

hop provides two interactive terminal interfaces:

1. Management TUI (Default)

Run hop without arguments to launch the interactive management interface:

hop

Features:

  • Proxy List: View all configured proxies with their status (Running/Stopped)
  • Quick Actions:
    • /: Navigate through proxies
    • Enter: View proxy details
    • a: Add new proxy (opens config in editor)
    • d: Delete proxy (with confirmation)
    • s: Start/Stop selected proxy
    • q / Ctrl+C: Exit

Proxy Details View:

  • View complete proxy configuration
  • e: Edit proxy (opens config in editor)
  • s: Start/Stop proxy
    • Esc / Backspace: Back to list

Configuration Editing: When you press a (add) or e (edit), hop opens your default editor ($EDITOR or vim) with the configuration file. Simply edit the JSON and save to apply changes.

2. Dashboard (Request Monitor)

When you run hop serve, the terminal switches to a real-time request monitoring dashboard:

hop serve

Features:

  • Left Panel: Real-time list of requests with method, path, status, and duration
  • Right Panel (Top): Detailed view of selected request (headers, body)
  • Right Panel (Bottom): System logs
  • Keys:
    • /: Navigate requests
    • Enter: View request details
    • Tab: Switch between panels
    • f: Toggle auto-scroll
    • q / Ctrl+C: Exit

Output:

┌──────────────┬──────┬─────────────────────────┬──────────────────────┬─────────────────┐
│ Name         │ Port │ Target                  │ Paths                │ Headers         │
├──────────────┼──────┼─────────────────────────┼──────────────────────┼─────────────────┤
│ api-proxy    │ 3000 │ https://api.example.com │ /api/users, /api/... │ Authorization   │
│ auth-service │ 5000 │ https://auth.example.com│ (all)                │ -               │
└──────────────┴──────┴─────────────────────────┴──────────────────────┴─────────────────┘

3. Edit a proxy

hop edit

Select a proxy and choose which properties to edit (name, port, target, paths, or headers). You can:

  • Update individual fields
  • Add or remove headers
  • Replace all headers
  • Clear all headers

4. Start the proxy server

Start all proxies:

hop serve

Start specific proxies by name:

hop serve api-proxy auth-service

Output:

✔ Hop proxy server running!

✓ Started api-proxy on port 3000 → https://api.example.com (paths: /api/users, /api/posts)
✓ Started auth-service on port 5000 → https://auth.example.com

ℹ Press Ctrl+C to stop

5. Remove a proxy

hop remove

Select the proxy you want to remove from the list.

6. Get help

hop help

Commands

| Command | Aliases | Description | |---------|---------|-------------| | hop add | - | Add a new proxy rule (interactive) | | hop list | ls | List all configured proxies | | hop edit | - | Edit an existing proxy rule (interactive) | | hop remove | rm | Remove a proxy rule (interactive) | | hop serve [names...] | start | Start proxy servers (all or specific ones) | | hop help | - | Display detailed help information |

Path Matching

When adding a proxy, you can specify which paths should be proxied:

? Paths to proxy (comma-separated, leave empty for all): /api/users, /api/posts, /v1/auth

How it works:

  • If paths are specified, only requests matching those paths will be proxied
  • Matches exact paths and sub-paths (e.g., /api/users matches /api/users/123)
  • If no paths are specified, all requests are proxied
  • Non-matching requests return 404 with a helpful message

Example:

# Only /api/users and /api/posts are proxied
$ curl http://localhost:3000/api/users      # ✓ Proxied
$ curl http://localhost:3000/api/users/123  # ✓ Proxied
$ curl http://localhost:3000/other          # ✗ 404: Path not configured

Configuration

Hop stores configuration in ~/.hop/config.json:

{
  "proxies": [
    {
      "name": "api-proxy",
      "port": 3000,
      "target": "https://api.example.com",
      "paths": ["/api/users", "/api/posts"],
      "headers": {
        "Authorization": "Bearer your-token-here",
        "Cookie": "session=abc123"
      }
    },
    {
      "name": "auth-service",
      "port": 5000,
      "target": "https://auth.example.com"
    }
  ]
}

CORS Configuration

By default, Hop automatically handles CORS headers by mirroring the client's requested headers. For more control, you can configure CORS settings:

{
  "name": "custom-cors-proxy",
  "port": 3000,
  "target": "https://api.example.com",
  "cors": {
    "allowOrigin": "https://myapp.com",
    "allowHeaders": ["Content-Type", "Authorization", "X-Custom-Header"],
    "allowMethods": ["GET", "POST", "PUT", "DELETE"],
    "allowCredentials": true
  }
}

CORS Options:

  • allowOrigin (string, optional): Specific origin to allow. Defaults to the request origin or *
  • allowHeaders (string[] | '*', optional): Array of allowed headers or '*' for all. If not specified, automatically mirrors the client's requested headers
  • allowMethods (string[], optional): Array of allowed HTTP methods. Defaults to ['GET', 'POST', 'PUT', 'DELETE', 'OPTIONS']
  • allowCredentials (boolean, optional): Whether to allow credentials. Defaults to true

[!NOTE] The default behavior (without explicit CORS config) is smart - it automatically allows whatever headers the client requests, making it work seamlessly with any custom headers like x-csrf-token without manual configuration.

Use Cases

  • 🔐 API Development - Proxy API requests to add authentication headers
  • 🧪 Testing - Test APIs with different headers without modifying code
  • 🍪 Session Management - Add cookies for local development
  • 🌐 Remote Development - Forward requests to remote servers with custom headers
  • 🛣️ Path Routing - Proxy only specific API endpoints
  • 🎯 Multi-Service - Run multiple proxies for different microservices

Examples

Example 1: API with Authentication

# Add an API proxy with auth header
hop add
? Proxy name: my-api
? Port: 3000
? Target: https://api.production.com
? Paths: /api/v1/users, /api/v1/products
? Add custom headers? Yes
? Header name: Authorization
? Header value: Bearer your-api-token

# Start the proxy
hop serve my-api

# Make requests
curl http://localhost:3000/api/v1/users  # Proxied with auth header

Example 2: Multiple Services

# Add multiple proxies
hop add  # Create "users-api" on port 3000
hop add  # Create "orders-api" on port 4000
hop add  # Create "auth-api" on port 5000

# Start all services
hop serve

# Or start only specific services
hop serve users-api orders-api

Example 3: Editing an Existing Proxy

# Edit a proxy configuration
hop edit
? Select proxy to edit: my-api (port: 3000 → https://api.production.com)
? What would you like to edit? (Press space to select)
  ◉ Port
  ◉ Headers

? New local port: 3001
? How would you like to manage headers? Keep existing and add more
? Header name: X-Custom-Header
? Header value: custom-value
? Add another header? No

✔ Proxy updated: my-api

Example 4: Custom CORS Configuration

For scenarios where you need strict CORS control or want to allow specific origins only:

{
  "name": "secure-api",
  "port": 4000,
  "target": "https://secure-api.example.com",
  "headers": {
    "Authorization": "Bearer secret-token"
  },
  "cors": {
    "allowOrigin": "https://trusted-domain.com",
    "allowHeaders": ["Content-Type", "Authorization", "X-CSRF-Token"],
    "allowMethods": ["GET", "POST"],
    "allowCredentials": true
  }
}

This configuration:

  • Only allows requests from https://trusted-domain.com
  • Restricts headers to a specific whitelist
  • Only permits GET and POST methods
  • Enables credential support for cookies and auth headers

Development

# Clone the repository
git clone https://github.com/knight174/hop.git
cd hop

# Install dependencies
npm install

# Build
npm run build

# Run locally
npm run dev

Contributing

Contributions are welcome! Please feel free to submit issues or pull requests.

License

MIT