Skip to content

scrutin

A Unified Dashboard and Orchestrator for Quality Checks

Unit tests · Data validation · Linting · Spelling

Run every quality check on your project using a single command: unit tests, data validation, linters, spell checkers. Scrutin watches for edits, figures out which checks are affected, and re-runs them in parallel. Drill into a failure to see the expected and actual values, as well as the relevant source code. Use quick keystrokes to fix linting and spelling issues, or to open files in your editor of choice. Hand any failure off to an AI coding agent with a single keystroke: Scrutin ships its own Agent Skill and is built for non-interactive use by agents too.

Documentation


See everything in one place

Pick where to see your results: a live terminal UI, a browser dashboard, or embedded inside your editor (VS Code, Positron, or RStudio). Scrutin can also emit JUnit XML for CI platforms, GitHub Actions annotations for pull-request comments, or plain text for shell pipelines.


Tools

  • Unit tests


    Run your test suites in isolated workers with live result streaming. Supports pytest, testthat, and tinytest.

  • Data validation


    Data quality checks run alongside code quality checks with the same outcome taxonomy (pass/fail/warn/skip/error) and rerun logic. Supports pointblank (R), validate (R), and Great Expectations (Python).

  • Linters


    Lint diagnostics map to warnings in the same dashboard; fix actions appear as numbered chips in the Detail view so 1, 2, 3 invokes them directly. Supports jarl (R) and ruff (Python).

  • Spell checks


    Prose, docs, and comments go through the same engine. Misspellings render with ranked suggestions as chips: press 1-9 to replace or 0 to add the word to a committable project dictionary. Supports skyspell and typos.


Fast, focused, and flexible

Re-run only what changed. Scrutin watches your project for file changes and uses dependency mapping to figure out which checks are affected. Edit a source file, and only the tests that depend on it re-run.

Parallel execution. Within each tool, files run concurrently across isolated workers; one crash never takes down the rest. Opt in to automatic retries (run.reruns) and failing-but-passes-on-retry files get flagged as flaky.

Any mix of tools, side by side. Test and data-validation tools auto-detect from marker files (DESCRIPTION, pyproject.toml, ...) the moment you run Scrutin. Linters and spell checkers opt in through a one-line [[suite]] entry. Every active tool streams into the same dashboard.


In the terminal or in your favorite editor


Ship it!

  • Easy to install


    Install a single binary. Works on macOS, Linux, and Windows. The tools Scrutin orchestrates are installed separately, through whatever package manager they normally ship with.

  • Continuous integration


    JUnit XML output for CI platforms. Exit code 0 or 1 for scripts. GitHub Actions annotations for inline comments on pull requests.

  • Run history


    Every run is saved to a local SQLite database. Track flaky tests, spot regressions, and compare run times across commits.

Etymology

Scrutin is French for a ballot or vote: polling individual verdicts into a collective result, much like this tool polls tests, expectations, linters, and validators. It comes from the Latin scrutinium (a careful examination), from scrutari, "to sift through the rubbish pile".