# coralline is a Powerlevel10k statusline for Claude Code, and its installer rewrites a setting you did not choose

> Eighteen segments with a Powerlevel10k look, rendered by either a Bash script or a native Windows PowerShell file, with rate-limit gauges, token counts, and a cache hit ratio. The engineering here is unusually honest about its edges: the cache countdown is documented as the last render rather than a live clock, the curl-to-bash line is documented as fetching mutable main, and the native installer is documented as replacing your refresh interval on every run.

**Nanako0129/coralline** — 🪸 Powerlevel10k-inspired statusline for Claude Code — paste one prompt and your AI interviews you, then installs it

- Repository: https://github.com/Nanako0129/coralline
- Stars: 544 · Forks: 42
- Language: PowerShell
- License: MIT
- Published: 2026-09-15 · Updated: 2026-09-15 · Language: en
- Canonical page: https://hysenlabs.com/projects/nanako0129-coralline

## Eighteen segments, and eight of them ship enabled

The segment table is the whole configuration surface, and the default column matters more than the list. On by default: dir for the current directory with long paths collapsed, git for branch plus staged, modified, untracked, ahead, and behind markers, model for the active Claude model, ctx for the context gauge with input, output, and cache token counts, limit5h and limit7d for the five-hour and seven-day rate-limit gauges with reset countdowns, cost for session cost in USD, and clock as a 12 or 24 hour clock. That is eight. Off by default and worth knowing about: project for a worktree-stable repository name, node and python runtime detection, effort for reasoning effort across low, med, high, xhigh, and max, cache for the prompt-cache hit ratio, burn for the projected time until the binding limit reaches 100%, lines added and removed this session, style, duration, and stash. Two of the defaults are conditional rather than unconditional.

## Gauges go yellow at 50% and red at 75%, and cache reads the same rule backwards

Every gauge uses one threshold pair, and both numbers are configurable: green becomes yellow at 50% and red at 75%. The cache segment then inverts the meaning, because a high hit ratio is the good outcome rather than a resource being consumed. It turns yellow at 50% and red at 25%, which means the same visual colour carries opposite news depending on which segment you are looking at. That is a defensible choice and an easy one to misread at a glance, so it is worth knowing before you trust a colour. The runtime segments have their own hiding rules rather than gauge rules. node and python show an active version, a pinned version, or a PATH probe when VL_RUNTIME_PROBE=1, and hide themselves entirely when nothing is detected, so a segment that is missing means undetected rather than zero.

## The cache countdown is the value at the last render, not a live clock

This is the most precisely documented behaviour in the README and the easiest to get wrong if you assume otherwise. The cache segment needs Claude Code v2.1.263 or newer, which is where prompt_cache first appears in the statusline payload, and it hides itself before the session's first request has been made. Below an hour the countdown carries seconds, showing values like 10m12s or 42s; above an hour it drops them, showing 1h06m. Once the cache has gone cold, or if it never warmed at all, the countdown is replaced by the word cold. The percentage itself is the session's cumulative hit ratio, so it stays accurate and is never zeroed, which means the marker tells you whether there is still a cache behind the number rather than resetting. The countdown is the value at the last render, because Claude Code refreshes on payload events and once at the expiry itself, not every second, unless you set statusLine.refreshInterval in your settings.

## The one-line install fetches mutable main, and the README says so

There are two documented ways in and both have a caveat attached. The first asks an agent to do it: paste a short prompt into Claude Code telling it to fetch INSTALL.md from the repository's main branch and follow the playbook. Claude routes by environment, asks before changing preferences, and picks the right installer. The README immediately notes that this fetches a mutable main/INSTALL.md and advises reviewing it first or pinning the playbook, installer, and payload to the same audited commit. The second is the shell one-liner, which pipes the installer straight into bash from the same mutable branch:

```bash
curl -fsSL https://raw.githubusercontent.com/Nanako0129/coralline/main/install.sh | bash
```

That installer recommends the latest tagged release or lets you choose mutable main, and passing --ref v0.18.1 or another ref skips the prompt entirely. The pattern is consistent and worth internalising: the convenience path tracks the branch, and pinning is your job. Bash environments on macOS, Linux, and Windows all use this script, and it needs jq plus a Nerd Font, with VL_ASCII=1 available for a glyph-free rendering.

## The PowerShell bootstrap resolves a ref to a commit before it downloads anything

The native Windows path is built differently, and the difference is the most security-conscious thing in the project. The bootstrap line assigns a repository and a ref, then validates both before it does anything else: the repository name has to match a constrained owner-and-name pattern, and the ref has to match a pattern of its own, stay under 200 characters, and contain no parent-directory sequence, no double slash, no at-sign brace, no trailing slash or dot, and no path segment ending in .lock. It then resolves the ref to a concrete commit and passes that same commit to install.ps1. The documentation spells out the consequence: a branch or a tag can move, the bootstrap resolves it first, and for an audited release you copy the line and change only the ref to a tag or a 40-character SHA. The Bash one-liner has no equivalent step, so the two paths have different guarantees despite covering the same installer.

## Re-running install.ps1 rewrites refreshInterval whether you chose it or not

One setting is decided for you, and the README explains why in a way that earns trust. install.ps1 writes a refresh interval of 2 rather than 1 for the native renderer. The reason is a Claude Code behaviour rather than a preference: an in-flight statusline render is aborted the moment the next refresh tick fires, and the native PowerShell renderer takes close to a second, so a one-second tick can abort every render before it finishes. The catch is that re-running install.ps1 replaces the whole statusLine value on every run. So an existing refreshInterval, whether you had set 1, 5, or anything else, becomes 2 when the native renderer is selected and 1 when the Bash renderer is. Nothing warns you before this happens, and nothing preserves your value, so if you tuned that number by hand it is worth recording elsewhere before you reinstall.

## Runtime auto picks Bash only when Git for Windows and jq are both there

The renderer is chosen by a flag, and the default does real detection rather than guessing. auto selects the Bash renderer, running statusline.sh through Git Bash with a refresh interval of 1, only when Git for Windows is installed for all users in its standard location, taken from the InstallPath under the Git for Windows registry key with the Program Files path as the fallback, and that bash.exe can find jq on PATH. Otherwise it falls back to the native renderer. It prints which runtime it selected and, after a fallback, why, which is the behaviour you want from an installer that silently changes your rendering engine. Forcing it is possible in both directions: native keeps the native renderer and never probes for Git Bash at all, and bash requires both Git Bash and jq and stops before changing anything if they are missing. The native renderer itself needs no Bash, no jq, no WSL, no archive extractor, and no Git.

## The installer replaces ten themes and never touches coralline.conf

What gets overwritten is stated precisely, which is rarer than it should be. The native installer manages statusline.ps1 and the ten shipped themes, and adds statusline.sh when it selects the Bash runtime. It merges the top-level statusLine value precisely rather than clobbering the object, and it preserves subagentStatusLine unless you explicitly pass on or off. It never creates or edits coralline.conf, so your own configuration file is outside its reach, and custom themes, state, and float output sit outside the replacement set as well. That is a clean contract, and the README points at the current INSTALL.md for it and at the historical native installer pull request for the reasoning. Around it sit a Traditional Chinese README, an UPGRADE.md, and a BENCHMARK.md, so the project documents its own upgrade path and its measurements as first-class files.

## Conclusion

Use it if you read a statusline many times an hour and want rate-limit headroom visible before it runs out, and if you are on Windows without Git Bash you are better served than most of the alternatives, since the native renderer needs no Bash, no jq, and no WSL. Read the trust section before you run anything, because the one-line path fetches mutable main by design and the fix is to pin a ref. And if you have set refreshInterval yourself, note it in a comment somewhere, because re-running the installer will decide it for you again.

## FAQ

### What is coralline for Claude Code?

It is a statusline inspired by Powerlevel10k with native Bash and Windows PowerShell renderers. It offers eighteen segments, eight enabled by default, including the current directory, git state, the active Claude model, a context gauge with token counts, five-hour and seven-day rate-limit gauges with reset countdowns, session cost, and a clock.

### How do I install coralline without Git Bash on Windows?

Use the native Windows PowerShell 5.1 renderer, statusline.ps1. It needs no Bash, no jq, no WSL, no archive extractor, and no Git, though git.exe is optional and only enables the git, stash, and project segments. The bootstrap resolves its ref to a commit before downloading installer code.

### What does the coralline cache segment show?

The prompt-cache hit ratio and a countdown to the cache expiring, or the word cold once it has. It needs Claude Code v2.1.263 or newer, hides before the session's first request, shows seconds below an hour and not above, and the percentage is the session's cumulative ratio, never zeroed.

### Is the coralline one-line install safe?

The README flags it. The one-line path fetches mutable main over the network, and the agent path fetches a mutable main/INSTALL.md, so the advice is to review the playbook first or pin the playbook, installer, and payload to the same audited commit. The install script also accepts a ref so you can skip the prompt and choose a tag.

### Will reinstalling coralline change my refreshInterval?

Yes. install.ps1 replaces the whole statusLine value on every run, writing a refresh interval of 2 for the native renderer and 1 for the Bash renderer. The native value is 2 because Claude Code aborts an in-flight render when the next tick fires and the PowerShell renderer takes close to a second.

## Sources

- [Issues](https://github.com/Nanako0129/coralline/issues)
- [License: MIT](https://github.com/Nanako0129/coralline/blob/main/LICENSE)
- [Nanako0129/coralline on GitHub](https://github.com/Nanako0129/coralline)
- [README](https://github.com/Nanako0129/coralline/blob/main/README.md)
- [Releases](https://github.com/Nanako0129/coralline/releases)

---

Hysen Labs editorial analysis, written from the project's own repository and release notes. Cite the canonical page: https://hysenlabs.com/projects/nanako0129-coralline
