SSD Nodes Learn Hosting plans →
मार्गदर्शक Matt Connorद्वारे Matt Connor · अपडेटेड 2026-08-29

VPS वर Claude Code statusline कशी सेट करावी

statusLine script चे stdout prompt खाली दाखवते. hostname, directory, git branch आणि model पाहण्यासाठी सेटअप करा, म्हणजे योग्य server वरच बदल करता येतील.

Claude Code statusline काय दाखवते

Claude Code statusline ही prompt च्या खाली दिसणारी एक ओळ आहे. त्यात तुम्ही लिहिलेल्या script चे output दाखवले जाते. तुम्ही statusLine block settings.json मध्ये जोडता आणि त्याला एका command कडे निर्देशित करता. Claude Code तो command चालवतो, session state JSON स्वरूपात standard input वर पाठवतो आणि command ने standard output वर लिहिलेली कोणतीही माहिती दाखवतो.

हा संपूर्ण करार आहे. तुमची script standard input वरून JSON वाचते आणि standard output वर text लिहिते. ती तुमच्या machine वर चालते. ती लिहित असलेली कोणतीही माहिती model कडे पाठवली जात नाही. त्यामुळे त्यासाठी tokens खर्च होत नाहीत.

एकाच project असलेल्या laptop वर हे केवळ सजावटीचे आहे. तीन servers वर ते सुरक्षिततेसाठी महत्त्वाचे ठरते. प्रत्येक terminal मध्ये प्रत्येक Claude Code session सारखाच दिसतो. त्यामुळे labels नसलेल्या चार SSH windows मुळे migration चुकीच्या server वर लागू होऊ शकते. hostname ने सुरू होणारी statusline अशा प्रकारची चूक टाळते.

settings.json मध्ये statusLine सेटिंग कुठे असते

ती ~/.claude/settings.json येथील user settings मध्ये ठेवा. हे त्या मशीनवरील प्रत्येक project ला लागू होते. Repository मधील .claude/settings.json येथील project settings देखील वापरता येतात. त्या directory साठी त्यांना प्राधान्य मिळते.

{
  "statusLine": {
    "type": "command",
    "command": "~/.claude/statusline.sh"
  }
}

type नेहमी "command" असते. command value shell मधून चालवली जाते. त्यामुळे ती script path किंवा साधी command असू शकते. कोणतीही script लिहिण्यापूर्वी wiring कार्यरत आहे हे तपासा:

{
  "statusLine": {
    "type": "command",
    "command": "hostname -s"
  }
}

Claude Code सुरू करा आणि एक message पाठवा. Prompt खालील bar मध्ये आता server चे short hostname दिसेल. तो रिकामा राहिल्यास समस्या setting किंवा trust dialog मध्ये आहे; तुमच्या script मध्ये नाही. खालील "statusline रिकामी का राहते" हा विभाग वाचा.

August 2026 पासून तीन optional keys उपलब्ध आहेत. padding characters मध्ये horizontal spacing जोडते आणि तिची default value 0 आहे. refreshInterval सामान्य triggers व्यतिरिक्त प्रत्येक N seconds ने command पुन्हा चालवते. यासाठी किमान value 1 आहे. Line मध्ये clock किंवा session idle असताना बदलणारी माहिती दाखवायची असल्यासच हे वापरा. तुमची स्वतःची script vim mode दाखवत असल्यास hideVimModeIndicator अंगभूत -- INSERT -- text लपवते.

statusline script ला कोणता data मिळतो?

या पृष्ठासह, कुठेही वाचलेल्या field list वर विश्वास ठेवू नका. तुमची आवृत्ती प्रत्यक्षात पाठवते तो object capture करा. stdin फाइलमध्ये जतन करणारी तात्पुरती script लिहा:

cat > ~/.claude/statusline-capture.sh <<'EOF'
#!/bin/bash
cat > /tmp/statusline-input.json
echo "captured"
EOF
chmod +x ~/.claude/statusline-capture.sh

statusLine.command ला त्या फाइलकडे निर्देशित करा, session सुरू करा आणि एक message पाठवा. बार captured वाचतो. आता प्राप्त झालेला data पहा:

jq . /tmp/statusline-input.json

तुमच्या build साठी अचूक रचना तुमच्याकडे आहे. Update मुळे काही बदलल्यास ही प्रक्रिया पुन्हा कधीही करता येते.

August 2026 मध्ये दस्तऐवजीकरण केलेल्या स्थिर भागांमध्ये flat keys ऐवजी nested objects आहेत. model मध्ये id आणि display_name असतात. workspace मध्ये current_dir आणि project_dir असतात: current_dir session सध्या कुठे आहे ते दाखवते, project_dir session कुठून सुरू करण्यात आले ते दाखवते आणि session दरम्यान working directory बदलल्यावर ही दोन्ही मूल्ये वेगळी होतात. Top-level cwd मध्ये workspace.current_dir सारखेच मूल्य असते. context_window मध्ये token counts आणि पूर्वगणना केलेले used_percentage असते. cost मध्ये total_cost_usd आणि duration counters असतात. session_id session सुरू असेपर्यंत स्थिर राहते आणि sessions मध्ये unique असते. पुढे caching करताना हे महत्त्वाचे ठरते.

Schema बदलल्यानंतरही script कार्यरत ठेवण्यासाठी तीन नियम पाळा.

काही keys null नसतात; त्या अनुपस्थित असतात. Matching feature सक्रिय असतानाच vim, agent, pr, worktree आणि effort दिसतात. vim mode बंद असताना jq -r सह .vim.mode वाचल्यास literal string null print होते आणि तुमचा bar वाचकाला null दाखवतो. प्रत्येक selector ला // empty जोडा, म्हणजे missing key असल्यास काहीही print होणार नाही.

काही values सुरुवातीला null असतात. पहिला API response येण्यापूर्वी context_window.used_percentage आणि context_window.current_usage null असतात. /compact नंतर पुढील call त्यात पुन्हा value भरेपर्यंत current_usage देखील null होते. त्यामुळे bar वर context percentage दाखवण्यासाठी // 0 आवश्यक आहे; अन्यथा प्रत्येक session च्या सुरुवातीच्या काही seconds मध्ये null वाचले जाईल. हा number bar वर दाखवण्यापूर्वी context window प्रत्यक्षात कशी भरते हे समजून घेणे उपयुक्त ठरते.

git branch JSON मध्ये नसते. कोणतेही field ती दाखवत नाही. तुमच्या bar वर दिसणारी branch तुमची script स्वतः git चालवून मिळवते.

बिघाडण्याऐवजी fallback वापरणारी statusline script

ही copy-paste आवृत्ती आहे. ती hostname, working directory, git branch आणि model name दाखवते. प्रत्येक field साठी fallback आहे. त्यामुळे रिकामा JSON object असला तरी वापरण्यायोग्य line तयार होते.

#!/bin/bash
# ~/.claude/statusline.sh
input=$(cat)

# Read one field. Prints nothing when the key is missing or null.
field() { printf '%s' "$input" | jq -r "$1 // empty" 2>/dev/null; }

HOST=$(hostname -s 2>/dev/null)
[ -z "$HOST" ] && HOST="host"

DIR=$(field '.workspace.current_dir')
[ -z "$DIR" ] && DIR=$(field '.cwd')
[ -z "$DIR" ] && DIR="$PWD"

MODEL=$(field '.model.display_name')
[ -z "$MODEL" ] && MODEL="claude"

SHORT="$DIR"
if [ -n "$HOME" ]; then
  case "$DIR" in
    "$HOME") SHORT="~" ;;
    "$HOME"/*) SHORT="~/${DIR#"$HOME"/}" ;;
  esac
fi

BRANCH=""
if git -C "$DIR" rev-parse --git-dir >/dev/null 2>&1; then
  BRANCH=$(git -C "$DIR" branch --show-current 2>/dev/null)
  [ -z "$BRANCH" ] && BRANCH="detached"
fi

CYAN=$'\033[36m'
YELLOW=$'\033[33m'
DIM=$'\033[2m'
RESET=$'\033[0m'

LINE="${CYAN}${HOST}${RESET} ${SHORT}"
[ -n "$BRANCH" ] && LINE="${LINE} ${YELLOW}${BRANCH}${RESET}"
LINE="${LINE} ${DIM}${MODEL}${RESET}"

printf '%s\n' "$LINE"

प्रत्येक read field द्वारे होते. ते // empty जोडते. त्यामुळे renamed किंवा removed key असल्यास empty string मिळते आणि पुढील line default value देते. Directory साठी प्रथम workspace.current_dir, त्यानंतर cwd आणि शेवटी $PWD असा fallback वापरला जातो. Branch साठी साध्या git ऐवजी git -C "$DIR" वापरले जाते. त्यामुळे bar दाखवत असलेल्या directory शी branch नेहमी जुळते.

ती save करा आणि executable करा:

chmod +x ~/.claude/statusline.sh

Execute bit आवश्यक आहे. Claude Code ही command shell द्वारे चालवते. त्यामुळे +x नसलेली script Permission denied मुळे fail होते, stdout तयार होत नाही आणि कोणतीही दृश्यमान error न दाखवता row रिकामी राहते.

jq command line वर JSON parse करते. Fresh Ubuntu server वर ती installed नसते:

sudo apt update && sudo apt install -y jq

त्यानंतर setting ला script कडे निर्देशित करा. वरच्या पहिल्या settings.json block चा वापर करा.

स्क्रिप्टवर विश्वास ठेवण्यापूर्वी तिची चाचणी घ्या

ती हाताने दोनदा चालवा. प्रथम सामान्य session object सह:

echo '{"model":{"display_name":"Opus"},"workspace":{"current_dir":"/srv/api"},"session_id":"t1"}' | ~/.claude/statusline.sh

तुम्हाला hostname, त्यानंतर /srv/api आणि मग Opus मिळते. कोणतीही branch दिसत नाही, कारण तुमच्या मशीनवरील /srv/api बहुधा git repository नाही.

दुसरी चाचणी degradation test आहे. ही चाचणी अनेक जण वगळतात:

echo '{}' | ~/.claude/statusline.sh

Schema change मुळे मिळू शकणारी सर्वात वाईट स्थिती म्हणजे रिक्त object. ओळ तरीही hostname, $PWD मधील current directory आणि model name जिथे असायला हवे तिथे claude हा शब्द दाखवते. काहीही crash होत नाही आणि null देखील छापले जात नाही. ही चाचणी उत्तीर्ण होणारी स्क्रिप्ट एखादे field rename झाले तरी कार्यरत राहते, कारण तुमच्या स्क्रिप्टसाठी renamed field आणि missing field ही एकच घटना असते.

तुम्हाला काय दिसले पाहिजे

statusline अंगभूत footer badgesच्या वर स्वतःच्या ओळीत दिसते आणि त्या badgesना बदलत नाही. कार्यरत सेटअपमध्ये ती एकाच ओळीत दिसते: cyan रंगात short hostname, त्यानंतर home directory संक्षिप्त करून ~ केलेली working directory, directory git repository असल्यास yellow रंगात branch name आणि शेवटी dimmed स्वरूपात model name. त्या चार घटकांना रंग दिल्यास, परिणाम web-01 ~/api main Opus सारखा दिसतो.

session सुरू झाल्यावर, resume सहित, नवीन assistant message आल्यावर, /compact पूर्ण झाल्यावर, permission mode बदलल्यावर, vim mode toggle केल्यावर आणि तुम्ही refreshInterval tick सेट केल्यास त्या tick वेळी row तुमची script पुन्हा चालवते. Updates 300 ms ने debounce केले जातात. त्यामुळे बदलांची मालिका आली तरी script एकदाच चालते. Autocomplete, help menu आणि permission prompts दरम्यान bar लपते आणि त्यानंतर पुन्हा दिसते.

hostname प्रथम का असतो

तुम्ही एकापेक्षा अधिक server वर agents चालू ठेवता तेव्हा तुम्ही कुठे आहात हे सांगणारी एकमेव गोष्ट terminal असते; आणि terminals चुकीची माहिती देतात. tmux pane मधून दुसरे ssh connection उघडल्यावर window title मध्ये अनेकदा जुने नावच राहते, कारण title अशा shell ने सेट केलेले असते ज्याला तो हलवला गेला आहे हे कधीच समजलेले नसते. VPS वर detached tmux session मध्ये Claude Code चालू ठेवले आणि एक दिवसाने पुन्हा attach केले, तर screen वरील कोणतीही गोष्ट build server आणि production box यांच्यात फरक दाखवत नाही.

statusline वेगळी असते, कारण ती Claude Code स्वतः प्रत्येक session साठी त्या session कडे असलेल्या data मधून render करतो. ती चुकीच्या pane कडून inherit होऊ शकत नाही किंवा refresh न झालेल्या shell prompt मुळे जुनी राहू शकत नाही. statusline मध्ये दिसणारे नाव म्हणजे agent ज्या box वर files लिहित आहे तो box.

प्रत्येक server साठी स्वतंत्र colour द्या, म्हणजे वाचण्यापूर्वीच तो ओळखता येईल. LINE= assignment च्या वर खालील दोन lines जोडा:

CODE=$(printf '%s' "$HOST" | cksum | cut -d' ' -f1)
HOST_COLOR=$(printf '\033[%dm' "$((31 + CODE % 6))")

त्यानंतर ${CYAN} ऐवजी ${HOST_COLOR} वापरा. cksum hostname चा checksum print करतो. त्यामुळे दिलेले नाव 31 ते 36 या range मधील एकाच colour शी नेहमी जोडले जाते; या range मध्ये red ते cyan colours असतात. हीच script प्रत्येक box वर copy करा. प्रत्येक box स्वतःचे label दाखवेल.

directory सुद्धा याच कारणासाठी आवश्यक आहे. /srv/api आणि /srv/api-staging हे ssh command मध्ये एक keystroke अंतरावर असतात, पण त्यांच्या परिणामांमध्ये संपूर्ण incident इतका फरक असू शकतो. उरलेल्या जागेसाठी model आणि branch हे दोन घटक महत्त्वाचे आहेत: तुम्ही कोणते session resume केले आहे हे model सांगतो, आणि agent main वर commit करणार आहे की नाही हे branch सांगतो.

लहान screen वर हे सर्व अधिक स्पष्ट होते, कारण त्यासाठी window title चा आधार घेता येत नाही. तुमची रचना अशी असल्यास फोनवरून Claude Code चालवणे पहा.

स्क्रिप्ट जलद ठेवा

तुमची स्क्रिप्ट प्रत्येक assistant संदेशावर चालते. नवीन update आल्यावर Claude Code सुरू असलेली run रद्द करते. त्यामुळे स्क्रिप्ट धीमी असल्यास जुन्या मजकुराचे प्रदर्शन होते किंवा कोणताही मजकूर दिसत नाही.

प्रत्येक jq call ला काही milliseconds लागतात. git हा धीमा होणारा भाग आहे: cache रिकामा असताना मोठ्या repository मध्ये git status पूर्ण होण्यासाठी शेकडो milliseconds लागू शकतात. वरील स्क्रिप्ट जाणीवपूर्वक git status टाळते आणि git branch --show-current call करते. ते .git/HEAD वाचते आणि त्वरित परत येते.

तुम्ही अधिक वेळ घेणारी प्रक्रिया जोडत असल्यास, तिचा परिणाम file मध्ये cache करा आणि दर काही सेकंदांनी refresh करा. ही file session नुसार वेगळी ठेवा:

CACHE="/tmp/statusline-$(field '.session_id')"

session_id वापरा, $$ नाही. $$ हा तुमच्या स्क्रिप्टचा process ID आहे. प्रत्येक invocation मध्ये तो वेगळा असतो. त्यामुळे त्यावर आधारित cache कधीही सापडत नाही आणि प्रत्येक वेळी पूर्ण खर्च होतो. session_id संपूर्ण session मध्ये स्थिर असते आणि वेगवेगळ्या sessions मध्ये वेगळी असते. त्यामुळे दोन repositories मधील दोन Claude Code sessions एकमेकांच्या cached branch name वाचू शकत नाहीत. Sessions जाणीवपूर्वक अशा प्रकारे वेगळे ठेवलेले असतात. त्यामुळे एका session कडून दुसऱ्या session कडे काम सोपवण्यासाठी ठरवून केलेली कृती आवश्यक असते. यासाठी एका Claude Code session मधून दुसऱ्या Claude Code session कडे संदेश पाठवणे वापरले जाते.

आणखी एक मर्यादा लक्षात ठेवा: tput cols statusline script मध्ये कार्य करत नाही. Claude Code output capture करते आणि तुमची स्क्रिप्ट terminal शी जोडत नाही. त्यामुळे मोजण्यासाठी width उपलब्ध नसते. Claude Code command चालवण्यापूर्वी COLUMNS आणि LINES environment variables सेट करते. हे v2.1.153 आणि त्यानंतरच्या आवृत्त्यांमध्ये लागू आहे. किती मजकूर print करायचा हे ठरवताना $COLUMNS वाचा.

स्टेटसलाइन रिकामी का राहते

काहीही दिसत नाही. ls -l ~/.claude/statusline.sh वापरून execute bit तपासा आणि वरील mock input सह script हाताने चालवा. Shell मध्ये ओळ दिसत असेल, पण Claude Code मध्ये दिसत नसेल, तर claude --debug पासून सुरुवात करा. हे session मधील पहिल्या statusline run चा exit code आणि stderr नोंदवते.

Debug log मध्ये Status line command skipped: workspace trust not accepted असे दिसते. Statusline shell command चालवते. त्यामुळे hooks प्रमाणेच ती workspace trust gate मागे असते. त्या directory साठी trust dialog स्वीकारेपर्यंत command चालत नाही. VPS वर हे नेहमी घडते, कारण प्रत्येक नवीन clone ही Claude Code ने अद्याप न पाहिलेली directory असते. त्या directory मध्ये Claude Code पुन्हा सुरू करा आणि dialog स्वीकारा.

सर्व काही रिकामे आहे आणि disableAllHooks सेट केलेले आहे. settings.json मधील "disableAllHooks": true statusline देखील बंद करते, कारण तेच shell-execution gate वापरते. ते काढून टाका किंवा false वर सेट करा.

ओळ null दाखवते. jq selector अशा key पर्यंत पोहोचला आहे जी उपलब्ध नाही किंवा null आहे. jq -r null ला null या चार अक्षरांप्रमाणे दाखवते. Text साठी // empty आणि numbers साठी // 0 जोडा.

Script संपादित केल्यानंतर लगेच ओळ रिकामी होते. Non-zero exit होणारी किंवा काहीही output न देणारी command ओळ रिकामी करते. सामान्य कारण म्हणजे [ -n "$BRANCH" ] && LINE="..." सारखी शेवटची ओळ. Branch रिकामी असल्यास ती 1 ने exit होते आणि संपूर्ण script चा exit code 1 करते. printf शेवटी ठेवा किंवा exit 0 जोडा.

Escape codes bar वर literal text म्हणून दिसतात, उदाहरणार्थ \e]8;;. echo -e ऐवजी printf '%b' वापरा. Clickable OSC 8 links साठी त्यांना support करणारे terminal आवश्यक असते. तसेच tmux किंवा SSH ही sequences काढून टाकू शकतात. त्यामुळे remote box वर साधा colour अधिक सुरक्षित पर्याय आहे.

ओळीची उजवी बाजू कापली जाते. System notifications आणि verbose-mode token counter हे दोन्ही उजवीकडून त्याच ओळीमध्ये जागा घेतात. अरुंद terminal मध्ये त्यांचा overlap दिसत नाही. Output लहान ठेवा. Bar वरील संख्येऐवजी usage चे अचूक accounting पाहण्यासाठी Claude Code tokens कसे मोजते पहा.

FAQ

Claude Code statusline ची सेटिंग कुठे असते?

ही settings.json मधील statusLine ब्लॉकमध्ये असते. त्यात type ची किंमत "command" आणि command ची किंमत script path किंवा shell command असते. User settings ~/.claude/settings.json येथे असतात आणि त्या मशीनवरील प्रत्येक project ला लागू होतात. Project settings repository मधील .claude/settings.json येथे असतात आणि त्या directory साठी प्राधान्याने लागू होतात. Settings आपोआप reload होतात; परंतु बदल पुढील update trigger वरच दिसतो, उदाहरणार्थ तुमच्या पुढील message वेळी.

माझी Claude Code statusline रिकामी का आहे?

यामागील जवळजवळ सर्व कारणे चार प्रकारांत येतात. Script ला execute bit नसल्यामुळे shell Permission denied परत करतो आणि stdout वर काहीही पोहोचत नाही. Workspace trust dialog स्वीकारलेला नसतो आणि claude --debug मध्ये Status line command skipped: workspace trust not accepted log होते. disableAllHooks हे true असते, त्यामुळे त्याच gate अंतर्गत statusline बंद होते. किंवा script non-zero exit करते, त्यामुळे row रिकामी होते. प्रथम हाताने तपासा: echo '{}' | ~/.claude/statusline.sh ने काहीतरी print केले पाहिजे.

Statusline JSON मध्ये git branch असते का?

नाही. JSON मध्ये model, workspace directories, context window numbers आणि cost यांसारखी session state असते. त्यात git विषयी कोणतीही माहिती दिलेली नसते. तुमच्या bar वरील branch तुमच्या script मधून git branch --show-current call केल्याने येते. JSON मधील directory git -C "$DIR" द्वारे pass करा, म्हणजे bar ज्या directory दाखवत आहे त्याच directory शी branch नेहमी जुळेल.

Statusline साठी tokens खर्च होतात का किंवा session धीमे होते का?

Tokens खर्च होत नाहीत, कारण script स्थानिकरित्या चालते आणि त्याचे output model कडे कधीही पाठवले जात नाही. वेग राखण्याची जबाबदारी तुमची आहे. प्रत्येक assistant message वर command 300 ms debounce सह चालतो. नवीन update आल्यावर Claude Code चालू असलेले run cancel करते. त्यामुळे script ला पूर्ण एक सेकंद लागत असल्यास जुन्या मजकुराचे output दिसते. मोठ्या repositories मध्ये git status टाळा आणि धीम्या कामाचे output session_id वर आधारित नाव असलेल्या file मध्ये cache करा.

प्रत्येक server वर वेगळी statusline कशी दाखवू?

एकच script ठेवा आणि त्याला machine वाचू द्या. वरील script $HOSTNAME print करते आणि fallback म्हणून hostname -s वापरते. त्यामुळे प्रत्येक box वर तीच file copy केली तरी प्रत्येक box चे label योग्य येते. Checksum colour trick मुळे प्रत्येक hostname ला स्वतःचा colour मिळतो. एखाद्या server साठी वेगळा layout आवश्यक असल्यास, त्या box वर तुम्ही वापरत असलेल्या repository च्या project settings मध्ये statusLine ब्लॉक ठेवा, कारण त्या directory साठी project settings user settings वर प्राधान्य घेतात.