π Features
- π Zero-configuration tunnels
- π Secure HTTPS endpoints
- π Easy-to-use Python API
- π» Command-line interface (CLI)
- π¦ Automatic binary management
- π Multiple tunnel providers (Cloudflare, Serveo)
- π TCP forwarding support (Serveo)
- π― Cross-platform support (Windows, macOS, Linux)
- π± Android support via Termux
- π Context manager support
- π Download progress tracking
- π Detailed logging with verbose mode
π― Why Flaredantic?
While tools like ngrok are great, Flaredantic offers several advantages:
- Free and unlimited tunnels
- Multiple tunnel providers to choose from
- Better stability and performance
- TCP forwarding with Serveo
- No rate limiting
Flaredantic makes it dead simple to use tunnels in your Python projects!
π Installation
pip install flaredantic
After installation, you can use either the CLI command flare
or the Python API.
π Quick Start
Command Line Usage
The simplest way to create a tunnel is using the CLI:
flare --port 8080 -v
flare --port 8080 --tunnel serveo
flare --port 5432 --tcp
CLI Options:
-p, --port Local port to expose (required)
-t, --timeout Tunnel start timeout in seconds (default: 30)
-v, --verbose Show detailed progress output
--tunnel Tunnel provider to use [cloudflare, serveo] (default: cloudflare)
--tcp Use Serveo with TCP forwarding (overrides --tunnel)
Python API Usage
Basic Usage with Cloudflare
from flaredantic import FlareTunnel, FlareConfig
config = FlareConfig(port=8080)
with FlareTunnel(config) as tunnel:
print(f"Your service is available at: {tunnel.tunnel_url}")
input("Press Enter to stop the tunnel...")
Basic Usage with Serveo
from flaredantic.tunnel.serveo import ServeoTunnel, ServeoConfig
config = ServeoConfig(port=8080)
with ServeoTunnel(config) as tunnel:
print(f"Your service is available at: {tunnel.tunnel_url}")
input("Press Enter to stop the tunnel...")
TCP Forwarding with Serveo
from flaredantic.tunnel.serveo import ServeoTunnel, ServeoConfig
config = ServeoConfig(port=5432, tcp=True)
with ServeoTunnel(config) as tunnel:
print(f"TCP tunnel available at: {tunnel.tunnel_url}")
input("Press Enter to stop the tunnel...")
Custom Configuration
from flaredantic import FlareTunnel, FlareConfig
from flaredantic.tunnel.serveo import ServeoTunnel, ServeoConfig
from pathlib import Path
cloudflare_config = FlareConfig(
port=8080,
bin_dir=Path.home() / ".my-tunnels",
timeout=60,
verbose=True
)
serveo_config = ServeoConfig(
port=8080,
ssh_dir=Path.home() / ".my-tunnels/ssh",
timeout=60,
verbose=True
)
with FlareTunnel(cloudflare_config) as tunnel:
print(f"Access your service at: {tunnel.tunnel_url}")
input("Press Enter to stop the tunnel...")
Flask Application
from flask import Flask
from flaredantic import FlareTunnel, FlareConfig
import threading
app = Flask(__name__)
@app.route('/')
def hello():
return 'Hello, World!'
def run_tunnel():
config = FlareConfig(
port=5000,
verbose=True
)
with FlareTunnel(config) as tunnel:
print(f"Flask app available at: {tunnel.tunnel_url}")
app.run(port=5000)
if __name__ == '__main__':
threading.Thread(target=run_tunnel).start()
βοΈ Configuration Options
Cloudflare Tunnel Options
port | int | Required | Local port to expose |
bin_dir | Path | ~/.flaredantic | Directory for cloudflared binary |
timeout | int | 30 | Tunnel start timeout in seconds |
verbose | bool | False | Show detailed progress and debug output |
Serveo Tunnel Options
port | int | Required | Local port to expose |
ssh_dir | Path | ~/.flaredantic/ssh | Directory for SSH configuration |
timeout | int | 30 | Tunnel start timeout in seconds |
verbose | bool | False | Show detailed progress and debug output |
tcp | bool | False | Enable TCP forwarding instead of HTTP |
π¦ Requirements
- Cloudflare tunnel: No additional requirements (binary auto-downloaded)
- Serveo tunnel: Requires SSH client to be installed
βοΈNote: Serveo servers might occasionally be unavailable as they are a free service. Flaredantic automatically detects when Serveo is down and provides a clear error message. Consider using Cloudflare tunnels if you need guaranteed availability.
π More Examples
For more detailed examples and use cases, check out our examples: