cli clipboard manager

read me


clipmenu is a simple clipboard manager using fzf and xsel.


clipmenud uses clipnotify, which is provided with this repo as a submodule. You will also need fzf and xsel installed.

clone the repo with submodules:

git clone --recurse-submodules
cd clipmenu

build clipnotify, then the clipmenu bins:

cd clipnotify
make && make install
cd ..
make install

finally re{load,start} the systemd unit:

systemctl --user daemon-reload
systemctl --user restart clipmenud.service



Start clipmenud, then run clipmenu to select something to put on the clipboard. For systemd users, a user service called clipmenud is packaged as part of the project.

For those using a systemd unit and not using a desktop environment which does it automatically, you must import $DISPLAY so that clipmenud knows which X server to use. For example, in your ~/.xinitrc do this prior to launching clipmenud:

systemctl --user import-environment DISPLAY

if you're in a headless environment you need to create a "fake" xorg server for xsel to communicate with. i suggest using xvfb. put something like this in your shell init (e.g. ~/.zlogin or ~/.bash_login):

if ! pgrep -x "Xvfb" >/dev/null; then
    export DISPLAY=:0
    Xvfb :0 -screen 0 1x1x8 &
    systemctl --user import-environment DISPLAY
    systemctl --user restart clipmenud.service


this fork of clipmenu uses fzf exclusivly. you can use it's environment vars to setup the fzf style to your liking. i personally have the following set in my env:

export FZF_DEFAULT_OPTS=$FZF_DEFAULT_OPTS' --color=fg:#c1c1c1,bg:#2b2b2b,hl:#5f8787 --color=fg+:#ffffff,bg+:#1c1c1c,hl+:#3ea3a3 --color=info:#87875f,prompt:#87875f,pointer:#8787af --color=marker:#8787af,spinner:#8787af,header:#5f8787 --color=gutter:#2b2b2b,border:#222222 --padding=1 --prompt=❯ --marker=❯ --pointer=❯ --reverse'

For a full list of environment variables that clipmenud can take, please see clipmenud --help.


The behavior of clipmenud can be customized through environment variables. Despite being only <300 lines, clipmenu has many useful features, including:

  • Customising the maximum number of clips stored (default 1000)
  • Disabling clip collection temporarily with clipctl disable, reenabling with clipctl enable
  • Not storing clipboard changes from certain applications, like password managers
  • Taking direct ownership of the clipboard
  • ...and much more.

Check clipmenud --help to view all possible environment variables and what they do. If you manage clipmenud with systemd, you can override the defaults by using systemctl --user edit clipmenud to generate an override file.

Supported launchers

this fork is designed to only work with CM_LAUNCHER set to fzf (default)

How does it work?

clipmenud is less than 300 lines, and clipmenu is less than 100, so hopefully it should be fairly self-explanatory. However, at the most basic level:


  1. clipmenud uses clipnotify to wait for new clipboard events.
  2. If clipmenud detects changes to the clipboard contents, it writes them out to the cache directory and an index using a hash as the filename.


  1. clipmenu reads the index to find all available clips.
  2. fzf is executed to allow the user to select a clip.
  3. After selection, the clip is put onto the PRIMARY and CLIPBOARD X selections. or stdout using the CM_OUTPUT_CLIP=1 environment var.


checkout my dotfiles repo to see it in action.