Customizing Statusline
Use this skill to create or update the global Letta Code statusline mod:
~/.letta/mods/statusline.tsx
The statusline is a panel registered at order: 0 — the primary line just below the input. It overrides the built-in agent · model line. Host UI can still temporarily preempt it for safety confirmations and transient hints.
Statusline ownership model
safety preemption
else transient host hint
else order-0 statusline panel
else built-in default statusline
The order-0 panel owns the whole primary row. It renders text (not React) and owns its own layout via the row/columns helpers.
Workflow
- Check whether
~/.letta/mods/statusline.tsxexists. - If it exists, read it before editing and preserve unrelated code.
- If it does not exist, synthesize a focused starter for the user's request.
- If the user asks to migrate, import a
.shfile, or match a shell prompt, readreferences/migration.md. - If API details or concrete patterns are needed, read
references/api.mdandreferences/examples.md. - If the request combines statusline work with commands, tools, events, other panels, or stateful mod behavior, also use
creating-modsand itsreferences/architecture.md. - Guard panel work with
letta.capabilities.ui.panelswhen writing new files. - Edit
~/.letta/mods/statusline.tsx. - Summarize the absolute file path changed and tell the user to run
/reloadunless the command can reload automatically.
Bare /statusline behavior
If the user ran /statusline without a specific request:
- If a custom statusline file exists, summarize what it appears to do and ask what they want to change.
- If no custom file exists, explain that Letta is using the built-in default statusline and offer focused next steps:
- start from a simple
agent · modelstatusline - add project info like git branch, worktree, or PR
- migrate an existing legacy statusline
.shfile - match shell prompt / PS1
- describe a custom statusline in their own words
- start from a simple
Keep this conversational. Do not build a menu UI unless the product command explicitly asks for one.
Rules
- Global-only for now. Do not create project mods.
- Keep the mod single-file for MVP.
- Do not assume extra npm packages are available.
- Do not use relative multi-file imports yet.
- Keep
rendersynchronous and side-effect-free. Do not shell, fetch, await, or read files inside render. - Do async work in setup code, intervals, or subscriptions, store the result in a closure variable, then call
panel.update()to re-render. - Register the statusline at
order: 0. Compose left/right withrow(left, right, width); color withchalk. - Guard panel work with
letta.capabilities.ui.panelsin new files. - Return a disposer that clears timers/subscriptions and calls
panel.close(). - Preserve existing mod code unless the user asks to reset.
Useful references
references/api.md- panel API, render context, lifecycle rulesreferences/examples.md- common statusline patternsreferences/migration.md- legacy command.shand PS1 migration