A standalone Hermes Web Dashboard plugin that adds a Calendar page for browsing daily session and cron activity, generating manual per-session summaries, and optionally creating a daily roll-up from saved summaries.
Summarization Calendar does not patch Hermes core. It inventories Hermes session and cron stores read-only and writes its own versioned artifacts under the active HERMES_HOME.
- Calendar month navigation with activity counts.
- Daily session inventory across the default Hermes profile and named profiles.
- Session title with sanitized anchor that navigates to
/chat?resume=<session_id>&profile=<profile>. - Profile-scoped session links, restored model metadata, and browser-local auto-titled session visibility filter.
- Read-only cron execution inventory.
- Manual per-session summaries; nothing runs automatically.
- Lossless transcript chunking for larger sessions.
- Optional daily roll-ups built from current saved session summaries, not raw transcripts.
- Immutable JSON and Markdown versions with fingerprints, staleness detection, durable job state, and explicit regeneration.
- Summary routing through Hermes' configured
auxiliary.compressiontask. The plugin contains no private provider or model fallback. - Fixed
America/Chicagoday boundaries.
- Hermes Agent with the native Web Dashboard plugin SDK and backend plugin API loader.
- A Hermes build that provides
agent.auxiliary_client.call_llmand a workingauxiliary.compressionroute. - Python 3.11 or newer in the Dashboard runtime.
- Linux for the
1.2.xrelease line. Artifact locking uses POSIXfcntl; the supplied lifecycle scripts also use Bash and GNU coreutils. - Node.js 20 or newer only for development tests; users install the prebuilt frontend bundle.
The v1.2.3 release was validated on Hermes Agent v0.20.1 (2026.8.13), Python 3.11, and Node.js 23. Newer Hermes releases may change plugin contracts; see the compatibility notes in SECURITY.md and run the included validation before publishing or deploying an update.
Hermes discovers dashboard plugins at:
$HERMES_HOME/plugins/summarization-calendar/dashboard/manifest.json
For this standalone Dashboard extension, dashboard/manifest.json is the canonical package manifest. A root plugin.yaml or plugin.json is not required by the Dashboard plugin contract.
HERMES_HOME defaults to ~/.hermes.
The Dashboard loader enables a user-installed standalone extension by the
exact manifest name. Ensure the active Hermes config contains a YAML list entry
for summarization-calendar under plugins.enabled; the directory name may be
different. This is separate from the native hermes plugins enable command,
which does not manage Dashboard-only packages that have no root
plugin.yaml/plugin.json.
Set the release version, download the archive and checksum manifest from the GitHub release, and verify the exact archive before extracting it:
VERSION=1.2.3
ARCHIVE="hermes-summarization-calendar-v${VERSION}.tar.gz"
RELEASE_URL="https://github.com/Ithrial/Hermes-Summarization-Calendar/releases/download/v${VERSION}"
curl -fsSLO "${RELEASE_URL}/${ARCHIVE}"
curl -fsSLO "${RELEASE_URL}/SHA256SUMS"
grep "${ARCHIVE}$" SHA256SUMS | sha256sum -c -Extract it anywhere, then install a production copy:
tar -xzf "${ARCHIVE}"
cd "hermes-summarization-calendar-v${VERSION}"
HERMES_HOME="${HERMES_HOME:-$HOME/.hermes}" ./scripts/install-local.sh --copyUse --copy for a normal release installation. The installer stages the
replacement, snapshots any existing plugin, and atomically swaps the staged
copy into place. If the swap fails, it attempts to restore the previous plugin.
It never removes generated summaries or other data under HERMES_HOME.
--symlink is available for development installations, but is not the normal
release-update mode.
Either clone directly into the Hermes plugin path:
mkdir -p "${HERMES_HOME:-$HOME/.hermes}/plugins"
git clone https://github.com/Ithrial/Hermes-Summarization-Calendar.git "${HERMES_HOME:-$HOME/.hermes}/plugins/summarization-calendar"Or clone elsewhere and run:
./scripts/install-local.sh --copyThe Git method is useful for development or a first install. For a release
update, use the checksum-verified release archive and --copy; do not run
git pull inside an installed release copy because that bypasses the install
backup and atomic-swap workflow.
The frontend can be rediscovered by the Dashboard, but Python API routes are mounted only when the Dashboard process starts. Stop and relaunch hermes dashboard after installation or upgrade. If you manage the Dashboard with systemd, Docker, or another supervisor, restart the Dashboard process through that supervisor using its actual configured unit or service name.
Do not restart the Hermes messaging gateway for a Dashboard-only plugin change.
Then open the Dashboard and select Calendar. The plugin health route is:
GET /api/plugins/summarization-calendar/health
Daily inventory works without generating summaries. Manual summary and roll-up jobs use the active Hermes profile's standard compression-task configuration:
auxiliary.compression.provider
auxiliary.compression.model
auxiliary.compression.base_url
auxiliary.compression.timeout
auxiliary.compression.reasoning_effort
Configure that route with Hermes itself. Summarization Calendar never writes global model configuration and does not silently substitute a plugin-owned backend.
When a summary is requested, the selected day's transcript slice is sent to the configured compression model. Review SECURITY.md before using a remote provider.
Runtime code:
$HERMES_HOME/plugins/summarization-calendar/
Generated data follows the active HERMES_HOME at runtime (or the explicit
LEDGER_ROOT override used by tests and controlled deployments):
$HERMES_HOME/summarization-calendar/
session-versions/
rollup-versions/
running/
.locks/
Source stores are opened read-only. Generated summaries are separate from plugin code and are preserved by default across install, upgrade, rollback, and uninstall.
Upgrading from v1.1.0 and earlier? Existing generated data under
$HERMES_HOME/daily-ledger/is followed in place — nothing is copied or moved, and recaps remain readable. A pre-renameplugins/daily-ledgerinstall is automatically backed up and removed byinstall-local.sh(restore it withrollback-local.sh). Run./scripts/status-local.shto see which store the plugin is currently using.
The release archive never contains your Hermes configuration, credentials, sessions, cron database, logs, or generated Summarization Calendar artifacts.
Show installation and artifact counts:
./scripts/status-local.shUpgrade from a new checkout or extracted release:
./scripts/install-local.sh --copyA pre-existing installation is snapshotted under:
$HERMES_HOME/backups/summarization-calendar-install/
Each snapshot has a generated backup ID and contains the previous plugin plus a
manifest. The snapshot is created before the replacement is swapped into place,
so it is the rollback handle for that update. Generated summaries remain under
$HERMES_HOME/summarization-calendar and are not part of the plugin swap.
List rollback IDs:
./scripts/rollback-local.shRestore one:
./scripts/rollback-local.sh <backup-id>Uninstall code while preserving summaries:
./scripts/uninstall-local.shRemoving generated data is intentionally separate and destructive:
./scripts/uninstall-local.sh --remove-dataRestart the Dashboard after upgrade, rollback, or uninstall so its Python router set matches the installed code.
The frontend is a prebuilt plain-JavaScript IIFE at dashboard/dist/index.js. It uses React and components supplied by window.__HERMES_PLUGIN_SDK__; React is not bundled.
Install development dependencies in a Python 3.11 environment:
python -m pip install -r requirements-dev.txt
./scripts/run-tests.shThe test runner executes backend tests with outbound non-loopback sockets blocked, frontend Node tests, Python compilation, JavaScript syntax validation, Bash syntax validation, release validation, and diff checks.
Build release archives from a clean committed tree:
./scripts/build-release.sh --ref v1.2.3See CONTRIBUTING.md and docs/RELEASE.md.
- Day boundaries are fixed to
America/Chicago. - Daily roll-ups summarize saved session summaries rather than re-ingesting all raw transcripts.
- The runtime and lifecycle scripts are POSIX/Linux-oriented.
- Summary quality and runtime depend on the user's configured compression model.
- Dashboard backend plugin routes inherit Hermes' local-dashboard trust model; do not expose an untrusted Dashboard publicly.
MIT. See LICENSE.
