fix(server): fall back to a UTF-8 locale in terminal spawn env - #4827

Closed
Kaidstor wants to merge 2 commits into
pingdotgg:mainfrom
Kaidstor:fix/terminal-utf8-locale-fallback
Closed

fix(server): fall back to a UTF-8 locale in terminal spawn env#4827
Kaidstor wants to merge 2 commits into
pingdotgg:mainfrom
Kaidstor:fix/terminal-utf8-locale-fallback

Conversation

@Kaidstor

@KaidstorKaidstor commented Jul 29, 2026

Copy link
Copy Markdown

What Changed

The terminal manager now falls back to a UTF-8 locale when spawning a PTY whose environment defines neither LANG nor LC_ALL: en_US.UTF-8 on macOS, C.UTF-8 on Linux (the only one guaranteed to exist), nothing on Windows. An explicitly configured locale — even a non-UTF-8 one — and per-session runtime env overrides are left untouched. Two tests cover the fallback and the "explicit locale wins" case.

Why

GUI apps launched from the macOS Dock/Finder get no LANG/LC_* from launchd (Terminal.app and iTerm inject their own; the integrated terminal inherits the server process env instead). The PTY shell therefore starts in the single-byte C locale, and zsh's line editor mangles any multibyte input — typing non-ASCII text (e.g. Cyrillic) renders as raw bytes instead of characters:

❯ for�
❯ ???????<0080>?? # typing "фор…" — <0080> is the 2nd byte of UTF-8 "р"

Repro on macOS: launch the packaged app from the Dock, open the integrated terminal, run localeLANG="", LC_CTYPE="C"; then type any non-ASCII character.

VS Code works around the same launchd behavior with terminal.integrated.detectLocale; this is the minimal equivalent.

Checklist

  • This PR is small and focused
  • I explained what changed and why
  • I included before/after screenshots for any UI changes (terminal transcript above; no app UI changed)

Note

Low Risk
Small, localized change to terminal spawn environment with explicit-locale guardrails and tests; no auth or data-path impact.

Overview
Fixes integrated terminals starting in the C locale when the app is launched from the macOS Dock/Finder (launchd does not set LANG/LC_*), which caused zsh to mangle multibyte input.

withUtf8LocaleFallback runs after AppImage env scrubbing in createTerminalSpawnEnv. If neither LANG nor LC_ALL is set, it injects en_US.UTF-8 on macOS and C.UTF-8 on other non-Windows platforms; Windows and any explicit locale are unchanged. PTY spawn now passes platform into env construction.

Tests cover the macOS fallback and preserving an explicit non-UTF-8 LANG.

Reviewed by Cursor Bugbot for commit 7b709cb. Bugbot is set up for automated code reviews on this repo. Configure here.

Note

Fall back to a UTF-8 locale in terminal spawn env on non-Windows platforms

Introduces withUtf8LocaleFallback in Manager.ts to inject a LANG fallback when LC_ALL and LANG are absent from the spawn environment. On macOS the fallback is en_US.UTF-8; on other non-Windows platforms it is C.UTF-8. Windows and envs with an explicit locale are left unchanged. createTerminalSpawnEnv now accepts a platform argument and pipes the env through this fallback after stripping AppImage variables.

Macroscope summarized 7b709cb.

GUI apps launched from the macOS Dock/Finder inherit no LANG/LC_* from
launchd, so the integrated terminal's PTY shell starts in the single-byte
C locale and zsh's line editor renders multibyte input (any non-ASCII
text) as raw bytes like `<0080>`. Default LANG to en_US.UTF-8 on macOS
and C.UTF-8 on Linux when neither LANG nor LC_ALL is present; explicitly
configured locales and runtime env overrides stay untouched.
@coderabbitai

coderabbitaiBot commented Jul 29, 2026

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 465dd662-f96d-4876-85cf-76e4bbaa3b59

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@github-actionsgithub-actionsBot added vouch:unvouched PR author is not yet trusted in the VOUCHED list. size:S 10-29 changed lines (additions + deletions). labels Jul 29, 2026
@macroscopeapp

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Approved 83d4050

Straightforward bug fix that adds a UTF-8 locale fallback for terminal spawning when no locale is configured. The change is defensive, respects existing user settings, and includes test coverage for both the fallback and preservation behaviors.

You can customize Macroscope's approvability policy. Learn more.

@Kaidstor

Copy link
Copy Markdown
Author

?

@t3dotgg

Copy link
Copy Markdown
Member

Note

🤖 GPT-5.6 Sol responding on behalf of Theo

We're closing this PR as we clean up the T3 Code backlog. Thank you for taking the time to put this together.

Closing the server-wide LANG fallback. The desktop macOS launch problem now has a narrower fix that respects existing locale settings and supplies LC_CTYPE only when needed. This patch changes every non-Windows terminal spawn. A remaining standalone-server or Linux failure needs its own current reproduction. Related work: #6236.

If you believe we closed this in error, please reopen the PR and leave a comment explaining what we missed. If GitHub does not let you reopen it, leave a comment here and we'll take another look.

@t3dotggt3dotgg closed this Aug 27, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:S10-29 changed lines (additions + deletions).vouch:unvouchedPR author is not yet trusted in the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@Kaidstor@t3dotgg
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

fix(server): fall back to a UTF-8 locale in terminal spawn env - #4827

Closed
Kaidstor wants to merge 2 commits into
pingdotgg:mainfrom
Kaidstor:fix/terminal-utf8-locale-fallback
Closed

fix(server): fall back to a UTF-8 locale in terminal spawn env#4827
Kaidstor wants to merge 2 commits into
pingdotgg:mainfrom
Kaidstor:fix/terminal-utf8-locale-fallback

Conversation

@Kaidstor

@KaidstorKaidstor commented Jul 29, 2026

Copy link
Copy Markdown

What Changed

The terminal manager now falls back to a UTF-8 locale when spawning a PTY whose environment defines neither LANG nor LC_ALL: en_US.UTF-8 on macOS, C.UTF-8 on Linux (the only one guaranteed to exist), nothing on Windows. An explicitly configured locale — even a non-UTF-8 one — and per-session runtime env overrides are left untouched. Two tests cover the fallback and the "explicit locale wins" case.

Why

GUI apps launched from the macOS Dock/Finder get no LANG/LC_* from launchd (Terminal.app and iTerm inject their own; the integrated terminal inherits the server process env instead). The PTY shell therefore starts in the single-byte C locale, and zsh's line editor mangles any multibyte input — typing non-ASCII text (e.g. Cyrillic) renders as raw bytes instead of characters:

❯ for�
❯ ???????<0080>?? # typing "фор…" — <0080> is the 2nd byte of UTF-8 "р"

Repro on macOS: launch the packaged app from the Dock, open the integrated terminal, run localeLANG="", LC_CTYPE="C"; then type any non-ASCII character.

VS Code works around the same launchd behavior with terminal.integrated.detectLocale; this is the minimal equivalent.

Checklist

  • This PR is small and focused
  • I explained what changed and why
  • I included before/after screenshots for any UI changes (terminal transcript above; no app UI changed)

Note

Low Risk
Small, localized change to terminal spawn environment with explicit-locale guardrails and tests; no auth or data-path impact.

Overview
Fixes integrated terminals starting in the C locale when the app is launched from the macOS Dock/Finder (launchd does not set LANG/LC_*), which caused zsh to mangle multibyte input.

withUtf8LocaleFallback runs after AppImage env scrubbing in createTerminalSpawnEnv. If neither LANG nor LC_ALL is set, it injects en_US.UTF-8 on macOS and C.UTF-8 on other non-Windows platforms; Windows and any explicit locale are unchanged. PTY spawn now passes platform into env construction.

Tests cover the macOS fallback and preserving an explicit non-UTF-8 LANG.

Reviewed by Cursor Bugbot for commit 7b709cb. Bugbot is set up for automated code reviews on this repo. Configure here.

Note

Fall back to a UTF-8 locale in terminal spawn env on non-Windows platforms

Introduces withUtf8LocaleFallback in Manager.ts to inject a LANG fallback when LC_ALL and LANG are absent from the spawn environment. On macOS the fallback is en_US.UTF-8; on other non-Windows platforms it is C.UTF-8. Windows and envs with an explicit locale are left unchanged. createTerminalSpawnEnv now accepts a platform argument and pipes the env through this fallback after stripping AppImage variables.

Macroscope summarized 7b709cb.

GUI apps launched from the macOS Dock/Finder inherit no LANG/LC_* from
launchd, so the integrated terminal's PTY shell starts in the single-byte
C locale and zsh's line editor renders multibyte input (any non-ASCII
text) as raw bytes like `<0080>`. Default LANG to en_US.UTF-8 on macOS
and C.UTF-8 on Linux when neither LANG nor LC_ALL is present; explicitly
configured locales and runtime env overrides stay untouched.
@coderabbitai

coderabbitaiBot commented Jul 29, 2026

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 465dd662-f96d-4876-85cf-76e4bbaa3b59

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@github-actionsgithub-actionsBot added vouch:unvouched PR author is not yet trusted in the VOUCHED list. size:S 10-29 changed lines (additions + deletions). labels Jul 29, 2026
@macroscopeapp

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Approved 83d4050

Straightforward bug fix that adds a UTF-8 locale fallback for terminal spawning when no locale is configured. The change is defensive, respects existing user settings, and includes test coverage for both the fallback and preservation behaviors.

You can customize Macroscope's approvability policy. Learn more.

@Kaidstor

Copy link
Copy Markdown
Author

?

@t3dotgg

Copy link
Copy Markdown
Member

Note

🤖 GPT-5.6 Sol responding on behalf of Theo

We're closing this PR as we clean up the T3 Code backlog. Thank you for taking the time to put this together.

Closing the server-wide LANG fallback. The desktop macOS launch problem now has a narrower fix that respects existing locale settings and supplies LC_CTYPE only when needed. This patch changes every non-Windows terminal spawn. A remaining standalone-server or Linux failure needs its own current reproduction. Related work: #6236.

If you believe we closed this in error, please reopen the PR and leave a comment explaining what we missed. If GitHub does not let you reopen it, leave a comment here and we'll take another look.

@t3dotggt3dotgg closed this Aug 27, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:S10-29 changed lines (additions + deletions).vouch:unvouchedPR author is not yet trusted in the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@Kaidstor@t3dotgg
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

fix(server): fall back to a UTF-8 locale in terminal spawn env - #4827

Closed
Kaidstor wants to merge 2 commits into
pingdotgg:mainfrom
Kaidstor:fix/terminal-utf8-locale-fallback
Closed

fix(server): fall back to a UTF-8 locale in terminal spawn env#4827
Kaidstor wants to merge 2 commits into
pingdotgg:mainfrom
Kaidstor:fix/terminal-utf8-locale-fallback

Conversation

@Kaidstor

@KaidstorKaidstor commented Jul 29, 2026

Copy link
Copy Markdown

What Changed

The terminal manager now falls back to a UTF-8 locale when spawning a PTY whose environment defines neither LANG nor LC_ALL: en_US.UTF-8 on macOS, C.UTF-8 on Linux (the only one guaranteed to exist), nothing on Windows. An explicitly configured locale — even a non-UTF-8 one — and per-session runtime env overrides are left untouched. Two tests cover the fallback and the "explicit locale wins" case.

Why

GUI apps launched from the macOS Dock/Finder get no LANG/LC_* from launchd (Terminal.app and iTerm inject their own; the integrated terminal inherits the server process env instead). The PTY shell therefore starts in the single-byte C locale, and zsh's line editor mangles any multibyte input — typing non-ASCII text (e.g. Cyrillic) renders as raw bytes instead of characters:

❯ for�
❯ ???????<0080>?? # typing "фор…" — <0080> is the 2nd byte of UTF-8 "р"

Repro on macOS: launch the packaged app from the Dock, open the integrated terminal, run localeLANG="", LC_CTYPE="C"; then type any non-ASCII character.

VS Code works around the same launchd behavior with terminal.integrated.detectLocale; this is the minimal equivalent.

Checklist

  • This PR is small and focused
  • I explained what changed and why
  • I included before/after screenshots for any UI changes (terminal transcript above; no app UI changed)

Note

Low Risk
Small, localized change to terminal spawn environment with explicit-locale guardrails and tests; no auth or data-path impact.

Overview
Fixes integrated terminals starting in the C locale when the app is launched from the macOS Dock/Finder (launchd does not set LANG/LC_*), which caused zsh to mangle multibyte input.

withUtf8LocaleFallback runs after AppImage env scrubbing in createTerminalSpawnEnv. If neither LANG nor LC_ALL is set, it injects en_US.UTF-8 on macOS and C.UTF-8 on other non-Windows platforms; Windows and any explicit locale are unchanged. PTY spawn now passes platform into env construction.

Tests cover the macOS fallback and preserving an explicit non-UTF-8 LANG.

Reviewed by Cursor Bugbot for commit 7b709cb. Bugbot is set up for automated code reviews on this repo. Configure here.

Note

Fall back to a UTF-8 locale in terminal spawn env on non-Windows platforms

Introduces withUtf8LocaleFallback in Manager.ts to inject a LANG fallback when LC_ALL and LANG are absent from the spawn environment. On macOS the fallback is en_US.UTF-8; on other non-Windows platforms it is C.UTF-8. Windows and envs with an explicit locale are left unchanged. createTerminalSpawnEnv now accepts a platform argument and pipes the env through this fallback after stripping AppImage variables.

Macroscope summarized 7b709cb.

GUI apps launched from the macOS Dock/Finder inherit no LANG/LC_* from
launchd, so the integrated terminal's PTY shell starts in the single-byte
C locale and zsh's line editor renders multibyte input (any non-ASCII
text) as raw bytes like `<0080>`. Default LANG to en_US.UTF-8 on macOS
and C.UTF-8 on Linux when neither LANG nor LC_ALL is present; explicitly
configured locales and runtime env overrides stay untouched.
@coderabbitai

coderabbitaiBot commented Jul 29, 2026

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 465dd662-f96d-4876-85cf-76e4bbaa3b59

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@github-actionsgithub-actionsBot added vouch:unvouched PR author is not yet trusted in the VOUCHED list. size:S 10-29 changed lines (additions + deletions). labels Jul 29, 2026
@macroscopeapp

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Approved 83d4050

Straightforward bug fix that adds a UTF-8 locale fallback for terminal spawning when no locale is configured. The change is defensive, respects existing user settings, and includes test coverage for both the fallback and preservation behaviors.

You can customize Macroscope's approvability policy. Learn more.

@Kaidstor

Copy link
Copy Markdown
Author

?

@t3dotgg

Copy link
Copy Markdown
Member

Note

🤖 GPT-5.6 Sol responding on behalf of Theo

We're closing this PR as we clean up the T3 Code backlog. Thank you for taking the time to put this together.

Closing the server-wide LANG fallback. The desktop macOS launch problem now has a narrower fix that respects existing locale settings and supplies LC_CTYPE only when needed. This patch changes every non-Windows terminal spawn. A remaining standalone-server or Linux failure needs its own current reproduction. Related work: #6236.

If you believe we closed this in error, please reopen the PR and leave a comment explaining what we missed. If GitHub does not let you reopen it, leave a comment here and we'll take another look.

@t3dotggt3dotgg closed this Aug 27, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:S10-29 changed lines (additions + deletions).vouch:unvouchedPR author is not yet trusted in the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@Kaidstor@t3dotgg
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

fix(server): fall back to a UTF-8 locale in terminal spawn env - #4827

Closed
Kaidstor wants to merge 2 commits into
pingdotgg:mainfrom
Kaidstor:fix/terminal-utf8-locale-fallback
Closed

fix(server): fall back to a UTF-8 locale in terminal spawn env#4827
Kaidstor wants to merge 2 commits into
pingdotgg:mainfrom
Kaidstor:fix/terminal-utf8-locale-fallback

Conversation

@Kaidstor

@KaidstorKaidstor commented Jul 29, 2026

Copy link
Copy Markdown

What Changed

The terminal manager now falls back to a UTF-8 locale when spawning a PTY whose environment defines neither LANG nor LC_ALL: en_US.UTF-8 on macOS, C.UTF-8 on Linux (the only one guaranteed to exist), nothing on Windows. An explicitly configured locale — even a non-UTF-8 one — and per-session runtime env overrides are left untouched. Two tests cover the fallback and the "explicit locale wins" case.

Why

GUI apps launched from the macOS Dock/Finder get no LANG/LC_* from launchd (Terminal.app and iTerm inject their own; the integrated terminal inherits the server process env instead). The PTY shell therefore starts in the single-byte C locale, and zsh's line editor mangles any multibyte input — typing non-ASCII text (e.g. Cyrillic) renders as raw bytes instead of characters:

❯ for�
❯ ???????<0080>?? # typing "фор…" — <0080> is the 2nd byte of UTF-8 "р"

Repro on macOS: launch the packaged app from the Dock, open the integrated terminal, run localeLANG="", LC_CTYPE="C"; then type any non-ASCII character.

VS Code works around the same launchd behavior with terminal.integrated.detectLocale; this is the minimal equivalent.

Checklist

  • This PR is small and focused
  • I explained what changed and why
  • I included before/after screenshots for any UI changes (terminal transcript above; no app UI changed)

Note

Low Risk
Small, localized change to terminal spawn environment with explicit-locale guardrails and tests; no auth or data-path impact.

Overview
Fixes integrated terminals starting in the C locale when the app is launched from the macOS Dock/Finder (launchd does not set LANG/LC_*), which caused zsh to mangle multibyte input.

withUtf8LocaleFallback runs after AppImage env scrubbing in createTerminalSpawnEnv. If neither LANG nor LC_ALL is set, it injects en_US.UTF-8 on macOS and C.UTF-8 on other non-Windows platforms; Windows and any explicit locale are unchanged. PTY spawn now passes platform into env construction.

Tests cover the macOS fallback and preserving an explicit non-UTF-8 LANG.

Reviewed by Cursor Bugbot for commit 7b709cb. Bugbot is set up for automated code reviews on this repo. Configure here.

Note

Fall back to a UTF-8 locale in terminal spawn env on non-Windows platforms

Introduces withUtf8LocaleFallback in Manager.ts to inject a LANG fallback when LC_ALL and LANG are absent from the spawn environment. On macOS the fallback is en_US.UTF-8; on other non-Windows platforms it is C.UTF-8. Windows and envs with an explicit locale are left unchanged. createTerminalSpawnEnv now accepts a platform argument and pipes the env through this fallback after stripping AppImage variables.

Macroscope summarized 7b709cb.

GUI apps launched from the macOS Dock/Finder inherit no LANG/LC_* from
launchd, so the integrated terminal's PTY shell starts in the single-byte
C locale and zsh's line editor renders multibyte input (any non-ASCII
text) as raw bytes like `<0080>`. Default LANG to en_US.UTF-8 on macOS
and C.UTF-8 on Linux when neither LANG nor LC_ALL is present; explicitly
configured locales and runtime env overrides stay untouched.
@coderabbitai

coderabbitaiBot commented Jul 29, 2026

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 465dd662-f96d-4876-85cf-76e4bbaa3b59

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@github-actionsgithub-actionsBot added vouch:unvouched PR author is not yet trusted in the VOUCHED list. size:S 10-29 changed lines (additions + deletions). labels Jul 29, 2026
@macroscopeapp

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Approved 83d4050

Straightforward bug fix that adds a UTF-8 locale fallback for terminal spawning when no locale is configured. The change is defensive, respects existing user settings, and includes test coverage for both the fallback and preservation behaviors.

You can customize Macroscope's approvability policy. Learn more.

@Kaidstor

Copy link
Copy Markdown
Author

?

@t3dotgg

Copy link
Copy Markdown
Member

Note

🤖 GPT-5.6 Sol responding on behalf of Theo

We're closing this PR as we clean up the T3 Code backlog. Thank you for taking the time to put this together.

Closing the server-wide LANG fallback. The desktop macOS launch problem now has a narrower fix that respects existing locale settings and supplies LC_CTYPE only when needed. This patch changes every non-Windows terminal spawn. A remaining standalone-server or Linux failure needs its own current reproduction. Related work: #6236.

If you believe we closed this in error, please reopen the PR and leave a comment explaining what we missed. If GitHub does not let you reopen it, leave a comment here and we'll take another look.

@t3dotggt3dotgg closed this Aug 27, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:S10-29 changed lines (additions + deletions).vouch:unvouchedPR author is not yet trusted in the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@Kaidstor@t3dotgg
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

fix(server): fall back to a UTF-8 locale in terminal spawn env - #4827

Closed
Kaidstor wants to merge 2 commits into
pingdotgg:mainfrom
Kaidstor:fix/terminal-utf8-locale-fallback
Closed

fix(server): fall back to a UTF-8 locale in terminal spawn env#4827
Kaidstor wants to merge 2 commits into
pingdotgg:mainfrom
Kaidstor:fix/terminal-utf8-locale-fallback

Conversation

@Kaidstor

@KaidstorKaidstor commented Jul 29, 2026

Copy link
Copy Markdown

What Changed

The terminal manager now falls back to a UTF-8 locale when spawning a PTY whose environment defines neither LANG nor LC_ALL: en_US.UTF-8 on macOS, C.UTF-8 on Linux (the only one guaranteed to exist), nothing on Windows. An explicitly configured locale — even a non-UTF-8 one — and per-session runtime env overrides are left untouched. Two tests cover the fallback and the "explicit locale wins" case.

Why

GUI apps launched from the macOS Dock/Finder get no LANG/LC_* from launchd (Terminal.app and iTerm inject their own; the integrated terminal inherits the server process env instead). The PTY shell therefore starts in the single-byte C locale, and zsh's line editor mangles any multibyte input — typing non-ASCII text (e.g. Cyrillic) renders as raw bytes instead of characters:

❯ for�
❯ ???????<0080>?? # typing "фор…" — <0080> is the 2nd byte of UTF-8 "р"

Repro on macOS: launch the packaged app from the Dock, open the integrated terminal, run localeLANG="", LC_CTYPE="C"; then type any non-ASCII character.

VS Code works around the same launchd behavior with terminal.integrated.detectLocale; this is the minimal equivalent.

Checklist

  • This PR is small and focused
  • I explained what changed and why
  • I included before/after screenshots for any UI changes (terminal transcript above; no app UI changed)

Note

Low Risk
Small, localized change to terminal spawn environment with explicit-locale guardrails and tests; no auth or data-path impact.

Overview
Fixes integrated terminals starting in the C locale when the app is launched from the macOS Dock/Finder (launchd does not set LANG/LC_*), which caused zsh to mangle multibyte input.

withUtf8LocaleFallback runs after AppImage env scrubbing in createTerminalSpawnEnv. If neither LANG nor LC_ALL is set, it injects en_US.UTF-8 on macOS and C.UTF-8 on other non-Windows platforms; Windows and any explicit locale are unchanged. PTY spawn now passes platform into env construction.

Tests cover the macOS fallback and preserving an explicit non-UTF-8 LANG.

Reviewed by Cursor Bugbot for commit 7b709cb. Bugbot is set up for automated code reviews on this repo. Configure here.

Note

Fall back to a UTF-8 locale in terminal spawn env on non-Windows platforms

Introduces withUtf8LocaleFallback in Manager.ts to inject a LANG fallback when LC_ALL and LANG are absent from the spawn environment. On macOS the fallback is en_US.UTF-8; on other non-Windows platforms it is C.UTF-8. Windows and envs with an explicit locale are left unchanged. createTerminalSpawnEnv now accepts a platform argument and pipes the env through this fallback after stripping AppImage variables.

Macroscope summarized 7b709cb.

GUI apps launched from the macOS Dock/Finder inherit no LANG/LC_* from
launchd, so the integrated terminal's PTY shell starts in the single-byte
C locale and zsh's line editor renders multibyte input (any non-ASCII
text) as raw bytes like `<0080>`. Default LANG to en_US.UTF-8 on macOS
and C.UTF-8 on Linux when neither LANG nor LC_ALL is present; explicitly
configured locales and runtime env overrides stay untouched.
@coderabbitai

coderabbitaiBot commented Jul 29, 2026

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 465dd662-f96d-4876-85cf-76e4bbaa3b59

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@github-actionsgithub-actionsBot added vouch:unvouched PR author is not yet trusted in the VOUCHED list. size:S 10-29 changed lines (additions + deletions). labels Jul 29, 2026
@macroscopeapp

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Approved 83d4050

Straightforward bug fix that adds a UTF-8 locale fallback for terminal spawning when no locale is configured. The change is defensive, respects existing user settings, and includes test coverage for both the fallback and preservation behaviors.

You can customize Macroscope's approvability policy. Learn more.

@Kaidstor

Copy link
Copy Markdown
Author

?

@t3dotgg

Copy link
Copy Markdown
Member

Note

🤖 GPT-5.6 Sol responding on behalf of Theo

We're closing this PR as we clean up the T3 Code backlog. Thank you for taking the time to put this together.

Closing the server-wide LANG fallback. The desktop macOS launch problem now has a narrower fix that respects existing locale settings and supplies LC_CTYPE only when needed. This patch changes every non-Windows terminal spawn. A remaining standalone-server or Linux failure needs its own current reproduction. Related work: #6236.

If you believe we closed this in error, please reopen the PR and leave a comment explaining what we missed. If GitHub does not let you reopen it, leave a comment here and we'll take another look.

@t3dotggt3dotgg closed this Aug 27, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:S10-29 changed lines (additions + deletions).vouch:unvouchedPR author is not yet trusted in the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@Kaidstor@t3dotgg
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

fix(server): fall back to a UTF-8 locale in terminal spawn env - #4827

Closed
Kaidstor wants to merge 2 commits into
pingdotgg:mainfrom
Kaidstor:fix/terminal-utf8-locale-fallback
Closed

fix(server): fall back to a UTF-8 locale in terminal spawn env#4827
Kaidstor wants to merge 2 commits into
pingdotgg:mainfrom
Kaidstor:fix/terminal-utf8-locale-fallback

Conversation

@Kaidstor

@KaidstorKaidstor commented Jul 29, 2026

Copy link
Copy Markdown

What Changed

The terminal manager now falls back to a UTF-8 locale when spawning a PTY whose environment defines neither LANG nor LC_ALL: en_US.UTF-8 on macOS, C.UTF-8 on Linux (the only one guaranteed to exist), nothing on Windows. An explicitly configured locale — even a non-UTF-8 one — and per-session runtime env overrides are left untouched. Two tests cover the fallback and the "explicit locale wins" case.

Why

GUI apps launched from the macOS Dock/Finder get no LANG/LC_* from launchd (Terminal.app and iTerm inject their own; the integrated terminal inherits the server process env instead). The PTY shell therefore starts in the single-byte C locale, and zsh's line editor mangles any multibyte input — typing non-ASCII text (e.g. Cyrillic) renders as raw bytes instead of characters:

❯ for�
❯ ???????<0080>?? # typing "фор…" — <0080> is the 2nd byte of UTF-8 "р"

Repro on macOS: launch the packaged app from the Dock, open the integrated terminal, run localeLANG="", LC_CTYPE="C"; then type any non-ASCII character.

VS Code works around the same launchd behavior with terminal.integrated.detectLocale; this is the minimal equivalent.

Checklist

  • This PR is small and focused
  • I explained what changed and why
  • I included before/after screenshots for any UI changes (terminal transcript above; no app UI changed)

Note

Low Risk
Small, localized change to terminal spawn environment with explicit-locale guardrails and tests; no auth or data-path impact.

Overview
Fixes integrated terminals starting in the C locale when the app is launched from the macOS Dock/Finder (launchd does not set LANG/LC_*), which caused zsh to mangle multibyte input.

withUtf8LocaleFallback runs after AppImage env scrubbing in createTerminalSpawnEnv. If neither LANG nor LC_ALL is set, it injects en_US.UTF-8 on macOS and C.UTF-8 on other non-Windows platforms; Windows and any explicit locale are unchanged. PTY spawn now passes platform into env construction.

Tests cover the macOS fallback and preserving an explicit non-UTF-8 LANG.

Reviewed by Cursor Bugbot for commit 7b709cb. Bugbot is set up for automated code reviews on this repo. Configure here.

Note

Fall back to a UTF-8 locale in terminal spawn env on non-Windows platforms

Introduces withUtf8LocaleFallback in Manager.ts to inject a LANG fallback when LC_ALL and LANG are absent from the spawn environment. On macOS the fallback is en_US.UTF-8; on other non-Windows platforms it is C.UTF-8. Windows and envs with an explicit locale are left unchanged. createTerminalSpawnEnv now accepts a platform argument and pipes the env through this fallback after stripping AppImage variables.

Macroscope summarized 7b709cb.

GUI apps launched from the macOS Dock/Finder inherit no LANG/LC_* from
launchd, so the integrated terminal's PTY shell starts in the single-byte
C locale and zsh's line editor renders multibyte input (any non-ASCII
text) as raw bytes like `<0080>`. Default LANG to en_US.UTF-8 on macOS
and C.UTF-8 on Linux when neither LANG nor LC_ALL is present; explicitly
configured locales and runtime env overrides stay untouched.
@coderabbitai

coderabbitaiBot commented Jul 29, 2026

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 465dd662-f96d-4876-85cf-76e4bbaa3b59

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@github-actionsgithub-actionsBot added vouch:unvouched PR author is not yet trusted in the VOUCHED list. size:S 10-29 changed lines (additions + deletions). labels Jul 29, 2026
@macroscopeapp

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Approved 83d4050

Straightforward bug fix that adds a UTF-8 locale fallback for terminal spawning when no locale is configured. The change is defensive, respects existing user settings, and includes test coverage for both the fallback and preservation behaviors.

You can customize Macroscope's approvability policy. Learn more.

@Kaidstor

Copy link
Copy Markdown
Author

?

@t3dotgg

Copy link
Copy Markdown
Member

Note

🤖 GPT-5.6 Sol responding on behalf of Theo

We're closing this PR as we clean up the T3 Code backlog. Thank you for taking the time to put this together.

Closing the server-wide LANG fallback. The desktop macOS launch problem now has a narrower fix that respects existing locale settings and supplies LC_CTYPE only when needed. This patch changes every non-Windows terminal spawn. A remaining standalone-server or Linux failure needs its own current reproduction. Related work: #6236.

If you believe we closed this in error, please reopen the PR and leave a comment explaining what we missed. If GitHub does not let you reopen it, leave a comment here and we'll take another look.

@t3dotggt3dotgg closed this Aug 27, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:S10-29 changed lines (additions + deletions).vouch:unvouchedPR author is not yet trusted in the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@Kaidstor@t3dotgg
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

fix(server): fall back to a UTF-8 locale in terminal spawn env - #4827

Closed
Kaidstor wants to merge 2 commits into
pingdotgg:mainfrom
Kaidstor:fix/terminal-utf8-locale-fallback
Closed

fix(server): fall back to a UTF-8 locale in terminal spawn env#4827
Kaidstor wants to merge 2 commits into
pingdotgg:mainfrom
Kaidstor:fix/terminal-utf8-locale-fallback

Conversation

@Kaidstor

@KaidstorKaidstor commented Jul 29, 2026

Copy link
Copy Markdown

What Changed

The terminal manager now falls back to a UTF-8 locale when spawning a PTY whose environment defines neither LANG nor LC_ALL: en_US.UTF-8 on macOS, C.UTF-8 on Linux (the only one guaranteed to exist), nothing on Windows. An explicitly configured locale — even a non-UTF-8 one — and per-session runtime env overrides are left untouched. Two tests cover the fallback and the "explicit locale wins" case.

Why

GUI apps launched from the macOS Dock/Finder get no LANG/LC_* from launchd (Terminal.app and iTerm inject their own; the integrated terminal inherits the server process env instead). The PTY shell therefore starts in the single-byte C locale, and zsh's line editor mangles any multibyte input — typing non-ASCII text (e.g. Cyrillic) renders as raw bytes instead of characters:

❯ for�
❯ ???????<0080>?? # typing "фор…" — <0080> is the 2nd byte of UTF-8 "р"

Repro on macOS: launch the packaged app from the Dock, open the integrated terminal, run localeLANG="", LC_CTYPE="C"; then type any non-ASCII character.

VS Code works around the same launchd behavior with terminal.integrated.detectLocale; this is the minimal equivalent.

Checklist

  • This PR is small and focused
  • I explained what changed and why
  • I included before/after screenshots for any UI changes (terminal transcript above; no app UI changed)

Note

Low Risk
Small, localized change to terminal spawn environment with explicit-locale guardrails and tests; no auth or data-path impact.

Overview
Fixes integrated terminals starting in the C locale when the app is launched from the macOS Dock/Finder (launchd does not set LANG/LC_*), which caused zsh to mangle multibyte input.

withUtf8LocaleFallback runs after AppImage env scrubbing in createTerminalSpawnEnv. If neither LANG nor LC_ALL is set, it injects en_US.UTF-8 on macOS and C.UTF-8 on other non-Windows platforms; Windows and any explicit locale are unchanged. PTY spawn now passes platform into env construction.

Tests cover the macOS fallback and preserving an explicit non-UTF-8 LANG.

Reviewed by Cursor Bugbot for commit 7b709cb. Bugbot is set up for automated code reviews on this repo. Configure here.

Note

Fall back to a UTF-8 locale in terminal spawn env on non-Windows platforms

Introduces withUtf8LocaleFallback in Manager.ts to inject a LANG fallback when LC_ALL and LANG are absent from the spawn environment. On macOS the fallback is en_US.UTF-8; on other non-Windows platforms it is C.UTF-8. Windows and envs with an explicit locale are left unchanged. createTerminalSpawnEnv now accepts a platform argument and pipes the env through this fallback after stripping AppImage variables.

Macroscope summarized 7b709cb.

GUI apps launched from the macOS Dock/Finder inherit no LANG/LC_* from
launchd, so the integrated terminal's PTY shell starts in the single-byte
C locale and zsh's line editor renders multibyte input (any non-ASCII
text) as raw bytes like `<0080>`. Default LANG to en_US.UTF-8 on macOS
and C.UTF-8 on Linux when neither LANG nor LC_ALL is present; explicitly
configured locales and runtime env overrides stay untouched.
@coderabbitai

coderabbitaiBot commented Jul 29, 2026

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 465dd662-f96d-4876-85cf-76e4bbaa3b59

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@github-actionsgithub-actionsBot added vouch:unvouched PR author is not yet trusted in the VOUCHED list. size:S 10-29 changed lines (additions + deletions). labels Jul 29, 2026
@macroscopeapp

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Approved 83d4050

Straightforward bug fix that adds a UTF-8 locale fallback for terminal spawning when no locale is configured. The change is defensive, respects existing user settings, and includes test coverage for both the fallback and preservation behaviors.

You can customize Macroscope's approvability policy. Learn more.

@Kaidstor

Copy link
Copy Markdown
Author

?

@t3dotgg

Copy link
Copy Markdown
Member

Note

🤖 GPT-5.6 Sol responding on behalf of Theo

We're closing this PR as we clean up the T3 Code backlog. Thank you for taking the time to put this together.

Closing the server-wide LANG fallback. The desktop macOS launch problem now has a narrower fix that respects existing locale settings and supplies LC_CTYPE only when needed. This patch changes every non-Windows terminal spawn. A remaining standalone-server or Linux failure needs its own current reproduction. Related work: #6236.

If you believe we closed this in error, please reopen the PR and leave a comment explaining what we missed. If GitHub does not let you reopen it, leave a comment here and we'll take another look.

@t3dotggt3dotgg closed this Aug 27, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:S10-29 changed lines (additions + deletions).vouch:unvouchedPR author is not yet trusted in the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@Kaidstor@t3dotgg
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

fix(server): fall back to a UTF-8 locale in terminal spawn env - #4827

Closed
Kaidstor wants to merge 2 commits into
pingdotgg:mainfrom
Kaidstor:fix/terminal-utf8-locale-fallback
Closed

fix(server): fall back to a UTF-8 locale in terminal spawn env#4827
Kaidstor wants to merge 2 commits into
pingdotgg:mainfrom
Kaidstor:fix/terminal-utf8-locale-fallback

Conversation

@Kaidstor

@KaidstorKaidstor commented Jul 29, 2026

Copy link
Copy Markdown

What Changed

The terminal manager now falls back to a UTF-8 locale when spawning a PTY whose environment defines neither LANG nor LC_ALL: en_US.UTF-8 on macOS, C.UTF-8 on Linux (the only one guaranteed to exist), nothing on Windows. An explicitly configured locale — even a non-UTF-8 one — and per-session runtime env overrides are left untouched. Two tests cover the fallback and the "explicit locale wins" case.

Why

GUI apps launched from the macOS Dock/Finder get no LANG/LC_* from launchd (Terminal.app and iTerm inject their own; the integrated terminal inherits the server process env instead). The PTY shell therefore starts in the single-byte C locale, and zsh's line editor mangles any multibyte input — typing non-ASCII text (e.g. Cyrillic) renders as raw bytes instead of characters:

❯ for�
❯ ???????<0080>?? # typing "фор…" — <0080> is the 2nd byte of UTF-8 "р"

Repro on macOS: launch the packaged app from the Dock, open the integrated terminal, run localeLANG="", LC_CTYPE="C"; then type any non-ASCII character.

VS Code works around the same launchd behavior with terminal.integrated.detectLocale; this is the minimal equivalent.

Checklist

  • This PR is small and focused
  • I explained what changed and why
  • I included before/after screenshots for any UI changes (terminal transcript above; no app UI changed)

Note

Low Risk
Small, localized change to terminal spawn environment with explicit-locale guardrails and tests; no auth or data-path impact.

Overview
Fixes integrated terminals starting in the C locale when the app is launched from the macOS Dock/Finder (launchd does not set LANG/LC_*), which caused zsh to mangle multibyte input.

withUtf8LocaleFallback runs after AppImage env scrubbing in createTerminalSpawnEnv. If neither LANG nor LC_ALL is set, it injects en_US.UTF-8 on macOS and C.UTF-8 on other non-Windows platforms; Windows and any explicit locale are unchanged. PTY spawn now passes platform into env construction.

Tests cover the macOS fallback and preserving an explicit non-UTF-8 LANG.

Reviewed by Cursor Bugbot for commit 7b709cb. Bugbot is set up for automated code reviews on this repo. Configure here.

Note

Fall back to a UTF-8 locale in terminal spawn env on non-Windows platforms

Introduces withUtf8LocaleFallback in Manager.ts to inject a LANG fallback when LC_ALL and LANG are absent from the spawn environment. On macOS the fallback is en_US.UTF-8; on other non-Windows platforms it is C.UTF-8. Windows and envs with an explicit locale are left unchanged. createTerminalSpawnEnv now accepts a platform argument and pipes the env through this fallback after stripping AppImage variables.

Macroscope summarized 7b709cb.

GUI apps launched from the macOS Dock/Finder inherit no LANG/LC_* from
launchd, so the integrated terminal's PTY shell starts in the single-byte
C locale and zsh's line editor renders multibyte input (any non-ASCII
text) as raw bytes like `<0080>`. Default LANG to en_US.UTF-8 on macOS
and C.UTF-8 on Linux when neither LANG nor LC_ALL is present; explicitly
configured locales and runtime env overrides stay untouched.
@coderabbitai

coderabbitaiBot commented Jul 29, 2026

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 465dd662-f96d-4876-85cf-76e4bbaa3b59

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@github-actionsgithub-actionsBot added vouch:unvouched PR author is not yet trusted in the VOUCHED list. size:S 10-29 changed lines (additions + deletions). labels Jul 29, 2026
@macroscopeapp

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Approved 83d4050

Straightforward bug fix that adds a UTF-8 locale fallback for terminal spawning when no locale is configured. The change is defensive, respects existing user settings, and includes test coverage for both the fallback and preservation behaviors.

You can customize Macroscope's approvability policy. Learn more.

@Kaidstor

Copy link
Copy Markdown
Author

?

@t3dotgg

Copy link
Copy Markdown
Member

Note

🤖 GPT-5.6 Sol responding on behalf of Theo

We're closing this PR as we clean up the T3 Code backlog. Thank you for taking the time to put this together.

Closing the server-wide LANG fallback. The desktop macOS launch problem now has a narrower fix that respects existing locale settings and supplies LC_CTYPE only when needed. This patch changes every non-Windows terminal spawn. A remaining standalone-server or Linux failure needs its own current reproduction. Related work: #6236.

If you believe we closed this in error, please reopen the PR and leave a comment explaining what we missed. If GitHub does not let you reopen it, leave a comment here and we'll take another look.

@t3dotggt3dotgg closed this Aug 27, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:S10-29 changed lines (additions + deletions).vouch:unvouchedPR author is not yet trusted in the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@Kaidstor@t3dotgg