Skip to content
claudemods

Goal Meter Claude Code mod: a progress bar and ETA for /goal

A progress bar for /goal built from Claude's own task plan: tasks done, elapsed time, ETA and every chat's goal.

Permissions

  • Reads filesCan read files and list directories on your machine ($.fs.read / list / stat / exists).
  • Writes filesCan create or overwrite files on your machine ($.fs.write).
  • Runs commandsCan run shell programs on your machine ($.process.run / spawn). Check the source for exactly which ones.
  • Intercepts tool callsSees every tool call Claude makes (tool.call / tool.check) and could block or change it.
  • Reads your promptsCan see what you type and the conversation transcript (prompt.* / session.append / session.messages).
  • Changes the UIDraws into the Claude Code interface: bands, panes, status text, toasts (ui.render / $.ui.*).
  • Adds commands/toolsRegisters new slash commands or tools that you or Claude can invoke ($.command.register / $.tool.register).
  • Stores dataKeeps data between sessions in the plugin's private store ($.store.*).
tested with
v2.1.310
last tested
requires
Claude Code ≥ 2.1.287
surfaces
above-prompt, status, pane

Install inside Claude Code:

/plugin install goal-meter --marketplace nateherkai/claude-code-mods
All install options ↓

What does this mod do?

The Claude Code goal meter mod, Goal Meter, is a community mod by Nate Herk (nateherkai), one of four plugins in his claude-code-mods collection. It gives you a Claude Code goal progress bar for /goal. You type /goal with what done looks like, and the mod asks Claude to write a plan first: a list of tasks, each sized S, M or L, kept through a task tool the mod registers itself. As Claude marks tasks started and done, the bar fills.

Above the prompt a band shows the goal, 2 of 3 tasks · 67%, the bar, the elapsed time, and a short window on the list: the last tasks done, what is running and which agent runs it, and the next tasks. When Claude's goal check says the goal is not met yet, its reason appears in yellow. Once two tasks are done the band adds an ETA at this goal's own pace. A footer label such as ◎ goal 69% · ~15m shows in every view. Pressing g or running /goals opens a pane with the whole task list and the goals of your other chats from the last 12 hours.

The mod is close to our Context Meter and Tool Call Counter in spirit, but it tracks a different thing: not tokens or tool calls, but how far along a goal is, according to Claude's own plan. A plan Claude makes without /goal is tracked the same way.

Demo

The recording starts Claude Code with the mod loaded in the small demo project and sends /goal read README.md and src/index.js, then say in one sentence what each file is for. The band appears above the prompt at once with "Waiting for Claude's task plan…" and the footer reads ◎ goal · planning. Claude then calls the goal-meter task tool with a three-task plan, all sized S, and the band switches to 0 of 3 tasks · 0% with the three tasks listed. The clip ends as Claude starts and finishes the first tasks: the bar moves to 2 of 3 tasks · 67%. The demo allows the mod's task tool, so there is no permission prompt.

Install

Use any of the methods in the install block; they install straight from the author's own marketplace. The band shows up the next time you start a /goal.

$ install goal-meter

Requires Claude Code ≥ 2.1.287

Installs from the author's own marketplace: nateherkai/claude-code-mods

  1. 1.One line, inside Claude Code

    /plugin install goal-meter --marketplace nateherkai/claude-code-mods

    Paste into a running session (v2.1.275+). Claude Code asks to add the marketplace first.

  2. 2.From your shell

    claude plugin marketplace add nateherkai/claude-code-mods
    claude plugin install goal-meter@nateherk-mods

    Then run /reload-plugins in any session that is already open.

  3. 3.Try it without installing

    git clone https://github.com/nateherkai/claude-code-mods
    claude --plugin-dir ./claude-code-mods/goal-meter

    Loads the mod for one session only. Nothing is added to your settings.

How it works

The mod hooks /goal through command.run, lets the command run, then starts a goal record and hands Claude an instruction as the command's hidden note. The tool call handler serves the mod's own tool, so the task list never goes through a shell or the network. From hooks/register.mjs:

on('command.run', { command: 'goal' }, async ($, e, next) => {
  const args = String(e.args || '').trim()
  const r = await next(e)
  ...
  await startGoal($, args)
  const notes = r && Array.isArray(r.context) ? r.context : []
  return { ...(r || {}), context: [...notes, instruction(toolName)] }
})

The task logic lives in plan.mjs as pure functions: applyAction handles plan, add, start, done and drop, progress weights S, M and L as 1, 2 and 3, and eta needs two finished tasks. If Claude makes four tool calls in a goal without a plan, the mod appends one reminder message asking for the plan. The goal check's verdict is read from the last 12 lines of the chat's log with tail, retried at 1.5 and 4 seconds.

Customize it

There is no /config page. Everything runs through /goals:

  • /goals opens the pane with this chat's tasks and other chats' goals.
  • /goals hide and /goals show toggle the band above the prompt; the footer label stays.
  • /goals strict on or off sets strict planning, saved with $.store.
  • /goals clear stops the current goal.

If another plugin already uses /goals, the mod registers /goal-meter instead. To change the look or timings, edit the constants at the top of register.mjs, such as RECENT_MS, NUDGE_AFTER and OTHERS_MS.

Permissions & safety

We read every file the plugin can execute before running it: plugin.json, hooks/hooks.json, register.mjs, plan.mjs, fmt.mjs and privacy.mjs. There is no package.json, install script, binary or bundled code, and we found no hidden Unicode. Findings:

  • Network: none.
  • Processes: one, tail -n 12 <chat log> (PowerShell Get-Content -Tail 12 on Windows), passed as an argument list with no shell, to read the goal check's verdict.
  • File writes: one JSON file per chat in ~/.claude/mods-data/goal-meter/. It is under ~/.claude, but it is the mod's own folder; it does not touch settings.json, shell files or launch agents. The file holds your goal text, tasks and the project folder name, and other chats' copies of the mod read it.
  • File reads: its own folder, the chat log tail, and ~/.claude/mods-data/recording.json, a flag file written by the author's sibling Recording Mode mod. When that flag is on, the mod masks secrets and personal details in the text it draws.
  • Environment: reads HOME and USERPROFILE only, to find those folders.
  • Daemons and telemetry: none. Two timers run inside Claude Code and stop when it exits.
  • Model influence: it adds an instruction to the /goal command asking Claude to plan with the task tool, and appends one user-role reminder message after four tool calls without a plan. The text is plain and matches the README.
  • Gating: with strict mode on (off by default) it denies file-edit tools in a goal until a plan exists. Otherwise it never blocks a tool call.

claude plugin validate reported no errors and no warnings in the plugin (the directory check only notes a missing icon). It lists several gating hooks without .catch, which is an advisory note. The author ships no tests, so claude plugin test exits with "no *.test.ts or *.test.tsx", and we ran no author tests. License: MIT, with a LICENSE file in the repo.

Reads files
Can read files and list directories on your machine ($.fs.read / list / stat / exists).
Writes files
Can create or overwrite files on your machine ($.fs.write).
Runs commands
Can run shell programs on your machine ($.process.run / spawn). Check the source for exactly which ones.
Intercepts tool calls
Sees every tool call Claude makes (tool.call / tool.check) and could block or change it.
Reads your prompts
Can see what you type and the conversation transcript (prompt.* / session.append / session.messages).
Changes the UI
Draws into the Claude Code interface: bands, panes, status text, toasts (ui.render / $.ui.*).
Adds commands/tools
Registers new slash commands or tools that you or Claude can invoke ($.command.register / $.tool.register).
Stores data
Keeps data between sessions in the plugin's private store ($.store.*).

Compatibility & troubleshooting

Checked with Claude Code 2.1.310 on macOS (validate and a recorded demo). If the band does not appear:

  • Start a goal with /goal <condition>. The band only shows during a goal or a plan, and for 10 minutes after it ends.
  • Check that you did not run /goals hide; /goals show brings it back.
  • If it says "Waiting for Claude's task plan…", Claude has not called the task tool yet. Tool use may need approval, because the tool is named mcp__goal-meter__tasks.
  • Use Claude Code 2.1.287 or later.

With the mod loaded, the "for shortcuts" hint in the footer is replaced by the mode line, which is normal.

FAQ

Does Goal Meter send extra requests to the model?
The mod makes no model requests and no network calls of its own. It does add text to the conversation, though. When you start a goal it asks Claude to plan, and Claude then makes a few small calls to the mod's task tool per goal, which are ordinary tool calls in your session.
Where does the percentage come from?
Only from the task list Claude writes through the mod's tool. Tasks are sized S, M or L and count 1, 2 and 3, so the percentage is finished work out of the planned work. If Claude adds tasks later, the bar can step back.
When does the ETA appear?
After two tasks are done. It takes the time since the plan was made, divides it by the finished work, and multiplies by the work left. Before that the band reads "ETA after 2 tasks finish".
What does strict mode do?
/goals strict on is off by default. When it is on, the mod denies Edit, Write, NotebookEdit and MultiEdit calls in a /goal until Claude has made a plan, and tells Claude to plan first. /goals strict off turns it off again.
Where does it save its data?
Each chat writes one JSON file to ~/.claude/mods-data/goal-meter/, named after the session id. It holds the goal text, the task list, timestamps and the folder name. The /goals pane reads those files to list other chats' goals from the last 12 hours.
Context Meter running in Claude CodeFeatured

Context Meter

Context-window fill, 5-hour and 7-day plan usage and session cost in the status line, plus a warning near the limit.

  • status
  • toast
  • Changes the UI

tested with v2.1.310

Tool Call Counter running in Claude CodeFeatured

Tool Call Counter

Counts Claude's tool calls per turn and session, shows the count by the spinner, and adds /tally for a breakdown.

  • spinner
  • transcript
  • status
  • Intercepts tool calls
  • Changes the UI
  • Adds commands/tools

tested with v2.1.310

More in Timers, todos, standups, Status line & prompt bar.