TinyFish Tunneling Service (tinyfi.sh)
Creates instant public HTTPS URLs for locally running apps via SSH tunneling. Free, no account, no installation beyond SSH.
Pre-flight Check (REQUIRED)
Verify SSH is available (it almost always is):
which ssh && echo "SSH available" || echo "SSH not found — install OpenSSH first"
Quick Start
Expose a local port to the internet:
ssh -o StrictHostKeyChecking=accept-new -R 80:localhost:<PORT> tinyfi.sh
Replace <PORT> with the port your app is running on. The command will print a public https://<random>.tinyfi.sh URL.
Custom Subdomain
Request a specific subdomain instead of a random one:
ssh -o StrictHostKeyChecking=accept-new -R myname:80:localhost:<PORT> tinyfi.sh
This gives you https://myname.tinyfi.sh.
Keep-Alive (Stable Connections)
For long-running tunnels, add a keep-alive interval to prevent disconnection:
ssh -o StrictHostKeyChecking=accept-new -o ServerAliveInterval=60 -R 80:localhost:<PORT> tinyfi.sh
Usage Guidelines
When starting a tunnel for the user:
Ask which port to expose if not already specified
Run the SSH command in the background so the agent can continue working
Report the public URL back to the user once the tunnel is established
The tunnel stays open as long as the SSH connection is alive
Common Ports
| Framework / Tool | Default Port |
|---|---|
| Next.js / React / Express | 3000 |
| Vite | 5173 |
| Django | 8000 |
| Flask | 5000 |
| Go (net/http) | 8080 |
| Ruby on Rails | 3000 |
| PHP (built-in) | 8000 |
Rate Limits
5 SSH connections per minute per IP
100 HTTP requests per minute per IP
50 concurrent connections max
48-hour idle timeout