{"id":51241755,"url":"https://github.com/Nanako0129/coralline","last_synced_at":"2026-07-17T11:00:59.873Z","repository":{"id":364530271,"uuid":"1267078448","full_name":"Nanako0129/coralline","owner":"Nanako0129","description":"🪸 Powerlevel10k-inspired statusline for Claude Code — paste one prompt and your AI interviews you, then installs it","archived":false,"fork":false,"pushed_at":"2026-07-02T04:34:15.000Z","size":6509,"stargazers_count":456,"open_issues_count":2,"forks_count":34,"subscribers_count":1,"default_branch":"main","last_synced_at":"2026-07-02T06:22:40.791Z","etag":null,"topics":["bash","claude","claude-code","nerd-fonts","powerlevel10k","statusline","terminal","vibe-coding"],"latest_commit_sha":null,"homepage":null,"language":"Shell","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Nanako0129.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-06-12T07:44:56.000Z","updated_at":"2026-07-02T04:34:19.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/Nanako0129/coralline","commit_stats":null,"previous_names":["nanako0129/coralline"],"tags_count":16,"template":false,"template_full_name":null,"purl":"pkg:github/Nanako0129/coralline","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Nanako0129%2Fcoralline","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Nanako0129%2Fcoralline/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Nanako0129%2Fcoralline/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Nanako0129%2Fcoralline/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Nanako0129","download_url":"https://codeload.github.com/Nanako0129/coralline/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Nanako0129%2Fcoralline/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":35579288,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-07-17T02:00:06.162Z","response_time":116,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["bash","claude","claude-code","nerd-fonts","powerlevel10k","statusline","terminal","vibe-coding"],"created_at":"2026-06-29T01:00:37.134Z","updated_at":"2026-07-17T11:00:59.865Z","avatar_url":"https://github.com/Nanako0129.png","language":"Shell","funding_links":[],"categories":["Shell"],"sub_categories":[],"readme":"# coralline\n\n\u003e A [Powerlevel10k](https://github.com/romkatv/powerlevel10k)-inspired statusline for Claude\n\u003e Code with one installer entrypoint for humans and AI: run it directly, or ask Claude to run\n\u003e it and handle the setup for you.\n\n[繁體中文說明](./README.zh-TW.md)\n\n![All six coralline themes rendered side by side](./assets/hero.png)\n\n## What you get\n\n```text\n╭ ~/side-project/coralline  ⬢ coralline  ⎇ main+!  ◆ Fable 5  ψ high  ⬡ ▰▰▰▱▱ 62% ↑1.2M ↓45.6k  5h ▰▰▱▱▱ 41% ↺2h44m  7d ▰▰▰▰▱ 79% ↺1d11h  +321 −87  $1.23  ✎ Explanatory  ⧖ 47m  ⚑ 1  ⊙ 02:45 pm ╮\n```\n\n| Segment | Shows |\n|---|---|\n| `dir` | current directory, long paths collapsed to `~/a/…/z` |\n| `project` | repo name (`⬢`), stable across every worktree; hidden outside a git repo |\n| `git` | branch, staged `+` / modified `!` / untracked `?`, ahead `⇡` behind `⇣` |\n| `node` | active Node version (Nerd Font `nf-dev-nodejs_small`) from `.nvmrc` / `.node-version` (or `node` on `PATH` with `VL_RUNTIME_PROBE=1`); hidden when undetected; opt-in |\n| `python` | active Python env (Nerd Font `nf-dev-python`) — `$VIRTUAL_ENV` / conda (skips `base`) / `.python-version` (or `python3` on `PATH` with `VL_RUNTIME_PROBE=1`); hidden when undetected; opt-in |\n| `model` | active Claude model |\n| `effort` | reasoning effort level (`ψ`) — `low` / `med` / `high` / `xhigh` / `max` |\n| `ctx` | context-window gauge, input/output/cache token counts |\n| `limit5h` / `limit7d` | rate-limit gauges with reset countdown |\n| `burn` | range-to-empty: projected time until the binding limit (5h or 7d) hits 100% at the recent burn rate (`↗`); opt-in by adding `burn` to `VL_SEGMENTS` |\n| `lines` | lines added/removed this session |\n| `cost` | session cost in USD |\n| `style` | active output style |\n| `duration` | session wall-clock duration |\n| `stash` | git stash count |\n| `clock` | time, 12h or 24h |\n\nGauges change color as they fill: green → yellow at 50% → red at 75% (thresholds configurable).\n\n## Subagent panel\n\nClaude Code shows an agent panel below the prompt while subagents run; each row\ndefaults to `name · description · token count`. coralline can theme the\n**subagent rows** and add the per-task model, a context gauge, and elapsed time:\n\n```text\n scout · Explore config sources ◆ gpt-5.6-luna ⬡ ▰▰▱▱▱ 21% 42.0k ⧖ 2m05s\n executor · Apply R2 fixes ◆ Fable 5 ⬡ ▰▰▰▰▱ 77% 155.0k ⧖ 45s\n```\n\n![A live Claude Code session with coralline's main statusline and themed subagent rows](./assets/subagent-panel.png)\n\nClaude Code v2.1.211 does not include its internal `agentType` role in the\n`subagentStatusLine` payload, but local Agent tasks have a small metadata\nsidecar next to the session transcript. coralline reads that file with Bash\nbuiltins, so roles such as `scout` and `executor` return without another\nprocess. The row keeps both identity and task label: an explicit per-task\n`name` is retained alongside the role when both exist, followed by `label` or\n`description`. If the sidecar is absent or unreadable, the payload fields still\nrender normally.\n\nThe model comes directly from Claude Code's per-task `model` payload field;\ncoralline never infers it from the main-session model or the agent role. Known\nClaude IDs are shortened (`claude-haiku-4-5-…` → `Haiku 4.5`), while unknown or\ngateway IDs such as `gpt-5.6-luna` are shown verbatim.\n\nEnable or disable the renderer directly:\n\n```bash\nbash ~/.claude/coralline/configure.sh --subagent-rows=on\nbash ~/.claude/coralline/configure.sh --subagent-rows=off\n```\n\nThe setup wizard offers the same toggle. Disabling removes only the\n`subagentStatusLine` entry and preserves every other Claude setting.\n\nPer-task `model` and `contextWindowSize` need Claude Code **v2.1.205+**. Missing\nfields degrade one segment at a time: no model hides only the model segment;\n`tokenCount` still renders as a bare count without `contextWindowSize`; and the\nrest of the row remains themed. Refresh is panel-event-driven rather than a\nfixed one-second poll, so elapsed time changes when Claude Code redraws the\npanel.\n\nLive payloads currently expose no per-task *effort*. coralline does not reuse\nthe main-session effort or guess from the role; effort can be added only if\nClaude Code exposes it later. The panel's native **main-session row remains\nvisible** because it is outside the `subagentStatusLine` protocol; only the\nsubagent rows are replaced and themed.\n\n`VL_SUB_SEGMENTS` (default `\"name model ctx elapsed\"`) picks and orders the row\nsegments. These four are the complete set:\n\n| Segment | Shows | Hidden when |\n|---|---|---|\n| `name` | task identity plus task label: explicit `name` and sidecar `agentType` compose when both exist, followed by payload `label` or `description`; `type` is the final fallback; colored by status — running: text color, completed: ok, failed: hot, missing/unknown: dim | every source is empty or unavailable |\n| `model` | `◆` model from Claude Code's per-task payload; known Claude IDs are shortened and unknown/gateway IDs are shown verbatim | model not resolved yet, or pre-v2.1.205 |\n| `ctx` | `⬡` context gauge + token count; bare count without `contextWindowSize` | no `tokenCount` |\n| `elapsed` | `⧖` wall-clock since `startTime`, shown to the second (epoch s/ms or UTC ISO) | `startTime` missing or unparseable |\n\nThe renderer shares your config file but reads only the knobs that shape a row:\n`VL_STYLE` with its per-style knobs — the pill caps and separator (`VL_CAP_L`,\n`VL_CAP_R`, `VL_SEP`) and the lean/classic family (`VL_LEAN_SEP`, `VL_LEAN_BG`,\n`VL_LEAN_CAP_L`/`VL_LEAN_CAP_R`, `VL_LEAN_FG`, `VL_BG_BAR`) — `VL_ASCII`,\n`VL_NAME_MAX` (recommended — panel labels are long, and overlong rows are\nclipped from the right, hiding model/ctx first), the gauge knobs\n(`VL_BAR_WIDTH`, `VL_BAR_FILL`, `VL_BAR_EMPTY`, `VL_WARN_PCT`, `VL_HOT_PCT`),\nthe shared palette (`VL_FG_TEXT`, `VL_FG_DIM`, `VL_FG_OK`, `VL_FG_WARN`,\n`VL_FG_HOT`), and the row colors `VL_BG_SUB_NAME` / `VL_BG_SUB_MODEL` /\n`VL_BG_SUB_CTX` / `VL_BG_SUB_ELAPSED` (empty = fall back to `VL_BG_DIR` /\n`VL_BG_MODEL` / `VL_BG_CTX` / `VL_BG_DURATION`). Everything else —\n`VL_SEGMENTS*`, layout (`VL_LAYOUT`, `VL_MAX_LINES`, `VL_WRAP_MARGIN`), clock,\ncost, lines, float, limit-sync, burn, git, and the runtime segments — is\nmain-bar-only and ignored here. To theme panel rows independently of the main\nbar, point the registration at its own config file:\n`CORALLINE_CONFIG=~/.claude/coralline-subagent.conf bash ~/.claude/coralline/statusline.sh --subagent`.\n\n## Install\n\nThree ways to install, all driven by the same `install.sh`. Each one copies the renderer **and\nthe setup wizard** into `~/.claude/coralline` and registers the status line in Claude Code, so\nyou can re-run the wizard later no matter which way you installed.\n\n\u003e **Requirements:** `jq` and a [Nerd Font](https://www.nerdfonts.com/) terminal. No Nerd Font?\n\u003e Set `VL_ASCII=1` in your config for a glyph-free rendering.\n\n### Ask Claude (recommended)\n\nPaste this into Claude Code:\n\n```text\nPlease install coralline for me:\nfetch https://raw.githubusercontent.com/Nanako0129/coralline/main/INSTALL.md\nand follow the playbook in it.\n```\n\nClaude will read the playbook, use the same installer to bootstrap the runtime, interview you\nabout the look, write the config, verify it, and remind you that you can rerun the visual\nwizard if the first result doesn't match your taste.\n\nIf your Claude flags the playbook and wants to inspect things first, that is the right\ninstinct, not an obstacle: see [Trust and security](#trust-and-security).\n\n### Install it yourself\n\nRun the installer in your terminal:\n\n```bash\ncurl -fsSL https://raw.githubusercontent.com/Nanako0129/coralline/main/install.sh | bash\n```\n\nWhen run interactively it asks which version to install — the latest tagged release\n(recommended) or `main` (latest development). To skip the prompt, pin one explicitly with\n`--ref`, e.g. `... | bash -s -- --ref v0.9.1` or `--ref main`.\n\n### Manual\n\n```bash\ngit clone https://github.com/Nanako0129/coralline ~/.claude/coralline-src\nmkdir -p ~/.claude/coralline/themes\ncp ~/.claude/coralline-src/statusline.sh ~/.claude/coralline/\ncp ~/.claude/coralline-src/configure.sh ~/.claude/coralline/\ncp ~/.claude/coralline-src/install.sh ~/.claude/coralline/\ncp ~/.claude/coralline-src/themes/claude-coral.conf ~/.claude/coralline/themes/\n```\n\nThen add to `~/.claude/settings.json`:\n\n```json\n{\n  \"statusLine\": {\n    \"type\": \"command\",\n    \"command\": \"bash ~/.claude/coralline/statusline.sh\",\n    \"refreshInterval\": 1\n  }\n}\n```\n\n\u003e **Note:** the commands above copy only the `claude-coral` theme. The Ask-Claude and one-line\n\u003e installers bundle every theme; after a manual install, copy the rest of\n\u003e `~/.claude/coralline-src/themes/*.conf` into `~/.claude/coralline/themes/` to switch themes.\n\n### Updating\n\nTwo ways to update, both driven by the same installer. Either way your\n`~/.claude/coralline.conf` is preserved and the previous `statusline.sh` is backed up\nunder `~/.claude/coralline/` (the 3 newest are kept).\n\n#### Ask Claude (recommended)\n\nPaste this into Claude Code:\n\n```text\nPlease update coralline for me:\nfetch https://raw.githubusercontent.com/Nanako0129/coralline/main/UPGRADE.md\nand follow the playbook in it.\n```\n\nClaude re-runs the installer, reads the \"new since your installed copy\" report, and\noffers to turn on any new opt-in features for you.\n\n#### Update it yourself\n\nRe-run the installer — it prints a short \"new since your installed copy\" report when\nsomething new shipped:\n\n```bash\ncurl -fsSL https://raw.githubusercontent.com/Nanako0129/coralline/main/install.sh | bash -s -- --install-only\n```\n\n## Trust and security\n\nThe Ask-Claude install is a remote document that instructs an AI to run `curl | bash` and\ntouch `~/.claude/settings.json`. That shape is exactly what a prompt-injection attack looks\nlike, so a Claude that red-flags it before proceeding is behaving correctly. The answer to\nthat skepticism is inspection, not trust:\n\n- **Read what runs.** Everything is in this repo: [install.sh](./install.sh) (about 270\n  lines) copies files and merges the core `statusLine` key into `settings.json`; the optional\n  `subagentStatusLine` key is written only after an explicit yes. [INSTALL.md](./INSTALL.md)\n  is the playbook the AI follows. Have your Claude read both before approving anything; that\n  is the intended flow.\n- **Pin a release.** `... | bash -s -- --ref v0.9.1` installs a tagged release instead of\n  `main`, so what you audited is what you run. The interactive installer already offers the\n  latest tag by default.\n- **What gets written, exactly:** files under `~/.claude/coralline/`, your choices in\n  `~/.claude/coralline.conf`, and the core `statusLine` entry in\n  `~/.claude/settings.json`. If you explicitly enable themed subagent rows, coralline also\n  writes `subagentStatusLine`. A timestamped `settings.json.bak.*` backup is created before\n  either merge; no other Claude settings are changed.\n- **What runs afterwards:** `statusline.sh` renders on every prompt. It is pure bash and\n  makes zero network requests at runtime. A main render uses one `jq` and at most one `git`;\n  a subagent-panel render uses one `jq`, no `git`, and Bash builtins for local role metadata.\n  Your prompts, keys, and usage data never leave the machine.\n- **Why INSTALL.md addresses the AI:** humans get the visual wizard, AIs get an interview\n  script, so the playbook speaks to the reader that executes it. A document that opens by\n  addressing your AI deserves scrutiny, which is why every artifact it references lives in\n  this repo where both of you can read it first.\n\n### Uninstall\n\nIf you enabled themed subagent rows, remove their settings entry before deleting the tools:\n\n```bash\nbash ~/.claude/coralline/configure.sh --subagent-rows=off\nrm -rf ~/.claude/coralline ~/.claude/coralline.conf\n```\n\nThen delete the `statusLine` block from `~/.claude/settings.json` (or restore the newest\n`settings.json.bak.*`). If you skipped the first command, also delete `subagentStatusLine`.\n\n## Setup\n\nBoth paths use the same installer. Humans run it with no mode and get the visual setup. Claude\nuses it with `--install-only`, then follows `INSTALL.md` to interview you and write config.\n\n### Setup modes\n\n| Mode | Use when |\n|---|---|\n| Default | You want the coralline default immediately |\n| Powerlevel10k import | You already have `~/.p10k.zsh` and want to carry over its style, time format, and main colors |\n| Visual wizard | You want to preview themes, style, segments, wrapping, clock, and font compatibility before writing config |\n\nRunning the installer yourself with no mode opens the interactive setup. Claude should not\noperate that TUI unless you explicitly ask for visual customization.\n\n### Reconfigure\n\nEvery install path copies the wizard into `~/.claude/coralline`, so you can rerun it anytime to\nrestyle:\n\n```bash\nbash ~/.claude/coralline/configure.sh\n```\n\n### Testing a fork\n\nPoint the installer at the same fork:\n\n```bash\ncurl -fsSL https://raw.githubusercontent.com/YOU/coralline/main/install.sh | bash -s -- --repo YOU/coralline\n```\n\n## Configuration\n\nEverything lives in `~/.claude/coralline.conf` (plain bash, sourced by the script):\n\n| Variable | Default | Meaning |\n|---|---|---|\n| `VL_STYLE` | `pill` | `pill`: powerline pills · `lean`: flat colored text · `classic`: lean on a uniform dark bar (p10k classic) |\n| `VL_LAYOUT` | `fixed` | `fixed`: one line per `VL_SEGMENTS*` var · `auto`: responsive |\n| `VL_MAX_LINES` | `3` | `auto` only — wrap into at most this many lines (`1` = never wrap) |\n| `VL_WRAP_MARGIN` | `4` | `auto` only — columns kept free on the right so segments never touch the edge |\n| `VL_SEGMENTS` | `dir git model ctx limit5h limit7d cost clock` | segments on line 1, in order (the full list in `auto` mode) |\n| `VL_SEGMENTS2` / `VL_SEGMENTS3` | _(empty)_ | `fixed` only — optional second/third line |\n| `VL_CLOCK` | `12h` | `12h` / `24h` / `off` |\n| `VL_CLOCK_SECONDS` | `1` | show seconds in the clock |\n| `VL_BAR_WIDTH` | `5` | gauge width in cells |\n| `VL_PATH_DEPTH` | `4` | collapse paths deeper than this |\n| `VL_NAME_MAX` | `0` | max chars for the `project` / `git` names before `…` truncation (`0` = off) |\n| `VL_COST_DECIMALS` | `2` | decimal places for the cost segment |\n| `VL_WARN_PCT` / `VL_HOT_PCT` | `50` / `75` | gauge color thresholds |\n| `VL_ASCII` | `0` | `1` disables Nerd Font glyphs |\n| `VL_RUNTIME_PROBE` | `0` | `node` / `python`: `1` = also detect via `node` / `python3` on `PATH` when no pin file (forks per render) |\n| `VL_BG_*` / `VL_FG_*` | theme | colors — `256`-color index or `\"R,G,B\"` |\n\n### Burn-rate segment\n\n![The burn segment in a full statusline, and each of its states](./assets/burn-segment.png)\n\nOff by default. Add `burn` to `VL_SEGMENTS` to show a \"range to empty\" — the projected\ntime until whichever rate limit (5h or 7d) binds first, e.g. `↗ 5h ⇢ 1h58m`. Keys:\n`CORALLINE_BURN_WINDOW` (recent-slope lookback, default 600s), `VL_BURN_GLYPH` (default\n`↗`), `VL_BG_BURN` (defaults to the 5h background). While `burn` is in the segment list,\ncoralline writes samples to `~/.claude/coralline/burn-5h.tsv`; drop it from the list and\nnothing is written.\n\nThe ETA is coloured by urgency against the window reset, and collapses to a glyph when a\nnumber would be noise:\n\n| You see | When |\n|---|---|\n| `↗ 5h ⇢ 1h58m` **red** | you'd empty *before* the window resets |\n| `↗ 5h ⇢ 1h58m` **yellow** | reset and empty are a close call |\n| `↗ 5h ⇢ 1h58m` **green** | the window resets with room to spare |\n| **bright** `↗ ✓` | at this pace a full window can't run dry — a number like `24d15h` would just be noise |\n| **dim** `↗ ✓` | idle: you've stopped burning, nothing in flight |\n| **dim** `↗ …` | warming up: a cold start with no samples yet (deliberately *not* a green check, so a fresh install doesn't read as healthy) |\n\nThe label tells you which limit binds — whichever of `5h`/`7d` will hit 100% soonest.\n`5h` only appears once you're burning hard enough to register at least two integer-%\nsteps within the recent window; at a light or steady pace there's no short-term slope to\nfit, so the 7d projection binds and you see `↗ 7d`.\n\n### Cross-session limit sync (optional)\n\n`VL_LIMIT_SYNC=1` makes `limit5h` / `limit7d` show the freshest rate-limit reading any of your sessions has seen, instead of just this session's own snapshot. Each render records its `5h` / `7d` value to a small per-host store (`limit-5h.d` / `limit-7d.d`), and the segments display the highest percentage recorded for the current window. Off by default.\n\nThis exists because Claude Code re-renders a session's statusline only when that session is active, and the rate-limit numbers it passes are that session's last-seen values. So idle sessions show stale, divergent percentages. With sync on, every session converges to the latest known value the next time it redraws.\n\n\u003e **It only updates on redraw.** It cannot refresh a session that is not redrawing at all, and \"latest known\" is only as fresh as your most recently active session. coralline has no API access. So this narrows the gap between sessions, it does not make a fully idle bar live.\n\nSingle-session users gain nothing from it (there is only one snapshot), so it stays opt-in.\n\n### Responsive layout\n\nWith `VL_LAYOUT=\"auto\"` the bar stays on a single line while it fits, and greedily wraps into\nup to `VL_MAX_LINES` rows when the window gets narrow. Once the line cap is reached, remaining\nsegments overflow on the last line. `VL_WRAP_MARGIN` keeps a few columns free on the right so\nwrapped lines never butt against the window edge — raise it if your terminal adds padding.\n\nWidth comes from `$COLUMNS`. Claude Code v2.1.153+ sets `COLUMNS` to the current terminal width\nbefore running the status line, so wrapping responds to window resizing out of the box. Outside\nClaude Code the script falls back to `stty size` on the controlling terminal; if neither is\navailable it stays on one line.\n\n```text\nwide window:    ~/dev/app  ⎇ main  ◆ Fable 5  ⬡ ▰▰▰▱▱ 62%  5h ▰▰▱▱▱ 41%  $1.23  ⊙ 14:45\n\nnarrow window:  ~/dev/app  ⎇ main  ◆ Fable 5\n                ⬡ ▰▰▰▱▱ 62%  5h ▰▰▱▱▱ 41%  $1.23  ⊙ 14:45\n```\n\nPrefer a layout that never moves? Keep `VL_LAYOUT=\"fixed\"` and pin rows with\n`VL_SEGMENTS` / `VL_SEGMENTS2` / `VL_SEGMENTS3`.\n\n### Lean style\n\nPrefer Powerlevel10k's *lean* look — no backgrounds, just colored text? Set\n`VL_STYLE=\"lean\"` and each segment's `VL_BG_*` color becomes its text accent instead:\n\n![Lean style compared with pill style](./assets/style-lean.png)\n\n| Variable | Default | Meaning |\n|---|---|---|\n| `VL_STYLE` | `pill` | set to `lean` for the flat look |\n| `VL_LEAN_SEP` | _(empty)_ | extra text between segments, e.g. `·` |\n| `VL_LEAN_FG` | _(empty)_ | force a text color; empty = inherit each segment's accent |\n| `VL_LEAN_BG` | _(empty)_ | paint one uniform background behind the row — `\"R,G,B\"` or 256 index. For the full p10k *classic* look, prefer the `VL_STYLE=\"classic\"` preset below — it wires this up for you |\n| `VL_LEAN_CAP_R` | _(empty)_ | trailing cap glyph drawn in the `VL_LEAN_BG` color to bevel the bar's end into the terminal (p10k's end separator, e.g. `$''`); needs `VL_LEAN_BG` |\n| `VL_LEAN_CAP_L` | _(empty)_ | leading cap glyph — the left-facing mirror of `VL_LEAN_CAP_R` at the bar's start (e.g. `$''`); needs `VL_LEAN_BG`. Stock p10k *classic* leaves it flat |\n\n\u003e **Tip:** already a p10k user? Tell the AI installer or the visual wizard to import your\n\u003e `~/.p10k.zsh` — it will carry over your style, colors, and time format after you opt in.\n\u003e See the [AI interview notes in INSTALL.md](./INSTALL.md#ai-interview).\n\n### Classic style\n\nWant Powerlevel10k's stock *classic* prompt — one uniform dark bar with colored\ntext and a solid end cap? Set `VL_STYLE=\"classic\"`. It's a one-word preset: it\nrenders like `lean` on a dark bar (p10k's `POWERLEVEL9K_BACKGROUND`) with a\ntrailing powerline cap, no other knobs required.\n\n![Classic style](./assets/style-classic.png)\n\n| Variable | Default | Meaning |\n|---|---|---|\n| `VL_STYLE` | `pill` | set to `classic` for the p10k dark-bar look |\n| `VL_BG_BAR` | _(empty → `238`)_ | the uniform bar color behind the row — `\"R,G,B\"` or 256 index. Any theme's palette rides this bar; grayscale palettes (e.g. `mono`) want an explicit `VL_BG_BAR` for contrast |\n\nUnder the hood `classic` is `lean` plus a `VL_LEAN_BG` (from `VL_BG_BAR`) and a\n`VL_LEAN_CAP_R` end cap, so an explicit `VL_LEAN_BG` or cap still wins. Importing\na p10k *classic* config carries over your exact bar color and separator.\n\n## Float readout (optional)\n\n`VL_FLOAT=1` makes `statusline.sh` write a one-line **plain-text** readout to\n`~/.claude/coralline/float.txt` on every render (segments from\n`VL_FLOAT_SEGMENTS`, default `model ctx cost`). That's all coralline does —\nit ships **no display carrier**. The file is the seam: pipe it wherever you want\na glanceable readout that stays visible without looking at Claude Code's bottom\nstatusline (a terminal status bar, tmux, a menu-bar app, …).\n\nThe readout is **plain text** (no ANSI color), so the default favors stable,\nglance-friendly segments and leaves the color-driven limit warnings\n(`limit5h` / `limit7d`) in the bottom statusline, where threshold colors work.\nYou can still add them to `VL_FLOAT_SEGMENTS` if you want the numbers up top.\n\n**Config keys**\n\n| Key | Default | Meaning |\n|---|---|---|\n| `VL_FLOAT` | `0` | `1` = write `float.txt` each render |\n| `VL_FLOAT_SEGMENTS` | `model ctx cost` | segments rendered into the readout (plain text, no color) |\n| `VL_FLOAT_SEP` | `  ·  ` | separator between segments |\n| `VL_FLOAT_FILE` | `~/.claude/coralline/float.txt` | where the readout is written |\n\n(Or toggle `VL_FLOAT` via \"float readout\" in `configure.sh`'s Details menu.)\n\nA worked iTerm2 carrier (the `coralline-float` companion + setup steps) lives in\n[`example/float-display-iterm2/`](example/float-display-iterm2/) — copy it into\nyour dotfiles and adapt. Other terminals (tmux, WezTerm, a menu-bar app, …) just\nneed to read `float.txt` the same way.\n\n## Themes\n\n| | |\n|---|---|\n| **`claude-coral`** — steel blue · mauve · Claude coral (default)\u003cbr\u003e![claude-coral theme preview](./assets/theme-claude-coral.png) | **`catppuccin-mocha`** — soft pastels on dark\u003cbr\u003e![catppuccin-mocha theme preview](./assets/theme-catppuccin-mocha.png) |\n| **`nord`** — arctic frost\u003cbr\u003e![nord theme preview](./assets/theme-nord.png) | **`gruvbox-dark`** — warm retro\u003cbr\u003e![gruvbox-dark theme preview](./assets/theme-gruvbox-dark.png) |\n| **`tokyo-night`** — neon on deep navy\u003cbr\u003e![tokyo-night theme preview](./assets/theme-tokyo-night.png) | **`mono`** — grayscale minimalism\u003cbr\u003e![mono theme preview](./assets/theme-mono.png) |\n| **`dracula`** — cyan · pink · purple on charcoal\u003cbr\u003e![dracula theme preview](./assets/theme-dracula.png) | **`lunar-pink`** — pink · cyan · yellow on near-black\u003cbr\u003e![lunar-pink theme preview](./assets/theme-lunar-pink.png) |\n| **`reverie`** — soft pastels · plum text on warm-dark\u003cbr\u003e![reverie theme preview](./assets/theme-reverie.png) | |\n\nA theme is just a `.conf` file assigning `VL_BG_*` / `VL_FG_*` — copy one, change the colors,\nand source yours from `coralline.conf` instead. PRs with new themes are welcome.\nThe wizard discovers themes automatically from `themes/*.conf` and nested collections such as\n`themes/best-themes/*.conf`, so adding a theme file does not require editing `configure.sh`.\n\n\u003e **Adding a theme?** Copy an existing `.conf`, set every `VL_BG_*` / `VL_FG_*`\n\u003e (including `VL_BG_EFFORT`; `VL_BG_BAR` is optional — only grayscale palettes need\n\u003e it, to keep the classic bar readable), add its name to the `THEMES` list in\n\u003e [`tools/render-screenshots.py`](./tools/render-screenshots.py), re-run it to generate\n\u003e `assets/theme-\u003cname\u003e.png`, and add a row to the table above. Please **don't regenerate\n\u003e `hero.png`** — it's a fixed sampler of the original six themes, not a full catalog.\n\n## Platform support\n\n| Platform | Status |\n|---|---|\n| macOS | ✅ supported (works on the stock bash 3.2) |\n| Linux | ✅ supported |\n| Windows + Git Bash | ✅ supported — Claude Code runs the status line through Git Bash when it's installed |\n| Windows without Git Bash | ❌ not yet — Claude Code falls back to PowerShell, which can't run the bash script ([roadmap](https://github.com/Nanako0129/coralline/issues)) |\n\n\u003e **Windows note:** install [Git for Windows](https://git-scm.com/download/win) (which bundles\n\u003e Git Bash) and `jq`, and coralline runs natively. A native PowerShell port for the no-Git-Bash\n\u003e case is on the roadmap. The render path is built to stay cheap under Git Bash's emulated\n\u003e `fork()` — one `jq`, one `git`, and no per-field subprocess spawning.\n\n## Why it's fast\n\nThe statusline is just a local shell script: it makes no network or API calls and uses zero\ntokens. Claude Code pipes the session JSON to it on stdin and renders whatever it prints.\n\nIt runs every second (`refreshInterval: 1`), so the script is built to be cheap on CPU: one\n`jq` invocation extracts every field at once, and one `git status --porcelain=v2 --branch`\ncall provides branch, dirty state, and ahead/behind together. No `bc`, no per-field subprocess\nspam. Works on stock macOS bash 3.2 and any Linux bash.\n\n## Acknowledgements\n\nThe visual language of coralline — segmented pills, powerline transitions, the `⇡⇣` git\nglyphs, gauges that shift color as they fill — is a loving tribute to\n[Powerlevel10k](https://github.com/romkatv/powerlevel10k) by\n[@romkatv](https://github.com/romkatv), which set the bar for what a fast, beautiful prompt\ncan be. Thanks also to the wider [powerline](https://github.com/powerline/powerline) lineage\nthat started it all, and to [Nerd Fonts](https://www.nerdfonts.com/) for the glyphs that make\nthe pill shapes possible.\n\nAs for the name: coralline algae build reefs one thin, colorful layer at a time —\nand **coral·line** is exactly what this is: a line, in Claude's coral.\n\n## License\n\n[MIT](./LICENSE)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FNanako0129%2Fcoralline","html_url":"https://awesome.ecosyste.ms/projects/github.com%2FNanako0129%2Fcoralline","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FNanako0129%2Fcoralline/lists"}