client cli
a reference for all `funnel` client command-line flags.
client reference
the funnel client is the command-line tool you use on your local machine to connect your service to a funnel server.
primary commands
🌐 funnel http
create an http tunnel (primary command)
📋 funnel version
display version information
funnel http
this is the primary command for creating an http tunnel.
basic syntax
funnel http [address:port | port] [flags]arguments
flexible addressing
you can specify either just a port or a full address:port combination.
[address:port | port] (required): the local address of the service you want to expose.
- if you provide just a port (e.g.,
3000), it will default tolocalhost:3000. - you can provide a full address (e.g.,
127.0.0.1:8080).
flags
| flag | shorthand | default | description |
|---|---|---|---|
--server | -s | (from config) | the url of the remote funnel server. use http:// or https://. overrides config. |
--id | -i | (randomly generated) | the custom subdomain to request for the tunnel. |
--inlet | default | the inlet configuration to use from your config file. | |
--help | -h | show help for the command. |
configuration
the funnel client supports configuration files to save and reuse server endpoints. this allows you to quickly switch between different tunnel servers without specifying the full URL each time.
config file location
the client looks for configuration in the following order:
$XDG_CONFIG_HOME/funnel/config.toml(ifXDG_CONFIG_HOMEis set)~/.config/funnel/config.toml(default location)
manual setup required
you must create the configuration file manually. the client will not create a default config automatically.
config file format
configuration uses TOML format with the following structure:
[inlets.default]
server = "http://localhost:8080"
domain = "localhost:8080"
[inlets.production]
server = "https://api.tunneling.dev"
domain = "tunneling.dev"
[inlets.staging]
server = "https://staging.tunneling.dev"
domain = "staging.tunneling.dev"
[inlets.local]
server = "http://localhost:8080"
domain = "localhost:8080"inlet configuration
each inlet section contains:
server(required): the URL of the tunnel serverdomain(optional): the domain for display purposes
using inlets
inlet usage
use the --inlet flag to specify which configuration to use, or omit it to use the default inlet.
# use default inlet
funnel http 3000
# use specific inlet
funnel http 3000 --inlet production
# override config with command line
funnel http 3000 --inlet production --server https://custom.example.comconfiguration required
if no configuration file exists or the specified inlet doesn't exist, the client will require you to specify the --server flag explicitly.
examples
expose a service on port 3000, using the default inlet:
funnel http 3000default behavior
this will use the default inlet from your config file, or localhost:8080 if no config exists.
use a specific inlet configuration:
# use production inlet
funnel http 3000 --inlet production
# use staging inlet with custom id
funnel http 3000 --inlet staging --id my-app-stagingconfiguration workflow
perfect for switching between different environments (development, staging, production) without remembering server URLs.
connect to a remote server with a custom subdomain:
funnel http 3000 --server https://my-server.com --id my-app-demosecure connection
use https:// for secure connections when connecting to a server with TLS enabled.
expose a service on a different host and port:
funnel http 192.168.1.100:8000 --server http://tunnel.mycompany.com:8080 --id staging-apinetwork services
you can expose services running on other machines in your network, but ensure they're accessible from your client machine.
funnel version
displays the version of the funnel client.
funnel versionversion check
useful for verifying your installation and checking for updates.
usage patterns
development workflow
🔧 local development
funnel http 3000 --inlet local
🧪 testing
funnel http 8080 --inlet staging
🎯 demos
funnel http 5000 --inlet production
common scenarios
expose your local development server:
# react development server
funnel http 3000 --inlet local --id my-react-app
# next.js development server
funnel http 3000 --inlet local --id my-nextjs-app
# vite development server
funnel http 5173 --inlet local --id my-vite-appexpose your local api for testing:
# express api server
funnel http 8000 --inlet staging --id my-api-v1
# django development server
funnel http 8000 --inlet staging --id django-api
# flask development server
funnel http 5000 --inlet staging --id flask-apiexpose your local server for mobile app testing:
# react native metro bundler
funnel http 8081 --inlet local --id rn-bundler
# local api for mobile app
funnel http 3000 --inlet staging --id mobile-apimobile testing
perfect for testing your mobile app against a local backend without complex network configuration.
troubleshooting
common issues
if you encounter connection issues, check these common problems:
- connection refused: ensure the server is running and accessible
- tunnel id taken: try a different
--idor let the system generate one - local service not found: verify your local service is running on the specified port
- firewall blocking: check that your firewall allows outbound websocket connections
- inlet not found: verify the inlet exists in your config file or use
--serverto override - config file not found: create a config file manually at
~/.config/funnel/config.tomlor use--serverflag
need help?
for server-specific configuration, see the server CLI reference.