Repository files navigation

Clipboard Manager (cb)

Description

A versatile command-line utility for copying file contents, directory contents, or STDIN input to the system clipboard. Supports both text and image files, with special features for Discord formatting and debug output. The command is installed as cb and maps to copybuffer.main:main, so it can also be invoked with python -m copybuffer.

Features

  • Copy text from files to clipboard
  • Copy text from STDIN to clipboard
  • Copy contents of all files in a directory (non-recursive by default)
  • Recursively expand directories when needed
  • Honor .gitignore patterns while scanning directories
  • Copy images to clipboard
  • Include headers with filenames
  • Format output for Discord
  • Generate heredoc shell script to recreate files on paste
  • Append mode for heredoc script generation
  • Verbose output option
  • Debug mode

Requirements

  • Python 3.x

  • pyperclip

  • PIL (for image support)

  • xclip or xsel (Linux X11, preferred when DISPLAY is set and the tool works)

  • wl-clipboard (Wayland only)

  • A terminal that supports OSC 52, for SSH/remote sessions without a working graphical clipboard

    On CachyOS/Hyprland systems, wl-clipboard is preferred for native clipboard access. Wayland detection checks for WAYLAND_DISPLAY, XDG_SESSION_TYPE=wayland, HYPRLAND_INSTANCE_SIGNATURE, or SWAYSOCK. If wl-copy is missing or fails, auto may fall back to OSC 52.

Installation

  1. Install package with pipx:
pipx install .

Uninstall

pipx uninstall copybuffer)
  1. For Linux systems, install clipboard handlers:
sudo apt-get install xclip
# or
sudo apt-get install xsel
# For Wayland sessions
sudo apt-get install wl-clipboard

Usage

Basic Usage

# Copy file contents
cb filename.txt
# Copy from STDINecho"hello"| cb
# Copy directory contents (non-recursive)
cb -d directory/
# Copy directory contents recursively
cb -r directory/
# Copy with Discord formatting
cb -a filename.txt
# Copy with headers
cb -i filename.txt
# Copy as heredoc script for recreating files on paste
cb -p path/to/file1.txt path/to/file2.txt
# Copy as heredoc script that appends to target files
cb --append path/to/file1.txt

Options

  • file: File to copy (optional - reads from STDIN if not provided)
  • -i, --include-header: Include filename as header in copied text
  • -d, --directory: Copy contents of all files in directory (non-recursive)
  • -r, --recursive: Recursively copy contents of provided directories
  • -v, --verbose: Display the copied contents
  • -a, --attachment: Format output as Discord attachment
  • -p, --paste: Copy a heredoc shell script that recreates the given files when pasted
  • --append: Use with --paste behavior to append to files instead of overwriting
  • --image: Include image files discovered when expanding directories
  • --debug: Enable debug mode
  • --backend {auto,osc52,wayland,xclip,xsel}: Select the text clipboard backend. Overrides COPYBUFFER_BACKEND. Default: auto
  • --version: Display application version

Clipboard backends (Linux text)

cb copies text with an explicit backend. Images never use OSC 52.

SelectionHow
--backend auto|osc52|wayland|xclip|xselCommand-line flag
COPYBUFFER_BACKEND=osc52Environment variable

The flag overrides the environment variable. auto is the default.

Automatic selection prefers a native graphical backend when its environment and executable are present: Wayland (wl-copy) when a Wayland session is detected, otherwise xclip or xsel when DISPLAY is set and the display looks reachable. DISPLAY is only a hint — a value such as localhost:12.0 does not prove X11 works. Copybuffer probes the X11 socket or TCP port (250ms) before running xclip, and caps graphical helpers at 2 seconds, so a dead SSH forward does not stall the command. If that graphical backend fails, auto falls back to OSC 52 when /dev/tty is writable. Explicit xclip, xsel, or wayland do not fall back; they fail with a nonzero exit status. Explicit osc52 skips X11 and Wayland.

# Force OSC 52 (useful over SSH)
cb --backend osc52 filename.txt
printf'test'| COPYBUFFER_BACKEND=osc52 cb

OSC 52 over SSH. Copybuffer encodes the text as UTF-8, then Base64, and writes this control sequence to /dev/tty (not stdout, so it still works at the end of a pipeline):

ESC ] 52 ; c ; BASE64_DATA BEL

SSH_TTY is not required. The session needs a writable controlling terminal (/dev/tty). The local terminal emulator must allow OSC 52 clipboard writes (iTerm2, kitty, Alacritty, Windows Terminal, xterm with allowWindowOps, and others). tmux users typically need set -s set-clipboard on. Some terminals (notably many VTE-based ones) ignore OSC 52.

Payload size. Copybuffer does not chunk OSC 52 payloads. Terminals and multiplexers often cap the sequence (commonly tens to hundreds of kilobytes; tmux, screen, and some emulators truncate or drop larger pastes). If a large copy appears truncated, use a native graphical backend or split the payload.

Security. OSC 52 lets the application running in the terminal set the local clipboard. Over SSH that means a remote cb (or any remote program that emits the sequence) can overwrite clipboard contents on your workstation. Disable or restrict OSC 52 in the terminal if you do not trust the remote session, and avoid --backend osc52 on untrusted hosts. Copybuffer's OSC 52 path is text-only; it will not place images on the clipboard that way.

macOS and Windows keep the existing pyperclip/pbcopy behavior when --backend auto is used.

Image Support

Supports copying image files directly to clipboard. Image files are detected automatically based on their MIME type, or you can force image handling with the --image flag:

  • PNG
  • JPG/JPEG
  • BMP
  • GIF (first frame)
cb image.png

Directory Mode

Copy contents of all text files in a directory:

cb -d /path/to/directory
  • Automatically skips image files
  • Uses .gitignore rules from the current working directory
  • Optionally includes headers with -i flag
  • Can format as Discord attachments with -a flag
  • Use -r to walk directories recursively and include nested files

Debug Mode

Enable detailed output for troubleshooting:

cb --debug filename.txt

Version Information

# Display version information
cb --version
# Output: copybuffer version 1.11.1

Error Handling

The script provides clear error messages for common issues:

  • Missing dependencies
  • File not found
  • Permission errors
  • Invalid file types
  • Directory access errors

Examples

Copy with Headers

cb -i document.txt
# Output includes: === document.txt ===

Discord Formatting

cb -a code.py
# Output format: [Attached file: code.py\nContent:\n```\n...\n```\n]

Heredoc Script Generation

# Overwrite or create files on the target system
cb -p path/to/file1 path/to/nested/dir/file2
# Append to files on the target system
cb --append path/to/file1
# Notes:# - A random, content-safe delimiter is used to avoid collisions# - Single-quoted heredocs prevent shell interpolation

Verbose Directory Copy

cb -d -v -i /path/to/docs
# Shows all processed files and copied content

Troubleshooting

If you encounter issues:

  1. Check dependencies with --debug flag
  2. Verify clipboard system access (on Linux, try --backend osc52 over SSH)
  3. Check file permissions
  4. Ensure proper Python version
  5. If cb prints success but paste is empty, upgrade past 1.10.0: that release could report success when xclip failed on a dead DISPLAY

License

This project is open source and available under the MIT License.

Contact

For issues or suggestions: draeician@gmail.com

About

A powerful command-line clipboard manager that copies files and STDIN, and generates portable shell scripts to instantly recreate them on any system.

Topics

Resources

Stars

2 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, '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

Repository files navigation

Clipboard Manager (cb)

Description

A versatile command-line utility for copying file contents, directory contents, or STDIN input to the system clipboard. Supports both text and image files, with special features for Discord formatting and debug output. The command is installed as cb and maps to copybuffer.main:main, so it can also be invoked with python -m copybuffer.

Features

  • Copy text from files to clipboard
  • Copy text from STDIN to clipboard
  • Copy contents of all files in a directory (non-recursive by default)
  • Recursively expand directories when needed
  • Honor .gitignore patterns while scanning directories
  • Copy images to clipboard
  • Include headers with filenames
  • Format output for Discord
  • Generate heredoc shell script to recreate files on paste
  • Append mode for heredoc script generation
  • Verbose output option
  • Debug mode

Requirements

  • Python 3.x

  • pyperclip

  • PIL (for image support)

  • xclip or xsel (Linux X11, preferred when DISPLAY is set and the tool works)

  • wl-clipboard (Wayland only)

  • A terminal that supports OSC 52, for SSH/remote sessions without a working graphical clipboard

    On CachyOS/Hyprland systems, wl-clipboard is preferred for native clipboard access. Wayland detection checks for WAYLAND_DISPLAY, XDG_SESSION_TYPE=wayland, HYPRLAND_INSTANCE_SIGNATURE, or SWAYSOCK. If wl-copy is missing or fails, auto may fall back to OSC 52.

Installation

  1. Install package with pipx:
pipx install .

Uninstall

pipx uninstall copybuffer)
  1. For Linux systems, install clipboard handlers:
sudo apt-get install xclip
# or
sudo apt-get install xsel
# For Wayland sessions
sudo apt-get install wl-clipboard

Usage

Basic Usage

# Copy file contents
cb filename.txt
# Copy from STDINecho"hello"| cb
# Copy directory contents (non-recursive)
cb -d directory/
# Copy directory contents recursively
cb -r directory/
# Copy with Discord formatting
cb -a filename.txt
# Copy with headers
cb -i filename.txt
# Copy as heredoc script for recreating files on paste
cb -p path/to/file1.txt path/to/file2.txt
# Copy as heredoc script that appends to target files
cb --append path/to/file1.txt

Options

  • file: File to copy (optional - reads from STDIN if not provided)
  • -i, --include-header: Include filename as header in copied text
  • -d, --directory: Copy contents of all files in directory (non-recursive)
  • -r, --recursive: Recursively copy contents of provided directories
  • -v, --verbose: Display the copied contents
  • -a, --attachment: Format output as Discord attachment
  • -p, --paste: Copy a heredoc shell script that recreates the given files when pasted
  • --append: Use with --paste behavior to append to files instead of overwriting
  • --image: Include image files discovered when expanding directories
  • --debug: Enable debug mode
  • --backend {auto,osc52,wayland,xclip,xsel}: Select the text clipboard backend. Overrides COPYBUFFER_BACKEND. Default: auto
  • --version: Display application version

Clipboard backends (Linux text)

cb copies text with an explicit backend. Images never use OSC 52.

SelectionHow
--backend auto|osc52|wayland|xclip|xselCommand-line flag
COPYBUFFER_BACKEND=osc52Environment variable

The flag overrides the environment variable. auto is the default.

Automatic selection prefers a native graphical backend when its environment and executable are present: Wayland (wl-copy) when a Wayland session is detected, otherwise xclip or xsel when DISPLAY is set and the display looks reachable. DISPLAY is only a hint — a value such as localhost:12.0 does not prove X11 works. Copybuffer probes the X11 socket or TCP port (250ms) before running xclip, and caps graphical helpers at 2 seconds, so a dead SSH forward does not stall the command. If that graphical backend fails, auto falls back to OSC 52 when /dev/tty is writable. Explicit xclip, xsel, or wayland do not fall back; they fail with a nonzero exit status. Explicit osc52 skips X11 and Wayland.

# Force OSC 52 (useful over SSH)
cb --backend osc52 filename.txt
printf'test'| COPYBUFFER_BACKEND=osc52 cb

OSC 52 over SSH. Copybuffer encodes the text as UTF-8, then Base64, and writes this control sequence to /dev/tty (not stdout, so it still works at the end of a pipeline):

ESC ] 52 ; c ; BASE64_DATA BEL

SSH_TTY is not required. The session needs a writable controlling terminal (/dev/tty). The local terminal emulator must allow OSC 52 clipboard writes (iTerm2, kitty, Alacritty, Windows Terminal, xterm with allowWindowOps, and others). tmux users typically need set -s set-clipboard on. Some terminals (notably many VTE-based ones) ignore OSC 52.

Payload size. Copybuffer does not chunk OSC 52 payloads. Terminals and multiplexers often cap the sequence (commonly tens to hundreds of kilobytes; tmux, screen, and some emulators truncate or drop larger pastes). If a large copy appears truncated, use a native graphical backend or split the payload.

Security. OSC 52 lets the application running in the terminal set the local clipboard. Over SSH that means a remote cb (or any remote program that emits the sequence) can overwrite clipboard contents on your workstation. Disable or restrict OSC 52 in the terminal if you do not trust the remote session, and avoid --backend osc52 on untrusted hosts. Copybuffer's OSC 52 path is text-only; it will not place images on the clipboard that way.

macOS and Windows keep the existing pyperclip/pbcopy behavior when --backend auto is used.

Image Support

Supports copying image files directly to clipboard. Image files are detected automatically based on their MIME type, or you can force image handling with the --image flag:

  • PNG
  • JPG/JPEG
  • BMP
  • GIF (first frame)
cb image.png

Directory Mode

Copy contents of all text files in a directory:

cb -d /path/to/directory
  • Automatically skips image files
  • Uses .gitignore rules from the current working directory
  • Optionally includes headers with -i flag
  • Can format as Discord attachments with -a flag
  • Use -r to walk directories recursively and include nested files

Debug Mode

Enable detailed output for troubleshooting:

cb --debug filename.txt

Version Information

# Display version information
cb --version
# Output: copybuffer version 1.11.1

Error Handling

The script provides clear error messages for common issues:

  • Missing dependencies
  • File not found
  • Permission errors
  • Invalid file types
  • Directory access errors

Examples

Copy with Headers

cb -i document.txt
# Output includes: === document.txt ===

Discord Formatting

cb -a code.py
# Output format: [Attached file: code.py\nContent:\n```\n...\n```\n]

Heredoc Script Generation

# Overwrite or create files on the target system
cb -p path/to/file1 path/to/nested/dir/file2
# Append to files on the target system
cb --append path/to/file1
# Notes:# - A random, content-safe delimiter is used to avoid collisions# - Single-quoted heredocs prevent shell interpolation

Verbose Directory Copy

cb -d -v -i /path/to/docs
# Shows all processed files and copied content

Troubleshooting

If you encounter issues:

  1. Check dependencies with --debug flag
  2. Verify clipboard system access (on Linux, try --backend osc52 over SSH)
  3. Check file permissions
  4. Ensure proper Python version
  5. If cb prints success but paste is empty, upgrade past 1.10.0: that release could report success when xclip failed on a dead DISPLAY

License

This project is open source and available under the MIT License.

Contact

For issues or suggestions: draeician@gmail.com

About

A powerful command-line clipboard manager that copies files and STDIN, and generates portable shell scripts to instantly recreate them on any system.

Topics

Resources

Stars

2 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, '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

Repository files navigation

Clipboard Manager (cb)

Description

A versatile command-line utility for copying file contents, directory contents, or STDIN input to the system clipboard. Supports both text and image files, with special features for Discord formatting and debug output. The command is installed as cb and maps to copybuffer.main:main, so it can also be invoked with python -m copybuffer.

Features

  • Copy text from files to clipboard
  • Copy text from STDIN to clipboard
  • Copy contents of all files in a directory (non-recursive by default)
  • Recursively expand directories when needed
  • Honor .gitignore patterns while scanning directories
  • Copy images to clipboard
  • Include headers with filenames
  • Format output for Discord
  • Generate heredoc shell script to recreate files on paste
  • Append mode for heredoc script generation
  • Verbose output option
  • Debug mode

Requirements

  • Python 3.x

  • pyperclip

  • PIL (for image support)

  • xclip or xsel (Linux X11, preferred when DISPLAY is set and the tool works)

  • wl-clipboard (Wayland only)

  • A terminal that supports OSC 52, for SSH/remote sessions without a working graphical clipboard

    On CachyOS/Hyprland systems, wl-clipboard is preferred for native clipboard access. Wayland detection checks for WAYLAND_DISPLAY, XDG_SESSION_TYPE=wayland, HYPRLAND_INSTANCE_SIGNATURE, or SWAYSOCK. If wl-copy is missing or fails, auto may fall back to OSC 52.

Installation

  1. Install package with pipx:
pipx install .

Uninstall

pipx uninstall copybuffer)
  1. For Linux systems, install clipboard handlers:
sudo apt-get install xclip
# or
sudo apt-get install xsel
# For Wayland sessions
sudo apt-get install wl-clipboard

Usage

Basic Usage

# Copy file contents
cb filename.txt
# Copy from STDINecho"hello"| cb
# Copy directory contents (non-recursive)
cb -d directory/
# Copy directory contents recursively
cb -r directory/
# Copy with Discord formatting
cb -a filename.txt
# Copy with headers
cb -i filename.txt
# Copy as heredoc script for recreating files on paste
cb -p path/to/file1.txt path/to/file2.txt
# Copy as heredoc script that appends to target files
cb --append path/to/file1.txt

Options

  • file: File to copy (optional - reads from STDIN if not provided)
  • -i, --include-header: Include filename as header in copied text
  • -d, --directory: Copy contents of all files in directory (non-recursive)
  • -r, --recursive: Recursively copy contents of provided directories
  • -v, --verbose: Display the copied contents
  • -a, --attachment: Format output as Discord attachment
  • -p, --paste: Copy a heredoc shell script that recreates the given files when pasted
  • --append: Use with --paste behavior to append to files instead of overwriting
  • --image: Include image files discovered when expanding directories
  • --debug: Enable debug mode
  • --backend {auto,osc52,wayland,xclip,xsel}: Select the text clipboard backend. Overrides COPYBUFFER_BACKEND. Default: auto
  • --version: Display application version

Clipboard backends (Linux text)

cb copies text with an explicit backend. Images never use OSC 52.

SelectionHow
--backend auto|osc52|wayland|xclip|xselCommand-line flag
COPYBUFFER_BACKEND=osc52Environment variable

The flag overrides the environment variable. auto is the default.

Automatic selection prefers a native graphical backend when its environment and executable are present: Wayland (wl-copy) when a Wayland session is detected, otherwise xclip or xsel when DISPLAY is set and the display looks reachable. DISPLAY is only a hint — a value such as localhost:12.0 does not prove X11 works. Copybuffer probes the X11 socket or TCP port (250ms) before running xclip, and caps graphical helpers at 2 seconds, so a dead SSH forward does not stall the command. If that graphical backend fails, auto falls back to OSC 52 when /dev/tty is writable. Explicit xclip, xsel, or wayland do not fall back; they fail with a nonzero exit status. Explicit osc52 skips X11 and Wayland.

# Force OSC 52 (useful over SSH)
cb --backend osc52 filename.txt
printf'test'| COPYBUFFER_BACKEND=osc52 cb

OSC 52 over SSH. Copybuffer encodes the text as UTF-8, then Base64, and writes this control sequence to /dev/tty (not stdout, so it still works at the end of a pipeline):

ESC ] 52 ; c ; BASE64_DATA BEL

SSH_TTY is not required. The session needs a writable controlling terminal (/dev/tty). The local terminal emulator must allow OSC 52 clipboard writes (iTerm2, kitty, Alacritty, Windows Terminal, xterm with allowWindowOps, and others). tmux users typically need set -s set-clipboard on. Some terminals (notably many VTE-based ones) ignore OSC 52.

Payload size. Copybuffer does not chunk OSC 52 payloads. Terminals and multiplexers often cap the sequence (commonly tens to hundreds of kilobytes; tmux, screen, and some emulators truncate or drop larger pastes). If a large copy appears truncated, use a native graphical backend or split the payload.

Security. OSC 52 lets the application running in the terminal set the local clipboard. Over SSH that means a remote cb (or any remote program that emits the sequence) can overwrite clipboard contents on your workstation. Disable or restrict OSC 52 in the terminal if you do not trust the remote session, and avoid --backend osc52 on untrusted hosts. Copybuffer's OSC 52 path is text-only; it will not place images on the clipboard that way.

macOS and Windows keep the existing pyperclip/pbcopy behavior when --backend auto is used.

Image Support

Supports copying image files directly to clipboard. Image files are detected automatically based on their MIME type, or you can force image handling with the --image flag:

  • PNG
  • JPG/JPEG
  • BMP
  • GIF (first frame)
cb image.png

Directory Mode

Copy contents of all text files in a directory:

cb -d /path/to/directory
  • Automatically skips image files
  • Uses .gitignore rules from the current working directory
  • Optionally includes headers with -i flag
  • Can format as Discord attachments with -a flag
  • Use -r to walk directories recursively and include nested files

Debug Mode

Enable detailed output for troubleshooting:

cb --debug filename.txt

Version Information

# Display version information
cb --version
# Output: copybuffer version 1.11.1

Error Handling

The script provides clear error messages for common issues:

  • Missing dependencies
  • File not found
  • Permission errors
  • Invalid file types
  • Directory access errors

Examples

Copy with Headers

cb -i document.txt
# Output includes: === document.txt ===

Discord Formatting

cb -a code.py
# Output format: [Attached file: code.py\nContent:\n```\n...\n```\n]

Heredoc Script Generation

# Overwrite or create files on the target system
cb -p path/to/file1 path/to/nested/dir/file2
# Append to files on the target system
cb --append path/to/file1
# Notes:# - A random, content-safe delimiter is used to avoid collisions# - Single-quoted heredocs prevent shell interpolation

Verbose Directory Copy

cb -d -v -i /path/to/docs
# Shows all processed files and copied content

Troubleshooting

If you encounter issues:

  1. Check dependencies with --debug flag
  2. Verify clipboard system access (on Linux, try --backend osc52 over SSH)
  3. Check file permissions
  4. Ensure proper Python version
  5. If cb prints success but paste is empty, upgrade past 1.10.0: that release could report success when xclip failed on a dead DISPLAY

License

This project is open source and available under the MIT License.

Contact

For issues or suggestions: draeician@gmail.com

About

A powerful command-line clipboard manager that copies files and STDIN, and generates portable shell scripts to instantly recreate them on any system.

Topics

Resources

Stars

2 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, '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

Repository files navigation

Clipboard Manager (cb)

Description

A versatile command-line utility for copying file contents, directory contents, or STDIN input to the system clipboard. Supports both text and image files, with special features for Discord formatting and debug output. The command is installed as cb and maps to copybuffer.main:main, so it can also be invoked with python -m copybuffer.

Features

  • Copy text from files to clipboard
  • Copy text from STDIN to clipboard
  • Copy contents of all files in a directory (non-recursive by default)
  • Recursively expand directories when needed
  • Honor .gitignore patterns while scanning directories
  • Copy images to clipboard
  • Include headers with filenames
  • Format output for Discord
  • Generate heredoc shell script to recreate files on paste
  • Append mode for heredoc script generation
  • Verbose output option
  • Debug mode

Requirements

  • Python 3.x

  • pyperclip

  • PIL (for image support)

  • xclip or xsel (Linux X11, preferred when DISPLAY is set and the tool works)

  • wl-clipboard (Wayland only)

  • A terminal that supports OSC 52, for SSH/remote sessions without a working graphical clipboard

    On CachyOS/Hyprland systems, wl-clipboard is preferred for native clipboard access. Wayland detection checks for WAYLAND_DISPLAY, XDG_SESSION_TYPE=wayland, HYPRLAND_INSTANCE_SIGNATURE, or SWAYSOCK. If wl-copy is missing or fails, auto may fall back to OSC 52.

Installation

  1. Install package with pipx:
pipx install .

Uninstall

pipx uninstall copybuffer)
  1. For Linux systems, install clipboard handlers:
sudo apt-get install xclip
# or
sudo apt-get install xsel
# For Wayland sessions
sudo apt-get install wl-clipboard

Usage

Basic Usage

# Copy file contents
cb filename.txt
# Copy from STDINecho"hello"| cb
# Copy directory contents (non-recursive)
cb -d directory/
# Copy directory contents recursively
cb -r directory/
# Copy with Discord formatting
cb -a filename.txt
# Copy with headers
cb -i filename.txt
# Copy as heredoc script for recreating files on paste
cb -p path/to/file1.txt path/to/file2.txt
# Copy as heredoc script that appends to target files
cb --append path/to/file1.txt

Options

  • file: File to copy (optional - reads from STDIN if not provided)
  • -i, --include-header: Include filename as header in copied text
  • -d, --directory: Copy contents of all files in directory (non-recursive)
  • -r, --recursive: Recursively copy contents of provided directories
  • -v, --verbose: Display the copied contents
  • -a, --attachment: Format output as Discord attachment
  • -p, --paste: Copy a heredoc shell script that recreates the given files when pasted
  • --append: Use with --paste behavior to append to files instead of overwriting
  • --image: Include image files discovered when expanding directories
  • --debug: Enable debug mode
  • --backend {auto,osc52,wayland,xclip,xsel}: Select the text clipboard backend. Overrides COPYBUFFER_BACKEND. Default: auto
  • --version: Display application version

Clipboard backends (Linux text)

cb copies text with an explicit backend. Images never use OSC 52.

SelectionHow
--backend auto|osc52|wayland|xclip|xselCommand-line flag
COPYBUFFER_BACKEND=osc52Environment variable

The flag overrides the environment variable. auto is the default.

Automatic selection prefers a native graphical backend when its environment and executable are present: Wayland (wl-copy) when a Wayland session is detected, otherwise xclip or xsel when DISPLAY is set and the display looks reachable. DISPLAY is only a hint — a value such as localhost:12.0 does not prove X11 works. Copybuffer probes the X11 socket or TCP port (250ms) before running xclip, and caps graphical helpers at 2 seconds, so a dead SSH forward does not stall the command. If that graphical backend fails, auto falls back to OSC 52 when /dev/tty is writable. Explicit xclip, xsel, or wayland do not fall back; they fail with a nonzero exit status. Explicit osc52 skips X11 and Wayland.

# Force OSC 52 (useful over SSH)
cb --backend osc52 filename.txt
printf'test'| COPYBUFFER_BACKEND=osc52 cb

OSC 52 over SSH. Copybuffer encodes the text as UTF-8, then Base64, and writes this control sequence to /dev/tty (not stdout, so it still works at the end of a pipeline):

ESC ] 52 ; c ; BASE64_DATA BEL

SSH_TTY is not required. The session needs a writable controlling terminal (/dev/tty). The local terminal emulator must allow OSC 52 clipboard writes (iTerm2, kitty, Alacritty, Windows Terminal, xterm with allowWindowOps, and others). tmux users typically need set -s set-clipboard on. Some terminals (notably many VTE-based ones) ignore OSC 52.

Payload size. Copybuffer does not chunk OSC 52 payloads. Terminals and multiplexers often cap the sequence (commonly tens to hundreds of kilobytes; tmux, screen, and some emulators truncate or drop larger pastes). If a large copy appears truncated, use a native graphical backend or split the payload.

Security. OSC 52 lets the application running in the terminal set the local clipboard. Over SSH that means a remote cb (or any remote program that emits the sequence) can overwrite clipboard contents on your workstation. Disable or restrict OSC 52 in the terminal if you do not trust the remote session, and avoid --backend osc52 on untrusted hosts. Copybuffer's OSC 52 path is text-only; it will not place images on the clipboard that way.

macOS and Windows keep the existing pyperclip/pbcopy behavior when --backend auto is used.

Image Support

Supports copying image files directly to clipboard. Image files are detected automatically based on their MIME type, or you can force image handling with the --image flag:

  • PNG
  • JPG/JPEG
  • BMP
  • GIF (first frame)
cb image.png

Directory Mode

Copy contents of all text files in a directory:

cb -d /path/to/directory
  • Automatically skips image files
  • Uses .gitignore rules from the current working directory
  • Optionally includes headers with -i flag
  • Can format as Discord attachments with -a flag
  • Use -r to walk directories recursively and include nested files

Debug Mode

Enable detailed output for troubleshooting:

cb --debug filename.txt

Version Information

# Display version information
cb --version
# Output: copybuffer version 1.11.1

Error Handling

The script provides clear error messages for common issues:

  • Missing dependencies
  • File not found
  • Permission errors
  • Invalid file types
  • Directory access errors

Examples

Copy with Headers

cb -i document.txt
# Output includes: === document.txt ===

Discord Formatting

cb -a code.py
# Output format: [Attached file: code.py\nContent:\n```\n...\n```\n]

Heredoc Script Generation

# Overwrite or create files on the target system
cb -p path/to/file1 path/to/nested/dir/file2
# Append to files on the target system
cb --append path/to/file1
# Notes:# - A random, content-safe delimiter is used to avoid collisions# - Single-quoted heredocs prevent shell interpolation

Verbose Directory Copy

cb -d -v -i /path/to/docs
# Shows all processed files and copied content

Troubleshooting

If you encounter issues:

  1. Check dependencies with --debug flag
  2. Verify clipboard system access (on Linux, try --backend osc52 over SSH)
  3. Check file permissions
  4. Ensure proper Python version
  5. If cb prints success but paste is empty, upgrade past 1.10.0: that release could report success when xclip failed on a dead DISPLAY

License

This project is open source and available under the MIT License.

Contact

For issues or suggestions: draeician@gmail.com

About

A powerful command-line clipboard manager that copies files and STDIN, and generates portable shell scripts to instantly recreate them on any system.

Topics

Resources

Stars

2 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, '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

Repository files navigation

Clipboard Manager (cb)

Description

A versatile command-line utility for copying file contents, directory contents, or STDIN input to the system clipboard. Supports both text and image files, with special features for Discord formatting and debug output. The command is installed as cb and maps to copybuffer.main:main, so it can also be invoked with python -m copybuffer.

Features

  • Copy text from files to clipboard
  • Copy text from STDIN to clipboard
  • Copy contents of all files in a directory (non-recursive by default)
  • Recursively expand directories when needed
  • Honor .gitignore patterns while scanning directories
  • Copy images to clipboard
  • Include headers with filenames
  • Format output for Discord
  • Generate heredoc shell script to recreate files on paste
  • Append mode for heredoc script generation
  • Verbose output option
  • Debug mode

Requirements

  • Python 3.x

  • pyperclip

  • PIL (for image support)

  • xclip or xsel (Linux X11, preferred when DISPLAY is set and the tool works)

  • wl-clipboard (Wayland only)

  • A terminal that supports OSC 52, for SSH/remote sessions without a working graphical clipboard

    On CachyOS/Hyprland systems, wl-clipboard is preferred for native clipboard access. Wayland detection checks for WAYLAND_DISPLAY, XDG_SESSION_TYPE=wayland, HYPRLAND_INSTANCE_SIGNATURE, or SWAYSOCK. If wl-copy is missing or fails, auto may fall back to OSC 52.

Installation

  1. Install package with pipx:
pipx install .

Uninstall

pipx uninstall copybuffer)
  1. For Linux systems, install clipboard handlers:
sudo apt-get install xclip
# or
sudo apt-get install xsel
# For Wayland sessions
sudo apt-get install wl-clipboard

Usage

Basic Usage

# Copy file contents
cb filename.txt
# Copy from STDINecho"hello"| cb
# Copy directory contents (non-recursive)
cb -d directory/
# Copy directory contents recursively
cb -r directory/
# Copy with Discord formatting
cb -a filename.txt
# Copy with headers
cb -i filename.txt
# Copy as heredoc script for recreating files on paste
cb -p path/to/file1.txt path/to/file2.txt
# Copy as heredoc script that appends to target files
cb --append path/to/file1.txt

Options

  • file: File to copy (optional - reads from STDIN if not provided)
  • -i, --include-header: Include filename as header in copied text
  • -d, --directory: Copy contents of all files in directory (non-recursive)
  • -r, --recursive: Recursively copy contents of provided directories
  • -v, --verbose: Display the copied contents
  • -a, --attachment: Format output as Discord attachment
  • -p, --paste: Copy a heredoc shell script that recreates the given files when pasted
  • --append: Use with --paste behavior to append to files instead of overwriting
  • --image: Include image files discovered when expanding directories
  • --debug: Enable debug mode
  • --backend {auto,osc52,wayland,xclip,xsel}: Select the text clipboard backend. Overrides COPYBUFFER_BACKEND. Default: auto
  • --version: Display application version

Clipboard backends (Linux text)

cb copies text with an explicit backend. Images never use OSC 52.

SelectionHow
--backend auto|osc52|wayland|xclip|xselCommand-line flag
COPYBUFFER_BACKEND=osc52Environment variable

The flag overrides the environment variable. auto is the default.

Automatic selection prefers a native graphical backend when its environment and executable are present: Wayland (wl-copy) when a Wayland session is detected, otherwise xclip or xsel when DISPLAY is set and the display looks reachable. DISPLAY is only a hint — a value such as localhost:12.0 does not prove X11 works. Copybuffer probes the X11 socket or TCP port (250ms) before running xclip, and caps graphical helpers at 2 seconds, so a dead SSH forward does not stall the command. If that graphical backend fails, auto falls back to OSC 52 when /dev/tty is writable. Explicit xclip, xsel, or wayland do not fall back; they fail with a nonzero exit status. Explicit osc52 skips X11 and Wayland.

# Force OSC 52 (useful over SSH)
cb --backend osc52 filename.txt
printf'test'| COPYBUFFER_BACKEND=osc52 cb

OSC 52 over SSH. Copybuffer encodes the text as UTF-8, then Base64, and writes this control sequence to /dev/tty (not stdout, so it still works at the end of a pipeline):

ESC ] 52 ; c ; BASE64_DATA BEL

SSH_TTY is not required. The session needs a writable controlling terminal (/dev/tty). The local terminal emulator must allow OSC 52 clipboard writes (iTerm2, kitty, Alacritty, Windows Terminal, xterm with allowWindowOps, and others). tmux users typically need set -s set-clipboard on. Some terminals (notably many VTE-based ones) ignore OSC 52.

Payload size. Copybuffer does not chunk OSC 52 payloads. Terminals and multiplexers often cap the sequence (commonly tens to hundreds of kilobytes; tmux, screen, and some emulators truncate or drop larger pastes). If a large copy appears truncated, use a native graphical backend or split the payload.

Security. OSC 52 lets the application running in the terminal set the local clipboard. Over SSH that means a remote cb (or any remote program that emits the sequence) can overwrite clipboard contents on your workstation. Disable or restrict OSC 52 in the terminal if you do not trust the remote session, and avoid --backend osc52 on untrusted hosts. Copybuffer's OSC 52 path is text-only; it will not place images on the clipboard that way.

macOS and Windows keep the existing pyperclip/pbcopy behavior when --backend auto is used.

Image Support

Supports copying image files directly to clipboard. Image files are detected automatically based on their MIME type, or you can force image handling with the --image flag:

  • PNG
  • JPG/JPEG
  • BMP
  • GIF (first frame)
cb image.png

Directory Mode

Copy contents of all text files in a directory:

cb -d /path/to/directory
  • Automatically skips image files
  • Uses .gitignore rules from the current working directory
  • Optionally includes headers with -i flag
  • Can format as Discord attachments with -a flag
  • Use -r to walk directories recursively and include nested files

Debug Mode

Enable detailed output for troubleshooting:

cb --debug filename.txt

Version Information

# Display version information
cb --version
# Output: copybuffer version 1.11.1

Error Handling

The script provides clear error messages for common issues:

  • Missing dependencies
  • File not found
  • Permission errors
  • Invalid file types
  • Directory access errors

Examples

Copy with Headers

cb -i document.txt
# Output includes: === document.txt ===

Discord Formatting

cb -a code.py
# Output format: [Attached file: code.py\nContent:\n```\n...\n```\n]

Heredoc Script Generation

# Overwrite or create files on the target system
cb -p path/to/file1 path/to/nested/dir/file2
# Append to files on the target system
cb --append path/to/file1
# Notes:# - A random, content-safe delimiter is used to avoid collisions# - Single-quoted heredocs prevent shell interpolation

Verbose Directory Copy

cb -d -v -i /path/to/docs
# Shows all processed files and copied content

Troubleshooting

If you encounter issues:

  1. Check dependencies with --debug flag
  2. Verify clipboard system access (on Linux, try --backend osc52 over SSH)
  3. Check file permissions
  4. Ensure proper Python version
  5. If cb prints success but paste is empty, upgrade past 1.10.0: that release could report success when xclip failed on a dead DISPLAY

License

This project is open source and available under the MIT License.

Contact

For issues or suggestions: draeician@gmail.com

About

A powerful command-line clipboard manager that copies files and STDIN, and generates portable shell scripts to instantly recreate them on any system.

Topics

Resources

Stars

2 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, '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

Repository files navigation

Clipboard Manager (cb)

Description

A versatile command-line utility for copying file contents, directory contents, or STDIN input to the system clipboard. Supports both text and image files, with special features for Discord formatting and debug output. The command is installed as cb and maps to copybuffer.main:main, so it can also be invoked with python -m copybuffer.

Features

  • Copy text from files to clipboard
  • Copy text from STDIN to clipboard
  • Copy contents of all files in a directory (non-recursive by default)
  • Recursively expand directories when needed
  • Honor .gitignore patterns while scanning directories
  • Copy images to clipboard
  • Include headers with filenames
  • Format output for Discord
  • Generate heredoc shell script to recreate files on paste
  • Append mode for heredoc script generation
  • Verbose output option
  • Debug mode

Requirements

  • Python 3.x

  • pyperclip

  • PIL (for image support)

  • xclip or xsel (Linux X11, preferred when DISPLAY is set and the tool works)

  • wl-clipboard (Wayland only)

  • A terminal that supports OSC 52, for SSH/remote sessions without a working graphical clipboard

    On CachyOS/Hyprland systems, wl-clipboard is preferred for native clipboard access. Wayland detection checks for WAYLAND_DISPLAY, XDG_SESSION_TYPE=wayland, HYPRLAND_INSTANCE_SIGNATURE, or SWAYSOCK. If wl-copy is missing or fails, auto may fall back to OSC 52.

Installation

  1. Install package with pipx:
pipx install .

Uninstall

pipx uninstall copybuffer)
  1. For Linux systems, install clipboard handlers:
sudo apt-get install xclip
# or
sudo apt-get install xsel
# For Wayland sessions
sudo apt-get install wl-clipboard

Usage

Basic Usage

# Copy file contents
cb filename.txt
# Copy from STDINecho"hello"| cb
# Copy directory contents (non-recursive)
cb -d directory/
# Copy directory contents recursively
cb -r directory/
# Copy with Discord formatting
cb -a filename.txt
# Copy with headers
cb -i filename.txt
# Copy as heredoc script for recreating files on paste
cb -p path/to/file1.txt path/to/file2.txt
# Copy as heredoc script that appends to target files
cb --append path/to/file1.txt

Options

  • file: File to copy (optional - reads from STDIN if not provided)
  • -i, --include-header: Include filename as header in copied text
  • -d, --directory: Copy contents of all files in directory (non-recursive)
  • -r, --recursive: Recursively copy contents of provided directories
  • -v, --verbose: Display the copied contents
  • -a, --attachment: Format output as Discord attachment
  • -p, --paste: Copy a heredoc shell script that recreates the given files when pasted
  • --append: Use with --paste behavior to append to files instead of overwriting
  • --image: Include image files discovered when expanding directories
  • --debug: Enable debug mode
  • --backend {auto,osc52,wayland,xclip,xsel}: Select the text clipboard backend. Overrides COPYBUFFER_BACKEND. Default: auto
  • --version: Display application version

Clipboard backends (Linux text)

cb copies text with an explicit backend. Images never use OSC 52.

SelectionHow
--backend auto|osc52|wayland|xclip|xselCommand-line flag
COPYBUFFER_BACKEND=osc52Environment variable

The flag overrides the environment variable. auto is the default.

Automatic selection prefers a native graphical backend when its environment and executable are present: Wayland (wl-copy) when a Wayland session is detected, otherwise xclip or xsel when DISPLAY is set and the display looks reachable. DISPLAY is only a hint — a value such as localhost:12.0 does not prove X11 works. Copybuffer probes the X11 socket or TCP port (250ms) before running xclip, and caps graphical helpers at 2 seconds, so a dead SSH forward does not stall the command. If that graphical backend fails, auto falls back to OSC 52 when /dev/tty is writable. Explicit xclip, xsel, or wayland do not fall back; they fail with a nonzero exit status. Explicit osc52 skips X11 and Wayland.

# Force OSC 52 (useful over SSH)
cb --backend osc52 filename.txt
printf'test'| COPYBUFFER_BACKEND=osc52 cb

OSC 52 over SSH. Copybuffer encodes the text as UTF-8, then Base64, and writes this control sequence to /dev/tty (not stdout, so it still works at the end of a pipeline):

ESC ] 52 ; c ; BASE64_DATA BEL

SSH_TTY is not required. The session needs a writable controlling terminal (/dev/tty). The local terminal emulator must allow OSC 52 clipboard writes (iTerm2, kitty, Alacritty, Windows Terminal, xterm with allowWindowOps, and others). tmux users typically need set -s set-clipboard on. Some terminals (notably many VTE-based ones) ignore OSC 52.

Payload size. Copybuffer does not chunk OSC 52 payloads. Terminals and multiplexers often cap the sequence (commonly tens to hundreds of kilobytes; tmux, screen, and some emulators truncate or drop larger pastes). If a large copy appears truncated, use a native graphical backend or split the payload.

Security. OSC 52 lets the application running in the terminal set the local clipboard. Over SSH that means a remote cb (or any remote program that emits the sequence) can overwrite clipboard contents on your workstation. Disable or restrict OSC 52 in the terminal if you do not trust the remote session, and avoid --backend osc52 on untrusted hosts. Copybuffer's OSC 52 path is text-only; it will not place images on the clipboard that way.

macOS and Windows keep the existing pyperclip/pbcopy behavior when --backend auto is used.

Image Support

Supports copying image files directly to clipboard. Image files are detected automatically based on their MIME type, or you can force image handling with the --image flag:

  • PNG
  • JPG/JPEG
  • BMP
  • GIF (first frame)
cb image.png

Directory Mode

Copy contents of all text files in a directory:

cb -d /path/to/directory
  • Automatically skips image files
  • Uses .gitignore rules from the current working directory
  • Optionally includes headers with -i flag
  • Can format as Discord attachments with -a flag
  • Use -r to walk directories recursively and include nested files

Debug Mode

Enable detailed output for troubleshooting:

cb --debug filename.txt

Version Information

# Display version information
cb --version
# Output: copybuffer version 1.11.1

Error Handling

The script provides clear error messages for common issues:

  • Missing dependencies
  • File not found
  • Permission errors
  • Invalid file types
  • Directory access errors

Examples

Copy with Headers

cb -i document.txt
# Output includes: === document.txt ===

Discord Formatting

cb -a code.py
# Output format: [Attached file: code.py\nContent:\n```\n...\n```\n]

Heredoc Script Generation

# Overwrite or create files on the target system
cb -p path/to/file1 path/to/nested/dir/file2
# Append to files on the target system
cb --append path/to/file1
# Notes:# - A random, content-safe delimiter is used to avoid collisions# - Single-quoted heredocs prevent shell interpolation

Verbose Directory Copy

cb -d -v -i /path/to/docs
# Shows all processed files and copied content

Troubleshooting

If you encounter issues:

  1. Check dependencies with --debug flag
  2. Verify clipboard system access (on Linux, try --backend osc52 over SSH)
  3. Check file permissions
  4. Ensure proper Python version
  5. If cb prints success but paste is empty, upgrade past 1.10.0: that release could report success when xclip failed on a dead DISPLAY

License

This project is open source and available under the MIT License.

Contact

For issues or suggestions: draeician@gmail.com

About

A powerful command-line clipboard manager that copies files and STDIN, and generates portable shell scripts to instantly recreate them on any system.

Topics

Resources

Stars

2 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, '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

Repository files navigation

Clipboard Manager (cb)

Description

A versatile command-line utility for copying file contents, directory contents, or STDIN input to the system clipboard. Supports both text and image files, with special features for Discord formatting and debug output. The command is installed as cb and maps to copybuffer.main:main, so it can also be invoked with python -m copybuffer.

Features

  • Copy text from files to clipboard
  • Copy text from STDIN to clipboard
  • Copy contents of all files in a directory (non-recursive by default)
  • Recursively expand directories when needed
  • Honor .gitignore patterns while scanning directories
  • Copy images to clipboard
  • Include headers with filenames
  • Format output for Discord
  • Generate heredoc shell script to recreate files on paste
  • Append mode for heredoc script generation
  • Verbose output option
  • Debug mode

Requirements

  • Python 3.x

  • pyperclip

  • PIL (for image support)

  • xclip or xsel (Linux X11, preferred when DISPLAY is set and the tool works)

  • wl-clipboard (Wayland only)

  • A terminal that supports OSC 52, for SSH/remote sessions without a working graphical clipboard

    On CachyOS/Hyprland systems, wl-clipboard is preferred for native clipboard access. Wayland detection checks for WAYLAND_DISPLAY, XDG_SESSION_TYPE=wayland, HYPRLAND_INSTANCE_SIGNATURE, or SWAYSOCK. If wl-copy is missing or fails, auto may fall back to OSC 52.

Installation

  1. Install package with pipx:
pipx install .

Uninstall

pipx uninstall copybuffer)
  1. For Linux systems, install clipboard handlers:
sudo apt-get install xclip
# or
sudo apt-get install xsel
# For Wayland sessions
sudo apt-get install wl-clipboard

Usage

Basic Usage

# Copy file contents
cb filename.txt
# Copy from STDINecho"hello"| cb
# Copy directory contents (non-recursive)
cb -d directory/
# Copy directory contents recursively
cb -r directory/
# Copy with Discord formatting
cb -a filename.txt
# Copy with headers
cb -i filename.txt
# Copy as heredoc script for recreating files on paste
cb -p path/to/file1.txt path/to/file2.txt
# Copy as heredoc script that appends to target files
cb --append path/to/file1.txt

Options

  • file: File to copy (optional - reads from STDIN if not provided)
  • -i, --include-header: Include filename as header in copied text
  • -d, --directory: Copy contents of all files in directory (non-recursive)
  • -r, --recursive: Recursively copy contents of provided directories
  • -v, --verbose: Display the copied contents
  • -a, --attachment: Format output as Discord attachment
  • -p, --paste: Copy a heredoc shell script that recreates the given files when pasted
  • --append: Use with --paste behavior to append to files instead of overwriting
  • --image: Include image files discovered when expanding directories
  • --debug: Enable debug mode
  • --backend {auto,osc52,wayland,xclip,xsel}: Select the text clipboard backend. Overrides COPYBUFFER_BACKEND. Default: auto
  • --version: Display application version

Clipboard backends (Linux text)

cb copies text with an explicit backend. Images never use OSC 52.

SelectionHow
--backend auto|osc52|wayland|xclip|xselCommand-line flag
COPYBUFFER_BACKEND=osc52Environment variable

The flag overrides the environment variable. auto is the default.

Automatic selection prefers a native graphical backend when its environment and executable are present: Wayland (wl-copy) when a Wayland session is detected, otherwise xclip or xsel when DISPLAY is set and the display looks reachable. DISPLAY is only a hint — a value such as localhost:12.0 does not prove X11 works. Copybuffer probes the X11 socket or TCP port (250ms) before running xclip, and caps graphical helpers at 2 seconds, so a dead SSH forward does not stall the command. If that graphical backend fails, auto falls back to OSC 52 when /dev/tty is writable. Explicit xclip, xsel, or wayland do not fall back; they fail with a nonzero exit status. Explicit osc52 skips X11 and Wayland.

# Force OSC 52 (useful over SSH)
cb --backend osc52 filename.txt
printf'test'| COPYBUFFER_BACKEND=osc52 cb

OSC 52 over SSH. Copybuffer encodes the text as UTF-8, then Base64, and writes this control sequence to /dev/tty (not stdout, so it still works at the end of a pipeline):

ESC ] 52 ; c ; BASE64_DATA BEL

SSH_TTY is not required. The session needs a writable controlling terminal (/dev/tty). The local terminal emulator must allow OSC 52 clipboard writes (iTerm2, kitty, Alacritty, Windows Terminal, xterm with allowWindowOps, and others). tmux users typically need set -s set-clipboard on. Some terminals (notably many VTE-based ones) ignore OSC 52.

Payload size. Copybuffer does not chunk OSC 52 payloads. Terminals and multiplexers often cap the sequence (commonly tens to hundreds of kilobytes; tmux, screen, and some emulators truncate or drop larger pastes). If a large copy appears truncated, use a native graphical backend or split the payload.

Security. OSC 52 lets the application running in the terminal set the local clipboard. Over SSH that means a remote cb (or any remote program that emits the sequence) can overwrite clipboard contents on your workstation. Disable or restrict OSC 52 in the terminal if you do not trust the remote session, and avoid --backend osc52 on untrusted hosts. Copybuffer's OSC 52 path is text-only; it will not place images on the clipboard that way.

macOS and Windows keep the existing pyperclip/pbcopy behavior when --backend auto is used.

Image Support

Supports copying image files directly to clipboard. Image files are detected automatically based on their MIME type, or you can force image handling with the --image flag:

  • PNG
  • JPG/JPEG
  • BMP
  • GIF (first frame)
cb image.png

Directory Mode

Copy contents of all text files in a directory:

cb -d /path/to/directory
  • Automatically skips image files
  • Uses .gitignore rules from the current working directory
  • Optionally includes headers with -i flag
  • Can format as Discord attachments with -a flag
  • Use -r to walk directories recursively and include nested files

Debug Mode

Enable detailed output for troubleshooting:

cb --debug filename.txt

Version Information

# Display version information
cb --version
# Output: copybuffer version 1.11.1

Error Handling

The script provides clear error messages for common issues:

  • Missing dependencies
  • File not found
  • Permission errors
  • Invalid file types
  • Directory access errors

Examples

Copy with Headers

cb -i document.txt
# Output includes: === document.txt ===

Discord Formatting

cb -a code.py
# Output format: [Attached file: code.py\nContent:\n```\n...\n```\n]

Heredoc Script Generation

# Overwrite or create files on the target system
cb -p path/to/file1 path/to/nested/dir/file2
# Append to files on the target system
cb --append path/to/file1
# Notes:# - A random, content-safe delimiter is used to avoid collisions# - Single-quoted heredocs prevent shell interpolation

Verbose Directory Copy

cb -d -v -i /path/to/docs
# Shows all processed files and copied content

Troubleshooting

If you encounter issues:

  1. Check dependencies with --debug flag
  2. Verify clipboard system access (on Linux, try --backend osc52 over SSH)
  3. Check file permissions
  4. Ensure proper Python version
  5. If cb prints success but paste is empty, upgrade past 1.10.0: that release could report success when xclip failed on a dead DISPLAY

License

This project is open source and available under the MIT License.

Contact

For issues or suggestions: draeician@gmail.com

About

A powerful command-line clipboard manager that copies files and STDIN, and generates portable shell scripts to instantly recreate them on any system.

Topics

Resources

Stars

2 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, '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

Repository files navigation

Clipboard Manager (cb)

Description

A versatile command-line utility for copying file contents, directory contents, or STDIN input to the system clipboard. Supports both text and image files, with special features for Discord formatting and debug output. The command is installed as cb and maps to copybuffer.main:main, so it can also be invoked with python -m copybuffer.

Features

  • Copy text from files to clipboard
  • Copy text from STDIN to clipboard
  • Copy contents of all files in a directory (non-recursive by default)
  • Recursively expand directories when needed
  • Honor .gitignore patterns while scanning directories
  • Copy images to clipboard
  • Include headers with filenames
  • Format output for Discord
  • Generate heredoc shell script to recreate files on paste
  • Append mode for heredoc script generation
  • Verbose output option
  • Debug mode

Requirements

  • Python 3.x

  • pyperclip

  • PIL (for image support)

  • xclip or xsel (Linux X11, preferred when DISPLAY is set and the tool works)

  • wl-clipboard (Wayland only)

  • A terminal that supports OSC 52, for SSH/remote sessions without a working graphical clipboard

    On CachyOS/Hyprland systems, wl-clipboard is preferred for native clipboard access. Wayland detection checks for WAYLAND_DISPLAY, XDG_SESSION_TYPE=wayland, HYPRLAND_INSTANCE_SIGNATURE, or SWAYSOCK. If wl-copy is missing or fails, auto may fall back to OSC 52.

Installation

  1. Install package with pipx:
pipx install .

Uninstall

pipx uninstall copybuffer)
  1. For Linux systems, install clipboard handlers:
sudo apt-get install xclip
# or
sudo apt-get install xsel
# For Wayland sessions
sudo apt-get install wl-clipboard

Usage

Basic Usage

# Copy file contents
cb filename.txt
# Copy from STDINecho"hello"| cb
# Copy directory contents (non-recursive)
cb -d directory/
# Copy directory contents recursively
cb -r directory/
# Copy with Discord formatting
cb -a filename.txt
# Copy with headers
cb -i filename.txt
# Copy as heredoc script for recreating files on paste
cb -p path/to/file1.txt path/to/file2.txt
# Copy as heredoc script that appends to target files
cb --append path/to/file1.txt

Options

  • file: File to copy (optional - reads from STDIN if not provided)
  • -i, --include-header: Include filename as header in copied text
  • -d, --directory: Copy contents of all files in directory (non-recursive)
  • -r, --recursive: Recursively copy contents of provided directories
  • -v, --verbose: Display the copied contents
  • -a, --attachment: Format output as Discord attachment
  • -p, --paste: Copy a heredoc shell script that recreates the given files when pasted
  • --append: Use with --paste behavior to append to files instead of overwriting
  • --image: Include image files discovered when expanding directories
  • --debug: Enable debug mode
  • --backend {auto,osc52,wayland,xclip,xsel}: Select the text clipboard backend. Overrides COPYBUFFER_BACKEND. Default: auto
  • --version: Display application version

Clipboard backends (Linux text)

cb copies text with an explicit backend. Images never use OSC 52.

SelectionHow
--backend auto|osc52|wayland|xclip|xselCommand-line flag
COPYBUFFER_BACKEND=osc52Environment variable

The flag overrides the environment variable. auto is the default.

Automatic selection prefers a native graphical backend when its environment and executable are present: Wayland (wl-copy) when a Wayland session is detected, otherwise xclip or xsel when DISPLAY is set and the display looks reachable. DISPLAY is only a hint — a value such as localhost:12.0 does not prove X11 works. Copybuffer probes the X11 socket or TCP port (250ms) before running xclip, and caps graphical helpers at 2 seconds, so a dead SSH forward does not stall the command. If that graphical backend fails, auto falls back to OSC 52 when /dev/tty is writable. Explicit xclip, xsel, or wayland do not fall back; they fail with a nonzero exit status. Explicit osc52 skips X11 and Wayland.

# Force OSC 52 (useful over SSH)
cb --backend osc52 filename.txt
printf'test'| COPYBUFFER_BACKEND=osc52 cb

OSC 52 over SSH. Copybuffer encodes the text as UTF-8, then Base64, and writes this control sequence to /dev/tty (not stdout, so it still works at the end of a pipeline):

ESC ] 52 ; c ; BASE64_DATA BEL

SSH_TTY is not required. The session needs a writable controlling terminal (/dev/tty). The local terminal emulator must allow OSC 52 clipboard writes (iTerm2, kitty, Alacritty, Windows Terminal, xterm with allowWindowOps, and others). tmux users typically need set -s set-clipboard on. Some terminals (notably many VTE-based ones) ignore OSC 52.

Payload size. Copybuffer does not chunk OSC 52 payloads. Terminals and multiplexers often cap the sequence (commonly tens to hundreds of kilobytes; tmux, screen, and some emulators truncate or drop larger pastes). If a large copy appears truncated, use a native graphical backend or split the payload.

Security. OSC 52 lets the application running in the terminal set the local clipboard. Over SSH that means a remote cb (or any remote program that emits the sequence) can overwrite clipboard contents on your workstation. Disable or restrict OSC 52 in the terminal if you do not trust the remote session, and avoid --backend osc52 on untrusted hosts. Copybuffer's OSC 52 path is text-only; it will not place images on the clipboard that way.

macOS and Windows keep the existing pyperclip/pbcopy behavior when --backend auto is used.

Image Support

Supports copying image files directly to clipboard. Image files are detected automatically based on their MIME type, or you can force image handling with the --image flag:

  • PNG
  • JPG/JPEG
  • BMP
  • GIF (first frame)
cb image.png

Directory Mode

Copy contents of all text files in a directory:

cb -d /path/to/directory
  • Automatically skips image files
  • Uses .gitignore rules from the current working directory
  • Optionally includes headers with -i flag
  • Can format as Discord attachments with -a flag
  • Use -r to walk directories recursively and include nested files

Debug Mode

Enable detailed output for troubleshooting:

cb --debug filename.txt

Version Information

# Display version information
cb --version
# Output: copybuffer version 1.11.1

Error Handling

The script provides clear error messages for common issues:

  • Missing dependencies
  • File not found
  • Permission errors
  • Invalid file types
  • Directory access errors

Examples

Copy with Headers

cb -i document.txt
# Output includes: === document.txt ===

Discord Formatting

cb -a code.py
# Output format: [Attached file: code.py\nContent:\n```\n...\n```\n]

Heredoc Script Generation

# Overwrite or create files on the target system
cb -p path/to/file1 path/to/nested/dir/file2
# Append to files on the target system
cb --append path/to/file1
# Notes:# - A random, content-safe delimiter is used to avoid collisions# - Single-quoted heredocs prevent shell interpolation

Verbose Directory Copy

cb -d -v -i /path/to/docs
# Shows all processed files and copied content

Troubleshooting

If you encounter issues:

  1. Check dependencies with --debug flag
  2. Verify clipboard system access (on Linux, try --backend osc52 over SSH)
  3. Check file permissions
  4. Ensure proper Python version
  5. If cb prints success but paste is empty, upgrade past 1.10.0: that release could report success when xclip failed on a dead DISPLAY

License

This project is open source and available under the MIT License.

Contact

For issues or suggestions: draeician@gmail.com

About

A powerful command-line clipboard manager that copies files and STDIN, and generates portable shell scripts to instantly recreate them on any system.

Topics

Resources

Stars

2 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages