CLI Reference nfltr
Reference for readers who already know their path. Use this page when you need concrete nfltr commands for hosted orchestration, worker execution, secure transport, or dashboard-managed operator flows.
If you still need to decide between the hosted control plane and a self-hosted deployment boundary, start with When to Use NFLTR before using this reference as your entry surface.
Start From The Right Command Path
| Goal | Start here | Next step |
|---|---|---|
| Hosted orchestration | nfltr mcp --proxy-url https://nfltr.xyz --write-mcp-json .vscode/mcp.json | Agent Orchestration overview |
| Worker execution | nfltr worker --labels role=implementer --mcp-command "nfltr copilot-mcp" --max-tasks 2 | AI Agent Orchestration guide |
| Secure transport or sharing | nfltr http 8080 | Choose whether transport-only or orchestration-first is the right fit |
After you choose a path, use the sections below as the deep command reference for flags, environment variables, examples, and operational details.
Installation
Download the binary for your platform from the landing page:
| Platform | Binary |
|---|---|
| macOS (Apple Silicon) | nfltr-darwin-arm64 |
| macOS (Intel) | nfltr-darwin-amd64 |
| Linux (x86_64) | nfltr-linux-amd64 |
| Linux (ARM64) | nfltr-linux-arm64 |
| Windows (x86_64) | nfltr-windows-amd64.exe |
| Windows (ARM64) | nfltr-windows-arm64.exe |
# Example: macOS Apple Silicon
chmod +x nfltr-darwin-arm64
sudo mv nfltr-darwin-arm64 /usr/local/bin/nfltr
Commands
nfltr http — HTTP Tunnel
Expose a local HTTP service through an encrypted tunnel.
nfltr http [port|url] [flags]
Arguments
| Argument | Description |
|---|---|
[port] | Local port number (expands to http://localhost:PORT) |
[url] | Full local URL (e.g. https://myapp.local:3000) |
If omitted, defaults to http://localhost:8080.
Flags
| Flag | Env Var | Default | Description |
|---|---|---|---|
--name | AGENT_ID | auto-generated | Agent identity name |
--api-key | NFLTR_API_KEY | (config file) | API key for authentication |
--server | NFLTR_SERVER | grpc.nfltr.xyz:443 | Server gRPC address |
--share | SHARE | true | Request a public share URL |
--no-share | NO_SHARE | false | Disable automatic share URL |
--route | — | — | Path-based route (repeatable) |
--tls | RPC_TLS | true | Enable TLS for gRPC |
--tls-cert | TLS_CERT_FILE | — | Client certificate for mTLS |
--tls-key | TLS_KEY_FILE | — | Client key for mTLS |
--tls-ca | TLS_CA_FILE | — | CA bundle for mTLS |
--verbose | VERBOSE | false | Log every proxied request |
--health-addr | HEALTH_ADDR | :29501 | Health check endpoint |
--timeout | REQUEST_TIMEOUT | 60 | Local request timeout (seconds) |
--duration | DURATION | 0 | Max runtime in seconds (0=unlimited) |
--retries | CONNECT_RETRIES | 12 | Connection retry attempts |
--retry-wait | RETRY_WAIT | 5 | Seconds between retries |
--insecure-skip-verify | INSECURE_SKIP_VERIFY | false | Skip TLS verify for local service |
--labels | NFLTR_LABELS | — | Comma-separated key=value labels for fleet matching |
--e2ee | NFLTR_E2EE | true | Enable E2EE — agent terminates TLS, server routes by SNI without decrypting |
--e2ee-cert | NFLTR_E2EE_CERT | (auto-generated) | TLS certificate file for E2EE (PEM) |
--e2ee-key | NFLTR_E2EE_KEY | (auto-generated) | TLS private key file for E2EE (PEM) |
--acme-domain | — | — | Obtain Let’s Encrypt certificate for domain (implies --e2ee) |
--record | — | false | Capture request/response traffic to a file for later replay |
--record-file | — | (auto-generated) | Output file for captured traffic (default: nfltr-capture-<timestamp>.json) |
--intercept | — | false | Live-print request/response summaries to stderr (traffic inspector) |
--key-name | — | — | Use a named API key from config (see nfltr config list-api-keys) |
Access control flags
These flags protect different layers and can be combined:
| Flag | Env Var | Protects | Enforced by |
|---|---|---|---|
--basic-auth | NFLTR_BASIC_AUTH | Browse URL (/browse/<agent>/) | Your machine (agent-side) |
--share-auth | NFLTR_SHARE_AUTH | Share URL (vivid-hawk.nfltr.xyz) | Server-side (cloud) |
--share-bearer | NFLTR_SHARE_BEARER | Share URL (Bearer token) | Server-side (cloud) |
--share-ip-allowlist | NFLTR_SHARE_IP_ALLOWLIST | Share URL (IP/CIDR filter) | Server-side (cloud) |
--share-header | — | Share URL (required header, repeatable) | Server-side (cloud) |
--basic-authand--share-authare not redundant.--basic-authruns on your machine and gates all incoming requests.--share-authis sent to the server as a policy and only applies to the public share URL. Use both together to protect the browse URL with one password and the share URL with another.
Examples
# Basic — expose port 8080
nfltr http 8080
# Custom name — access at /browse/myapp/
nfltr http 3000 --name myapp
# Public share URL is included by default; disable with --no-share
nfltr http 8080 --no-share
# Multi-backend routing (route /api to port 3000, default to 8080)
nfltr http 8080 --route /api=3000
# Multiple backends
nfltr http 8080 --route /api=3000 --route /ws=4000
# Expose an HTTPS local service
nfltr http https://localhost:3443
# Verbose logging of all proxied requests
nfltr http 8080 --verbose
# Limited duration (auto-stop after 1 hour)
nfltr http 8080 --duration 3600
Connection banner
nfltr vX.Y.Z
Agent ID myapp
Forwarding https://nfltr.xyz/browse/myapp/ → http://localhost:8080
2026/03/25 10:20:55 Resolved identity: myapp
2026/03/25 10:20:55 Share URL: https://vivid-hawk.nfltr.xyz/
2026/03/25 10:20:55 Connected — waiting for requests... (press Ctrl+C to stop)
With --verbose, every proxied request is also logged:
[1] GET / → 200 (4521 bytes, 12ms)
[2] GET /style.css → 200 (1200 bytes, 3ms)
nfltr tcp — TCP Tunnel (Agent Side)
Expose a local TCP port (SSH, databases, Redis, etc.) through an encrypted gRPC tunnel. Run this on the machine that hosts the service.
nfltr tcp <port> [flags]
Flags
| Flag | Default | Description |
|---|---|---|
--name | auto-generated | Agent identity |
--api-key | (config file) | API key |
--server | grpc.nfltr.xyz:443 | Server gRPC address |
--tls | true | Enable TLS |
--tls-cert, --tls-key, --tls-ca | — | mTLS credentials |
--verbose | false | Verbose logging |
--retries | 12 | Retry attempts |
--retry-wait | 5 | Seconds between retries |
--forward | — | Forward TCP connections to host:port instead of localhost:<port> |
--duration | 0 | Max runtime in seconds (0=unlimited) |
--labels | — | Comma-separated key=value labels for fleet matching |
--acme-domain | — | Obtain Let’s Encrypt certificate for domain (implies --e2ee) |
--key-name | — | Use a named API key from config |
--e2ee | true | Enable E2EE TLS passthrough |
--e2ee-cert | (auto-generated) | TLS certificate for E2EE |
--e2ee-key | (auto-generated) | TLS private key for E2EE |
Examples
# Expose SSH
nfltr tcp 22 --name my-ssh
# Expose PostgreSQL
nfltr tcp 5432 --name my-db
# Expose Redis
nfltr tcp 6379 --name my-redis
Connection banner
nfltr vX.Y.Z starting TCP tunnel
agent-id: my-ssh
server: grpc.nfltr.xyz:443 (tls=true)
tunnel: TCP → localhost:22
Connected — TCP tunnel active for localhost:22
Connect from another machine:
nfltr tcp-connect my-ssh 22 --listen :<local-port> --server nfltr.xyz:443
SSH example (if tunneling port 22):
nfltr tcp-connect my-ssh 22 --listen :2222 --server nfltr.xyz:443
ssh -p 2222 user@localhost
nfltr tcp-connect — TCP Client (Connect Side)
Connect to a remote agent's TCP service by creating a local TCP listener that tunnels connections through the server. Works with any TCP client (ssh, psql, redis-cli, mysql, etc.).
nfltr tcp-connect <agent-name> <port> [flags]
Arguments
| Argument | Description |
|---|---|
<agent-name> | The agent identity used when running nfltr tcp on the remote machine |
<port> | The port the remote agent is exposing (e.g. 22 for SSH, 5432 for Postgres) |
Flags
| Flag | Default | Description |
|---|---|---|
--listen | :0 | Local TCP address to listen on (:0 = random port) |
--server | nfltr.xyz:443 | Server HTTP address |
--api-key | (config file) | API key for authentication |
--tls | true | Use TLS for server connection |
--key-name | — | Use a named API key from config |
--pin-cert | — | Pin remote TLS certificate fingerprint (SHA256:XX:XX:...) |
Examples
# SSH to a remote machine
nfltr tcp-connect my-ssh 22 --listen :2222
ssh -p 2222 user@localhost
# Connect to a remote PostgreSQL
nfltr tcp-connect my-db 5432 --listen :5432
psql -h localhost -p 5432 mydb
# Redis — use random port (shown in banner)
nfltr tcp-connect my-redis 6379
redis-cli -p 54321
# MySQL
nfltr tcp-connect my-mysql 3306 --listen :3306
mysql -h 127.0.0.1 -P 3306 -u root
Connection flow
Your machine nfltr Server Remote Agent
──────────── ──────────── ────────────
ssh -p 2222 localhost
│
tcp-connect listener ─HTTP /connect/my-ssh/22─────────→ TCPDispatcher
bridges gRPC
←──gRPC ConnectTCP stream──── nfltr tcp 22
dials localhost:22
←─────────────────────────────────bidirectional bytes──────────────────────→
Comparison: server-configured vs tcp-connect
| Old: server-configured | New: tcp-connect (self-service) | |
|---|---|---|
| Who configures? | Server admin | User (no admin needed) |
| Server changes? | Yes | No |
| Port on server | Fixed public port | None — uses HTTPS /connect/ |
| Firewall rules | Extra TCP port must be open | Only HTTPS (443) needed |
Prerequisite: The server must havetcp.enabled=true. The/connect/{agent_id}/{port}endpoint is available automatically.
SSH config shortcut
# ~/.ssh/config
Host my-ssh
ProxyCommand nfltr ssh-proxy --name %h --port %p
User admin
nfltr grpc — gRPC Tunnel new
Expose a local gRPC service through a TCP tunnel so it can be reached remotely via grpcurl, Postman gRPC, BloomRPC, or any gRPC client. Uses TCP tunneling (not HTTP proxy) to preserve HTTP/2 framing, trailers, and bidirectional streaming.
nfltr grpc <port> [flags]
Flags
| Flag | Default | Description |
|---|---|---|
--name | auto-generated | Agent identity |
--api-key | (config file) | API key |
--server | grpc.nfltr.xyz:443 | Server gRPC address |
--tls | true | Enable TLS |
--tls-cert, --tls-key, --tls-ca | — | mTLS credentials |
--verbose | false | Verbose logging |
--retries | 12 | Retry attempts |
--retry-wait | 5 | Seconds between retries |
--labels | — | Comma-separated key=value labels |
--key-name | — | Use a named API key from config |
--acme-domain | — | Obtain Let’s Encrypt certificate for domain (implies --e2ee) |
--e2ee | true | Enable E2EE TLS passthrough |
--e2ee-cert | (auto-generated) | TLS certificate for E2EE |
--e2ee-key | (auto-generated) | TLS private key for E2EE |
Examples
# Expose local gRPC service
nfltr grpc 50051
# With custom name
nfltr grpc 50051 --name my-grpc-api
# Connect from another machine
nfltr tcp-connect <agent>.my-grpc-api 50051 --listen :50051 --server nfltr.xyz:443
grpcurl -plaintext localhost:50051 list
Connection banner
nfltr vX.Y.Z — gRPC tunnel to localhost:50051
agent-id: alice.my-grpc-api
server: grpc.nfltr.xyz:443 (tls=true)
tunnel: TCP → localhost:50051 (gRPC/HTTP2)
Connected — gRPC tunnel active for localhost:50051
Connect from another machine:
nfltr tcp-connect alice.my-grpc-api 50051 --listen :50051 --server nfltr.xyz:443
Then test with grpcurl:
grpcurl -plaintext localhost:50051 list
grpcurl -plaintext localhost:50051 <service>/<method>
Why TCP tunneling?
gRPC requires HTTP/2 end-to-end — framing, trailers, and bidirectional streaming. The HTTP proxy path decomposes requests into protobuf envelopes, which breaks these semantics. TCP tunneling forwards raw bytes and preserves the protocol correctly.
Connection flow
Your machine nfltr Server Remote Machine
┌──────────────── ┌──────────── ┌────────────
grpcurl localhost:50051
│
tcp-connect listener →HTTP /connect/agent/50051→ TCPDispatcher
bridges gRPC
←──gRPC ConnectTCP stream──── nfltr grpc 50051
dials localhost:50051
←───────────────────────────────bidirectional gRPC bytes──────────────────→
nfltr command — Expose a CLI Command as an HTTP Endpoint new
Turn any CLI tool into an HTTP microservice, tunnelled through the server. POST requests pipe the body as stdin (or as a flag argument) to the command and return stdout as the response. GET / serves a chat-style web UI with markdown rendering.
nfltr command <cmd> [args...] [flags]
Flags
| Flag | Env Var | Default | Description |
|---|---|---|---|
--name | AGENT_ID | auto-generated | Agent identity |
--api-key | NFLTR_API_KEY | (config file) | API key |
--share | SHARE | true | Request a public share URL |
--no-share | NO_SHARE | false | Disable automatic share URL |
--timeout | COMMAND_TIMEOUT | 120 | Command execution timeout (seconds) |
--max-input | MAX_INPUT | 1048576 | Maximum request body size (bytes) |
--concurrency | CONCURRENCY | 10 | Max concurrent command executions |
--basic-auth | NFLTR_BASIC_AUTH | — | Require HTTP Basic Auth (user:password) |
--body-as-arg | BODY_AS_ARG | — | Pass POST body as a command flag instead of stdin (e.g. -p) |
--cwd | COMMAND_CWD | — | Working directory for the command |
--model | COMMAND_MODEL | — | Default AI model (overridable via UI X-Model header) |
--labels | NFLTR_LABELS | — | Comma-separated key=value labels for fleet matching |
--e2ee | NFLTR_E2EE | true | Enable E2EE TLS passthrough |
--e2ee-cert | NFLTR_E2EE_CERT | (auto-generated) | TLS certificate for E2EE |
--e2ee-key | NFLTR_E2EE_KEY | (auto-generated) | TLS private key for E2EE |
Examples
# Echo service (stdin → stdout)
nfltr command cat
# JSON formatter as a service
nfltr command jq .
# Python script (share URL included automatically)
nfltr command python3 myscript.py
# Shell pipeline
nfltr command sh -c "sort | uniq"
# GitHub Copilot CLI as a remote AI assistant:
nfltr command --name copilot --basic-auth 'admin:pass' \
--body-as-arg -p --timeout 600 --model claude-sonnet-4 \
--cwd /path/to/project \
copilot -- --allow-all-tools
# Run on multiple repos (one instance per repo):
nfltr command --name copilot-frontend --body-as-arg -p \
--cwd ~/projects/frontend copilot -- --allow-all-tools
nfltr command --name copilot-backend --body-as-arg -p \
--cwd ~/projects/backend copilot -- --allow-all-tools
Web UI features
- Chat-style interface with user/assistant message bubbles
- Markdown rendering with syntax-highlighted code blocks
- Model selector dropdown (sends
X-Modelheader per request) - File attachment support
- Typing indicator during command execution
- Basic auth with session cookies (24h TTL)
How --body-as-arg works
Without it, the POST body is piped as stdin to the command. With --body-as-arg -p, the body is appended as a flag argument instead:
| Mode | Command executed |
|---|---|
| Default (stdin) | echo "hello" | copilot |
--body-as-arg -p | copilot -p "hello" |
This is essential for tools like GitHub Copilot CLI that read input from a flag (-p) rather than stdin.
nfltr tail — Live File Streaming new
Stream the tail of any file via a public URL — like tail -f over the internet. Visitors see live updates via Server-Sent Events in a web UI with search, pause, and auto-scroll.
nfltr tail [flags] <file>
Flags
| Flag | Env Var | Default | Description |
|---|---|---|---|
--name | AGENT_ID | auto-generated | Agent identity |
--api-key | NFLTR_API_KEY | (config file) | API key |
--lines | TAIL_LINES | 50 | Number of trailing lines to show initially |
--share | SHARE | true | Request a public share URL |
--no-share | NO_SHARE | false | Disable automatic share URL |
--basic-auth | NFLTR_BASIC_AUTH | — | Require HTTP Basic Auth (user:password) |
--labels | NFLTR_LABELS | — | Comma-separated key=value labels for fleet matching |
--e2ee | NFLTR_E2EE | true | Enable E2EE TLS passthrough |
--e2ee-cert | NFLTR_E2EE_CERT | (auto-generated) | TLS certificate for E2EE |
--e2ee-key | NFLTR_E2EE_KEY | (auto-generated) | TLS private key for E2EE |
Endpoints served
| Path | Description |
|---|---|
/ | Web UI with search, pause, auto-scroll |
/raw | Plain-text output (curl-friendly) |
/stream | Server-Sent Events stream (live updates) |
/health | Health check endpoint |
Examples
# Stream syslog with a share URL
nfltr tail /var/log/syslog
# Show last 200 lines
nfltr tail --lines 200 /var/log/nginx/access.log
# Password-protected log stream
nfltr tail --basic-auth admin:secret app.log
# Named agent for easy identification
nfltr tail --name prod-logs /var/log/app.log
# Plain-text access from another machine
curl https://<share-url>/raw
nfltr terminal — Web-Based Terminal new
Open a browser-accessible xterm.js terminal on the agent machine, tunnelled through the server via HTTP polling. Works through any HTTP proxy — no WebSocket support required.
nfltr terminal [flags]
Flags
| Flag | Env Var | Default | Description |
|---|---|---|---|
--name | AGENT_ID | auto-generated | Agent identity |
--api-key | NFLTR_API_KEY | (config file) | API key |
--shell | NFLTR_SHELL | $SHELL or /bin/sh | Shell command to spawn |
--basic-auth | NFLTR_BASIC_AUTH | — | Require HTTP Basic Auth (user:password) |
--no-auth | — | false | Allow unauthenticated access (testing only) |
--share | SHARE | true | Request a public share URL |
--no-share | NO_SHARE | false | Disable automatic share URL |
--labels | NFLTR_LABELS | — | Comma-separated key=value labels for fleet matching |
--e2ee | NFLTR_E2EE | true | Enable E2EE TLS passthrough |
--e2ee-cert | NFLTR_E2EE_CERT | (auto-generated) | TLS certificate for E2EE |
--e2ee-key | NFLTR_E2EE_KEY | (auto-generated) | TLS private key for E2EE |
One of --basic-auth or --no-auth is required.
Examples
# Password-protected web terminal
nfltr terminal --basic-auth admin:secret
# Custom shell
nfltr terminal --shell /bin/zsh --basic-auth user:pass
# Named agent with share URL
nfltr terminal --name my-box --share --basic-auth admin:secret
# No auth (testing only)
nfltr terminal --no-auth
How it works
Browser (xterm.js) nfltr.xyz Agent machine
┌─ POST /input ───────────└── HTTP tunnel ──────└───────────────────────└
│ │ │ nfltr terminal │
│─ GET /output ──────────│────────────────────│ PTY └───┌ shell │
┌─ GET /resize ──────────├ ├───────────────────────├
├───────────────────────├
Allocates a real PTY and starts a shell. HTTP polling at 50ms intervals delivers keystrokes and output — fully interactive, works through corporate proxies and firewalls.
nfltr shell vs nfltr terminal — which should I use?
Both give you remote shell access through a tunnel, but they work in fundamentally different ways:
nfltr shell | nfltr terminal | |
|---|---|---|
| Protocol | SSH (TCP tunnel) | HTTP polling (HTTP tunnel) |
| Client | Any SSH client, or browser via dashboard | Browser only (xterm.js) |
| Authentication | SSH password, public key, or none | HTTP Basic Auth or none |
| Connection method | nfltr tcp-connect + ssh, or nfltr ssh-proxy | Visit the share URL in a browser |
| SCP / SFTP | Yes — full SSH subsystem | No |
| Port forwarding | Yes (ssh -L / -R) | No |
| PTY allocation | Yes (via SSH PTY request) | Yes (direct PTY allocation) |
| Works through HTTP-only proxies | No — requires TCP passthrough | Yes — pure HTTP, no WebSocket |
| Latency | Low (persistent TCP) | ~50ms (polling interval) |
| Setup complexity | Agent + client-side tcp-connect or ssh-proxy config | Single command, open the URL |
| Best for | Power users, automation, file transfer, SSH tooling | Quick access, sharing, demos, HTTP-only networks |
Rule of thumb: Use nfltr terminal when you want a one-click browser shell with a shareable URL. Use nfltr shell when you need SCP, SFTP, port forwarding, or want to use your existing SSH client and config.
nfltr a2a — Agent-to-Agent Communication new
Direct messaging between agents through the relay server. Supports unary send/receive, persistent listening, and bidirectional streaming. In multi-pod deployments, messages are routed across pods automatically.
nfltr a2a <command> [flags]
Sub-commands
| Command | Description |
|---|---|
send <target> [message] | Send a message to another agent (unary RPC) |
listen | Listen for incoming A2A calls (print to stdout) |
pipe <target> | Bidirectional stdin/stdout streaming (like netcat) |
list | List connected agents |
Flags
| Flag | Env Var | Default | Description |
|---|---|---|---|
--name | AGENT_ID | auto-generated | Agent identity |
--api-key | NFLTR_API_KEY | (config file) | API key for authentication |
--server | NFLTR_SERVER | grpc.nfltr.xyz:443 | Server gRPC address |
--tls | RPC_TLS | true | Enable TLS |
--tls-cert, --tls-key, --tls-ca | — | — | mTLS credentials |
--retries | CONNECT_RETRIES | 12 | Connection retry attempts |
--retry-wait | RETRY_WAIT | 5 | Seconds between retries |
--timeout | A2A_TIMEOUT | 30 | Request timeout (seconds, send only) |
--e2ee | NFLTR_E2EE | true | AES-256-GCM payload encryption (enabled by default) |
Examples
# Send a message to another agent
nfltr a2a send sensor-42 "get status"
# Pipe JSON through stdin
echo '{"cmd":"status"}' | nfltr a2a send sensor-42
# Listen for incoming messages
nfltr a2a listen --name responder
# Bidirectional pipe (interactive)
nfltr a2a pipe sensor-42
# Pipe a file through another agent
cat data.json | nfltr a2a pipe processor-agent > result.json
Use cases
- IoT sensor data collection (send + listen)
- Remote command execution between agents
- File transfer between machines behind NAT
- Interactive chat between two agents
nfltr p2p — Peer-to-Peer Direct Transfer new
Transfer files, chat, and audio/video calls directly between two machines. The server is used only for initial signaling — all data flows over a direct TCP connection between peers, authenticated with HMAC-SHA256 and encrypted with AES-256-CTR. This means lower latency, no server bandwidth costs, and true end-to-end encryption.
nfltr p2p <command> [flags]
Sub-commands
| Command | Description |
|---|---|
send <file|dir> <peer> | Send a file or directory to a peer agent |
recv | Wait for incoming send/chat/call sessions |
chat <peer> | Interactive encrypted text chat |
call <peer> | Encrypted audio/video call (opens browser UI) |
list | List connected peers visible to the current API key |
Shared flags
| Flag | Default | Description |
|---|---|---|
--name | (auto) | Agent identity for this session |
--stun | stun.l.google.com:19302 | STUN server for NAT traversal |
--retries | 5 | Connection retry attempts |
--retry-wait | 3 | Seconds between retries |
--server | grpc.nfltr.xyz:443 | Server address (signaling only) |
--api-key | (config file) | API key for authentication |
--tls | true | Enable TLS for signaling channel |
recv-specific flags
| Flag | Default | Description |
|---|---|---|
--output | . | Directory to write received files |
--from | (any) | Only accept transfers from this agent |
--keep | false | Keep listening after first transfer |
--no-browser | false | For call mode, print URL instead of auto-opening browser |
Examples
# ── File transfer (complementary pair) ──────────────
# Terminal 1: receiver waits for incoming files
nfltr p2p recv --name bob-laptop --output ~/received/
# Terminal 2: sender transfers a file
nfltr p2p send report.pdf bob-laptop
# Use the exact scoped peer ID when targeting another API key scope
nfltr p2p send report.pdf partner-key.bob-laptop
# ── Directory transfer ──────────────────────────────
nfltr p2p send ./project/ bob-laptop
# ── Restrict who can send to you ────────────────────
nfltr p2p recv --name bob-laptop --from alice-desktop
# ── Keep receiving multiple transfers ───────────────
nfltr p2p recv --name bob-laptop --keep
# ── Encrypted chat (both sides) ─────────────────────
# Terminal 1:
nfltr p2p chat bob-laptop --name alice-desktop
# Terminal 2:
nfltr p2p chat alice-desktop --name bob-laptop
# ── Audio/video call (both sides) ─────────────────
# Terminal 1 (caller):
nfltr p2p call bob-laptop --name alice-desktop
# Terminal 2 (receiver should already be listening):
nfltr p2p recv --name bob-laptop
# Headless mode (print URL instead of auto-open):
nfltr p2p call bob-laptop --name alice-desktop --no-browser
nfltr p2p recv --name bob-laptop --no-browser
Peer ID resolution: nfltr p2p list shows the peers visible to the current API key. If a peer appears as partner-key.bob-laptop, use that exact ID in send, chat, or call. A bare alias like bob-laptop only resolves when it is unique in that visible list.
How it works
- Signaling — Both peers connect to the server via gRPC. The initiator sends an offer with a session token and candidate addresses; the responder replies with an answer.
- Candidate gathering — Each peer discovers its local LAN IPs and queries a STUN server for its public (NAT-reflexive) address.
- Direct connection — All candidates are dialed in parallel. The first working TCP path wins (LAN-direct, STUN-reflexive, or hairpin NAT).
- HMAC authentication — A mutual HMAC-SHA256 challenge-response verifies both peers hold the same session token. Replay attacks are prevented by binding the HMAC to a unique session ID.
- Encrypted transport — After authentication, both sides derive a shared AES-256 key and per-direction IVs from the token and challenges. All subsequent data is encrypted with AES-256-CTR — the connection is fully end-to-end encrypted.
- Data transfer — Files, directories, chat messages, or call signaling/media flow over the encrypted direct TCP connection. The server is no longer involved.
A2A vs P2P — when to use which
A2A and P2P have similar-sounding subcommands but are not interchangeable — they solve fundamentally different problems:
A2A (send / listen / pipe) | P2P (send / recv / chat / call) | |
|---|---|---|
| Data path | All data relayed through server | Direct TCP between peers (server only for signaling) |
| Data types | Raw bytes — text, JSON, binary streams | Files (with SHA-256), directories (tar+gzip), text chat, audio/video calls |
| Integrity | None — raw byte relay | SHA-256 checksums, progress bars, file metadata |
| Best for | Commands, orchestration, scripting, piping | Large files, private transfers, encrypted chat, direct calls |
| Latency | Higher (server hop) | Lower (direct TCP, often LAN-speed) |
| Bandwidth cost | Server pays | Peers pay (server is uninvolved) |
| NAT requirement | None (server relays everything) | At least one peer reachable, or STUN |
| Setup | Fire and forget — send finds listen | Receiver must start first (recv before send) |
Why similar names? Both have a "send" side and a "receive" side, but the similarity ends there. a2a send sends a text message through the server; p2p send transfers a file over a direct TCP connection. a2a pipe is like netcat through gRPC; p2p chat is an interactive terminal UI over a direct link. You cannot send files with A2A (no metadata, no checksums), and you cannot send arbitrary text messages with P2P send (it requires a file path).
nfltr shell — Embedded SSH Server new
Starts an embedded SSH server on the agent machine and exposes it through the TCP tunnel — no OpenSSH or sshd required. Remote users can access a shell via the browser terminal in the dashboard or through any SSH client. See shell vs terminal comparison to decide which to use.
nfltr shell [flags]
Authentication modes
| Mode | Flag | Use case |
|---|---|---|
| Password | --password <secret> | Quick access with a shared password |
| Public key | --authorized-keys <file> | Production — only authorized keys can connect |
| No auth | --no-auth | Smoke tests only — anyone can connect |
At least one of --password, --authorized-keys, or --no-auth is required.
Flags
| Flag | Default | Description |
|---|---|---|
--password | — | SSH password for password authentication |
--authorized-keys | — | Path to authorized_keys file for public key auth |
--no-auth | false | Disable all SSH authentication (tests only) |
--shell | $SHELL or /bin/sh | Shell command to spawn |
--host-key | (auto-generated) | Path to SSH host key file (PEM) |
--name | (hostname) | Agent identity |
--server | grpc.nfltr.xyz:443 | Server gRPC address |
--api-key | — | API key for authentication |
--labels | — | Comma-separated key=value labels for fleet matching |
--tls | true | Enable TLS |
--verbose | false | Verbose logging |
--e2ee | true | Enable E2EE TLS passthrough |
--e2ee-cert | (auto-generated) | TLS certificate for E2EE |
--e2ee-key | (auto-generated) | TLS private key for E2EE |
Examples
# Password auth
nfltr shell --password secret
# Public key auth
nfltr shell --authorized-keys ~/.ssh/authorized_keys
# No auth (smoke tests only)
nfltr shell --no-auth
Connecting
Once the shell agent is running, there are three ways to connect:
1. Browser terminal (dashboard) — click the ► Term button on the agent card in the dashboard. Requires http.terminal.enabled=true on the server (enabled by default on nfltr.xyz).
2. TCP connect + SSH
nfltr tcp-connect <agent-id> 22 --listen :2222
ssh -p 2222 user@localhost
3. SSH proxy
ssh -o ProxyCommand="nfltr ssh-proxy --name <agent-id> --port 22" user@agent
How it works
┌────────────┐ TCP tunnel ┌─────────────┐ ConnectTCP ┌────────────────────┐
│ SSH Client │─────────────→│ rpc-server │─────────────→│ nfltr shell │
│ or Browser │ │ │ │ (embedded sshd) │
└────────────┘ └─────────────┘ └────────────────────┘
The embedded SSH server listens on a random local port. The TCP tunnel forwards connections from the server to that port. No system-level SSH daemon is needed.
nfltr wg — WireGuard VPN Tunnel new
Create a full Layer 3 VPN tunnel using the WireGuard protocol. The agent runs in userspace (no root required) using gvisor netstack. The server relays opaque WireGuard packets — it never possesses session keys or sees plaintext IP traffic.
nfltr wg <command> [flags]
Sub-commands
| Command | Description |
|---|---|
serve | Start a WireGuard server endpoint on this agent |
socks5 <agent> | Connect to a remote agent's WireGuard server via a local SOCKS5 proxy |
connect <agent> | Connect to a remote agent and create a local TUN interface |
keygen | Generate a new WireGuard key pair |
Shared flags
| Flag | Default | Description |
|---|---|---|
--name | (hostname) | Agent identity |
--server | grpc.nfltr.xyz:443 | Server gRPC address |
--api-key | (config file) | API key for authentication |
--tls | true | Enable TLS for gRPC |
--labels | — | Comma-separated key=value labels |
socks5-specific flags
| Flag | Default | Description |
|---|---|---|
--listen | :1080 | Local SOCKS5 proxy listen address |
Examples
# Start WireGuard server on the agent
nfltr wg serve --name my-network
# Connect from another machine via SOCKS5 proxy
nfltr wg socks5 my-network --listen :1080
# Access remote services through the tunnel
curl --proxy socks5://localhost:1080 http://192.168.1.100:8080
# Configure browser to use SOCKS5 proxy for full network access
# Firefox: Settings → Network Settings → SOCKS Host: localhost, Port: 1080
How it works
- Key exchange — WireGuard Curve25519 public keys are exchanged over gRPC metadata headers (
x-wg-pubkey,x-wg-assigned-ip). - IP allocation — The server allocates CGNAT addresses (100.64.0.0/10) for each peer.
- Tunnel establishment — gvisor netstack creates a userspace network stack — no kernel modules, no root, no
/dev/tun. - Encrypted relay — All IP traffic (TCP, UDP, ICMP) is WireGuard-encrypted. The server relays opaque packets without decryption.
Encryption
WireGuard provides built-in end-to-end encryption using Curve25519 (key exchange), ChaCha20-Poly1305 (data encryption), and BLAKE2s (hashing). The server has no access to the plaintext IP traffic.
nfltr ssh-proxy — SSH ProxyCommand Helper
Acts as an SSH ProxyCommand that tunnels SSH sessions through the server's HTTP /connect/{agent_id}/{port} endpoint.
nfltr ssh-proxy --name <agent> [--port <port>] [flags]
Flags
| Flag | Default | Description |
|---|---|---|
--name | — | Agent identity to connect to (required) |
--port | 22 | Remote port to tunnel to |
--server | nfltr.xyz:443 | Server HTTP address |
--api-key | (config file) | API key for authentication |
SSH config example
# ~/.ssh/config
Host mydevice
ProxyCommand nfltr ssh-proxy --name %h --port %p
User admin
Then simply:
ssh mydevice # connects through the nfltr tunnel
scp file mydevice:/path
sftp mydevice
Inline usage
ssh -o ProxyCommand="nfltr ssh-proxy --name myagent --port %p" user@myagent
nfltr status — Server Status
Check server connectivity and list connected agents.
nfltr status [flags]
Flags
| Flag | Default | Description |
|---|---|---|
--server | grpc.nfltr.xyz:443 | Server address |
--tls | true | Use TLS |
--api-key | — | Enables agent listing |
Example output
nfltr dev
Server: grpc.nfltr.xyz:443
URL: https://nfltr.xyz
Status: online
Latency: 668ms
nfltr diagnose — Connectivity Diagnostics
Run a comprehensive connectivity test against your configured NFLTR endpoints.
nfltr diagnose [flags]
Tests (in order):
- DNS Resolution — resolves the server hostname
- HTTP Connectivity — GET to the server's HTTPS endpoint
- HTTPS/TLS — validates the TLS certificate chain
- gRPC Port — TCP dial to the gRPC port
- TLS Handshake — verifies TLS works on the gRPC port
- Round-trip Latency — measures end-to-end HTTPS latency
Example output
nfltr dev — connection diagnostics
DNS resolution (grpc.nfltr.xyz) OK 34.61.152.169
DNS resolution (nfltr.xyz) OK 104.21.16.130, 172.67.212.183
TCP connection (grpc.nfltr.xyz:443) OK 254ms
TLS handshake (grpc.nfltr.xyz:443) OK 1.511s (TLS 1.3)
HTTP endpoint (https://nfltr.xyz) OK 200 (622ms)
gRPC channel (grpc.nfltr.xyz:443) OK 3ms
6/6 tests passed
All connectivity tests passed.
nfltr config — Configuration Management
Manage the nfltr configuration file (stored at ~/.config/nfltr/nfltr.json).
nfltr config <command>
Sub-commands
| Subcommand | Description |
|---|---|
add-api-key KEY [--name label] | Save an API key (optionally with a label) |
list-api-keys | List all saved API keys |
use-api-key <label> | Switch the active API key |
remove-api-key <label> | Remove a saved API key |
check | Validate the config file and print current settings |
list | Show current configuration |
path | Print the config file path |
Examples
# Save your API key (stored as "default")
nfltr config add-api-key rpc_abc123...
# Save a friend's key with a label
nfltr config add-api-key rpc_xyz789... --name alice
# List all saved keys (* marks the active key)
nfltr config list-api-keys
# * default rpc_...c123
# alice rpc_...z789
# Switch active key
nfltr config use-api-key alice
# Remove a key
nfltr config remove-api-key alice
# Check current config
nfltr config check
# Find config file
nfltr config path
# → /Users/you/.config/nfltr/nfltr.json
Per-command key selection
All commands accept --key-name <label> to use a specific named key without switching the global active key:
nfltr a2a send bob-laptop hello --key-name alice
nfltr http 8080 --key-name work
nfltr p2p chat bob-laptop --key-name bob
Priority chain: --api-key flag → NFLTR_API_KEY env → --key-name lookup → active key from config.
Config file format
{
"api_key": "rpc_abc123...",
"api_keys": {
"default": "rpc_abc123...",
"alice": "rpc_xyz789..."
},
"server": "grpc.nfltr.xyz:443",
"name": "my-laptop"
}
Override with environment variable: NFLTR_CONFIG=/path/to/config.json
nfltr keys — API Key Management
Manage API keys offline (reads/writes the server-side key file directly, no running server required). This is an admin tool — run it on the machine where the server stores its key file.
nfltr keys <command> [flags]
Sub-commands
| Subcommand | Description |
|---|---|
generate --name <agent> | Generate a new API key |
list | List existing keys (shows prefixes only) |
revoke --name <agent> | Revoke an agent's key |
Common flags
| Flag | Default | Description |
|---|---|---|
--file | /etc/rpcserver/api-keys | Path to the server-side API key file (not the client config) |
--json | false | Output in JSON format |
--name | — | Agent identity |
Examples
# Generate a key for an agent
nfltr keys generate --name myagent
# Agent ID: myagent
# API Key: rpc_abc123...
# List all keys
nfltr keys list
# AGENT ID KEY PREFIX CREATED
# -------- ---------- -------
# myagent rpc_abc123... 2026-03-21T10:00:00Z
# Revoke a key
nfltr keys revoke --name myagent
nfltr mcp — MCP Stdio Server
Run the NFLTR MCP server over stdio for AI planners, workers, and collectors. This command registers discovery, proxy, and worker orchestration tools up front. Calls that need the live A2A control-plane connection still fail until that connection is available.
nfltr mcp [flags]
Flags
| Flag | Default | Description |
|---|---|---|
--proxy-url | http://localhost:8080 | NFLTR proxy API base URL |
--server | grpc.nfltr.xyz:443 | gRPC control-plane address used for A2A orchestration |
--api-key | NFLTR_API_KEY / active config key | API key sent as X-Api-Key for authenticated requests |
--a2a-api-key | --api-key | Optional override for the A2A orchestrator connection |
--agent-id | (generated) | Planner-side agent identity used for orchestration tools |
--a2a-e2ee | true | Encrypt A2A worker payloads end to end |
--tls | true | Enable TLS for the gRPC A2A connection |
--task-store-file | dirname(NFLTR_CONFIG)/orchestrator-tasks.json | Override the local file used to persist planner task snapshots for recovery |
--write-mcp-json | — | Write a VS Code MCP config file and exit |
Examples
# Local proxy (default)
nfltr mcp
# Hosted planner bridge with explicit auth
nfltr mcp --proxy-url https://nfltr.xyz --server grpc.nfltr.xyz:443 --api-key "$NFLTR_API_KEY"
# Hosted proxy with env vars
NFLTR_PROXY_URL=https://nfltr.xyz NFLTR_API_KEY=... nfltr mcp
# Generate VS Code MCP config
nfltr mcp --proxy-url https://nfltr.xyz --write-mcp-json .vscode/mcp.json
Planner task snapshots and append-only task events persist locally by default beside the nfltr config file at dirname(NFLTR_CONFIG)/orchestrator-tasks.json, usually ~/.config/nfltr/orchestrator-tasks.json, so get_task_status, get_task_events, and list_active_tasks can recover best-effort last-known state after a planner restart. Use --task-store-file or NFLTR_TASK_STORE_FILE to override the path.
The local JSON store writes snapshots and lifecycle events separately, so an abrupt crash can still leave those two views one write apart. Crash-consistent replay is future shared-backend work.
If that file-backed store cannot be opened, nfltr mcp logs a warning and falls back to in-memory task tracking for the current process only.
If one planner runs on one machine and stays up, this local store is usually enough. Shared persistence only matters when the planner process restarts under a supervisor, moves between hosts, or another process needs the same orchestration history.
Core tool groups exposed by nfltr mcp:
list_my_peersandproxy_requestfor raw discovery and HTTP relaylist_worker_peers,rank_worker_peers, andprobe_workerfor worker selectionorchestrate_task,delegate_handoff,get_task_status,get_task_events,respond_to_worker,cancel_task, andlist_active_tasksfor planner-worker control flow;delegate_handoffalso supportswait_for_childto fan child results back into the parent reply
nfltr copilot-mcp — Copilot-Backed MCP Worker Tool
Run a local MCP stdio server that exposes a single worker tool backed by the GitHub Copilot CLI. Use this as the --mcp-command target for nfltr worker on machines that have Copilot CLI but no native MCP server command.
nfltr copilot-mcp [flags] [-- copilot-args...]
Flags
| Flag | Default | Description |
|---|---|---|
--tool-name | run_task | MCP tool name exposed to the worker runtime |
--copilot-command | copilot | Underlying GitHub Copilot CLI executable |
--cwd | — | Working directory used for Copilot task execution |
--model | — | Copilot model pinned for this worker process |
--mode | — | Copilot agent mode for task execution |
--reasoning-effort | — | Reasoning effort level such as low, medium, high, or xhigh |
--copilot-log-level | — | Pass through Copilot CLI log level |
--allow-all-tools | true | Enable non-interactive tool access in the underlying Copilot CLI |
--timeout | 5m | Per-task execution timeout |
--verbose | false | Enable verbose wrapper logging |
--copilot-arg | (repeatable) | Additional raw argument passed to the Copilot CLI |
Examples
# Start a local Copilot-backed MCP worker tool
nfltr copilot-mcp --cwd ~/project
# Pin the worker to one model and reasoning profile
nfltr copilot-mcp --cwd ~/project --model gpt-5.2 --reasoning-effort high
# Pass through extra Copilot CLI flags
nfltr copilot-mcp --cwd ~/project --verbose --copilot-arg=--stream=off
# Use it behind an nfltr worker
nfltr worker --api-key YOUR_KEY --mcp-command "nfltr copilot-mcp --cwd ~/project"
Use explicit flags like --model, --mode, and --reasoning-effort for common Copilot settings. Arguments after -- and repeated --copilot-arg flags are passed straight through to the underlying copilot CLI.
nfltr worker — A2A Worker Runtime
Run an A2A worker that accepts orchestrated tasks and forwards them to a local MCP-capable AI tool. The local MCP server is launched via --mcp-command and must expose the tool named by --mcp-tool.
nfltr worker [flags]
Connection flags
| Flag | Default | Description |
|---|---|---|
--name | (generated) | Worker agent identity |
--server | grpc.nfltr.xyz:443 | gRPC control-plane address |
--api-key | NFLTR_API_KEY | API key for worker authentication |
--key-name | — | Use a named API key from local config |
--e2ee | true | Encrypt worker A2A payloads end to end |
--tls | true | Enable TLS for the gRPC connection |
--retry-wait | 5 | Seconds between reconnect attempts |
Worker flags
| Flag | Default | Description |
|---|---|---|
--labels | — | Comma-separated key=value labels advertised for worker selection |
--max-tasks | 3 | Maximum concurrent tasks accepted by this worker |
--mcp-command | (required) | Local MCP server command launched for task execution |
--mcp-tool | run_task | MCP tool name invoked on the local MCP server |
--resource-cpu-cores | host CPU count | Worker selection CPU label value |
--resource-memory-mb | 4096 | Worker selection memory label value in MB |
--resource-load-pct | 25 | Worker selection load label value from 0 to 100 |
--transfer-mode | a2a | Preferred transfer label such as a2a, p2p, or wireguard |
--verbose | false | Enable verbose worker lifecycle logging |
Examples
# Start a worker backed by a native MCP server
nfltr worker --api-key YOUR_KEY --mcp-command "claude mcp serve"
# Advertise labels and accept up to two concurrent tasks
nfltr worker --api-key YOUR_KEY --labels gpu=a100,ram=64g --max-tasks 2 --mcp-command "python3 ./worker_mcp.py"
# Run a Copilot-backed worker
nfltr worker --api-key YOUR_KEY --verbose --mcp-command "nfltr copilot-mcp --cwd ~/project --verbose"
# Supply the worker MCP command through env vars
NFLTR_WORKER_MCP_COMMAND="python3 ./worker_mcp.py" nfltr worker --api-key YOUR_KEY --mcp-tool run_task
Workers automatically advertise scheduling labels such as coord.cpu_cores, coord.memory_mb, coord.load_pct, coord.transfer, nfltr.worker.protocol, nfltr.worker.tool, and nfltr.worker.max_tasks. Run nfltr worker --help to see the full set of shared connection flags inherited from nfltr a2a.
nfltr version
Print the version string.
nfltr version
# → nfltr dev
nfltr demo
Interactive feature showcase — 10 numbered sections covering every capability with copy-pasteable commands. Shows the current platform, version, and auto-generated agent ID. Requires no API key or network connection.
nfltr demo
nfltr db — Database Tunnel new
Connect to a remote database through a tunnel with database-aware defaults. Wraps tcp-connect with automatic port selection, connection string generation, and CLI client recommendations.
nfltr db <agent-name> <engine> [flags]
Supported engines
| Engine | Aliases | Default Port |
|---|---|---|
| PostgreSQL | postgres, pg | 5432 |
| MySQL / MariaDB | mysql, mariadb | 3306 |
| Redis | redis | 6379 |
| MongoDB | mongo, mongodb | 27017 |
| SQL Server | mssql, sqlserver | 1433 |
| ClickHouse | clickhouse | 9000 |
| CockroachDB | cockroach | 26257 |
Flags
| Flag | Default | Description |
|---|---|---|
--server | nfltr.xyz:443 | Server HTTP address |
--api-key | (config file) | API key |
--listen | :PORT | Local listen address (defaults to engine port) |
--user | — | Database username for connection hint |
--dbname | — | Database name for connection hint |
--port | (engine default) | Override remote port |
--tls | true | Use TLS for server connection |
Examples
# Connect to remote PostgreSQL
nfltr db my-server postgres
# → Listening on localhost:5432
# → psql -h localhost -p 5432 -U postgres
# MySQL with user and database hints
nfltr db my-server mysql --user root --dbname myapp
# → mysql -h 127.0.0.1 -P 3306 -u root myapp
# Redis on a custom local port
nfltr db my-server redis --listen :6380
# → redis-cli -p 6380
nfltr serve — HTTP File Server new
Start a local HTTP file server and expose it through a tunnel with an instant public URL. Like python -m http.server but with a share URL.
nfltr serve [path] [flags]
Arguments
| Argument | Description |
|---|---|
[path] | Directory to serve (default: current directory) or single file |
Flags
| Flag | Default | Description |
|---|---|---|
--name | auto-generated | Agent identity |
--api-key | (config file) | API key |
--share | true | Request public share URL |
--no-share | false | Disable share URL |
--basic-auth | — | Require HTTP Basic Auth (user:password) |
--share-auth | — | HTTP Basic Auth for share visitors |
--share-ip-allowlist | — | IP/CIDR allowlist for share URL |
--share-bearer | — | Bearer token for share visitors |
--labels | — | Comma-separated key=value labels |
--e2ee | true | Enable E2EE TLS passthrough |
--e2ee-cert | (auto-generated) | TLS certificate for E2EE |
--e2ee-key | (auto-generated) | TLS private key for E2EE |
Examples
# Serve the current directory
nfltr serve .
# Serve a build output
nfltr serve ./dist
# Serve a single file
nfltr serve file.zip
# Password-protected share
nfltr serve . --basic-auth admin:secret
# Named agent
nfltr serve ./public --name my-files
nfltr share — Instant Ephemeral URL new
Create an instant, ephemeral URL to share text, a file, or a directory. Content served through the tunnel until Ctrl+C or auto-expiration.
nfltr share [text|file|dir] [flags]
Flags
| Flag | Default | Description |
|---|---|---|
--expire | — | Auto-expire after duration (30m, 1h, 24h) |
--raw | false | Serve text as plain text (no HTML wrapper) |
--basic-auth | — | Require HTTP Basic Auth (user:password) |
--share-auth | — | HTTP Basic Auth for share visitors |
--e2ee | true | Enable E2EE TLS passthrough |
--e2ee-cert | (auto-generated) | TLS certificate for E2EE |
--e2ee-key | (auto-generated) | TLS private key for E2EE |
Examples
# Share text — wraps in a styled HTML page with copy button
nfltr share "error: connection refused on port 5432"
# Pipe from stdin
echo "build log" | nfltr share
git diff | nfltr share
# Share a file for download
nfltr share ./crash.log
# Share a directory with file listing
nfltr share ./dist/
# Auto-expire after 30 minutes
nfltr share "temporary secret" --expire 30m
# Password-protected
nfltr share ./secrets.env --share-auth admin:s3cret
# Plain text (curl-friendly)
nfltr share "data" --raw
nfltr manage — Dashboard-Managed Runtime new
Start one long-lived browser-capable tunnel, then let the dashboard stage Copilot, browser shells, HTTP apps, command UIs, and log tails as durable desired state.
nfltr manage [flags]
Flags
| Flag | Default | Description |
|---|---|---|
--name | auto-generated | Agent identity |
--api-key | (config file) | API key |
--server | grpc.nfltr.xyz:443 | Server gRPC address |
--http-addr | derived from --server | HTTP base for the share API and manage control plane |
--basic-auth | — | Require HTTP Basic Auth (user:password) for the manage root and all mounted surfaces |
--share | true | Request public share URL |
--no-share | false | Disable automatic share URL |
--share-auth | — | HTTP Basic Auth for share visitors |
--share-bearer | — | Bearer token for share visitors |
--share-ip-allowlist | — | IP/CIDR allowlist for share visitors |
--share-header | — | Required header for share visitors (repeatable) |
--poll-interval | 5s | How often to poll the dashboard-managed intent API |
--mode | verified default | Explicit tunnel mode: verified or inspectable |
--e2ee | true | Enable E2EE TLS passthrough |
Supported managed capability types
The current single-tunnel runtime can execute http, serve, command, tail, terminal, copilot, claude, codex, and generic ai when config.command is set. The dashboard still accepts tcp, grpc, shell, and watch, but this runtime reports them as unsupported.
Examples
# Start a dashboard-managed runtime on nfltr.xyz
nfltr manage \
--name dev-laptop \
--api-key "$NFLTR_API_KEY" \
--http-addr https://nfltr.xyz \
--basic-auth review:secret
# Dashboard recipes after the runtime is up:
# Copilot -> Type=copilot, Target=/home/alice/repo, Config=mode=chat
# Shell -> Type=terminal, Target=/bin/bash
# HTTP app -> Type=http, Target=http://localhost:3000
# Generic AI-> Type=ai, Target=/home/alice/repo, Config=command=copilot,mode=chat
Access pattern
Each running capability is mounted under the manage root:
/browse/<agent-id>/managed/<capability-id>/
The dashboard Open button points at that path once the runtime reports it.
For the full setup flow, see Managed Capabilities.
nfltr watch — Live Command Dashboard new
Run a command periodically and stream live-updating output via a share URL. Like watch + tail -f combined, accessible from anywhere via Server-Sent Events.
nfltr watch [flags] <command> [args...]
Flags
| Flag | Default | Description |
|---|---|---|
--interval | 2s | Refresh interval (2s, 5s, 1m) |
--expire | — | Auto-expire after duration (30m, 1h) |
--basic-auth | — | Require HTTP Basic Auth (user:password) |
--share-auth | — | HTTP Basic Auth for share visitors |
--name | auto-generated | Agent identity |
--share | true | Request public share URL |
--e2ee | true | Enable E2EE TLS passthrough |
--e2ee-cert | (auto-generated) | TLS certificate for E2EE |
--e2ee-key | (auto-generated) | TLS private key for E2EE |
Endpoints served
| Path | Description |
|---|---|
/ | Web UI with live-updating output |
/api/output | JSON API (latest output snapshot) |
/events | Server-Sent Events stream |
Examples
# Monitor Kubernetes pods
nfltr watch "kubectl get pods"
# Disk usage with 5-second refresh
nfltr watch --interval 5s df -h
# Docker container status
nfltr watch "docker ps --format 'table {{.Names}}\t{{.Status}}'"
# Auto-expire after 1 hour
nfltr watch --expire 1h "uptime"
# Password-protected dashboard
nfltr watch --basic-auth admin:secret "top -b -n 1"
nfltr clipboard — Cross-Machine Clipboard new
Sync clipboard content between machines via A2A messaging.
nfltr clipboard <command> [flags]
Sub-commands
| Command | Description |
|---|---|
copy <target> [text] | Send clipboard (or piped text) to a remote agent |
paste <target> | Retrieve clipboard from a remote agent |
Flags
| Flag | Default | Description |
|---|---|---|
--name | auto-generated | Agent identity |
--api-key | (config file) | API key |
--timeout | 30 | Request timeout (seconds) |
--stdout | false | Print to stdout instead of writing to clipboard (paste only) |
Examples
# Copy local clipboard to a work machine
nfltr clipboard copy work-laptop
# Copy specific text
nfltr clipboard copy work-laptop "some text to share"
# Pipe text to clipboard
cat secret.env | nfltr clipboard copy work-laptop
# Retrieve clipboard from remote machine
nfltr clipboard paste work-laptop
# Output to stdout instead of local clipboard
nfltr clipboard paste work-laptop --stdout
nfltr notify — Desktop Notifications new
Send desktop notifications to remote agents, listen for incoming notifications, or watch a command and notify when done.
nfltr notify <command> [flags]
Sub-commands
| Command | Description |
|---|---|
send <target> <message> | Send a desktop notification to a remote agent |
listen | Listen for and display incoming notifications |
watch <target> <command> | Run command and notify target when done |
Flags
| Flag | Default | Description |
|---|---|---|
--name | auto-generated | Agent identity |
--api-key | (config file) | API key |
--timeout | 30 | Request timeout (seconds) |
--title | nfltr | Notification title |
Examples
# Send a notification to your work laptop
nfltr notify send work-laptop "Build finished!"
# With a custom title
nfltr notify send work-laptop "Tests passed" --title "CI"
# Listen for incoming notifications
nfltr notify listen --name my-laptop
# Run a command and notify when done
nfltr notify watch work-laptop make test
nfltr notify watch work-laptop -- long-running-script.sh
nfltr ai — Remote AI CLI new
Run an AI CLI tool (Claude, Copilot, etc.) in an interactive PTY session exposed via a web UI. Supports text/voice input and screenshot capture for vision-capable models.
nfltr ai [command] [args...] [flags]
Flags
| Flag | Default | Description |
|---|---|---|
--mode | terminal | UI mode: terminal (xterm.js) or chat |
--cwd | (home dir) | Working directory for AI session |
--basic-auth | — | Require HTTP Basic Auth (user:password) |
--no-auth | false | Allow unauthenticated access |
--share | true | Request public share URL |
--name | auto-generated | Agent identity |
--labels | — | Comma-separated key=value labels |
--e2ee | true | Enable E2EE TLS passthrough |
--e2ee-cert | (auto-generated) | TLS certificate for E2EE |
--e2ee-key | (auto-generated) | TLS private key for E2EE |
Examples
# Run Claude CLI with web terminal UI (default)
nfltr ai claude
# Copilot with chat-style interface
nfltr ai copilot --mode chat --basic-auth admin:secret
# Custom AI tool with working directory
nfltr ai -- custom-ai-tool --verbose --cwd ~/project
UI modes
| Mode | Interface | Best For |
|---|---|---|
terminal | Full xterm.js terminal emulation | Tools with rich terminal output, interactive sessions |
chat | Simplified chat bubbles with markdown | Q&A-style interactions, sharing with non-technical users |
nfltr ssh-config — SSH Config Helper new
Generate and manage SSH Host blocks in ~/.ssh/config so you can ssh <agent-name> directly.
nfltr ssh-config <agent-name> [flags]
Flags
| Flag | Default | Description |
|---|---|---|
--user | (current user) | SSH username |
--port | 22 | Remote SSH port |
--config | ~/.ssh/config | SSH config file path |
--print | false | Print config block without modifying files |
--remove | false | Remove the agent's Host block |
Examples
# Add SSH config for an agent
nfltr ssh-config my-server --user admin
# Then simply:
ssh my-server
# Preview without modifying
nfltr ssh-config my-server --print
# Output:
# Host my-server
# ProxyCommand nfltr ssh-proxy --name %h --port %p
# User admin
# Remove an agent's config
nfltr ssh-config my-server --remove
nfltr replay — HTTP Traffic Replay new
Replay HTTP requests captured by nfltr http --record against a local or remote server. Useful for reproducing bugs, load testing, or service migration verification.
nfltr replay <capture-file> [flags]
Flags
| Flag | Default | Description |
|---|---|---|
--target | http://localhost:8080 | Base URL to replay against |
--delay | 0 | Milliseconds between requests |
--method | — | Only replay matching HTTP method |
--path | — | Only replay matching URL substring |
--dry-run | false | Print requests without executing |
--verbose | false | Print response bodies |
--timeout | 30 | Request timeout (seconds) |
--preserve-host | false | Send original Host header |
Examples
# Replay all captured traffic
nfltr replay nfltr-capture-20260325-120000.json
# Replay against a different server
nfltr replay capture.json --target http://localhost:3000
# Only POST requests, with response bodies
nfltr replay capture.json --method POST --verbose
# Filter by path with 100ms delay
nfltr replay capture.json --path /api/users --delay 100
# Preview without executing
nfltr replay capture.json --dry-run
nfltr update — Self-Update new
Update nfltr to the latest version. Detects OS/architecture automatically and performs an atomic binary replacement.
nfltr update [flags]
Flags
| Flag | Default | Description |
|---|---|---|
--check | false | Check for updates without downloading |
Examples
# Update to latest version
nfltr update
# Check for updates without installing
nfltr update --check
# → Current: vX.Y.Z, Latest: vX.Y.Z (update available)
nfltr completion — Shell Completions new
Generate shell completion scripts for bash or zsh.
nfltr completion <bash|zsh>
Examples
# Bash — add to ~/.bashrc
eval "$(nfltr completion bash)"
# Zsh — add to ~/.zshrc
eval "$(nfltr completion zsh)"
Authentication
nfltr supports multiple authentication methods, tried in order:
--api-keyflag — highest priorityNFLTR_API_KEYenvironment variable--key-nameflag — look up a named key from config- Config file — active key in
~/.config/nfltr/nfltr.json - mTLS certificates —
--tls-cert,--tls-key,--tls-ca
API Key Authentication
The server administrator creates API keys via the admin dashboard or admin API. Each key is bound to an agent identity.
# Save once (or save multiple keys with --name)
nfltr config add-api-key YOUR_KEY
nfltr config add-api-key FRIEND_KEY --name alice
# All subsequent commands use the active key automatically
nfltr http 8080
nfltr status
# Or use a specific named key per-command
nfltr http 8080 --key-name alice
mTLS Authentication
For zero-trust environments without API keys:
nfltr http 8080 \
--tls-cert client.crt \
--tls-key client.key \
--tls-ca ca.crt \
--server grpc.yourcompany.com:443
Agent identity is derived from the certificate Common Name (CN).
Features
Share URLs
Share URLs are enabled by default. Every nfltr http or nfltr command session automatically gets a temporary public URL with a memorable name (e.g., https://vivid-hawk.nfltr.xyz/). Share URLs:
- Are accessible without authentication
- Use word-pair subdomains for easy sharing
- Expire when the agent disconnects
- Are revoked automatically on disconnect
nfltr http 8080
# → Share URL: https://vivid-hawk.nfltr.xyz/
# Disable with --no-share:
nfltr http 8080 --no-share
Multi-Backend Routing
Route different URL paths to different local services:
nfltr http 8080 \
--route /api=3000 \
--route /ws=4000 \
--route /admin=https://localhost:9443
| Path | Target |
|---|---|
/api/* | http://localhost:3000 |
/ws/* | http://localhost:4000 |
/admin/* | https://localhost:9443 |
| Everything else | http://localhost:8080 |
Verbose Request Logging
With --verbose, every proxied request is logged:
[1] GET / → http://localhost:8080/ → 200 (4521 bytes, txn=abc123)
[2] GET /style.css → http://localhost:8080/style.css → 200 (1200 bytes, txn=def456)
[3] POST /api/login → http://localhost:3000/api/login → 200 (89 bytes, txn=ghi789)
Auto-Reconnect
nfltr automatically reconnects when the connection drops:
- Default: 12 retry attempts with 5-second intervals
- Configure:
--retries 30 --retry-wait 10 - Total resilience window:
retries × retry-waitseconds
Duration Limit
Auto-stop after a fixed duration (useful for demos):
nfltr http 8080 --duration 3600 # Stop after 1 hour
Health Endpoint
nfltr exposes a local HTTP health endpoint (default :29501) for integration with monitoring tools:
nfltr http 8080 --health-addr :9999
# Health check: http://localhost:9999/health
Environment Variables
| Variable | Description | Used By |
|---|---|---|
NFLTR_API_KEY | API key | all commands |
NFLTR_SERVER | Server gRPC address | all commands |
NFLTR_PROXY_URL | Proxy API base URL | mcp |
NFLTR_CONFIG | Config file path override | config, http, tcp |
AGENT_ID | Agent identity | http, tcp |
RPC_TLS | Enable TLS (true/false) | all commands |
TLS_CERT_FILE | mTLS client certificate | http, tcp |
TLS_KEY_FILE | mTLS client key | http, tcp |
TLS_CA_FILE | mTLS CA bundle | http, tcp |
HEALTH_ADDR | Health endpoint address | http |
REQUEST_TIMEOUT | Request timeout (seconds) | http |
CONNECT_RETRIES | Retry attempts | http, tcp |
RETRY_WAIT | Retry interval (seconds) | http, tcp |
DURATION | Max runtime (seconds) | http |
VERBOSE | Verbose logging | http, tcp |
COMMAND_TIMEOUT | Command execution timeout | command |
COMMAND_CWD | Command working directory | command |
COMMAND_MODEL | Default AI model | command |
NFLTR_BASIC_AUTH | Basic auth credentials | command, http |
NFLTR_SHARE_AUTH | Basic auth for share URL visitors | http |
NFLTR_SHARE_BEARER | Bearer token for share URL visitors | http |
NFLTR_SHARE_IP_ALLOWLIST | IP/CIDR allowlist for share URLs | http |
NFLTR_LABELS | Comma-separated key=value labels | http, tcp, command |
SHARE | Request a public share URL | http, command |
STUN_SERVER | STUN server for NAT traversal | p2p |
A2A_TIMEOUT | A2A request timeout (seconds) | a2a |
Quick Command Map
| Task | nfltr command |
|---|---|
| Expose HTTP | nfltr http 8080 |
| Create a stable named endpoint | nfltr http 8080 --name myapp |
| Create a public share URL | nfltr http 8080 --share |
| Open a raw TCP tunnel from the agent | nfltr tcp 22 --name my-ssh |
| Expose a remote TCP service on localhost | nfltr tcp-connect my-ssh 22 --listen :2222 |
| Route a path to a second local service | nfltr http 8080 --route /api=3000 |
| Run connectivity diagnostics | nfltr diagnose |
| Save an API key locally | nfltr config add-api-key |
| Manage API keys | nfltr keys generate / list / revoke |
| Run MCP stdio server | nfltr mcp --proxy-url https://nfltr.xyz |
| Use NFLTR as SSH ProxyCommand | nfltr ssh-proxy --name %h --port %p |
| Expose a CLI as an HTTP service | nfltr command python3 myscript.py |
| Send messages agent-to-agent | nfltr a2a send / listen / pipe |
| Send files or start a call peer-to-peer | nfltr p2p send / recv / chat / call |
| Check server status | nfltr status |
| Connect with mTLS | nfltr http 8080 --tls-cert agent.crt --tls-key agent.key |