coderot

Configuration

Most repos need none. The workflow on Get started works as it is, and the defaults below leave out vendored and generated code by themselves.

PR titles

The dashboard names each PR by its number, linked to GitHub. To show its title instead, add one line to the Action:

      - uses: coderot-ai/action@v1
        with:
          titles: true

The run then sends each PR’s title, or the subject line of a commit pushed without a PR. Never the rest of a commit message. Remove the line and the titles are gone from the dashboard after the next push.

Turned on later, titles arrive for the last 90 days and everything after; older PRs keep their number.

.coderot.yml

An optional file at the repo’s root. Every key is optional:

# only these files are measured; without it, every file is
include:
  - 'src/**'
# never measured, on top of the defaults below
exclude:
  - 'src/legacy/**'
  - '**/*.stories.tsx'
# test files the defaults miss, reported apart from code
tests:
  - 'integration/**'
# your own AI agents and bots
ai:
  release-bot:
    emails: ['[email protected]']
    branches: ['release-bot/']
# how far back the first run measures, and how far apart its snapshots are
since: 12m
interval: 1w

Globs match paths from the repo’s root, with / between folders: * within a folder, ** across folders.

A mistake in the file stops the run with a message saying what’s wrong, rather than measuring the wrong files.

When changes apply

Each push measures the latest commit with the file as it is then. Earlier snapshots keep the rules they were measured with, so excluding a big folder shows as a drop on that day. To measure the whole history again with the new rules, remove the repo in Settings, add it again and push: the next run starts over. The same goes for since and interval, which only the first run uses.

Your own AI agents

coderot already knows the common agents’ signals: the co-author trailers, bot accounts and branch prefixes that Claude Code, Copilot, Cursor, Codex, Devin and others leave (how AI signals work). Under ai, add agents of your own, each with the emails it commits or co-authors with and the branch prefixes its PRs come from. Its commits then count as AI under that name.

Durations

since and interval take a number and a unit: 90d, 1w, 12m, 1y. The defaults are 12m and 1w: 52 weekly snapshots.

Left out by default

These are never measured, without any configuration:

EF Core migrations stay measured: they’re meant to be edited, unlike their .Designer.cs files.

Config, styles, markup and code inside markup aren’t measured: Languages has the details.

Tests

Test files are measured and shown apart from code, so tests don’t count toward code’s complexity or duplication. A file is a test when its path has a test/, tests/, __tests__/ or e2e/ folder (also joined with one word, as in runtime-tests/), or it’s named *.test.* or *.spec.*, or it’s in a folder whose name ends in Test or Tests with a capital T, in any language (Basket.UnitTests/, but also ABTest/). C# files named *Test.cs or *Tests.cs are tests too, and so are Python’s test_*.py, *_test.py, conftest.py and tests.py, Go’s *_test.go, and Rust’s tests.rs and *_tests.rs beside their module, benches/ and cargo-fuzz’s fuzz/fuzz_targets/. Rust’s unit tests inside a code file, an item under #[cfg(test)] or a #[test] function, are left out of the file’s numbers. Add the ones these rules miss under tests.

Line-level AI attribution

Commit signals say an agent helped with a commit, not which lines it wrote, so they count the whole commit as AI. For line-level numbers, install Git AI on your team’s machines. It records the lines each agent wrote in git notes (refs/notes/ai), and the workflow reads them with no change. GitHub’s squash merges drop those notes unless Git AI’s CI integration is installed too.

Running it yourself

The Action runs the coderot CLI. Run it in any full clone, with Node.js 24, to see what a run would find and send:

npx @coderot-ai/cli analyze --out report

It writes the report to report/ and sends nothing. It leaves out the review counts, which need GitHub’s API, unless GITHUB_TOKEN and GITHUB_REPOSITORY are set (how). Add --titles to see it as a workflow with titles: true would send it. --since and --interval take the durations above.