Wayland clipboard manager with support for multimedia
Go
1,565
134 commits
updated Oct 7, 2026
Clipboard history “manager” for Wayland
Requires Go, wl-clipboard, and xdg-utils (for MIME inference by wl-copy when no type is supplied).
$PATH.$ go install go.senan.xyz/cliphist@latest.$ wl-paste --watch cliphist store
This will listen for changes on your primary clipboard and write them to the history.
Call it once per session - for example, in your Sway config.
store reads CLIPBOARD_TYPE from wl-paste --watch (requires wl-clipboard PR #297, merged after v2.3.0). Older wl-clipboard versions leave MIME types unknown.
$ cliphist list | dmenu | cliphist decode | wl-copy
Bind it to something nice on your keyboard.
cliphist list -fields id,mime,preview
cliphist list -fields id,format
cliphist list -fields id,timestamp
cliphist list -fields mime 123
cliphist -db-path /some/db list -fields id,timestamp
cliphist list -h
list emits TSV without a header, newest first. -fields selects columns in the requested order; the default is id,preview. An optional ID selects one entry. Unknown fields and missing IDs are errors.
$ cliphist list | dmenu | cliphist delete
Or else query manually:
$ cliphist delete-query "secret item".
$ cliphist wipe.
Run this from a timer to delete entries older than 30 days:
cliphist wipe -older-than 720h
The duration is a Go duration, so days must be given in hours. Entries stored before cliphist tracked timestamps count as older than any cutoff.
$ cliphist compact.
cliphist list | dmenu | cliphist decode | wl-copy
cliphist list | fzf --no-sort | cliphist decode | wl-copy
./cliphist-fzf-sixel
Requires contrib/cliphist-fzf-sixel, chafa, and a sixel-capable terminal. Uses MIME metadata for image previews and restoration.
cliphist list | rofi -dmenu | cliphist decode | wl-copy
cliphist list | fuzzel --dmenu | cliphist decode | wl-copy
cmenu runs the script itself, so instead of a pipe you give it a script that prints the list, and gets the selected line back. See menu-clipboard for an example.
rofi -modi clipboard:/path/to/cliphist-rofi -show clipboard
(Requires contrib/cliphist-rofi).
rofi -modi clipboard:/path/to/cliphist-rofi-img -show clipboard -show-icons
(Requires contrib/cliphist-rofi-img).
cliphist list | wofi -S dmenu | cliphist decode | wl-copy
Example config for Sway:
exec wl-paste --watch cliphist store
bindsym Mod1+p exec cliphist list | wofi -S dmenu | cliphist decode | wl-copy
It's important that a line prefixed with a number is piped into cliphist decode. This number is used to look up in the database the exact original selection that you made, with all leading, trailing, non-printable, etc. whitespace preserved. None of that will be shown in the preview output of cliphist list.
Since the format of cliphist list is "<id>\t<100 char preview>", and most pickers consider "\t" to be a column separator, you can try to just select column number 2.
# fzf
cliphist list | fzf -d $'\t' --with-nth 2 | cliphist decode | wl-copy
# rofi
cliphist list | rofi -dmenu -display-columns 2 | cliphist decode | wl-copy
# fuzzel
cliphist list | fuzzel --dmenu --with-nth 2 | cliphist decode | wl-copy
# wofi
# It kind of works but breaks with quotes in the original selection. I recommend not trying to hide the column with wofi.
cliphist list | wofi --dmenu --pre-display-cmd "echo '%s' | cut -f 2" | cliphist decode | wl-copy
It's also possible to run wl-paste --watch several times for multiple MIME types.
For example, in your window manager's startup, you could run:
wl-paste --type text --watch cliphist store
wl-paste --type image --watch cliphist store
Now you should have text and raw image data available in your history. Make sure you have xdg-utils installed too.
https://user-images.githubusercontent.com/6832539/230513908-b841fffe-d7d5-46c2-b29f-28b3e91daa74.mp4
cliphist can be optionally configured to extend the default functionality. Global options can be provided with a CLI argument, environment variable, or config file key. Global CLI flags go before the command. The command-local list -fields flag is CLI-only; environment variables and config keys cannot change the output fields.
For example, the option max-items, can be set via the CLI as -max-items 100, as an environment variable CLIPHIST_MAX_ITEMS=100, or in the config file as max-items 100.
If you choose to use the config file, the default location is $XDG_CONFIG_HOME/cliphist/config. The format is a text file with one option per line, where each line is <key> <value>. For example:
# example cliphist config
max-items 1000
max-dedupe-search 200
The list of available options is:
| CLI argument | Environment variable | Config file key | Description |
|---|---|---|---|
| -max-dedupe-search | CLIPHIST_MAX_DEDUPE_SEARCH | max-dedupe-search | (Optional) maximum number of last items to look through when finding duplicates (default 100) |
| -max-items | CLIPHIST_MAX_ITEMS | max-items | (Optional) maximum number of items to store (default 750) |
| -max-store-size | CLIPHIST_MAX_STORE_SIZE | max-store-size | (Optional) maximum size of clipboard item to store, e.g. 5MB, 10MiB, 1GB (default 5MB) |
| -min-store-length | CLIPHIST_MIN_STORE_LENGTH | min-store-length | (Optional) minimum number of characters to store |
| -preview-width | CLIPHIST_PREVIEW_WIDTH | preview-width | (Optional) maximum number of characters to preview (default 100) |
| -db-path | CLIPHIST_DB_PATH | db-path | (Optional) path to db (default $XDG_CACHE_HOME/cliphist/db) |
| -config-path | CLIPHIST_CONFIG_PATH | (Optional) path to config (default $XDG_CONFIG_HOME/cliphist/config) |
Overall
Maintained
Code review
Go module
Latest release
Releases this year
(top 24 of 39)
1,099 followers · starred Nov 2025
1,249 followers · starred Jul 2025
305 followers · starred Feb 2026
23 followers · starred Apr 2024
Wayland clipboard manager with support for multimedia
Go
1,565
134 commits
updated Oct 7, 2026
Clipboard history “manager” for Wayland
Requires Go, wl-clipboard, and xdg-utils (for MIME inference by wl-copy when no type is supplied).
$PATH.$ go install go.senan.xyz/cliphist@latest.$ wl-paste --watch cliphist store
This will listen for changes on your primary clipboard and write them to the history.
Call it once per session - for example, in your Sway config.
store reads CLIPBOARD_TYPE from wl-paste --watch (requires wl-clipboard PR #297, merged after v2.3.0). Older wl-clipboard versions leave MIME types unknown.
$ cliphist list | dmenu | cliphist decode | wl-copy
Bind it to something nice on your keyboard.
cliphist list -fields id,mime,preview
cliphist list -fields id,format
cliphist list -fields id,timestamp
cliphist list -fields mime 123
cliphist -db-path /some/db list -fields id,timestamp
cliphist list -h
list emits TSV without a header, newest first. -fields selects columns in the requested order; the default is id,preview. An optional ID selects one entry. Unknown fields and missing IDs are errors.
$ cliphist list | dmenu | cliphist delete
Or else query manually:
$ cliphist delete-query "secret item".
$ cliphist wipe.
Run this from a timer to delete entries older than 30 days:
cliphist wipe -older-than 720h
The duration is a Go duration, so days must be given in hours. Entries stored before cliphist tracked timestamps count as older than any cutoff.
$ cliphist compact.
cliphist list | dmenu | cliphist decode | wl-copy
cliphist list | fzf --no-sort | cliphist decode | wl-copy
./cliphist-fzf-sixel
Requires contrib/cliphist-fzf-sixel, chafa, and a sixel-capable terminal. Uses MIME metadata for image previews and restoration.
cliphist list | rofi -dmenu | cliphist decode | wl-copy
cliphist list | fuzzel --dmenu | cliphist decode | wl-copy
cmenu runs the script itself, so instead of a pipe you give it a script that prints the list, and gets the selected line back. See menu-clipboard for an example.
rofi -modi clipboard:/path/to/cliphist-rofi -show clipboard
(Requires contrib/cliphist-rofi).
rofi -modi clipboard:/path/to/cliphist-rofi-img -show clipboard -show-icons
(Requires contrib/cliphist-rofi-img).
cliphist list | wofi -S dmenu | cliphist decode | wl-copy
Example config for Sway:
exec wl-paste --watch cliphist store
bindsym Mod1+p exec cliphist list | wofi -S dmenu | cliphist decode | wl-copy
It's important that a line prefixed with a number is piped into cliphist decode. This number is used to look up in the database the exact original selection that you made, with all leading, trailing, non-printable, etc. whitespace preserved. None of that will be shown in the preview output of cliphist list.
Since the format of cliphist list is "<id>\t<100 char preview>", and most pickers consider "\t" to be a column separator, you can try to just select column number 2.
# fzf
cliphist list | fzf -d $'\t' --with-nth 2 | cliphist decode | wl-copy
# rofi
cliphist list | rofi -dmenu -display-columns 2 | cliphist decode | wl-copy
# fuzzel
cliphist list | fuzzel --dmenu --with-nth 2 | cliphist decode | wl-copy
# wofi
# It kind of works but breaks with quotes in the original selection. I recommend not trying to hide the column with wofi.
cliphist list | wofi --dmenu --pre-display-cmd "echo '%s' | cut -f 2" | cliphist decode | wl-copy
It's also possible to run wl-paste --watch several times for multiple MIME types.
For example, in your window manager's startup, you could run:
wl-paste --type text --watch cliphist store
wl-paste --type image --watch cliphist store
Now you should have text and raw image data available in your history. Make sure you have xdg-utils installed too.
https://user-images.githubusercontent.com/6832539/230513908-b841fffe-d7d5-46c2-b29f-28b3e91daa74.mp4
cliphist can be optionally configured to extend the default functionality. Global options can be provided with a CLI argument, environment variable, or config file key. Global CLI flags go before the command. The command-local list -fields flag is CLI-only; environment variables and config keys cannot change the output fields.
For example, the option max-items, can be set via the CLI as -max-items 100, as an environment variable CLIPHIST_MAX_ITEMS=100, or in the config file as max-items 100.
If you choose to use the config file, the default location is $XDG_CONFIG_HOME/cliphist/config. The format is a text file with one option per line, where each line is <key> <value>. For example:
# example cliphist config
max-items 1000
max-dedupe-search 200
The list of available options is:
| CLI argument | Environment variable | Config file key | Description |
|---|---|---|---|
| -max-dedupe-search | CLIPHIST_MAX_DEDUPE_SEARCH | max-dedupe-search | (Optional) maximum number of last items to look through when finding duplicates (default 100) |
| -max-items | CLIPHIST_MAX_ITEMS | max-items | (Optional) maximum number of items to store (default 750) |
| -max-store-size | CLIPHIST_MAX_STORE_SIZE | max-store-size | (Optional) maximum size of clipboard item to store, e.g. 5MB, 10MiB, 1GB (default 5MB) |
| -min-store-length | CLIPHIST_MIN_STORE_LENGTH | min-store-length | (Optional) minimum number of characters to store |
| -preview-width | CLIPHIST_PREVIEW_WIDTH | preview-width | (Optional) maximum number of characters to preview (default 100) |
| -db-path | CLIPHIST_DB_PATH | db-path | (Optional) path to db (default $XDG_CACHE_HOME/cliphist/db) |
| -config-path | CLIPHIST_CONFIG_PATH | (Optional) path to config (default $XDG_CONFIG_HOME/cliphist/config) |
Overall
Maintained
Code review
Go module
Latest release
Releases this year
(top 24 of 39)
1,099 followers · starred Nov 2025
1,249 followers · starred Jul 2025
305 followers · starred Feb 2026
23 followers · starred Apr 2024