Four callsites hardcoded Path.home() / '.hermes' with no HERMES_HOME
check, breaking Docker deployments and profile isolation (hermes -p):
- plugins/hermes-achievements/dashboard/plugin_api.py:
state_path(), snapshot_path(), checkpoint_path() bare-literal paths
- scripts/profile-tui.py:
DEFAULT_STATE_DB and DEFAULT_LOG defaults ignored HERMES_HOME
- hermes_cli/slack_cli.py:
except-Exception fallback for slack-manifest.json dump
- optional-skills/migration/openclaw-migration/scripts/openclaw_to_hermes.py:
--target argparse default
Use get_hermes_home() (with an ImportError shim for the standalone
scripts) or 'os.environ.get("HERMES_HOME") or str(Path.home()/".hermes")'
where importing hermes_constants is impractical.
E2E-verified: with HERMES_HOME=/tmp/x all three achievements paths and
both profile-tui defaults route under /tmp/x.
Salvaged from #18068 (original scope was broader mechanical cleanup
claiming 23 callsites were buggy; most were already respecting
HERMES_HOME via os.environ.get(key, default) — only these 4 had no env
check at all). Credit: @web-dev0521.
|
||
|---|---|---|
| .. | ||
| dashboard | ||
| docs | ||
| tests | ||
| LICENSE | ||
| README.md | ||
Hermes Achievements
Bundled with Hermes Agent. Originally authored by @PCinkusz at https://github.com/PCinkusz/hermes-achievements — vendored into
plugins/hermes-achievements/so it ships with the dashboard out-of-the-box and stays in lockstep with Hermes feature changes. Upstream repo remains the staging ground for new badges and UI iteration.When Hermes is installed via
pip install hermes-agentor cloned from source, this plugin auto-registers as a dashboard tab on firsthermes dashboardlaunch. No separate install step. See Built-in Plugins → hermes-achievements in the main docs.
Achievement system for the Hermes Dashboard: collectible, tiered badges generated from real local Hermes session history.
The screenshots use temporary demo tier data to show the full visual range. The plugin itself reads real local Hermes session history by default.
Update notice (2026-04-29): If you installed this plugin before today, update to the latest version. The achievements scan path was refactored for much faster warm loads (snapshot cache + incremental checkpoint scan).
What it does
Hermes Achievements scans local Hermes sessions and unlocks badges based on real agent behavior:
- autonomous tool chains
- debugging and recovery patterns
- vibe-coding file edits
- Hermes-native skills, memory, cron, and plugin usage
- web research and browser automation
- model/provider workflows
- lifestyle patterns such as weekend or night sessions
Achievements have three visible states:
- Unlocked — earned at least one tier
- Discovered — known achievement, progress visible, not earned yet
- Secret — hidden until Hermes detects the first related signal
Most achievements level through:
Copper → Silver → Gold → Diamond → Olympian
Each card has a collapsible What counts section showing the exact tracked metric or requirement once the user wants details.
Version 0.2.x expands the catalog to 60+ achievements, including model/provider badges such as Five-Model Flight, Provider Polyglot, Claude Confidant, Gemini Cartographer, and Open Weights Pilgrim.
Examples
- Let Him Cook
- Toolchain Maxxer
- Red Text Connoisseur
- Port 3000 Is Taken
- This Was Supposed To Be Quick
- One More Small Change
- Skillsmith
- Memory Keeper
- Context Dragon
- Plugin Goblin
- Rabbit Hole Certified
Install
Clone into your Hermes plugins directory:
git clone https://github.com/PCinkusz/hermes-achievements ~/.hermes/plugins/hermes-achievements
For local development, keep the repo elsewhere and symlink it:
git clone https://github.com/PCinkusz/hermes-achievements ~/hermes-achievements
ln -s ~/hermes-achievements ~/.hermes/plugins/hermes-achievements
Then rescan dashboard plugins:
curl http://127.0.0.1:9119/api/dashboard/plugins/rescan
If backend API routes 404, restart hermes dashboard; plugin APIs are mounted at dashboard startup.
Updating
If you installed with git:
cd ~/.hermes/plugins/hermes-achievements
git pull --ff-only
curl http://127.0.0.1:9119/api/dashboard/plugins/rescan
If the update changes backend routes or plugin_api.py, restart hermes dashboard after pulling.
As of 2026-04-29, updating is strongly recommended because scan performance changed significantly:
- removed duplicate
/overviewscan path - added cached
/achievementssnapshot - added incremental checkpoint reuse for unchanged sessions
Achievement unlock state is stored locally in state.json and is not overwritten by git updates. New achievements are evaluated from your existing Hermes session history. Achievement IDs are stable and should not be renamed casually because they are the unlock-state keys.
Releases are tagged in git, for example:
git fetch --tags
git checkout v0.2.0
Files
dashboard/
├── manifest.json
├── plugin_api.py
└── dist/
├── index.js
└── style.css
API
Routes are mounted under:
/api/plugins/hermes-achievements/
Endpoints:
GET /achievements
GET /scan-status
GET /recent-unlocks
GET /sessions/{session_id}/badges
POST /rescan
POST /reset-state
Development
Run checks:
node --check dashboard/dist/index.js
python3 -m py_compile dashboard/plugin_api.py
python3 -m unittest tests/test_achievement_engine.py -v
License
MIT
