pi-stickybar

Configurable two-line status bar and fixed editor extension for pi coding agent

Packages

Package details

extension

Install pi-stickybar from npm and Pi will load the resources declared by the package manifest.

$ pi install npm:pi-stickybar
Package
pi-stickybar
Version
1.1.0
Published
Jul 22, 2026
Downloads
317/mo · 24/wk
Author
jekatigr
License
MIT
Types
extension
Size
116.2 KB
Dependencies
0 dependencies · 3 peers
Pi manifest JSON
{
  "extensions": [
    "./src/index.ts"
  ],
  "image": "https://raw.githubusercontent.com/jekatigr//pi-stickybar/main/docs/preview.gif"
}

Security note

Pi packages can execute code and influence agent behavior. Review the source before installing third-party packages.

README

StickyBar

Input bar extension for pi coding agent.

Preview

StickyBar preview

Features

  • Fixed editor - prompt is always visible
  • Two configurable status rows with model, git state and more, check table below
  • Last-prompt preview under the input prompt line
  • Themed working vibes: generated realtime based on your input or loaded from a local file, with optional rainbow animation.

Installation

pi install npm:pi-stickybar

Restart pi after installation or call /reload.

Configuration

The extension has opiniated defaults, but it also configurable via settings.json

Put settings under a single stickybar object. Pi reads global settings first, then project settings, so .pi/settings.json overrides ~/.pi/agent/settings.json.

Full configuration example:

{
  "stickybar": {
    "fixedEditor": true,
    "mouseScroll": true,
    "showLastPrompt": true,

    "top": [
      "git",
      "context_pct",
      "token_in",
      "token_out",
      "cost",
      "time_spent"
    ],

    "bottom": [
      "model",
      "thinking",
      "path",
      "extension_statuses"
    ],

    "options": {
      "path": { "mode": "basename", "maxLength": 32 },
      "git": {
        "polling": "full",
        "showBranch": true,
        "showStaged": true,
        "showUnstaged": true,
        "showUntracked": true
      },
      "time": { "format": "24h", "showSeconds": false }
    },

    "vibe": {
      "theme": "evil corporation",
      "mode": "generate",
      "model": "openai-codex/gpt-5.4-mini",
      "rainbow": true,
      "fallback": "Working",
      "refreshInterval": 30,
      "prompt": "Generate a {theme} loading message for: {task}. {exclude}",
      "maxLength": 65
    }
  }
}

Status items

top and bottom are ordered arrays. An item can appear only once, and unknown IDs are ignored.

Item Description Example
model Current model in use gpt-5.4-mini
thinking Reasoning/thinking level medium
path Current file path (see options) src/index.ts
git Git branch + working-tree state main ⇡3 ✗2 ?1
context_pct Context window usage percentage 45%
context_total Total context tokens used 12,450 tok
token_in Input tokens for current turn 3,200
token_out Output tokens for current turn 840
token_total Total tokens (in + out) 4,040
cost Estimated cost of current session $0.012
time_spent Elapsed time for current turn 3s
time Current clock time 14:35
session Session identifier or name sess-abc123
hostname Machine hostname my-laptop
cache_read Cache read hits 128
cache_write Cache write hits 35
extension_statuses All published extension statuses ci: passing · deploy: ready

Path options

Configure how file paths are displayed via options.path:

Option Values Description
mode basename, abbreviated, full How the path is rendered. basename shows only the filename (index.ts). abbreviated keeps the full path but truncates from the start with when it exceeds maxLength. full always shows the complete absolute path.
maxLength number (default: 32) Maximum length for abbreviated mode. Longer paths are truncated from the beginning and prefixed with .

Git polling options

Configure git status detail via options.git:

Option Values Description
polling full, branch, off How much git info to gather. full polls for branch name plus staged, unstaged, and untracked counts. branch shows only the current branch name without scanning working-tree changes. off skips local polling entirely and relies on whatever branch info pi provides.
showBranch boolean (default: true) Include the branch name in the segment.
showStaged boolean (default: true) Show the count of staged changes ().
showUnstaged boolean (default: true) Show the count of unstaged changes ().
showUntracked boolean (default: true) Show the count of untracked files (?).

Custom status items

Use custom:<id> in a row and declare the matching item in customItems:

{
  "stickybar": {
    "top": ["model", "path", "custom:ci", "git"],
    "bottom": ["context_pct", "extension_statuses"],
    "customItems": [
      {
        "id": "ci",
        "statusKey": "ci-status",
        "prefix": "CI",
        "hideWhenMissing": true,
        "excludeFromExtensionStatuses": true
      }
    ]
  }
}

Extensions publish a value with:

ctx.ui.setStatus("ci-status", "passing");

Working vibes

Manage vibes from pi with /stickybar vibe:

/stickybar                    Show current status
/stickybar vibe               Show vibe status
/stickybar vibe pirate        Enable a theme
/stickybar vibe off           Disable vibes
/stickybar vibe rainbow on    Enable rainbow animation
/stickybar vibe mode file     Use ~/.pi/agent/vibes/<theme>.txt
/stickybar vibe model provider/model
/stickybar vibe generate evil cat corporation 100

generate mode requests a short message from the configured model while Pi is working. file mode rotates through messages in ~/.pi/agent/vibes/<theme>.txt and does not make a model request.

This project is a rework of pi-powerline-footer with simplified approach to customization and limited feature list.