
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.
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.




Meet Skipper
looks cute, contributes nothing to the repo
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)
Platform | Download Link |
---|---|
Linux AMD64 | skipper_0.0.7_linux_amd64.tar.gz |
Linux ARM64 | skipper_0.0.7_linux_arm64.tar.gz |
Windows AMD64 | skipper_0.0.7_windows_amd64.tar.gz |
Windows ARM64 | skipper_0.0.7_windows_arm64.tar.gz |
macOS AMD64 | skipper_0.0.7_darwin_amd64.tar.gz |
macOS ARM64 (M1) | skipper_0.0.7_darwin_arm64.tar.gz |
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:
- A secure tunnel is established between your local machine and our cloud infrastructure
- Requests to your subdomain are received by the HTTP server
- Using goroutines and worker pools, requests are efficiently routed through the tunnel
- Your local application processes the request and sends the response back through the tunnel
- The response is delivered to the end user through the HTTP server
Contribute
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