outdatty

outdatty

Catch outdated artifacts before they ship.

Declare a dependency graph between arbitrary files.
CI fails when a source changes but its dependents were not re-confirmed.
out of date → exit 1, in sync → exit 0.

crates.io CI MIT
outdatty check
$ outdatty check
[ stale ]  feature
    source changed:    src/feature.rs 
    confirm with:      outdatty update --group feature
[ drift ]  guide
[  ok   ]  api
[  ok   ]  schema

1 of 4 group(s) out of date; review and run `outdatty update`  (exit 1)

$ outdatty update --group feature
updated  feature

$ outdatty check
[  ok   ]  feature
[ drift ]  guide
[  ok   ]  api
[  ok   ]  schema

4 group(s) checked, none out of date  (exit 0)

# How it works

No commands run, no build graph.
One question: did a source change without its dependents being confirmed?

01

Declare

A YAML manifest groups source files with the dependents that must stay in sync with them.

02

Confirm

outdatty update records a blake3 hash of every file into a committed outdatty.lock.

03

Check

outdatty check recomputes hashes in CI. A changed source with stale dependents fails with exit 1.

04

Re-confirm

Update the dependents, run outdatty update to re-lock, and the group is green again.

# The manifest

Language- and format-agnostic: code, docs, .docx, configs — anything with bytes.
Globs are gitignore-aware by default.

# yaml-language-server: $schema=https://raw.githubusercontent.com/mlavrinenko/outdatty/main/schema/outdatty.schema.json
groups:
  - name: feature
    source: [src/feature.rs]          # literal paths or globs like src/**/*.rs
    dependents: [docs/feature.mdx, tests/feature.rs]
    # bidirectional: true             # also flag when a dependent changes

# Why not…

outdatty sits between two categories and does neither's job.

Build systems

Task, Bazel, Buck2 run commands to produce output. outdatty runs nothing — it only flags drift.

Integrity monitors

AIDE hashes files in isolation. outdatty models dependencies between files.

Doc linters

Tied to one language or format. outdatty couples any bytes to any other bytes.

# Install

# run without installing
$ nix run github:mlavrinenko/outdatty -- check

# or add it to your flake inputs
inputs.outdatty.url = "github:mlavrinenko/outdatty";

Gate CI

# .github/workflows/outdatty.yml
- run: outdatty check --format quiet