CLI Commands
The FastForward CLI binary is installed as ff. It provides several commands for running, testing, and debugging log pipelines.
ff run
Section titled “ff run”Starts the FastForward pipeline and runs continuously until stopped.
ff run --config pipeline.yamlThe --config flag is optional. FastForward will automatically discover configuration files in this order:
--config <path>$FFWD_CONFIG./ffwd.yaml~/.config/ffwd/config.yaml/etc/ffwd/config.yaml
ff validate
Section titled “ff validate”Parses and validates the YAML configuration file and its schema without starting any pipeline components.
ff validate --config pipeline.yamlOn success, validate exits with code 0 and prints:
ready: defaultconfig ok: 1 pipeline(s)ff dry-run
Section titled “ff dry-run”Builds all pipeline objects (inputs, SQL transforms, and outputs) without starting active IO workers. dry-run runs the same validation path as validate — both build full pipelines and compile SQL queries against the Arrow schema to catch column name typos or type mismatches. The only difference is the success label: dry run ok instead of config ok.
ff dry-run --config pipeline.yamlOn success, prints:
ready: defaultdry run ok: 1 pipeline(s)ff send
Section titled “ff send”Reads from standard input until EOF, processes it through the configured pipeline, drains the output buffers, and exits. Designed for piped shell workflows.
cat app.log | ff send --config destination.yaml --format json| Option | Description |
|---|---|
--config | Destination YAML config file |
--format | Input format: auto, cri, json, raw (default: auto) |
--service | Set service.name on emitted records |
--resource | Add or override a resource attribute, repeatable: --resource key=value |
See Inputs for stdin and piping patterns.
ff generate-json
Section titled “ff generate-json”Generates synthetic JSON log lines for testing. Creates a file with stable, parseable records that exercise all column types.
ff generate-json 10000 logs.jsonThis creates 10,000 JSON log lines with fields: timestamp, level, message, duration_ms, request_id, service, status.
| Option | Description |
|---|---|
NUM_LINES | Number of log lines to generate |
OUTPUT_FILE | Path to write the generated file |
ff blast
Section titled “ff blast”Blasts generated synthetic log data into a destination sink to test throughput and network performance. This command uses the same core pipeline runtime but bypasses reading from disk or the network.
ff blast --destination otlp --endpoint http://127.0.0.1:4318/v1/logs| Option | Description |
|---|---|
--destination | Sink type (required in non-interactive mode, prompted otherwise): otlp (alias: elasticsearch_otlp), elasticsearch (alias: elasticsearch_bulk), loki, arrow_ipc, udp, tcp, null |
--endpoint | Destination URL/address (required for all destinations except null) |
--workers | Worker threads (default: 2) |
--batch-lines | Lines per batch (default: 5000) |
--duration-secs | Stop automatically after N seconds (default: run until stopped) |
--auth-bearer-token | Bearer token auth header |
--auth-header | Extra header, repeatable: --auth-header 'Authorization=ApiKey xyz' |
--diagnostics-addr | Diagnostics server bind address (default: 127.0.0.1:0) |
ff devour
Section titled “ff devour”Runs a built-in receiver that accepts incoming log traffic and drops it. Use this to isolate sender performance or test upstream clients in isolation.
ff devour # defaults to OTLP mode on 127.0.0.1:4318ff devour --mode tcp --listen 127.0.0.1:15140ff devour --mode elasticsearch_bulk --listen 127.0.0.1:9200Unlike blast, devour does not require --destination — it accepts multiple built-in receiver modes.
| Option | Description |
|---|---|
--mode | Receiver type: otlp (default), http, elasticsearch_bulk, tcp, udp |
--listen | Bind address (default depends on mode: OTLP → 127.0.0.1:4318) |
--duration-secs | Stop automatically after N seconds (default: run until stopped) |
--diagnostics-addr | Diagnostics server bind address (default: 127.0.0.1:0) |
ff blackhole
Section titled “ff blackhole”A convenience alias for devour --mode otlp with no other arguments.
ff blackhole # listens on 127.0.0.1:4318ff blackhole 0.0.0.0:14318 # custom bind addressblackhole and devour both accept the same OTLP mode defaults. Use whichever reads more naturally in your workflow.
ff effective-config
Section titled “ff effective-config”Validates the config, expands environment variable placeholders, redacts secrets, and prints the final YAML. Use this to inspect how your config looks after expansion before deploying.
ff effective-config --config pipeline.yamlff init
Section titled “ff init”Creates a starter ffwd.yaml in the current directory with a basic file → stdout pipeline.
ff initThe generated config includes comments pointing to the next steps. Refuses to overwrite an existing file.
ff wizard
Section titled “ff wizard”Interactive step-by-step config builder. Choose a use-case preset or assemble your own input and output.
ff wizardwizard requires an interactive terminal (stdin and stdout must both be TTYs). It validates the generated config before writing, so bad column names or type mismatches are caught before you run.
ff completions
Section titled “ff completions”Print shell completion scripts.
ff completions bashff completions zshff completions fishff completions elvishff completions powershellff completions nushellRedirect output into the appropriate location for your shell, e.g.:
ff completions bash >> ~/.bashrcConfig file format
Section titled “Config file format”All pipeline commands (run, validate, dry-run, effective-config) accept the same YAML config format:
pipelines: default: inputs: - type: file path: ./logs.json format: json transform: | SELECT * FROM logs WHERE level = 'ERROR' outputs: - type: stdout format: console
server: diagnostics: 127.0.0.1:9090 log_level: infoSee the YAML configuration reference for all available input, transform, and output options.
Global options
Section titled “Global options”ff --version # Print version and exitff --help # Show top-level help and exitRun ff <command> --help for subcommand-specific options.