{"id":15116965,"url":"https://github.com/xrelkd/clipcat","last_synced_at":"2026-01-28T09:13:25.920Z","repository":{"id":51199857,"uuid":"274583099","full_name":"xrelkd/clipcat","owner":"xrelkd","description":"A clipboard manager written in Rust Programming Language.","archived":false,"fork":false,"pushed_at":"2024-06-20T07:56:59.000Z","size":1778,"stargazers_count":339,"open_issues_count":15,"forks_count":18,"subscribers_count":7,"default_branch":"develop","last_synced_at":"2024-06-20T09:27:58.641Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/xrelkd.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2020-06-24T05:29:22.000Z","updated_at":"2024-06-25T15:12:15.032Z","dependencies_parsed_at":"2024-03-10T10:34:21.205Z","dependency_job_id":"24c3a3be-532c-4420-8302-c31ed47f97d4","html_url":"https://github.com/xrelkd/clipcat","commit_stats":null,"previous_names":[],"tags_count":34,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/xrelkd%2Fclipcat","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/xrelkd%2Fclipcat/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/xrelkd%2Fclipcat/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/xrelkd%2Fclipcat/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/xrelkd","download_url":"https://codeload.github.com/xrelkd/clipcat/tar.gz/refs/heads/develop","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":234462081,"owners_count":18837255,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-09-26T01:45:27.238Z","updated_at":"2026-01-28T09:13:25.908Z","avatar_url":"https://github.com/xrelkd.png","language":"Rust","funding_links":[],"categories":["Linux"],"sub_categories":["Other"],"readme":"\u003ch1 align=\"center\"\u003eClipcat\u003c/h1\u003e\n\n\u003cp align=\"center\"\u003e\n    A clipboard manager written in\n    \u003ca href=\"https://www.rust-lang.org/\" target=\"_blank\"\u003eRust Programming Language\u003c/a\u003e.\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n    \u003ca href=\"https://github.com/xrelkd/clipcat/releases\"\u003e\u003cimg src=\"https://img.shields.io/github/v/release/xrelkd/clipcat.svg\"\u003e\u003c/a\u003e\n    \u003ca href=\"https://deps.rs/repo/github/xrelkd/clipcat\"\u003e\u003cimg src=\"https://deps.rs/repo/github/xrelkd/clipcat/status.svg\"\u003e\u003c/a\u003e\n    \u003ca href=\"https://github.com/xrelkd/clipcat/actions?query=workflow%3ARust\"\u003e\u003cimg src=\"https://github.com/xrelkd/clipcat/workflows/Rust/badge.svg\"\u003e\u003c/a\u003e\n    \u003ca href=\"https://github.com/xrelkd/clipcat/actions?query=workflow%3ARelease\"\u003e\u003cimg src=\"https://github.com/xrelkd/clipcat/workflows/Release/badge.svg\"\u003e\u003c/a\u003e\n    \u003ca href=\"https://github.com/xrelkd/clipcat/blob/main/LICENSE\"\u003e\u003cimg alt=\"GitHub License\" src=\"https://img.shields.io/github/license/xrelkd/clipcat\"\u003e\u003c/a\u003e\n\u003c/p\u003e\n\n**[Installation](#installation) | [Usage](#usage) | [Integration](#integration)**\n\n\u003cdetails\u003e\n\u003csummary\u003eTable of contents\u003c/summary\u003e\n\n- [Features](#features)\n- [Installation](#installation)\n- [Architecture](#architecture)\n- [Usage](#usage)\n- [Configuration](#configuration)\n- [Integration](#integration)\n- [Programs in this Repository](#programs-in-this-repository)\n- [License](#license)\n\n\u003c/details\u003e\n\n## Features\n\n- [x] Copy/Paste plaintext\n- [x] Copy/Paste images\n- [x] Persistent clipboard contents\n- [x] Support for snippets\n- [x] Support for `X11`\n- [x] Support for `Wayland` (experimental)\n- [x] Support for `macOS`\n- [x] Support for `gRPC`\n  - [x] gRPC over `HTTP`\n  - [x] gRPC over `Unix domain socket`\n- [x] Support for `D-Bus`\n\n## Screenshots and Demonstration\n\n- Demonstration with [Rofi](https://github.com/davatorium/rofi)\n\n  https://github.com/xrelkd/clipcat/assets/46590321/606a6a3a-6d7d-49d1-98c7-988e3d72df30\n\n- Use [Rofi](https://github.com/davatorium/rofi) to select clip\n\n  ![screenshot finder rofi](docs/_static/screenshot-finder-rofi.png)\n\n- Use [dmenu](https://tools.suckless.org/dmenu/) to select clip\n\n  ![screenshot finder dmenu](docs/_static/screenshot-finder-dmenu.png)\n\n- Use [skim](https://github.com/lotabout/skim) to select clip\n\n  ![screenshot finder skim](docs/_static/screenshot-finder-skim.png)\n\n## Installation\n\n`Clipcat` can be installed using various package managers on Linux.\n\nPre-built binaries can also be downloaded from the [GitHub releases page](https://github.com/xrelkd/clipcat/releases).\n\nDetailed instructions for installing `Clipcat` can be found [here](docs/INSTALL.md).\n\n## Architecture\n\nClipcat uses a Client-Server architecture. There are two role types in this architecture: `Server` and `Client`.\n\n### Clipcat Server\n\nThe `clipcat` daemon runs as a background process and performs the following tasks:\n\n- Watches for changes to the clipboard.\n- Caches clipboard content.\n- Inserts content into the clipboard.\n- Acts as a gRPC server, waiting for remote procedure calls from clients.\n\nCurrently, `clipcat` supports the following [windowing systems](https://en.wikipedia.org/wiki/Windowing_system):\n\n- `X11`, the following `crate`s are leveraged:\n  - [x11rb](https://github.com/psychon/x11rb)\n  - [arboard](https://github.com/1Password/arboard)\n- `Wayland` (experimentally), the following `crate`s are leveraged:\n  - [wl-clipboard-rs](https://github.com/YaLTeR/wl-clipboard-rs)\n  - [arboard](https://github.com/1Password/arboard)\n\n### Clipcat Client\n\nA `clipcat` client sends requests to the server for the following operations:\n\n- `List`: list the cached clips from server.\n- `Insert`: replace the current content of `clipboard` with a clip.\n- `Remove`: remove the cached clips from server.\n\n### List of Implementations\n\n| Program        | Role Type | Comment                                                                                      |\n| -------------- | --------- | -------------------------------------------------------------------------------------------- |\n| `clipcatd`     | `Server`  | The `clipcat` server (daemon).                                                               |\n| `clipcatctl`   | `Client`  | The `clipcat` client providing a command line interface.                                     |\n| `clipcat-menu` | `Client`  | The `clipcat` client that calls a built-in finder or an external finder for selecting clips. |\n\n## Usage\n\n0. Setup configurations for `clipcat`. Read [configuration](#configuration) section for more details.\n\n```bash\nmkdir -p                       $XDG_CONFIG_HOME/clipcat\nclipcatd default-config      \u003e $XDG_CONFIG_HOME/clipcat/clipcatd.toml\nclipcatctl default-config    \u003e $XDG_CONFIG_HOME/clipcat/clipcatctl.toml\nclipcat-menu default-config  \u003e $XDG_CONFIG_HOME/clipcat/clipcat-menu.toml\n```\n\n1. Start `clipcatd` for watching clipboard events.\n\n```bash\n# Show the usage. Please read the usage before doing any other operations.\nclipcatd help\n\n# Start and daemonize clipcatd. It will run in the background.\n# You can use `pkill clipcatd` to stop it; a `SIGTERM` signal will be sent to clipcatd.\nclipcatd\n\n# Alternatively, you can start clipcatd but keep it in the foreground.\n# You can press `Ctrl+C` in your terminal to stop it; a `SIGINT` signal will be sent to clipcatd.\nclipcatd --no-daemon\n```\n\n2. Copy arbitrary text or images from other processes using your mouse or keyboard.\n\n3. You can run the following commands with `clipcatctl` or `clipcat-menu`:\n\n| Command                   | Comment                                               |\n| ------------------------- | ----------------------------------------------------- |\n| `clipcatctl list`         | List cached clipboard history                         |\n| `clipcatctl promote \u003cid\u003e` | Insert cached clip with `\u003cid\u003e` into the X11 clipboard |\n| `clipcatctl remove [ids]` | Remove cached clips with `[ids]` from the server      |\n| `clipcatctl clear`        | Clear cached clipboard history                        |\n\n| Command               | Comment                                     |\n| --------------------- | ------------------------------------------- |\n| `clipcat-menu insert` | Insert a cached clip into the X11 clipboard |\n| `clipcat-menu remove` | Remove cached clips from the server         |\n| `clipcat-menu edit`   | Edit a cached clip with `$EDITOR`           |\n\nThe following finders are supported by `clipcat-menu`:\n\n- Built-in finder (integrating with the crate [skim](https://github.com/lotabout/skim))\n- [skim](https://github.com/lotabout/skim)\n- [fzf](https://github.com/junegunn/fzf)\n- [rofi](https://github.com/davatorium/rofi)\n- [dmenu](https://tools.suckless.org/dmenu/)\n- [fuzzel](https://codeberg.org/dnkl/fuzzel)\n\n## Configuration\n\n| Program        | Default Configuration File Path              |\n| -------------- | -------------------------------------------- |\n| `clipcatd`     | `$XDG_CONFIG_HOME/clipcat/clipcatd.toml`     |\n| `clipcatctl`   | `$XDG_CONFIG_HOME/clipcat/clipcatctl.toml`   |\n| `clipcat-menu` | `$XDG_CONFIG_HOME/clipcat/clipcat-menu.toml` |\n\n\u003cdetails\u003e\n    \u003csummary\u003eConfiguration for \u003cb\u003eclipcatd\u003c/b\u003e\u003c/summary\u003e\n\n```toml\n# Run as a traditional UNIX daemon.\ndaemonize = true\n\n# Maximum number of clips in history.\nmax_history = 50\n\n# File path for clip history.\n# If this value is omitted, `clipcatd` will persist history in `$XDG_CACHE_HOME/clipcat/clipcatd-history`.\nhistory_file_path = \"/home/\u003cusername\u003e/.cache/clipcat/clipcatd-history\"\n\n# File path for the PID file.\n# If this value is omitted, `clipcatd` will place the PID file in `$XDG_RUNTIME_DIR/clipcatd.pid`.\npid_file = \"/run/user/\u003cuser-id\u003e/clipcatd.pid\"\n\n# Controls how often the program updates its stored value of the Linux primary selection.\n# In the Linux environment, the primary selection automatically updates to reflect the currently highlighted text or object,\n# typically updating with every mouse movement.\nprimary_threshold_ms = 5000\n\n[log]\n# Emit log messages to a log file.\n# If this value is omitted, `clipcatd` will disable logging to a file.\nfile_path = \"/path/to/log/file\"\n\n# Emit log messages to systemd-journald.\nemit_journald = true\n\n# Emit log messages to stdout.\nemit_stdout = false\n\n# Emit log messages to stderr.\nemit_stderr = false\n\n# Log level.\nlevel = \"INFO\"\n\n[watcher]\n# Enable watching the X11/Wayland clipboard selection.\nenable_clipboard = true\n# Enable watching the X11/Wayland primary selection.\nenable_primary = true\n\n# Ignore clips that match any of the MIME types.\nsensitive_mime_types = [\"x-kde-passwordManagerHint\"]\n\n# Ignore text clips that match any of the provided regular expressions.\n# The regular expression engine is powered by https://github.com/rust-lang/regex.\ndenied_text_regex_patterns = []\n\n# Ignore text clips with a length less than or equal to `filter_text_min_length`, in characters (Unicode scalar value), not bytes.\nfilter_text_min_length = 1\n\n# Ignore text clips with a length greater than `filter_text_max_length`, in characters (Unicode scalar value), not bytes.\nfilter_text_max_length = 20000000\n\n# Enable or disable capturing images.\ncapture_image = true\n\n# Ignore image clips with a size greater than `filter_image_max_size`, in bytes.\nfilter_image_max_size = 5242880\n\n[grpc]\n# Enable gRPC over HTTP.\nenable_http = true\n\n# Enable gRPC over Unix domain socket.\nenable_local_socket = true\n\n# Host address for gRPC.\nhost = \"127.0.0.1\"\n\n# Port number for gRPC.\nport = 45045\n\n# Path for the Unix domain socket.\n# If this value is omitted, `clipcatd` will place the socket in `$XDG_RUNTIME_DIR/clipcat/grpc.sock`.\nlocal_socket = \"/run/user/\u003cuser-id\u003e/clipcat/grpc.sock\"\n\n[dbus]\n# Enable D-Bus.\nenable = true\n\n# Specify the identifier for the current `clipcat` instance.\n# The D-Bus service name will appear as \"org.clipcat.clipcat.instance-0\".\n# If the identifier is not provided, the D-Bus service name will appear as \"org.clipcat.clipcat\".\nidentifier = \"instance-0\"\n\n[desktop_notification]\n# Enable desktop notifications.\nenable = true\n\n# Path for an icon; the given icon will be displayed in the desktop notification,\n# if your desktop notification server supports showing an icon.\n# If this value is not provided, the default value `accessories-clipboard` will be used.\nicon = \"/path/to/the/icon\"\n\n# Timeout duration in milliseconds.\n# This sets the time from when the notification is displayed until it is closed by the notification server.\ntimeout_ms = 2000\n\n# Define the length of long plaintext.\n# If the length of plaintext is greater than or equal to `long_plaintext_length`,\n# a desktop notification will be emitted.\n# If this value is 0, no desktop notification will be emitted for long plaintext.\nlong_plaintext_length = 2000\n\n\n# Snippets, only UTF-8 text is supported.\n[[snippets]]\n[snippets.Directory]\n# Name of snippet.\nname = \"my-snippets\"\n# File path to the directory containing snippets.\npath = \"/home/user/snippets\"\n\n[[snippets]]\n[snippets.File]\n# Name of snippet.\nname = \"os-release\"\n# File path to the snippet.\npath = \"/etc/os-release\"\n\n[[snippets]]\n[snippets.Text]\n# Name of snippet.\nname = \"cxx-io-speed-up\"\n# Content of the snippet.\ncontent = '''\nint io_speed_up = [] {\n    std::ios::sync_with_stdio(false);\n    std::cin.tie(nullptr);\n    std::cout.tie(nullptr);\n    return 0;\n}();\n'''\n\n[[snippets]]\n[snippets.Text]\nname = \"rust-sieve-primes\"\ncontent = '''\nfn sieve_primes(n: usize) -\u003e Vec\u003cusize\u003e {\n    if n \u003c 2 {\n        return Vec::new();\n    }\n    let root_n = f64::from(n as i32).sqrt().floor() as usize;\n    let mut is_prime = vec![true; n + 1];\n    for i in 2..=root_n {\n        if !is_prime[i] {\n            continue;\n        }\n        for j in ((i \u003c\u003c 1)..=n).step_by(i) {\n            is_prime[j] = false;\n        }\n    }\n    is_prime\n        .into_iter()\n        .enumerate()\n        .skip(2)\n        .filter_map(|(i, x)| if x { Some(i) } else { None })\n        .collect()\n}\n'''\n```\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n    \u003csummary\u003eConfiguration for \u003cb\u003eclipcatctl\u003c/b\u003e\u003c/summary\u003e\n\n```toml\n# Server endpoint.\n# `clipcatctl` connects to the server via a Unix domain socket if `server_endpoint` is a file path, such as:\n# \"/run/user/\u003cuser-id\u003e/clipcat/grpc.sock\".\n# It connects via HTTP if `server_endpoint` is a URL, like: \"http://127.0.0.1:45045\".\nserver_endpoint = \"/run/user/\u003cuser-id\u003e/clipcat/grpc.sock\"\n\n# Maximum gRPC message size in bytes that can be received from the server.\n# The default value is 8MB (8 * 1024 * 1024 bytes).\n# Increase this value if you encounter \"message length too large\" errors with large clipboard entries.\ngrpc_max_message_size = 8388608\n\n[log]\n# Emit log messages to a log file.\n# Delete this line to disable logging to a file.\nfile_path = \"/path/to/log/file\"\n# Emit log messages to systemd-journald.\nemit_journald = true\n# Emit log messages to stdout.\nemit_stdout = false\n# Emit log messages to stderr.\nemit_stderr = false\n# Log level.\nlevel = \"INFO\"\n```\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n    \u003csummary\u003eConfiguration for \u003cb\u003eclipcat-menu\u003c/b\u003e\u003c/summary\u003e\n\n```toml\n# Server endpoint\n# The `clipcat-menu` connects to the server via a Unix domain socket if `server_endpoint` is a file path, such as:\n# \"/run/user/\u003cuser-id\u003e/clipcat/grpc.sock\".\n# It connects via HTTP if `server_endpoint` is a URL, like: \"http://127.0.0.1:45045\".\nserver_endpoint = \"/run/user/\u003cuser-id\u003e/clipcat/grpc.sock\"\n\n# The default finder to invoke when no \"--finder=\u003cfinder\u003e\" option is provided.\nfinder = \"rofi\"\n\n# Maximum gRPC message size in bytes that can be received from the server.\n# The default value is 8MB (8 * 1024 * 1024 bytes).\n# Increase this value if you encounter \"message length too large\" errors with large clipboard entries.\ngrpc_max_message_size = 8388608\n\n[log]\n# Emit log messages to a log file.\n# Delete this line to disable logging to a file.\nfile_path = \"/path/to/log/file\"\n# Emit log messages to systemd-journald.\nemit_journald = true\n# Emit log messages to stdout.\nemit_stdout = false\n# Emit log messages to stderr.\nemit_stderr = false\n# Log level.\nlevel = \"INFO\"\n\n# Options for \"rofi\".\n[rofi]\n# Length of line.\nline_length = 100\n# Length of menu.\nmenu_length = 30\n# Prompt for the menu.\nmenu_prompt = \"Clipcat\"\n# Extra arguments to pass to `rofi`.\nextra_arguments = [\"-mesg\", \"Please select a clip\"]\n\n# Options for \"dmenu\".\n[dmenu]\n# Length of line.\nline_length = 100\n# Length of menu.\nmenu_length = 30\n# Prompt for the menu.\nmenu_prompt = \"Clipcat\"\n# Extra arguments to pass to `dmenu`.\nextra_arguments = [\n  \"-fn\",\n  \"SauceCodePro Nerd Font Mono-12\",\n  \"-nb\",\n  \"#282828\",\n  \"-nf\",\n  \"#ebdbb2\",\n  \"-sb\",\n  \"#d3869b\",\n  \"-sf\",\n  \"#282828\",\n]\n\n# Customize your finder.\n[custom_finder]\n# External program name.\nprogram = \"fzf\"\n# Arguments for calling the external program.\nargs = []\n\n```\n\n\u003c/details\u003e\n\n## Integration\n\n\u003cdetails\u003e\n    \u003csummary\u003eIntegrating with \u003ca href=\"https://www.zsh.org/\" target=\"_blank\"\u003eZsh\u003c/a\u003e\u003c/summary\u003e\n\nFor `zsh` users, it is useful to integrate `clipcat` with `zsh`.\n\nAdd the following commands to your `zsh` configuration file (`~/.zshrc`):\n\n```bash\nif type clipcat-menu \u003e/dev/null 2\u003e\u00261; then\n    alias clipedit=' clipcat-menu --finder=builtin edit'\n    alias clipdel=' clipcat-menu --finder=builtin remove'\n\n    bindkey -s '^\\' \"^Q clipcat-menu --finder=builtin insert ^J\"\n    bindkey -s '^]' \"^Q clipcat-menu --finder=builtin remove ^J\"\nfi\n```\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n    \u003csummary\u003eIntegrating with \u003ca href=\"https://i3wm.org/\" target=\"_blank\"\u003ei3 Window Manager\u003c/a\u003e\u003c/summary\u003e\n\nFor `i3` window manager users, it is useful to integrate `clipcat` with `i3`.\n\nAdd the following options to your `i3` configuration file (`$XDG_CONFIG_HOME/i3/config`):\n\n```\n\nexec_always --no-startup-id clipcatd # start clipcatd at startup\n\nset $launcher-clipboard-insert clipcat-menu insert\nset $launcher-clipboard-remove clipcat-menu remove\n\nbindsym $mod+p exec $launcher-clipboard-insert\nbindsym $mod+o exec $launcher-clipboard-remove\n\n```\n\n**NOTE**: You can use `rofi`, `dmenu` or `fuzzel` as the default finder.\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n    \u003csummary\u003eIntegrating with \u003ca href=\"http://leftwm.org/\" target=\"_blank\"\u003eLeftWM\u003c/a\u003e\u003c/summary\u003e\n\nFor `leftwm` users, it is useful to integrate `clipcat` with `leftwm`.\n\nAdd the following keybindings to your `leftwm` configuration file (`$XDG_CONFIG_HOME/leftwm/config.ron`):\n\n```ron\n(\n    /* other configurations */\n    keybind: [\n        /* select clip from clipboard */\n        (command: Execute, value: \"clipcat-menu insert\", modifier: [\"modkey\"], key: \"p\"),\n        (command: Execute, value: \"clipcat-menu remove\", modifier: [\"modkey\"], key: \"o\"),\n        /* other configurations */\n    ],\n    /* other configurations */\n)\n```\n\n**NOTE**: You can use `rofi`, `dmenu` or `fuzzel` as the default finder.\n\nAdd the following commands to your `$XDG_CONFIG_HOME/leftwm/themes/current/up`:\n\n```bash\n# other configurations\n\n# Start clipcatd\nclipcatd\n\n# other configurations\n```\n\nAdd the following commands to your `$XDG_CONFIG_HOME/leftwm/themes/current/down`:\n\n```bash\n# other configurations\n\n# Terminate clipcatd\npkill clipcatd\n\n# other configurations\n```\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n    \u003csummary\u003eStarting \u003cb\u003eclipcatd\u003c/b\u003e with \u003ca href=\"https://systemd.io/\" target=\"_blank\"\u003esystemd\u003c/a\u003e\u003c/summary\u003e\n\nPut the following snippet in `$XDG_CONFIG_HOME/systemd/user/clipcat.service`:\n\n```\n[Unit]\nDescription=Clipcat Daemon\nPartOf=graphical-session.target\n\n[Install]\nWantedBy=graphical-session.target\n\n[Service]\n# NOTE: We assume that your `clipcatd` is located at `/usr/bin/clipcatd`.\nExecStartPre=/bin/rm -f %t/clipcat/grpc.sock\nExecStart=/usr/bin/clipcatd --no-daemon --replace\nRestart=on-failure\nType=simple\n```\n\nEnable and start `clipcat` with the following commands:\n\n```bash\nsystemctl --user daemon-reload\nsystemctl --user enable clipcat.service\nsystemctl --user start clipcat.service\nsystemctl --user status clipcat.service\n```\n\n\u003c/details\u003e\n\n## Programs in this Repository\n\n- `clipcatd`: The `clipcat` server (daemon).\n- `clipcatctl`: The `clipcat` client that provides a command line interface.\n- `clipcat-menu`: The `clipcat` client that utilizes a built-in or external finder to select clips.\n\n- `clipcat-notify`: A tool for monitoring clipboard events. It watches the clipboard and exits when a change is detected, returning an exit code of 0 for success and 1 for errors.\n\n\u003e [!Note]\n\u003e clipcat-notify does not interact with `clipcatd`, `clipcatctl`, or `clipcat-menu`; it is simply a tool for monitoring the clipboard.\n\n## License\n\nClipcat is licensed under the GNU General Public License version 3. See [LICENSE](./LICENSE) for more information.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fxrelkd%2Fclipcat","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fxrelkd%2Fclipcat","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fxrelkd%2Fclipcat/lists"}