A messenger-style conversation layout for the Pi coding agent. It adds actor headers, responsive metadata, turn grouping, date separators, and optional alternating alignment without imposing a model or terminal-font theme.
pi install npm:pi-chat-layoutUse pi -e npm:pi-chat-layout for one run. Remove it with pi remove npm:pi-chat-layout.
The extension works without configuration. For the icons and spacing shown in the screenshots, use IosevkaTerm Nerd Font Mono.
Then create ~/.pi/agent/chat-layout.json:
{
"icons": {
"user": "😎",
"assistant": "",
"thinking": { "medium": "\udb86\ude52", "high": "\udb86\ude54" }
},
"models": {
"aliases": { "openai-codex/gpt-5.6-sol": "SOL" }
},
"thinking": {
"markerGlyphs": ["ア", "イ", "ウ", "エ", "オ", "カ", "キ", "ク"]
},
"header": { "style": "compact" },
"dates": { "label": "VAULT LOG // {date}" }
}Every field is optional. Defaults use alternating alignment, 👤 You, 🤖 <provider/model>, separate lower-case thinking metadata, portable ASCII activity markers, and a plain date label.
layout:alternating(default) orstacked.icons.user,icons.assistant, andicons.thinking.<level>: arbitrary strings; use""to hide an icon.actors.user: user label.actors.assistant.namecanprefixorreplacethe model ID.models.aliases: exactprovider/modelmatches. Unknown models keep their actual ID.header.metadata: any ordered subset ofthinking,time,duration,tokens, andcost.header.style:separate(default) orcompact, which combines the thinking icon, identity, and upper-case level.thinking.markerGlyphs: non-empty array used to build deterministic four-glyph activity markers. Mixed-width entries share a stable column.dates.label: replaces{date}with the localized date; use""for an unlabeled divider.
Configuration changes hot-reload. PI_CODING_AGENT_DIR is respected. Invalid JSON keeps the last valid configuration; invalid fields fall back individually and produce a warning. On narrow terminals, low-priority metadata is removed before the header is truncated.
User headers show submission time. Assistant headers show available thinking, timing, token, and cost metadata. Follow-up assistant steps keep compact diagnostics without repeating the actor header.
Pi does not yet expose a public renderer hook for built-in messages, so the extension decorates its message components. A startup compatibility probe preserves stock rendering when those internals are incompatible. Core Pi packages remain host-provided peer dependencies.
pnpm install
pnpm check
pnpm pack:dryMIT

