Skip to content

overview Command

Display a unified cost dashboard combining Pulumi state and plan data with actual costs, projected costs, drift analysis, and recommendations.

Terminal window
finfocus overview [options]

All flags are optional. When --pulumi-state and --pulumi-json are omitted, the command auto-detects your Pulumi project and stack from the current directory.

Tip: Running finfocus with no arguments inside a Pulumi project directory automatically launches the overview — no subcommand needed.

FlagDescriptionDefault
--pulumi-statePath to Pulumi state JSON (skips auto-detection)Auto-detected
--pulumi-jsonPath to Pulumi preview JSON (skips auto-detection)Auto-detected
--stackPulumi stack name for auto-detection (ignored with --pulumi-state/--pulumi-json)Current stack
--fromStart date (YYYY-MM-DD or RFC3339)1st of current month
--toEnd date (YYYY-MM-DD or RFC3339)Now
--adapterRestrict to a specific adapter pluginAll plugins
--outputOutput format: table, json, ndjsontable
--filterResource filters (repeatable)-
--plainForce non-interactive plain text outputfalse
--yes, -ySkip confirmation promptsfalse
--cache-ttlCache TTL in seconds; 0 disables caching0 (disabled)
--no-paginationDisable pagination (plain mode only)false
--exit-on-thresholdExit non-zero when budget threshold exceededfalse
--exit-codeExit code for threshold breach (0-255)1
--state-onlySkip pulumi preview (faster, no pending change detection)false
--budget-scopeFilter budget scopes: global, provider, tag, typeAll

When no --pulumi-state or --pulumi-json flags are provided, finfocus overview locates your Pulumi project automatically:

  1. Walks up from the current directory to find Pulumi.yaml.
  2. Runs pulumi stack export to fetch the current state JSON.
  3. Runs pulumi preview --json to fetch the pending-change plan.
  4. Uses --stack to select a non-default stack (e.g., --stack production).

Use --pulumi-state / --pulumi-json to skip these Pulumi CLI calls and provide pre-exported files directly — useful in CI/CD when you manage the export step yourself.

Section titled “Auto-detect from current directory (recommended)”
Terminal window
finfocus overview

Walks up from the current directory to find Pulumi.yaml, exports the current stack state, and runs pulumi preview automatically. Opens an interactive TUI with progressive data loading.

Terminal window
finfocus overview --state-only

Skips pulumi preview entirely, reducing overview time from ~18s to ~3s. Shows cost data from the current stack state without detecting pending infrastructure changes. In the TUI, the p key is still available to run preview on demand.

Terminal window
finfocus overview --stack production

Same as above but selects the production stack instead of the current default.

Terminal window
finfocus overview --pulumi-state state.json --pulumi-json plan.json

Opens an interactive TUI with progressive data loading. Resources appear as they are enriched with cost data. Use this when you manage the pulumi stack export and pulumi preview --json steps yourself.

Terminal window
finfocus overview --pulumi-state state.json --pulumi-json plan.json

Shows resources with pending changes and their cost impact.

Terminal window
finfocus overview --pulumi-state state.json --plain --yes

Renders an ASCII table suitable for piping or CI/CD environments.

Terminal window
finfocus overview --pulumi-state state.json --output json --yes

Produces structured JSON with metadata, resources, summary, and errors.

Terminal window
finfocus overview --pulumi-state state.json --output ndjson --yes

One JSON object per line, suitable for streaming processors.

Terminal window
finfocus overview --pulumi-state state.json --from 2025-01-01 --to 2025-01-31
Terminal window
finfocus overview --cache-ttl 300 --pulumi-state state.json

Enables a 5-minute cache. The first run enriches all resources via plugin calls and stores results locally. Subsequent runs within the TTL window show (cached) in the adapter field and complete faster.

Terminal window
finfocus overview --pulumi-state state.json --filter provider=aws --yes
Terminal window
finfocus overview --pulumi-state state.json --filter type=aws:ec2/instance:Instance --yes

When running in a terminal (TTY) without --plain, the overview launches an interactive dashboard built with Bubble Tea.

KeyAction
Up / kMove cursor up
Down / jMove cursor down
EnterOpen resource detail view
EscapeReturn to list / clear filter
sCycle sort field (Cost, Name, Type, Delta)
/Enter filter mode
PgUp / PgDnNavigate pages (when >250 resources)
q / Ctrl+CQuit

The dashboard opens immediately and shows a progress banner while fetching cost data from plugins. Resources update in-place as data arrives.

Press Enter on a resource to see a detailed breakdown including:

  • Actual cost (MTD) with breakdown by category
  • Projected cost (monthly) with breakdown
  • Cost drift analysis with extrapolation
  • Optimization recommendations with estimated savings

The overview command displays budget health information differently depending on the output mode.

ModeBudget ShownDetails
Interactive TUIFooter bar + detail viewColor-coded health badge, spend/limit, utilization %. Press Enter for per-budget breakdown with forecasts and triggered alerts
Plain (--plain)Not renderedBudget enforcement available via --exit-on-threshold
JSON (--output json)budgets array in outputFull budget health objects with utilization, forecasted spend, triggered thresholds
NDJSON (--output ndjson)Not includedNDJSON is resource-scoped; budgets are stack-scoped
FlagDescriptionApplies To
--exit-on-thresholdExit non-zero when budget threshold exceededPlain, JSON
--exit-codeExit code when threshold exceeded (0-255)Plain, JSON
--budget-scopeFilter budget scopes (global, provider, tag, type)All modes

Why is budget status missing in plain or NDJSON mode?

Section titled “Why is budget status missing in plain or NDJSON mode?”

Plain mode focuses on the resource table for piping and CI/CD use. Use --exit-on-threshold for budget enforcement in non-interactive environments. NDJSON emits one object per resource and budgets are stack-scoped, so they do not fit the per-line streaming model. Use --output json or the interactive TUI to see full budget details.

ASCII table with the following columns:

ColumnDescription
ResourceResource name truncated to 40 characters; full URN shown in detail view
TypePulumi resource type (e.g., aws:ec2/instance:Instance)
StatusLifecycle state with an icon prefix (see below)
Actual(MTD)Month-to-date actual spend fetched from your cost adapter plugin
ProjectedEstimated monthly cost from your pricing plugin
DeltaProjected minus Actual(MTD) — positive means projected exceeds actual
Drift%Annualized deviation: how much the extrapolated monthly spend differs from projected
RecsNumber of open optimization recommendations (N(-M) format where M = dismissed)

Status icons:

IconStatusMeaning
activeResource exists and is running
+creatingResource will be created by the pending plan
~updatingResource will be updated by the pending plan
-deletingResource will be deleted by the pending plan
replacingResource will be deleted and re-created

Structured JSON object:

{
"metadata": {
"stackName": "prod",
"region": "us-east-1",
"timeWindow": { "start": "...", "end": "..." },
"hasChanges": true,
"totalResources": 50,
"pendingChanges": 10,
"generatedAt": "..."
},
"resources": [ ... ],
"summary": {
"totalActualMTD": 1234.56,
"projectedMonthly": 5678.90,
"projectedDelta": 4444.34,
"potentialSavings": 500.00,
"currency": "USD"
},
"budgets": [
{
"budgetID": "global",
"health": "WARNING",
"utilization": 85.2,
"limit": 5000.00,
"currentSpend": 4260.00,
"forecastedSpend": 5800.00
}
],
"errors": [ ... ]
}

One JSON object per line, no metadata wrapper:

{"urn":"urn:pulumi:...","type":"aws:ec2:Instance","status":"active",...}
{"urn":"urn:pulumi:...","type":"aws:s3:Bucket","status":"creating",...}
CodeMeaning
0Success
1Error (invalid input, plugin failure)
2User cancelled pre-flight prompt
130Interrupted (Ctrl+C)

Filters use key=value format and support:

  • provider=aws - Filter by cloud provider
  • type=aws:ec2/instance:Instance - Filter by resource type
  • status=active - Filter by resource status

Multiple filters are ANDed together.

Ensure plugins are installed and accessible. Run finfocus plugin list to verify. The overview enrichment requires at least one plugin to fetch cost data.

The overview fetches cost data concurrently (up to 10 resources at a time). Large stacks with many resources may take longer. Use --filter to narrow scope.

A warning icon appears when the extrapolated monthly spend differs from projected cost by more than 10%. This helps identify resources with unexpected cost changes.