MCPcopy Index your code
hub / github.com/UniClipboard/UniClipboard

github.com/UniClipboard/UniClipboard @v0.18.0

Chat with this repo
repository ↗ · DeepWiki ↗ · release v0.18.0 ↗ · + Follow
12,580 symbols 36,580 edges 1,485 files 2,434 documented · 19%
What it actually does AI analysis from the code graph — generated when you open this
loading…
README

UniClipboard

Windows MacOS Linux iOS Android

<a href="https://github.com/UniClipboard/UniClipboard/raw/v0.18.0/LICENSE">
  <img
    src="https://img.shields.io/github/license/UniClipboard/UniClipboard?style=flat-square"
  />
</a >
<a href="https://github.com/UniClipboard/UniClipboard/releases">
  <img
    src="https://img.shields.io/github/v/release/UniClipboard/UniClipboard?include_prereleases&style=flat-square"
  />
</a >
<a href="https://codecov.io/gh/UniClipboard/UniClipboard" >
  <img src="https://codecov.io/gh/UniClipboard/UniClipboard/branch/main/graph/badge.svg?token=QZfjXOsQTp"/>
</a>

English | 简体中文

Who maintains this project? (About & Trust)

Project Overview

Copy on one device. Paste on another — even across the internet.

No cloud account. No third-party servers. Your clipboard never leaves your devices in a form anyone else can read.

UniClipboard is a privacy-first, cross-device clipboard synchronization tool. It enables seamless and secure syncing of text, images, and files across multiple devices, whether on the same Wi-Fi or across different networks. Data is encrypted both in transit and at rest, and decrypted only on the user’s devices—neither servers nor the network layer can ever access plaintext data.

UniClipboard desktop screenshot

Desktop ↔ desktop — real-time, bidirectional clipboard sync between two computers.

Mobile companion — share a screenshot from your phone to your desktop. (click to expand)

<video src="https://github.com/user-attachments/assets/29f4bf5d-8996-4602-8784-067fb919c671" controls muted playsinline width="800"></video>

[!WARNING] UniClipboard is currently under active development and may have unstable or missing features. Feel free to try it out and provide feedback!

Table of Contents

Features

  • Cross-platform: First-class support on Windows, macOS, and Linux — your clipboard works wherever you do. iPhone and Android can join as a companion (see below).
  • Cross-network sync: Real-time sync on the same Wi-Fi, across different home/office networks, or across the internet, with automatic NAT traversal and encrypted relay fallback — not just LAN, and not bound to a single network. (Desktop ↔ desktop; mobile is a companion — LAN by default, or cross-network via a server node or Tailscale.)
  • Mobile companion: Pair an iPhone with the UniClipboard iOS App (now in TestFlight public beta) — or stay on the bundled iOS Shortcut — and on Android install the UniClipboard Android client (download APK), a fork of SyncClipboard and protocol-compatible with any other SyncClipboard client. Bidirectional clipboard exchange — on the LAN, or across networks via a server node or Tailscale. QR-code pairing, per-device credentials, rotate passwords without re-pairing.
  • Encrypted spaces: Devices join a shared "space" with one invitation code + passphrase — no cloud account, no email, just two devices agreeing to trust each other.
  • Local full-text search: Search your full history in milliseconds, even with tens of thousands of entries — and the index itself stays encrypted on disk.
  • Text, images, and files: Copy on one device, paste on another. Large files use streaming transfer so they don't have to fit in memory.
  • Quick Panel: Keyboard-shortcut overlay with inline preview for text, links, images, code, and files — designed to feel like part of the OS clipboard, not a separate app you context-switch into.
  • Command-line tool: A uniclip CLI mirrors the GUI flow and works headlessly — built for terminals, SSH sessions, scripts, and tmux workflows.
  • Secure encryption: XChaCha20-Poly1305 AEAD keeps data encrypted in transit and at rest — even the relay only sees ciphertext.
  • Multi-device management: Manage paired devices, presence, and per-device sync preferences. Revoke a lost device from any other paired one — sync stops including it immediately.

Installation

Download from Releases

Visit the GitHub Releases page to download the installation package for your operating system.

One-line install script (Linux / macOS)

Don't want to pick a package by hand? One command does it:

curl -fsSL https://uniclipboard.app/install.sh | bash

The script detects OS and CPU automatically:

  • macOS — downloads .app.tar.gz, extracts it, and moves UniClipboard.app into /Applications (escalates with sudo if the directory isn't writable; pass --prefix "$HOME/Applications" for a user-level install).
  • Linux — with sudo, installs .deb via apt or .rpm via dnf/yum; otherwise falls back to AppImage in ~/.local/bin with a .desktop entry (no root needed).

Common flags:

# Pin a specific version
curl -fsSL https://uniclipboard.app/install.sh | bash -s -- --version v0.9.0

# Force AppImage (rootless even when sudo is available)
curl -fsSL https://uniclipboard.app/install.sh | bash -s -- --format appimage

Uninstall with the matching script:

# Remove the app only, keep data and config
curl -fsSL https://raw.githubusercontent.com/UniClipboard/UniClipboard/main/scripts/uninstall.sh | bash

# Full wipe — also removes data directories, config, and cache
curl -fsSL https://raw.githubusercontent.com/UniClipboard/UniClipboard/main/scripts/uninstall.sh | bash -s -- --purge

# Preview what would be removed without deleting anything
curl -fsSL https://raw.githubusercontent.com/UniClipboard/UniClipboard/main/scripts/uninstall.sh | bash -s -- --dry-run

Update behavior matches the manual download paths below: .deb / .rpm installs are not picked up by the in-app updater — re-run the script or use your system package manager. AppImage on Linux and .app on macOS continue to update from inside the app.

Linux

Each release ships .deb, .rpm, and .AppImage artifacts for both x86_64 and aarch64 (where supported).

Fedora / RHEL / openSUSE — via COPR (recommended, auto-updating)

sudo dnf copr enable mkdir700/uniclipboard-alpha   # alpha channel; or mkdir700/uniclipboard for stable
sudo dnf install uniclipboard

After enabling, sudo dnf upgrade will pick up new releases automatically.

Or download a single .rpm / .deb / AppImage from the Releases page:

# Debian / Ubuntu
sudo dpkg -i uniclipboard_<version>_amd64.deb
sudo apt-get install -f                                 # resolve missing deps if any

# Fedora / RHEL / openSUSE (one-shot, no COPR)
sudo dnf install ./UniClipboard-<version>-1.x86_64.rpm

# AppImage (any distro)
chmod +x UniClipboard_<version>_amd64.AppImage
./UniClipboard_<version>_amd64.AppImage

Packaged installs (COPR / one-shot rpm / deb) do not auto-update from inside the app — use dnf upgrade / apt upgrade against your package source. The AppImage is what the in-app updater uses on Linux.

Homebrew (macOS)

On macOS, install via the official tap UniClipboard/homebrew-tap:

brew tap UniClipboard/tap

# Homebrew 6.0+ requires you to trust third-party taps before it will load
# their formulae/casks. Skip this and you'll hit
# "Refusing to load ... from untrusted tap". It only needs to run once.
brew trust UniClipboard/tap

# Desktop app (.app bundle)
brew install --cask uniclipboard

# CLI only — installs the `uniclip` command
brew install uniclipboard

Or install in a single command without tapping first (still trust the tap once):

brew trust UniClipboard/tap                          # Homebrew 6.0+, one-time
brew install --cask UniClipboard/tap/uniclipboard    # GUI
brew install UniClipboard/tap/uniclipboard           # CLI

The cask and the formula can coexist — install both if you want the GUI plus the uniclip command.

Build from Source

# Clone the repository (`--recurse-submodules` pulls the iroh-blobs fork
# under src-tauri/vendor/iroh-blobs/; without it `cargo build` fails).
git clone --recurse-submodules https://github.com/UniClipboard/UniClipboard.git
cd UniClipboard

# Install dependencies
bun install

# Start development mode
bun tauri dev

# Build application
bun tauri build

Usage

First Device (Create a Space)

  1. Launch the app and choose Create a Space
  2. Set an encryption passphrase — this protects all data inside the space
  3. Done. Copied content is stored encrypted in this space.

Adding More Devices (Join via Invitation)

  1. On an existing device, open the Devices page and generate an invitation code (short-lived, valid for several minutes)
  2. On the new device, choose Join an existing space, enter the invitation code together with the space passphrase
  3. Once verified, the device joins and syncing starts automatically.

Already set up and want to move to another space? Use Switch space from the Devices page (or run uniclip join --switch from the CLI) — your local clipboard history is re-encrypted and migrated. Without --switch, uniclip join takes the non-destructive redeem / re-pair path and does not switch spaces.

Pair a Mobile Device (companion)

The UniClipboard iOS App is now in TestFlight public beta. On Android, install the UniClipboard Android client — a fork of SyncClipboard that ships APKs in releases; any other SyncClipboard-compatible client also works. Either way, the phone joins as an HTTP companion — the desktop daemon exposes a small SyncClipboard-compatible HTTP service, and the phone reads/writes the clipboard against it (on the LAN by default, or across networks via a server node or Tailscale).

  1. On the desktop, open Devices → Mobile sync, enable it, and pick the LAN IPv4 the phone will reach (don't print 0.0.0.0 / Auto onto a phone screen).
  2. Click Add device to generate a QR code with the listener URL, username, and one-time password.
  3. iPhone — install TestFlight from the App Store, then open https://testflight.apple.com/join/nyNQ8dQe to accept the invite and install the UniClipboard iOS App; enter the desktop's URL + credentials in the app. The bundled iOS Shortcut (installed by scanning the QR) still works as a fallback.

    ⚠️ If TestFlight shows a certificate error, or the Install button spins because TestFlight can't reach App Store Connect, temporarily disable your proxy / VPN client (Loon, Surge, Clash, etc. — including global rules, TUN, HTTPS decryption / MitM) so

Extension points exported contracts — how you extend this code

IntoApiDto (Interface)
Pure projection from an application-facade view onto its wire DTO. [34 implementers]
crates/uc-webserver/src/api/projection/mod.rs
AnalyticsIdentityPort (Interface)
协调 `space_person_id` 持久化与 `EventContext` 重建的端口。 实现端只负责"切换 distinct_id 的来源"——发 `$identify` 由调用方显式调 [`super::port::Analyt [6 …
crates/uc-observability/src/analytics/identity.rs
HostEventEmitterPort (Interface)
Port for emitting host events from the application toward the host environment. [8 implementers]
crates/uc-core/src/ports/host_event.rs
PlatformClipboardEventLoop (Interface)
A platform clipboard event loop owns a connection to the OS clipboard change-notification mechanism (XFIXES, `wlr-data-c [5 …
crates/uc-platform/src/clipboard/event_loop.rs
DaemonService (Interface)
(no doc) [8 implementers]
apps/daemon/src/daemon/service.rs
InsertMapper (Interface)
(no doc) [11 implementers]
crates/uc-infra/src/db/ports/mapper.rs
ActivityHudListener (Interface)
HUD 渲染端订阅 trait。emitter 在状态机有变化时调用,参数是当前 完整快照(已稳定排序)。实现必须 `Send + Sync` —— emit 是同步路径 但来自任意 publisher 线程,listener 不得阻塞。 [3 …
src-tauri/crates/uc-tauri/src/activity_hud/emitter.rs
GlobalShortcutRegistry (Interface)
shell 实现的全局快捷键注册器。 实现方负责把 `shortcut`(物理键格式字符串)注册到 OS 层;按下时如何 派发回调由实现方在构造期决定(典型做法:构造时注入一个 `Fn()` 闭包, 内部转成 `tauri-plugin- [2 …
crates/uc-desktop/src/shortcuts.rs

Core symbols most depended-on inside this repo

clone
called by 2763
crates/uc-core/src/clipboard/system.rs
lock
called by 346
crates/uc-application/src/facade/encryption/mod.rs
returning
called by 333
apps/daemon/src/daemon/peers/presence_monitor.rs
as_ref
called by 315
crates/uc-core/src/clipboard/hash.rs
is_empty
called by 288
crates/uc-core/src/crypto/domain.rs
len
called by 287
crates/uc-core/src/crypto/domain.rs
lock
called by 272
crates/uc-application/src/entry_identity.rs
path
called by 267
crates/uc-daemon-local/src/instance_lock.rs

Shape

Function 6,703
Method 3,220
Class 1,720
Interface 490
Enum 447

Languages

Rust84%
TypeScript16%

Modules by API surface

crates/uc-mobile/src/client.rs134 symbols
crates/uc-application/src/facade/space_setup/facade.rs122 symbols
crates/uc-mobile-proto/src/sync_engine.rs116 symbols
crates/uc-application/src/pairing_inbound/orchestrator.rs85 symbols
crates/uc-infra/src/search/sqlite_index.rs81 symbols
crates/uc-application/src/usecases/clipboard_sync/active_state/apply_inbound.rs80 symbols
crates/uc-daemon-contract/src/api/dto/settings.rs79 symbols
crates/uc-application/src/usecases/pairing/redeem_invitation.rs79 symbols
crates/uc-application/src/usecases/mobile_sync/apply_incoming.rs77 symbols
crates/uc-application/src/facade/mobile_sync/facade.rs76 symbols
crates/uc-application/src/usecases/clipboard_sync/dispatch_entry/mod.rs74 symbols
crates/uc-observability/src/analytics/events.rs72 symbols

For agents

$ claude mcp add UniClipboard \
  -- python -m otcore.mcp_server <graph>

⬇ download graph artifact