See what each Hermes cron job actually costs
Hermes Cron Cost reads the records your Hermes Agent already keeps and prints, for every cron job: how many times it ran, how many runs failed, input and output tokens, average tokens and cost per run, and total cost. Hermes's own /usage and /insights report per session and overall; neither breaks spend down by scheduled job.
$npx @hermesagentai/cron-cost
- Cost and tokens per cron job, not per session
- One local command, no install step with
npx - Read-only: never writes Hermes files or runs jobs
- No account, no network calls, no telemetry
- Never reads prompts, responses, or memory
- Honest coverage: says which runs it could not analyze
Checked against official Nous Research sources on September 26, 2026 (Hermes Agent v0.21.5).
What the report looks like
Hermes Cron CostProfile default · ~/.hermesLast 30 days (Aug 27, 2026 – Sep 26, 2026)Analyzed 117 / 119 observed cron runs (98.3% had attributable usage data)JOB RUNS OK FAIL INPUT OUTPUT AVG TOKENS AVG COST TOTAL COSTMorning AI Brief 29 28 1 870k 61k 42,110 ~$0.19 ~$5.51GitHub Monitor 89 85 4 679k 44k 8,304 ~$0.04 ~$3.36*Weekly Research 1 1 0 100k 11k 111,402 included includedRUNS = finished executions or surviving sessions, whichever is larger (they are not paired per run).AVG columns use only runs with usage (tokens) or fully known cost (cost).Measured cost: ~$8.87* (~ = Hermes estimate from its pricing data)1 run used subscription-included routes (no per-call invoice; those calls count as $0).2 runs could not be analyzed:- 2 had an execution record but no surviving Hermes session* 3 analyzed runs had tokens Hermes could not price; their tokens are counted, their cost is not.
The numbers above are sample data. Your report reads only your own Hermes records. In this sample, GitHub Monitor has 89 finished executions but only 87 surviving sessions, so its token and cost averages come from those 87 runs, and the 2 runs without a session are listed under “could not be analyzed” instead of being filled in with guesses.
Reading the report
| Column | Meaning |
|---|---|
| RUNS | Observed finished cron runs in the window (see below). |
| OK / FAIL | Completed and failed executions from Hermes's execution log (cron/executions.db). |
| INPUT / OUTPUT | Input and output tokens, from runs that have usage accounting. |
| AVG TOKENS | Average total tokens (input + output + cache read + cache write) per run with usage data. |
| AVG COST | Average cost per run whose cost is fully known. |
| TOTAL COST | Sum of known costs, marked with its cost type. A trailing * means some runs had tokens Hermes could not price, so the total is a floor. |
What RUNS means
Hermes writes two separate records for a cron run: an execution entry (job ID, status, time) and an agent session with the token and cost accounting. It does not store a link between the two, so Hermes Cron Cost does not pretend to pair them. RUNS is the larger of the job's finished executions and its surviving attributed sessions in the window. Sessions are matched to jobs only through the cron_<job_id>_<timestamp> session ID that Hermes's scheduler assigns. Compression continuations and delegated subagents are counted as part of the same run through Hermes's own parent-session links. Sessions it cannot map are counted as unattributed, not guessed.
What coverage means
Coverage = runs with usage accounting ÷ observed runs. It tells you how much of the run population the token and cost figures actually describe. The report names each gap:
- No surviving Hermes session: the execution is recorded but its session is gone or never existed (script-only or blocked runs, pruned sessions, runs that started just outside the window).
- Session but no usage accounting: the run left a session, but Hermes recorded no token usage for it.
- Unrecognized session ID: a cron session whose ID does not match the scheduler's pattern.
Missing runs are never extrapolated. At 50% coverage, the totals describe half the runs. Do not read them as a projection for the rest.
Actual, estimated, included, and unknown cost
Hermes Cron Cost has no pricing engine of its own. It reports the cost Hermes already stored and keeps each kind distinct:
| Type | Shown as | What it means |
|---|---|---|
| Actual | $0.42 | A real billed cost reported for the call. |
| Estimated | ~$0.42 | Hermes calculated the cost from its own pricing data. The ~ is the same marker Hermes uses. |
| Included | included | A subscription-included route with no per-call invoice. It counts as $0 in totals and is labeled so it is not mistaken for free API usage. |
| Unknown | unknown | Hermes has no usable pricing for the call. Tokens are counted, cost is not, and it is never shown as $0. |
A job whose runs mix billed and estimated costs shows its total with ~. A run counts toward AVG COST only if every call in it has a known cost.
What it reads, and what it never touches
| Hermes file | Used for |
|---|---|
state.db | Cron sessions, their parent-session links, and token and cost columns |
cron/executions.db | Job ID, status, and time of each execution: run, success, and failure counts |
cron/jobs.json | Job ID and name only |
- Never reads message text, prompts, system prompts, responses, error text, session titles, or memory. It does not read API keys or environment-variable values.
- Read-only: SQLite files are opened read-only with
PRAGMA query_only. It never writes Hermes files and never runs Hermes, a cron job, or a model. - Nothing leaves the machine: no network calls, no telemetry, no account.
It analyzes ~/.hermes for the default profile and ~/.hermes/profiles/<name> for a named one. It honors HERMES_HOME and picks the active profile the same way Hermes does.
Options
$npx @hermesagentai/cron-cost # last 30 days, active profile$npx @hermesagentai/cron-cost --days 7 # different analysis window$npx @hermesagentai/cron-cost --profile work # a named Hermes profile$npx @hermesagentai/cron-cost --json # full report as JSON
--json prints the same report with every population count (observedRuns, sessionRuns, runsWithUsage, runsWithCompleteCost), the coverage gaps, the cost basis, and the status of each data source. Unknown cost is null, never 0. A run belongs to the window if its session started inside it.
Validated against real Hermes cron history
The acceptance test ran a small canary cron job on Hermes v0.21.5 (build v0.21.5+2961.g436b904) and compared every reported number with Hermes's persisted records. They all matched:
| Measure | Result |
|---|---|
| Observed runs | 4 (2 completed, 2 failed) |
| Surviving cron sessions | 3 |
| Runs with usage accounting | 2 (50% coverage) |
| Measured tokens (2 successful runs) | 36,875 |
| Cost type | Included (subscription route) |
| Not analyzed | 1 failed execution with no surviving session; 1 failed run with a session but no usage accounting |
SHA-256 hashes of the relevant Hermes files were identical before and after the analysis. The only exception was SQLite's shared-memory file, which any read-only reader touches while Hermes has a live write-ahead log.
Compatibility and limitations
- Node.js 22.18 or newer is required. The CLI uses the built-in
node:sqliteand has no runtime dependencies. - Tested schema: Hermes v0.21.5. On older schemas without the usage or cost tables, the report degrades and prints a warning instead of failing.
- Run it where the Hermes data lives. On a VPS, run it there. With the official Docker setup, the host's mounted
~/.hermesworks. Managed hosting without shell access to the Hermes home cannot be analyzed. - Execution history is finite. Hermes keeps the most recent finished executions (about 1,000), so long windows on very busy installs can undercount OK and FAIL.
- Real billed dollar costs have not been validated on a live install yet. Actual and estimated handling is covered by automated fixtures and data written by Hermes's own code.
- Not yet seen in the live acceptance test: compression continuation sessions, delegated subagent sessions, and a gateway firing the job on schedule. Fixtures cover the first two.
- If you resume a cron session and keep chatting in it, those later tokens land in the same session and are counted too.
Use it from an AI agent
A Hermes Cron Cost Agent Skill is published on this site. It teaches Hermes, Claude Code, Codex, and other agents to answer “what are my cron jobs costing?” from --json output. It keeps actual, estimated, included, and unknown costs apart, reports coverage gaps instead of extrapolating, and does not open transcripts, prompts, memory, or keys.
$npx skills add https://www.hermesagentai.org --skill hermes-cron-cost
Read it first: SKILL.md (listed in the skills index).
Common questions
How much does a Hermes cron job cost?
It depends on the model, how much context the prompt and tools pull in, and how often the job runs. Each agent run is a fresh Hermes session, so a job that fires every hour pays for 24 full agent turns a day. Script-only (--no-agent) jobs use no tokens. The reliable answer is to measure your own jobs, which is what this tool does.
Does Hermes show token usage per cron job?
Not as a per-job report. /usage covers the current session and /insights summarizes recent usage overall. The official cron docs do not document a per-job cost view. Hermes does store what is needed, and Hermes Cron Cost connects it to each job.
Why is a cost “unknown” instead of $0?
Because Hermes had no price for that model or route. Showing $0 would understate your spend. Check the provider's own usage dashboard for those calls.
Why doesn't RUNS equal OK + FAIL?
RUNS can be higher when more sessions survive than finished execution records (for example, after execution history rotated). OK and FAIL come only from execution records. See what RUNS means.
How do I make an expensive job cheaper?
Measure first, then decide. The common levers are on the Hermes cron page: a cheaper cron.model or per-job model pin, a pre-run script that skips the model when nothing changed, a script-only job, or a less frequent schedule. Models and Hermes cost cover provider pricing.
Is this an official Nous Research tool?
No. Hermes Cron Cost is an independent Hermes ecosystem utility from HermesAgentAI.org. It is not made, endorsed, or supported by Nous Research.
Package and source
| Status | |
|---|---|
| npm package | @hermesagentai/cron-cost |
| Source | github.com/fiz-is/hermes-cron-cost |
| Command | hermes-cron-cost |
| Requires | Node.js 22.18+, a local Hermes Agent home |
Primary sources
- Scheduled Tasks (Cron) — official docs
- Slash commands (/usage, /insights) — official docs
- Issue #23419: cron jobs burn provider credits without a budget cap
- Hermes Agent releases
HermesAgentAI.org is an independent educational documentation resource and community guide. It is not affiliated with, sponsored by, or endorsed by Nous Research or FlyHermes. Hermes Agent is released under the MIT License by Nous Research.
Where to go next
What must be running for jobs to fire, models, delivery, diagnostics.
Models, tools, and hosting: the fixed and variable parts of the bill.
Pick a cheaper model for scheduled jobs.
Routines are cron jobs in the bot's profile; report on them with --profile.