When a status line script fails, Claude Code does not show an error. It shows nothing. That makes problems look mysterious, but the causes are few and well known. Statusline Studio has a check that finds them in one paste.
Run the one-paste check
Click Not working? (next to the code, or in the install guide). The guide shows a command that starts with bash <<'STATUSLINE_CHECK'. Click Copy check, paste it into a terminal and press Enter.
It checks, in order of how often each goes wrong:
- That the script exists in
~/.claude/ - That it is executable, or that
settings.jsonruns it through its interpreter, which needs no permission - That every tool it needs is installed, like
jq, with the command that installs it on your system (winget in Git Bash, brew on macOS, apt on Linux) - That
~/.claude/settings.jsonexists, is valid JSON and has thestatusLinesetting - That the project you are in does not set its own status line in
.claude/settings.jsonor.claude/settings.local.json - That no settings file turns the status line off with
"disableAllHooks": true - That the script runs with sample data, and what it prints or which error it gives (a Bash script without
jqsays so here too)
Each problem is shown with a red cross and the fix under it. When everything passes it prints the output, and the only thing left to do is restart Claude Code.
Fix the permission problem
A script saved from a browser always loses its executable permission. That only matters when settings.json runs the file itself ("command": "~/.claude/statusline.sh"): Claude Code then gets "Permission denied" and shows nothing.
chmod +x ~/.claude/statusline.shThe same happens when you download a new version over the old one. The studio's settings.json and its install command avoid it for good: they run the script through its interpreter (bash ~/.claude/statusline.sh), which does not need the permission.
Find a script stuck in Downloads
The script has to live in ~/.claude/. If you downloaded it more than once, your browser may have named it statusline (1).sh.
ls ~/Downloads/*statusline*
cp ~/.claude/statusline.sh ~/.claude/statusline.sh.bak
mv ~/Downloads/statusline.sh ~/.claude/statusline.shThe second line keeps the script you had as statusline.sh.bak. Skip it on a first install, when there is nothing to keep.
Install a missing tool
"jq: command not found" means the Bash version needs jq:
sudo apt install jq # Debian, Ubuntu
brew install jq # macOS
winget install jqlang.jq # Windows: Git Bash does not include itOr switch the studio to Python or Node.js and install again. They need only their interpreter:
sudo apt install python3 # Debian, Ubuntu (Node.js: nodejs)
brew install python # macOS (Node.js: node)
winget install Python.Python.3.14 # Windows (Node.js: OpenJS.NodeJS.LTS)On Windows a python.org install has no python3; the install command then writes python or py -3 into the setting.
Check that nothing overrides your settings
You changed settings.json but nothing changed? Three reasons:
- Claude Code was not restarted
- The project has its own
.claude/settings.jsonor.claude/settings.local.jsonwith astatusLine, which wins in that project - A typo makes the JSON invalid, and Claude Code ignores the file
The one-paste check finds typos with jq, Python or Node.js, whichever you have. Or run one of these yourself (on Windows, python in place of python3):
jq empty ~/.claude/settings.json && echo "settings.json is valid"
python3 -m json.tool ~/.claude/settings.json >/dev/null && echo "settings.json is valid"
node -e 'JSON.parse(require("fs").readFileSync(process.argv[1], "utf8"))' ~/.claude/settings.json && echo "settings.json is valid"When it works in one folder but not in another
Claude Code runs the status line only in a folder you trusted, because the line is a command it runs. In a new folder, accept the trust dialog when Claude Code asks, and the line appears.
Two settings turn it off everywhere. "disableAllHooks": true in a settings file switches your status line off too; the check looks for it. And where an organisation manages Claude Code with allowManagedHooksOnly, only the status line from its managed settings runs. Ask whoever manages it.
To see why the line stays blank, start Claude Code with claude --debug. It logs what the script writes to stderr, and a run it skipped because the folder is not trusted yet.
Fix icons, colours and empty git segments
- Boxes or question marks instead of icons: your terminal font lacks those symbols. Pick a Nerd Font in your terminal, or set Icons to Text in Theme and install again.
- Colours are missing or look wrong: your terminal may not support 24-bit colour. Turn off 24-bit colour in Theme and install again.
- Git segments are empty: they only show inside a git repository, and git must be installed (
git --version).
The next lesson builds the second kind of status line: the rows Claude Code shows for its subagents.