CLI Reference nfltr
Reference for nfltr.xyz users. Use this page for client-side nfltr commands that connect to the hosted relay: secure tunnels, sharing, orchestration observability, and fleet operations from your workstation.
New to NFLTR? Start with When to Use NFLTR, then return here for command-level detail.
Start From The Right Command Path
| Goal | Start here | Next step |
|---|---|---|
| Dispatch work on nfltr.xyz | nfltr orch start worker --worker YOUR_WORKER --role implementer --objective "..." --watch | Agent Orchestration overview |
| Monitor tasks & fleet | nfltr orch task list --active / nfltr orch fleet status | 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 |
--http-addr | — | http://localhost:8080 | Local URL to proxy (alternative to positional port/URL) |
--share | SHARE | true | Request a public share URL |
--no-share | NO_SHARE | false | Disable automatic share URL |
--share-auth | NFLTR_SHARE_AUTH | — | HTTP Basic Auth for share URL visitors (user:password) |
--share-bearer | NFLTR_SHARE_BEARER | — | Bearer token required on share URL requests |
--share-header | — | — | Required header on share requests (repeatable, Name:Value) |
--share-ip-allowlist | NFLTR_SHARE_IP_ALLOWLIST | — | IP/CIDR allowlist for share URL visitors |
--share-preset | — | — | Named share policy preset |
--share-ttl | — | — | Share URL time-to-live |
--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 |
|---|---|---|
--port | 0 | Local TCP port to expose (alternative to positional <port>) |
--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 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 orch — Hosted Orchestration CLI
Client-side orchestration against the nfltr.xyz control plane. The CLI is grouped by operator intent: start work, inspect tasks, manage workers, handle HITL queues, and maintain local orchestration state.
nfltr orch <group> <command> [flags]
Command groups
| Group | Use it for | Common commands |
|---|---|---|
start | Start orchestration work | goal, spec, worker, batch, graph run, graph eval |
task | Inspect or intervene on tasks | list, status, watch, wait, result, diff, cancel, retry, steer, events, audit, artifact get, children aggregate |
queue | Run the local YAML queue runner | init, validate, plan, run, status |
fleet | Inspect and manage connected workers | status, workers, ping, top, drift, drain, undrain, upgrade, restart-stale, wait |
hitl | List human-intervention queues | list with --kind approval, --kind question, or --worker |
spec | Create, validate, or decompose specs | template, validate, decompose |
admin | Maintenance commands | cleanup, task-store stats, task-store vacuum |
lab | Experimental and dogfood drivers | local, loop, fanout, waves, dag, frontier, dogfood |
Shared orch flags
Most orch subcommands accept connection flags: --server, --proxy-url, --api-key, --json, --task-store-file, --quiet, --silent, --no-derive-proxy, and --agent-id.
start
Start one-off work, a planner-authored spec, a worker task, a batch manifest, or a graph run.
nfltr orch start goal "fix the failing auth tests" [--worktree] [--watch]
nfltr orch start spec ./objective.json [--worktree] [--watch] [--json]
nfltr orch start worker --worker WORKER_ID --role implementer --objective "..." [flags]
nfltr orch start batch ./batch.json [--batch-id ID] [--watch]
nfltr orch start graph run --manifest graph.json [flags]
Flags
| Flag | Default | Description |
|---|---|---|
--worker | — | Target worker agent_id |
--role | — | Execution role (implementer, verifier, …) |
--objective | — | Objective text sent to the worker |
--watch | false | Tail events until terminal state after dispatch |
--dry-run | false | Print orchestrate_task JSON without dispatching |
--retry-on-transient | 1 | Transient transport retry budget before surfacing failure |
--priority | normal | Queue priority: low, normal, or high |
--server | grpc.nfltr.xyz:443 | rpc-server gRPC address |
--proxy-url | http://localhost:8080 | NFLTR proxy API base URL |
--api-key | (env / config) | API key for this orch invocation |
--json | false | Emit raw JSON instead of pretty text |
--task-store-file | (XDG data dir) | Shared task store path for cross-shell status |
--quiet | false | Suppress informational stderr notices |
--silent | false | Suppress all informational stderr output |
--no-derive-proxy | false | Disable --proxy-url auto-derivation from --server |
--agent-id | (generated) | Underlying MCP session agent identity |
# Dispatch one worker task and watch to completion
nfltr orch start worker --worker impl-pool-1 --role implementer \
--objective "Regenerate docs" --watch --retry-on-transient 3
# Run a phased spec from stdin
nfltr orch spec decompose --goal "Ship docs and tests" | nfltr orch start spec - --watch
# Dry-run payload inspection for a worker task
nfltr orch start worker --worker impl-pool-1 --role implementer \
--objective "..." --dry-run --json
task
List tasks from the local task store. Repeat --filter key=value for AND semantics (e.g. --filter role=implementer, --filter batch_id=iter-78).
nfltr orch task list [--active] [--filter key=value]... [flags]
nfltr orch task status --task TASK_ID [--events N] [--json]
nfltr orch task events --task TASK_ID [--tail N] [--since SEQUENCE] [--json]
nfltr orch task watch --task TASK_ID [--json]
nfltr orch task wait --task TASK_ID
nfltr orch task result --task TASK_ID
nfltr orch task diff --task TASK_ID
nfltr orch task cancel --task TASK_ID --reason "stuck past SLA"
nfltr orch task steer --task TASK_ID --message "narrow scope"
nfltr orch task artifact get --task TASK_ID --artifact-id AID --output PATH
nfltr orch task children aggregate --parent TASK_ID --json
Flags
| Flag | Default | Description |
|---|---|---|
--active | false | Show only non-terminal tasks |
--filter | — | Metadata filter key=value (repeatable, AND) |
--limit | 0 | Maximum rows (0 = no limit) |
--events | 10 | Embed the last N task events in task status output |
--tail | 10 | Show the last N task events in task events output; 0 means all |
--since | 0 | Only show task events whose relay sequence is greater than this value |
--server | grpc.nfltr.xyz:443 | rpc-server gRPC address |
--proxy-url | http://localhost:8080 | NFLTR proxy API base URL |
--api-key | (env / config) | API key for this orch invocation |
--json | false | Emit raw JSON instead of pretty text |
--task-store-file | (XDG data dir) | Shared task store path |
--quiet | false | Suppress informational stderr notices |
--silent | false | Suppress all informational stderr output |
--no-derive-proxy | false | Disable --proxy-url auto-derivation from --server |
--agent-id | (generated) | Underlying MCP session agent identity |
spec
Create, validate, or decompose an orchestration spec before starting it.
nfltr orch spec template --name my-run
nfltr orch spec validate ./objective.json [--json]
nfltr orch spec decompose --goal "rename foo to bar across cli and docs" [--json]
fleet
Fleet operations for worker pools: status dashboards, worker inventory, pings, version upgrades, drain/undrain, and configuration drift detection.
nfltr orch fleet status [--json]
nfltr orch fleet workers [--flavor codex] [--json]
nfltr orch fleet ping [--json]
nfltr orch fleet top [--refresh-interval 2s]
nfltr orch fleet drift [--json]
nfltr orch fleet drain --worker POOL_ID
nfltr orch fleet upgrade --all
nfltr orch fleet restart-stale --workers POOL_ID
nfltr orch fleet wait --condition ready
queue
Use the local YAML queue runner for backlog-style orchestration where each ready item runs in its own Git worktree.
nfltr orch queue init
nfltr orch queue validate
nfltr orch queue plan
nfltr orch queue run --once
nfltr orch queue status --json
hitl
Inspect pending human-intervention work across approvals, questions, escalations, reviews, and exceptions.
nfltr orch hitl list --kind approval --json
nfltr orch hitl list --kind question --worker WORKER_ID
admin and lab
Admin commands handle local cleanup and task-store maintenance. Lab commands keep experimental and dogfood drivers out of the primary lifecycle path.
nfltr orch admin cleanup --base-dir .nfltr/worktrees --dry-run
nfltr orch admin task-store stats --json
nfltr orch admin task-store vacuum --before 7d --dry-run
nfltr orch lab fanout status --json
nfltr orch lab frontier --help
Examples
# List active implementer tasks in a batch
nfltr orch task list --filter role=implementer --filter batch_id=iter-78 --active
# Inspect a relay-backed task snapshot plus compact timeline
nfltr orch task status --task TASK_ID --events 20
# Resume event audit after the last reviewed relay sequence
nfltr orch task events --task TASK_ID --tail 50 --since 120
# Dispatch with transient retry budget
nfltr orch start worker --retry-on-transient 3 --worker impl-1 --role implementer --objective "..."
# Validate a spec before running
nfltr orch spec validate ./mission.json
# Monitor live orchestration load
nfltr orch fleet top --refresh-interval 3s
# Detect worker config drift vs planner expectations
nfltr orch fleet drift --json
# Task store maintenance
nfltr orch admin task-store stats --json
nfltr orch admin task-store vacuum --before 7d --dry-run
# Child task fan-in
nfltr orch task children aggregate --parent TASK_ID --json
nfltr version
Print the version string.
nfltr version
# → nfltr dev
Flags
| Flag | Default | Description |
|---|---|---|
--json | false | Emit structured build metadata as JSON |
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 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 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 help — Command Help
Print usage for a top-level command or subcommand. Equivalent to passing -h / --help on most commands.
nfltr help [command]
nfltr http --help
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 |
| 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 |