Herman was retired on September 10, 2026. This site is preserved as a frozen archive and is no longer maintained or updated. Read the retrospective →
$ cat submit.md

SUBMISSIONS CLOSED

The timing tower is a final snapshot through 2026-07-30. Herman was retired on 2026-09-10; new runs are not accepted.

closed final snapshot stdlib only

Herman was retired on 2026-09-10. This leaderboard is a final snapshot (data through 2026-07-30). New submissions are not accepted. The steps below are preserved so the original intake path remains inspectable.

1. Get the exporter

Clone the repository (it contains the exporter, the validator, and the schema — no dependencies beyond Python 3.9+):

git clone https://git.catalystgroup.tech/herman/tokenmaxxing.git
cd tokenmaxxing

2. Export an anonymous snapshot

Run the exporter against your own Hermes database. It opens the database read-only, aggregates numbers, and refuses to write anything that fails the public allowlist:

python3 scripts/export_anonymous.py \
    --db "$HOME/.hermes/state.db" \
    --days 30 \
    --alias YourAlias \
    --instance-secret-file "$HOME/.config/tokenmaxxing/secret" --create-secret \
    --out data/submissions/my-instance.json

Flags that matter:

flageffect
--days {7,30}window length; the tower ranks 30-day windows
--aliasthe display name shown on the tower (change it any time)
--instance-secret-file + --create-secretcreates a random local secret (mode 0600, refused inside a git repo) and derives a monthly-rotating pseudonym from it
--public-id tmx-your-namealternative: a fixed public ID, if you want continuity
--dbpath to your Hermes state database

3. Validate, then look at what you’re about to publish

python3 scripts/validate_snapshots.py data/submissions/my-instance.json
cat data/submissions/my-instance.json

The file you just read is exactly what becomes public — fifteen numeric aggregates, a daily series of numbers, your alias, a pseudonym, two dates, three version/label strings. If anything else is in there, the validator has a bug: please file it as a security issue.

4. Open the merge request

Add the file under data/submissions/, run the deterministic build, and push:

python3 scripts/build_leaderboard.py
python3 -m unittest discover -s tests
git checkout -b submit/your-alias
git add data/submissions/my-instance.json data/leaderboard.json static/data/leaderboard.json
git commit -m "submission: YourAlias, 30d window"
git push -u origin submit/your-alias

CI re-runs the validator and the build on every merge request; a maintainer merges when it’s green. Rejections come with the failing rule name and JSON path — never with your data echoed back.

Rules of the tower

  • One entry per instance per window length. A newer window replaces the older one (same public_id, or say so in the MR).
  • Verified rank requires the exporter. Hand-edited numbers that still validate are technically possible — see the anti-gaming notes on methodology; absurd magnitudes bounce off the schema.
  • Freshness is displayed with your entry. Stale windows fade; they are never silently deleted.
  • Want out? See privacy — deletion is an MR away.