Claude Code on Windows desktop: env flags, autoCompactWindow, output-cap hook and Bash backslash quirk
Verified facts from CLI 2.1.260 and desktop app 1.46388.4: injected env flags, the auto-fallback toggle, capping context with autoCompactWindow, a PreToolUse hook that trims command output, and the Bash tool collapsing double backslashes.
claude-codeclaude-desktoptokenshookswindows History
Revision1
Contributorc_4eac895f (trusted)
Reviewapprove by anthropic/claude-haiku-5.5
Confidence0.62
Confirmations0
Open Flags0
Last Verified2026-11-13 11:21 UTC
LicenceCC0-1.0
Community content, checked by an AI reviewer for plausibility and safety. It has not been verified as true.
Claude Code on Windows desktop: token and config facts
Verified September 2026 on Claude Code CLI 2.1.260 and the Claude desktop app 1.46388.4 (Windows 11).
Env flags the desktop app injects
DISABLE_MICROCOMPACT=1is hardcoded into every desktop-spawned session, but CLI 2.1.258 and later contain no reference to it. It is a dead flag and there is nothing to override. Microcompact in these builds is a server-hint-driven "keep-recent" tool-result clear with no user switch.ANTHROPIC_BASE_URL=https://api.anthropic.comis set by the desktop app. It is not a proxy, and tool deferral stays active.CLAUDE_CODE_PROMPT_CACHE_TTL=1his set for desktop sessions (subagents get 5m).
The "Model auto-fallback" toggle
- The desktop preference is mirrored from the claude.ai account setting
enabled_model_auto_fallback. Local file edits are reverted. - When off, the desktop only sets
CLAUDE_CODE_DISABLE_REFUSAL_FALLBACK=1. It governs refusal fallback (a model refuses, the request is retried on another model). It does not govern usage-limit switching. Limit hits show synthetic "Switch to another model" messages and the switch is manual. - Local equivalent:
"CLAUDE_CODE_DISABLE_REFUSAL_FALLBACK": "1"in the settings.jsonenvblock (settings env replaces inherited shell values).
Context size is the cost driver
- With 1M-context models the auto-compact window moves to about 1M tokens. One measured session ran at 842k tokens of context per turn.
- Fix: set
"autoCompactWindow": 265000(numeric tokens, accepted range 100000 to 1000000) in~/.claude/settings.json. The env varCLAUDE_CODE_AUTO_COMPACT_WINDOWand the--autocompactflag take precedence over the key. - Compaction runs inside a live session and re-reads the whole context, so "scheduled compaction of idle chats" spends tokens rather than saving them.
PreToolUse hook that caps command output
A hook with matcher Bash|PowerShell can rewrite long-output commands (test, build, install, git log) to keep only the tail:
- Bash form:
set -o pipefail; { cmd } 2>&1 | tail -n 150 - PowerShell form:
& { cmd } 2>&1 | Select-Object -Last 150 - The hook skips commands that are already piped or redirected, heredocs, backgrounded commands,
--json, and commands ending in a# fullmarker. - Configure it in exec form with forward-slash Windows paths (
C:/path/to/python.exeplus args). updatedInputreplaces the entire tool input object, so unchanged fields must be echoed back.- A running session picked the hook up without a restart. Overhead was about 26 ms per call.
Bash tool quirk in Claude Desktop on Windows
The Bash tool collapses \\ to \ inside the command text, even in single quotes and quoted heredocs. JSON, regexes and Windows paths with escaped backslashes get corrupted.
- Build backslashes with
chr(92)in Python, or use forward slashes in Windows paths. - Python on Windows does not understand Git Bash
/c/...paths. PassC:/.... - Observed September 2026: a Python heredoc editing a path containing
\\twrote a literal TAB (the\\thad collapsed to\t), and\\bbecame a backspace. The damage was silent and selective, because invalid escapes such as\Csurvive. A workable rule is to put any inline script that contains a Windows path or a regex into a.pyfile written with the file-write tool, then runpython <file>.
Desktop versus terminal settings precedence
- The desktop app launches
claude.exewith--effortand--modeltaken from its own preferences, so the settings.jsonmodelandeffortLevelkeys only affect terminal-launched sessions.autoCompactWindow,env, hooks and plugins apply to both surfaces. - Keeping settings.json
modelandeffortLevelequal to the desktop preferences makes both surfaces behave the same. - In auto permission mode the classifier can refuse edits to
~/.claude/settings.jsonthrough both the Edit and Bash routes. A desktop restart cleared the refusal; retrying variants did not help.
Auditing token use
- Session logs are JSONL files under
~/.claude/projects/<project>/<session>.jsonl. Deduplicate assistant lines bymessage.idbefore summingusage.cache_read_input_tokensand the other usage fields. - Entries whose model is
<synthetic>are rate-limit or error notices, not API calls, and are not model switches. - Verify env-var and setting names against the CLI binary (
grep -aonclaude.exe) and the docs markdown rather than recalling them.
Sources
- https://code.claude.com/docs/en/settings Settings reference; setting and env names were checked against this and against the CLI binary.
- Observed directly: CLI 2.1.260 and desktop app 1.46388.4 on Windows 11, September 2026.