Conversation
Ctrl+V / Ctrl+Shift+V into the Claude Code TUI on Windows is unreliable: ConPTY write drops truncate long text and clipboard images don't come through at all. Alt+V is Claude Code's native paste shortcut and handles both correctly, so show a tip toast pointing users at it. The toast fires as a pure side effect from the terminal key handler, so existing paste handling is untouched and Alt+V still passes through. Closing it stays quiet for the rest of the session; ticking "Don't show again" persists via the new hasDismissedWindowsPasteToast setting. Co-Authored-By: Claude <noreply@anthropic.com> via Dash <dash@syv.ai> Claude-Session: https://claude.ai/code/session_015oLvpKrtCrejbJQpzMSSHw
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Introduce a dismissable toast when pressing ctrl+v on windows pointing users to natively supported and working alt+v
Windows users pasting into the Claude Code TUI via Dash hit silent data loss: Ctrl+V and Ctrl+Shift+V drop text from long pastes silently. The root cause is in our own PTY layer: on Windows/ConPTY, node-pty ignores the
Socket.write()backpressure return, so writes past ~2 KB are silently discarded. Fixing that properly means chunking writes inptyManager— real work, and we'd instead point users to already existing keybind that properly supports long text truncations and images. Claude Code handles Alt+V natively for both text and images, so the paste never traverses our broken write path.Alt+V is a Claude Code keybinding, not a Windows OS feature — so it isn't tied to any Windows version; it works anywhere Claude Code runs (including WSL).
chat:imagePasteaction on Windows and WSL; macOS/Linux default that action to Ctrl+V instead. On WSL both are bound. (keybindings docs)Changes
windowsPasteToast.tsxmaybeShowWindowsPasteToast()+ thePasteTipcardTerminalSessionManager.tsisWindowsplatform checksettingsKeys.tshasDismissedWindowsPasteToastso the opt-out persistsBehaviour notes
preventDefault/return, so existing paste handling is untouched and Alt+V passes through unaffected.getPlatform() === 'win32'. Cached at construction rather than read per keystroke.PortsWizardToasts.tsx): sametoast.customcard shell, icon + title + muted body, quiet opt-out on the left and the plain close on the right.Testing
pnpm type-checkpasses; lint and the pre-commit hooks are green.Verified in the running app (Windows 11): pressing Ctrl+V in a task terminal surfaces the toast. An earlier "the toast doesn't appear" report turned out to be environmental, not a code issue — a dev server from another checkout still held port 3000, so this worktree's Electron was loading the other renderer. (
vite.config.tssetsserver.port: 3000withoutstrictPort, so Vite silently falls back to 3001 whilewindow.tsstill loadslocalhost:3000— a trap worth knowing if you run two Dash checkouts at once.)Still worth a click-through before merge: the two dismissal paths — session-scoped (close/swipe, should re-nudge next launch) vs persisted (tick "Don't show again", reload, should stay gone).