@normful/pi-auto-name
Auto-generates names in your language for Pi sessions, tmux windows, herder panes/tabs, zellij panes/tabs so you can easily view what each Pi is doing
Package details
Install @normful/pi-auto-name from npm and Pi will load the resources declared by the package manifest.
$ pi install npm:@normful/pi-auto-name- Package
@normful/pi-auto-name- Version
1.0.2- Published
- Aug 8, 2026
- Downloads
- 431/mo · 431/wk
- Author
- normful
- License
- MIT
- Types
- extension
- Size
- 502.4 KB
- Dependencies
- 2 dependencies · 4 peers
Pi manifest JSON
{
"extensions": [
"./src/index.ts"
],
"image": "https://media.githubusercontent.com/media/normful/pi-bakery/main/screenshots/auto-name.png"
}Security note
Pi packages can execute code and influence agent behavior. Review the source before installing third-party packages.
README
@normful/pi-auto-name
[!TIP] Documentation in: 简体中文 · 繁體中文 · 日本語 · 한국어 · Português · Español · Deutsch · Français · Bahasa Indonesia · Tiếng Việt · Türkçe · Polski · Українська · فارسی · العربية · हिन्दी · Italiano · Nederlands · ไทย
Automatically names your Pi session and terminal multiplexer surfaces from the conversation.
Supports renaming a herdr pane or herdr tab containing Pi:
Also supports renaming a tmux window containing Pi:
And supports renaming a zellij pane or zellij tab containing Pi:
Various languages are supported too, such as Japanese:
Installation
pi install npm:@normful/pi-auto-name
Usage
The extension is fully automatic; there is nothing to run.
Configure it once, and that's it. Set it and forget it.
How It Works
After the first user input (or the first agent_settled event — see config
below), it renames the Pi session and renames the containing:
- tmux window
- herdr pane and herdr tab
- zellij pane and zellij tab
Additionally, you can also configure it to continually rename as the conversation evolves, by configuring reRenameEveryNTurns.
Configuration
Save config to either:
- Globally:
~/.config/pi-auto-name/config.json(respectsXDG_CONFIG_HOME) - Per-project override:
.pi/pi-auto-name.json
Full default configuration:
{
"enabled": true,
"initialRenameTrigger": "first-input",
"language": "en",
"namingContextDepth": "recent-user-messages",
"namingModel": "",
"namingStyle": "natural",
"replaceExistingName": "always",
"reRenameEveryNTurns": 0,
"respectExternalRenames": true,
"sessionNameMaxLength": 200,
"skipSessionNameDedup": false,
"surfaces": {
"renameHerdrPane": true,
"renameHerdrTab": true,
"renamePiSession": true,
"renameTmuxWindow": true,
"renameZellijPane": true,
"renameZellijTab": true
},
"windowNameMaxLength": 30
}
Every configuration key is optional.
Configuration Reference
| Key | Type | Default | Meaning |
|---|---|---|---|
enabled |
boolean |
true |
false disables this extension entirely. |
initialRenameTrigger |
string |
"first-input" |
When the first rename fires:"first-input" — after you send first prompt"first-agent-settled" — after the first LLM run finishes (after the first agent_settled event). |
language |
string |
"en" |
One of: "en", "es", "de", "fr", "it", "nl", "pt", "pt-BR", "pt-PT", "id", "vi", "tr", "pl", "uk", "fa", "ar", "hi", "zh", "zh-CN", "zh-Hans", "zh-Hant", "zh-TW", "zh-HK", "ja", "ko", "th" |
namingContextDepth |
string |
"recent-user-messages" |
How much of the conversation to send to LLM in each renaming prompt:"first-user-message" — only the first user message"recent-user-messages" — first user message plus the last 3 user messages"full-conversation" — the whole conversation (users, assistants, tool calls & results), capped to ~60k chars keeping both the opening (core intent) and the latest tail |
namingModel |
string |
"" |
provider/modelId override for the naming LLM call. Example: "openrouter/nvidia/nemotron-3-nano-30b-a3b:free". Leave empty to use your configured Pi default model and provider. |
namingStyle |
string |
"natural" |
The naming style used for both names:"natural" — free-form sentence"slug" — lowercase kebab-case."topic-project" — <topic>|<project>, project derived from current working directory |
replaceExistingName |
string |
"always" |
When to overwrite an existing Pi session name, tmux window name, herdr pane/tab name, zellij pane/tab name:"always" — always overwrite"never" — never overwrite |
reRenameEveryNTurns |
integer |
0 |
Re-rename every N turns (every N agent_settled events). 0 never re-renames. |
respectExternalRenames |
boolean |
true |
When true, disables this extension's renaming after an external rename is detected (e.g. after you manually run /name) |
sessionNameMaxLength |
integer |
200 |
Max character limit for the Pi session name. |
skipSessionNameDedup |
boolean |
false |
true skips sending existing Pi session names into the renaming prompt. false (default) sends up to 15 existing session names as names to avoid duplicating. |
surfaces.renamePiSession |
boolean |
true |
false disables renaming of Pi session |
surfaces.renameHerdrPane |
boolean |
true |
false disables renaming of the herdr pane Pi is running in |
surfaces.renameHerdrTab |
boolean |
true |
false disables renaming of the herdr tab this process runs in. |
surfaces.renameTmuxWindow |
boolean |
true |
false disables renaming of the tmux window this process runs in. |
surfaces.renameZellijPane |
boolean |
true |
false disables renaming of the zellij pane this process runs in. |
surfaces.renameZellijTab |
boolean |
true |
false disables renaming of the zellij tab this process runs in. |
windowNameMaxLength |
integer |
30 |
Max chars for every terminal/frame window name (herdr pane/tab, tmux window, zellij pane/tab). One of the two length knobs. |
Debugging
Set PI_AUTO_NAME_DEBUG=1 and the extension will both append structured pi-auto-name:debug entries to
the session transcript and render them in the TUI. (The debug entries are not sent to the LLM.)
Inspiration
This extension is inspired by several other similar extensions:
