Skipper

A powerful tunnel and reverse proxy that allows you to expose your localhost projects to the internet through a subdomain. Simple, fast, and secure - your local development environment, accessible from anywhere.

Made with ❤️ by Juan Diego Diaz, a passionate backend and low-level learner developer

This project is dedicated to Skipper, my loyal companion during the long hours of programming. Your presence keeps me motivated and brings joy to my development journey.

How to Use Skipper

Quick Demo

Watch how easy it is to expose your localhost projects with Skipper

Installation

Package Managers

Using Homebrew (macOS)

brew tap juandi247/skipper
brew install skipper
brew upgrade skipper

Run this command to update to the latest version when new releases are available.

Using Chocolatey (Windows)

choco install skipper

⚠️ Pending for approval

Direct Downloads

Download the latest version (v0.0.7) directly for your platform: (Remember to add it to the PATH)

Usage

Getting started with Skipper is as simple as running a single command:

skipper -port 3000 -subdomain myapp

This will expose your local application running on port 3000 at:

https://myapp.skipper.lat

-port: The port where your local application is running
-subdomain: The subdomain you want to use (will be available at subdomain.skipper.lat)

How It Works

Skipper operates through a sophisticated architecture running on Google Cloud with advanced Go patterns:

🚀 Core Architecture

  • TCP Persistent Connection: Bidirectional communication between proxy and tunnel
  • Custom Framing Protocol: 20-byte binary header for efficient message routing
  • Stream Multiplexing: Multiple flows over single TCP connection

🧠 Concurrency Patterns

  • Worker Pools: Efficient concurrent task management
  • Fan-In/Fan-Out: Dynamic message distribution patterns
  • Reactor Pattern: Message dispatching by type and StreamID

🎛️ State Machine Design

  • Functional FSM: Tunnel as concurrent state machine
  • Graceful Shutdown: Controlled resource cleanup with context
  • Error Handling: Robust state transitions and recovery

📦 Protocol & Serialization

  • Protocol Buffers: Compact, fast serialization
  • Go Idioms: Context, select, interfaces
  • Extensible Design: Decoupled handlers for testing

When you start Skipper:

  1. A secure tunnel is established between your local machine and our cloud infrastructure
  2. Requests to your subdomain are received by the HTTP server
  3. Using goroutines and worker pools, requests are efficiently routed through the tunnel
  4. Your local application processes the request and sends the response back through the tunnel
  5. The response is delivered to the end user through the HTTP server

Contribute

⭐ Stars 🔀 Forks 👥 Contributors

Want to help make Skipper better?

We welcome contributions from the community! Here's how you can help:

  • Submit a Pull Request with your improvements
  • Report bugs on our GitHub Issues page
  • Suggest new features or improvements
  • Help improve our documentation
Check out our GitHub repository