Where Am I Claude Code mod: a Claude Code session recap above the prompt
A recap above the Claude Code prompt: the session goal, what is happening now, what waits on you and the next step.
Permissions
- Reads filesCan read files and list directories on your machine ($.fs.read / list / stat / exists).
- Calls the model (uses your quota)Can send its own requests to Claude, which count against your plan's usage ($.model.* / $.agent.spawn).
- 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).
- tested with
- v2.1.303
- last tested
- requires
- Claude Code ≥ 2.1.287
- surfaces
- above-prompt
- source
- Hamza Zafar (hamzafer) (MIT)
Install inside Claude Code:
/plugin install where-am-i --marketplace hamzafer/claude-code-modsWhat does this mod do?
Where Am I is a community mod by Hamza Zafar (hamzafer), part of his claude-code-mods collection. It keeps a Claude Code session recap above the prompt so you can look up and see where you are after a long answer or a break. The band shows the goal of the session, what is happening now, what Claude is waiting on you for, and the next step. The author wrote it for people who lose the thread easily, and the system prompt behind it asks for plain words.
The band has up to three lines. ◆ Goal: holds the overall aim, which the model is told to keep unless it clearly changed. The now: line follows Claude's work live, with labels such as reading src/index.js, and next: sits on the same line. A yellow waiting on you: line appears only when Claude needs something from you. Each field is cut to one sentence of at most 70 characters.
The recap is written by a small model call after each turn ends. /where writes a longer recap on request: up to six bullets built from the last 12 messages of the conversation. If you run several band mods, Where Am I sorts itself with them using a shared band order file, and the author's tests cover this.
Demo
The recording starts Claude Code with the mod loaded in the small demo project and asks Claude to read README.md and say what the project is in one sentence. While Claude works, the band above the prompt is still empty. When the turn ends, Claude's answer and the done line appear, and a few seconds later the recap shows up above the prompt: a Goal: line about understanding the demo app, a now: line saying it read the README, and a next: line. The clip then ends with Ctrl+C.
Install
Use any of the methods in the install block; they install straight from the author's own marketplace. The band appears after your first completed turn, and /where is registered at session start.
$ install where-am-i
Requires Claude Code ≥ 2.1.287
Installs from the author's own marketplace: hamzafer/claude-code-mods
1.One line, inside Claude Code
/plugin install where-am-i --marketplace hamzafer/claude-code-modsPaste into a running session (v2.1.275+). Claude Code asks to add the marketplace first.
2.From your shell
claude plugin marketplace add hamzafer/claude-code-mods claude plugin install where-am-i@claude-code-modsThen run /reload-plugins in any session that is already open.
3.Try it without installing
git clone https://github.com/hamzafer/claude-code-mods claude --plugin-dir ./claude-code-mods/mods/where-am-iLoads the mod for one session only. Nothing is added to your settings.
How it works
The recap lives in a host-held $.state atom, so it survives a hot reload. The model call that writes it runs from turn.complete and is not awaited, so the turn ends at once. From hooks/register.tsx:
on('turn.complete', async ($, e, next) => {
const r = await next(e)
if (!e.agentId) {
await update($, live, () => '')
void summarize($, prompt, log, e.answer).catch(() => {}) // in the background, so the turn ends at once
}
return r
})summarize calls $.model.complete with the haiku model. It sends the previous recap, your latest message (first 1500 characters), the labels of this turn's tool calls and the first 2500 characters of Claude's answer, and asks for JSON with goal, now, waiting and next. parseRecap accepts a code fence around the JSON, trims fields and replaces em dashes. A tool.call hook writes the now label and keeps the last 20 labels for the next recap; it only observes and returns the call unchanged. Subagent turns are skipped, and calls made by other mods are ignored by checking next.origin. The band is drawn on the AbovePrompt render site and goes away while a survey is open.
Customize it
There are no options in /config. /where is the only command. To change the look, edit register.tsx: MODEL picks the model for the recap, MAX_LOG sets how many tool-call labels are kept, clip sets the 70-character limit, and the two system prompts in summarize and longRecap set the tone. The order of the band among other band mods is read once per session from bands.json in the config folder, so restart Claude Code to apply a change.
Permissions & safety
We read every file the plugin can execute before running anything: hooks/hooks.json, hooks/register.tsx, hooks/bands.ts, the type declarations and the tests. There is no package.json, install script, binary or bundled code, and we found no hidden characters, eval or dynamic imports. The MIT license is in the repository root.
- Model calls.
$.model.completeruns after every main-agent turn and on/where. It sends your prompt, tool labels and Claude's answer (or the last 12 messages for/where) to the haiku model through Claude Code, so it uses your plan or API usage. The mod itself has no network code, and nothing is sent to any other host. - Environment and files. It reads
CLAUDE_CONFIG_DIRandHOMEand, if present, one file,<config dir>/claude-code-mods/bands.json, to get the band order. It writes no files; the recap lives in$.state. - Hooks.
prompt.submitandtool.callonly observe and pass everything on unchanged, and validate notes that both lack a.catch. The mod does not block or rewrite anything. It adds/whereand changes the UI above the prompt. - Not present. No processes, shell commands, daemons, telemetry, secrets or settings changes, and no instructions aimed at the model beyond the two recap prompts.
claude plugin validate reported no errors or warnings, and the author's 7 tests passed with claude plugin test on Claude Code 2.1.303.
- Reads files
- Can read files and list directories on your machine ($.fs.read / list / stat / exists).
- Calls the model (uses your quota)
- Can send its own requests to Claude, which count against your plan's usage ($.model.* / $.agent.spawn).
- 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).
Compatibility & troubleshooting
Checked with Claude Code 2.1.303 on macOS (validate, tests and a recording). If the band does not show up:
- Finish one turn first; the recap is written after it, and a failed or unparsable model reply leaves the band empty.
- A survey open above the input hides it until it closes.
- If
/whereis unknown, Claude Code already has a command with that name, and the mod starts without it. - If
/wheresays "Could not build a recap right now", the model call was not answered; try again.
The band reads next-steps state, so it hides its own next part when that mod shows its list.
FAQ
- Does Where Am I spend tokens?
- Yes, a few. After every turn of the main agent it makes one background call to the haiku model through Claude Code to write the recap, capped at 300 output tokens. Running /where makes one more call, capped at 500 output tokens. It makes no network requests of its own.
- What does the recap contain?
- Four short fields, each cut to about 70 characters and one sentence. Goal is the aim of the session, now is what was just done, waiting is what Claude needs from you (hidden when empty), and next is the next step.
- How is the "now" line updated while Claude works?
- A hook on every tool call from Claude replaces it with a plain label such as "reading src/login.js" or "running npm test". Calls made by other mods in the background are ignored, and when the turn ends the model's recap takes over again.
- Why is there no recap after my first prompt?
- The recap is written after a turn ends, by a background model call. It appears a few seconds after the first answer, and until then the band stays hidden.
- What happens if I also use the next-steps mod?
- When next-steps shows its list of next prompts, Where Am I leaves out its own "next" part so the two do not repeat each other.
# Related mods
FeaturedNext Steps
Two or three likely next prompts above the Claude Code input after each turn. Press 1, 2 or 3 to draft one.
- above-prompt
- Calls the model (uses your quota)
- Reads your prompts
- Changes the UI
tested with v2.1.291
FeaturedContext Bar
Your Claude Code context window as one stacked bar above the prompt, a color per category, with token counts.
- above-prompt
- Changes the UI
- Adds commands/tools
- Stores data
tested with v2.1.291
FeaturedMission Control
A live pane of Claude Code's main agent, subagents and every tool call, plus a code map of the files they touch.
- pane
- above-prompt
- Reads files
- Writes files
- Runs commands
- Calls the model (uses your quota)
- Intercepts tool calls
- Changes the UI
- Adds commands/tools
tested with v2.1.296
More in Timers, todos, standups, Slash commands.