Ga naar inhoud

Exporters

Wanderer's findings, scans, and assessments are valuable outside the binary: analysts want them in Excel, operators want them in Grafana, governance tooling wants them in JSONL. The wanderer export subcommand reads from the local SQLite store and writes to stdout or a file.

Synopsis

wanderer export <resource> [flags]

  <resource>    findings | scans | assessments
  --format      csv (default) | jsonl
  -o <path>     write to file (default stdout)
  --db <path>   SQLite DSN (default ./wanderer.db)
  --scan <id>   limit to one scan
  --probe <p>   limit findings to probe_id starting with <p> (e.g. tls)
  --dimension   limit findings/assessment rows to one DICTU dimension
  --since <ts>  RFC 3339 lower bound on created_at
  --until <ts>  RFC 3339 upper bound on created_at
  --include-evidence=false
                drop the evidence field from JSONL output

Selectors are AND-combined and pushed down to the SQL query — Wanderer never reads more rows than the filters select.

CSV column schemas

All timestamps are RFC 3339 UTC. Column order is fixed; two runs over the same data produce byte-identical output.

Findings

id,scan_id,probe_id,dimension_hint,criterium_hint,subject,severity,created_at,attributes_json

attributes_json is the probe-specific Attributes map serialised as a single JSON string. Flattening keys into columns would break each time a probe added a new attribute; a single JSON column is the boring choice that keeps the column set stable.

evidence is deliberately not in CSV — it is often binary or large. Use JSONL (or query the API/DB directly) when you need it.

Scans

id,target_id,domain,started_at,ended_at,status,error,finding_count

finding_count is computed in the query; one row per scan.

Assessments

id,scan_id,framework,created_at,dimension,score,completeness

One row per (assessment × dimension). The detailed rationale list is not flattened — use JSONL when the rationale matters.

JSONL

One JSON object per line, no wrapping array, no trailing comma. The findings line shape:

{"id":"f_abc","scan_id":"s_abc","probe_id":"tls.issuer","dimension_hint":"juridisch","subject":"example.nl","severity":"finding","attributes":{"issuer_country":["US"]},"evidence":"<base64>","created_at":"2026-04-24T19:50:11Z"}

evidence is base64-encoded by default. Pass --include-evidence=false to drop the field entirely.

Assessments JSONL emits a full Assessment per line, including the markdown report under report if it was persisted.

Recipes

Open in Excel

wanderer export findings --scan s_abc -o findings.csv
open findings.csv

Pipe to jq

wanderer export findings --probe tls --format jsonl |
  jq 'select(.dimension_hint == "juridisch")'

Grafana CSV datasource

Point a CSV datasource at a path served by wanderer export scans -o scans.csv rendered on a cron. The fixed column order keeps the panel definitions stable.

Diff two exports

wanderer export findings --scan s_old -o /tmp/old.csv
wanderer export findings --scan s_new -o /tmp/new.csv
diff /tmp/old.csv /tmp/new.csv

The CSV is byte-stable for stable input, so diff is meaningful without sorting first.