Skip to content

churn

spanical churn is the volume view: how many lines moved and how many commits landed, per period across the window. With --by dev the rows become per developer per period, keeping the commits and added/deleted/net columns and gaining throughput churn, rework lines, files touched, average commit size, and active days.

bash
spanical churn [flags]

Options

OptionValuesNotes
All global flagsSee global flags
--by devSwitches to per-dev rows; any other --by value falls back to the per-period table

Behavior

Default rows are periods. Columns: Period, Commits, Added, Deleted, Net, Throughput (added + deleted), Migrations (lines on migration paths only, excluded from the other columns' churn story).

--by dev rewrites the table to per-dev-per-period rows ordered by period then throughput: Commits, Lines added/deleted/net (all marked (volume)), Throughput churn and Rework lines ((context)), Files touched ((context)), Avg commit size and Active days ((signal)). The metric legend prints under the table because these columns mean different things: a high volume number is not a ranking.

Only dev changes anything here. --by file, --by dir, and --by language are accepted everywhere in spanical but consumed nowhere; they silently produce the default per-period table.

Examples

Per-period table:

shell
$ spanical churn --last 30d
┌──────────┬─────────┬───────┬─────────┬─────┬────────────┬────────────┐
│ Period   │ Commits │ Added │ Deleted │ Net │ Throughput │ Migrations │
├──────────┼─────────┼───────┼─────────┼─────┼────────────┼────────────┤
│ 2026-W30 │       0 │     0 │       0 │   0 │          0 │          0 │
├──────────┼─────────┼───────┼─────────┼─────┼────────────┼────────────┤
│ 2026-W31 │       1 │     2 │       3 │  -1 │          5 │          0 │
├──────────┼─────────┼───────┼─────────┼─────┼────────────┼────────────┤
│ 2026-W32 │       1 │     3 │       0 │   3 │          3 │          0 │
...
└──────────┴─────────┴───────┴─────────┴─────┴────────────┴────────────┘

JSON output:

shell
$ spanical churn --last 3m --format json
[
    {
        "period": "2026-05",
        "commits": 7,
        "added": 23,
        "deleted": 23,
        "net": 0,
        "throughput": 46,
        "migrationsAdded": 0,
        "migrationsDeleted": 0
    },
    ... truncated
]

Merge commits never count: totals are over no-merge commits. When several developers co-author one commit, credit splits fractionally between them instead of duplicating lines.