Describe the bug
Nerd Font glyphs (Unicode Private Use Area characters, U+E000-U+F8FF) are invisible in Copilot CLI output — both in LLM text responses and in captured shell command output. The same glyphs render correctly when the identical script is run directly in the terminal outside the CLI.
This is likely related to the same Ink/string-width rendering pipeline issue as #2521 (Thai text truncation) and #681 (Unicode character handling).
Root cause analysis
I traced the rendering pipeline in app.js:
Hxn (hidden_characters filter): Does NOT strip PUA chars — only strips bidi/tag/invisible Unicode. Not the culprit.
Qa (string-width function): Correctly returns width=1 for PUA codepoints. Confirmed via Node.js testing that PUA chars are not matched by \p{Default_Ignorable_Code_Point} and pass all skip conditions. Not the culprit.
Cht → Rht → wht (Ink Output grid rendering): Characters are parsed by Intl.Segmenter, placed in a grid via M0e.get(), and re-rendered to ANSI output. PUA characters appear to be lost during this pipeline — they get width=1 allocation but their actual character value doesn't survive the re-render to terminal output.
- Console codepage (CP437 vs 65001): Tested with
chcp 65001 — no change. Not the culprit.
The chars are present in the data but invisible in the rendered output. Similar to #2521 where Thai text is "complete if copied but truncated on screen."
Affected version
GitHub Copilot CLI 1.0.10
Steps to reproduce
- Install a Nerd Font (e.g., UbuntuMono Nerd Font) and set it as the terminal font
- Verify glyphs work outside CLI:
# Save as test.ps1 and run directly — glyphs appear
[Console]::OutputEncoding = [System.Text.Encoding]::UTF8
Write-Host 'Standard: ' -NoNewline; Write-Host ([char]0x2500 + ' ' + [char]0x2502)
Write-Host 'Nerd Font: ' -NoNewline; Write-Host ([char]0xE0B0 + ' ' + [char]0xE702 + ' ' + [char]0xF135)
- Start Copilot CLI (
copilot)
- Ask Copilot to run the same script — the Nerd Font line shows blanks
- Ask Copilot to include PUA characters in its text response — also invisible
Expected behavior
Nerd Font PUA glyphs should render correctly when:
- The terminal font supports them (confirmed by running the script directly)
- The CLI's shell tool captures and re-displays command output containing PUA chars
- The LLM response contains PUA characters in text
Actual behavior
- Standard Unicode (box drawing, arrows, emoji) renders correctly
- PUA characters (U+E000–U+F8FF) used by Nerd Fonts are invisible
- The characters are technically "there" (width is allocated) but visually absent
Environment
- OS: Windows 11
- Terminal: Windows Terminal with Nerd Font
- Console codepage: Tested with both CP437 and CP65001
- Node.js: v24+
- Binary:
copilot-win32-x64/copilot.exe
Additional context
This affects anyone using Nerd Fonts for terminal theming (starship, oh-my-posh, powerlevel10k users). The PUA codepoint ranges used by Nerd Fonts:
| Icon Set |
Range |
| Seti-UI + Custom |
U+E5FA - U+E6B8 |
| Devicons |
U+E700 - U+E8CF |
| Powerline |
U+E0A0 - U+E0D4 |
| Font Awesome |
U+F000 - U+F2E0 |
| Octicons |
U+F400 - U+F532 |
| Codicons |
U+EA60 - U+EC1E |
| Weather Icons |
U+E300 - U+E3E3 |
Describe the bug
Nerd Font glyphs (Unicode Private Use Area characters, U+E000-U+F8FF) are invisible in Copilot CLI output — both in LLM text responses and in captured shell command output. The same glyphs render correctly when the identical script is run directly in the terminal outside the CLI.
This is likely related to the same Ink/string-width rendering pipeline issue as #2521 (Thai text truncation) and #681 (Unicode character handling).
Root cause analysis
I traced the rendering pipeline in
app.js:Hxn(hidden_characters filter): Does NOT strip PUA chars — only strips bidi/tag/invisible Unicode. Not the culprit.Qa(string-width function): Correctly returns width=1 for PUA codepoints. Confirmed via Node.js testing that PUA chars are not matched by\p{Default_Ignorable_Code_Point}and pass all skip conditions. Not the culprit.Cht→Rht→wht(Ink Output grid rendering): Characters are parsed byIntl.Segmenter, placed in a grid viaM0e.get(), and re-rendered to ANSI output. PUA characters appear to be lost during this pipeline — they get width=1 allocation but their actual character value doesn't survive the re-render to terminal output.chcp 65001— no change. Not the culprit.The chars are present in the data but invisible in the rendered output. Similar to #2521 where Thai text is "complete if copied but truncated on screen."
Affected version
GitHub Copilot CLI 1.0.10
Steps to reproduce
copilot)Expected behavior
Nerd Font PUA glyphs should render correctly when:
Actual behavior
Environment
copilot-win32-x64/copilot.exeAdditional context
This affects anyone using Nerd Fonts for terminal theming (starship, oh-my-posh, powerlevel10k users). The PUA codepoint ranges used by Nerd Fonts: