{"id":51501095,"url":"https://github.com/UniClipboard/UniClipboard","last_synced_at":"2026-07-26T15:00:44.999Z","repository":{"id":282494023,"uuid":"948019708","full_name":"UniClipboard/UniClipboard","owner":"UniClipboard","description":"Real-time clipboard sync across all your devices — local-first, peer-to-peer, and end-to-end encrypted. No account. No cloud dependency. No central server.","archived":false,"fork":false,"pushed_at":"2026-07-23T20:02:42.000Z","size":39250,"stargazers_count":1318,"open_issues_count":158,"forks_count":59,"subscribers_count":6,"default_branch":"main","last_synced_at":"2026-07-23T20:12:05.537Z","etag":null,"topics":["clipboard-manager","clipboard-sync","clipboardsync","cross-platform","e2ee","efficientnet","linux","local-first","macos","p2p","tauri-app","tauri2","tools","windows"],"latest_commit_sha":null,"homepage":"https://uniclipboard.app","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"agpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/UniClipboard.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":"SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":"AGENTS.md","dco":null,"cla":null},"funding":{"github":["mkdir700"],"patreon":null,"open_collective":null,"ko_fi":"mkdir700","tidelift":null,"community_bridge":null,"liberapay":null,"issuehunt":null,"lfx_crowdfunding":null,"polar":null,"buy_me_a_coffee":null,"thanks_dev":null,"custom":["https://afdian.com/a/mkdir700"]}},"created_at":"2025-03-13T16:03:43.000Z","updated_at":"2026-07-23T19:46:11.000Z","dependencies_parsed_at":null,"dependency_job_id":"34c0c130-b660-4e76-8f81-5fda0a1abbf9","html_url":"https://github.com/UniClipboard/UniClipboard","commit_stats":null,"previous_names":["mkdir700/uniclipboard-desktop"],"tags_count":171,"template":false,"template_full_name":null,"purl":"pkg:github/UniClipboard/UniClipboard","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/UniClipboard%2FUniClipboard","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/UniClipboard%2FUniClipboard/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/UniClipboard%2FUniClipboard/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/UniClipboard%2FUniClipboard/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/UniClipboard","download_url":"https://codeload.github.com/UniClipboard/UniClipboard/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/UniClipboard%2FUniClipboard/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":35917795,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-07-20T02:08:10.276Z","status":"online","status_checked_at":"2026-07-26T02:00:06.503Z","response_time":89,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"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":["clipboard-manager","clipboard-sync","clipboardsync","cross-platform","e2ee","efficientnet","linux","local-first","macos","p2p","tauri-app","tauri2","tools","windows"],"created_at":"2026-07-07T19:00:28.229Z","updated_at":"2026-07-26T15:00:44.992Z","avatar_url":"https://github.com/UniClipboard.png","language":"Rust","funding_links":["https://github.com/sponsors/mkdir700","https://ko-fi.com/mkdir700","https://afdian.com/a/mkdir700"],"categories":["Rust"],"sub_categories":[],"readme":"\n\u003cdiv align=\"center\"\u003e\n  \u003ch1\u003eUniClipboard\u003c/h1\u003e\n  \u003ca href=\"https://github.com/UniClipboard/UniClipboard/releases\"\u003e\n    \u003cimg\n      alt=\"Windows\"\n      src=\"https://img.shields.io/badge/-Windows-blue?style=flat-square\u0026logo=data:image/svg+xml;base64,PHN2ZyB0PSIxNzI2MzA1OTcxMDA2IiBjbGFzcz0iaWNvbiIgdmlld0JveD0iMCAwIDEwMjQgMTAyNCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHAtaWQ9IjE1NDgiIHdpZHRoPSIxMjgiIGhlaWdodD0iMTI4Ij48cGF0aCBkPSJNNTI3LjI3NTU1MTYxIDk2Ljk3MTAzMDEzdjM3My45OTIxMDY2N2g0OTQuNTEzNjE5NzVWMTUuMDI2NzU3NTN6TTUyNy4yNzU1NTE2MSA5MjguMzIzNTA4MTVsNDk0LjUxMzYxOTc1IDgwLjUyMDI4MDQ5di00NTUuNjc3NDcxNjFoLTQ5NC41MTM2MTk3NXpNNi42NzA0NTEzNiA0NzAuODMzNjgyOTdINDIyLjY3Njg1OTI1VjExMC41NjM2ODE5N2wtNDE4LjAwNjQwNzg5IDY5LjI1Nzc5NzUzek00LjY3MDQ1MTM2IDg0Ni43Njc1OTcwM0w0MjIuNjc2ODU5MjUgOTE0Ljg2MDMxMDEzVjU1My4xNjYzMTcwM0g0LjY3MDQ1MTM2eiIgcC1pZD0iMTU0OSIgZmlsbD0iI2ZmZmZmZiI+PC9wYXRoPjwvc3ZnPg==\"\n    /\u003e\n  \u003c/a\u003e\n  \u003ca href=\"https://github.com/UniClipboard/UniClipboard/releases\"\u003e\n    \u003cimg\n      alt=\"MacOS\"\n      src=\"https://img.shields.io/badge/-MacOS-black?style=flat-square\u0026logo=apple\u0026logoColor=white\"\n    /\u003e\n  \u003c/a \u003e\n  \u003ca href=\"https://github.com/UniClipboard/UniClipboard/releases\"\u003e\n    \u003cimg\n      alt=\"Linux\"\n      src=\"https://img.shields.io/badge/-Linux-purple?style=flat-square\u0026logo=linux\u0026logoColor=white\"\n    /\u003e\n  \u003c/a\u003e\n  \u003ca href=\"#mobile-companion-lan\"\u003e\n    \u003cimg\n      alt=\"iOS\"\n      src=\"https://img.shields.io/badge/-iOS%20(compat)-lightgrey?style=flat-square\u0026logo=apple\u0026logoColor=white\"\n    /\u003e\n  \u003c/a\u003e\n  \u003ca href=\"#mobile-companion-lan\"\u003e\n    \u003cimg\n      alt=\"Android\"\n      src=\"https://img.shields.io/badge/-Android%20(compat)-3DDC84?style=flat-square\u0026logo=android\u0026logoColor=white\"\n    /\u003e\n  \u003c/a\u003e\n\n  \u003cdiv\u003e\n    \u003ca href=\"./LICENSE\"\u003e\n      \u003cimg\n        src=\"https://img.shields.io/github/license/UniClipboard/UniClipboard?style=flat-square\"\n      /\u003e\n    \u003c/a \u003e\n    \u003ca href=\"https://github.com/UniClipboard/UniClipboard/releases\"\u003e\n      \u003cimg\n        src=\"https://img.shields.io/github/v/release/UniClipboard/UniClipboard?include_prereleases\u0026style=flat-square\"\n      /\u003e\n    \u003c/a \u003e\n    \u003ca href=\"https://codecov.io/gh/UniClipboard/UniClipboard\" \u003e\n      \u003cimg src=\"https://codecov.io/gh/UniClipboard/UniClipboard/branch/main/graph/badge.svg?token=QZfjXOsQTp\"/\u003e\n    \u003c/a\u003e\n  \u003c/div\u003e\n\n\u003c/div\u003e\n\n\u003cp align=\"center\"\u003eEnglish | \u003ca href=\"./README_ZH.md\"\u003e简体中文\u003c/a\u003e\u003c/p\u003e\n\u003cp align=\"center\"\u003e\u003ca href=\"./ABOUT.md\"\u003eWho maintains this project? (About \u0026amp; Trust)\u003c/a\u003e\u003c/p\u003e\n\n## Project Overview\n\n\u003e **Copy on one device. Paste on another — even across the internet.**\n\u003e\n\u003e No cloud account. No third-party servers. Your clipboard never leaves your devices in a form anyone else can read.\n\nUniClipboard is a **privacy-first**, cross-device clipboard synchronization tool.\nIt 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.\n\n\u003cp align=\"center\"\u003e\n  \u003cimg width=\"990\" height=\"660\" alt=\"UniClipboard desktop screenshot\" src=\"https://github.com/user-attachments/assets/5e1d75b0-3fed-40ee-ba47-99f5a87f2ec4\" /\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003cvideo src=\"https://github.com/user-attachments/assets/367c7f45-579a-49b7-bc96-9ccc25cf5ad0\" controls muted playsinline width=\"800\"\u003e\u003c/video\u003e\n  \u003cbr/\u003e\n  \u003cem\u003eDesktop ↔ desktop — real-time, bidirectional clipboard sync between two computers.\u003c/em\u003e\n\u003c/p\u003e\n\n\u003cdetails\u003e\n  \u003csummary\u003e\u003cstrong\u003eCurrent mobile compatibility demo\u003c/strong\u003e — share a screenshot from your phone to your desktop. (click to expand)\u003c/summary\u003e\n  \u003cp align=\"center\"\u003e\n    \u003cvideo src=\"https://github.com/user-attachments/assets/29f4bf5d-8996-4602-8784-067fb919c671\" controls muted playsinline width=\"800\"\u003e\u003c/video\u003e\n  \u003c/p\u003e\n\u003c/details\u003e\n\n\u003e [!WARNING]\n\u003e UniClipboard is currently under active development and may have unstable or missing features. Feel free to try it out and provide feedback!\n\n## Table of Contents\n\n- [Features](#features)\n- [Installation](#installation)\n  - [Download from Releases](#download-from-releases)\n  - [One-line install script (Linux / macOS)](#one-line-install-script-linux--macos)\n  - [Linux](#linux)\n  - [Homebrew (macOS)](#homebrew-macos)\n  - [Build from Source](#build-from-source)\n- [Usage](#usage)\n  - [First Device (Create a Space)](#first-device-create-a-space)\n  - [Adding More Devices (Join via Invitation)](#adding-more-devices-join-via-invitation)\n  - [Pair a Mobile Device (current compatibility mode)](#mobile-companion-lan)\n  - [Main Pages](#main-pages)\n- [Advanced Features](#advanced-features)\n  - [How it Works](#how-it-works)\n  - [Command-line Tool](#command-line-tool)\n  - [Privacy \u0026 Security](#privacy--security)\n- [FAQ](#faq)\n- [Contributing](#contributing)\n- [License](#license)\n- [Acknowledgments](#acknowledgments)\n- [Community](#community)\n\n## Features\n\n- **Cross-platform**: First-class support on Windows, macOS, and Linux. The current iOS and Android releases connect through the compatibility mode described below; the target architecture makes desktop, iOS, Android, and HarmonyOS equal P2P peers.\n- **Cross-network sync**: Desktop peers sync on the same Wi-Fi or across the internet with automatic NAT traversal and encrypted relay fallback. Mobile products may also expose LAN HTTP as a separate, user-selected compatibility channel; it never replaces or automatically takes over from the shared P2P core.\n- **Mobile app**: Install the **[UniClipboard mobile app](https://github.com/UniClipboard/UniClip)** for **iOS** ([TestFlight public beta](https://testflight.apple.com/join/nyNQ8dQe)) and **Android** ([download APK](https://github.com/UniClipboard/UniClip/releases/latest)). The bundled **iOS Shortcut** remains available as part of the separately versioned LAN compatibility channel. Full P2P capability is delivered and validated independently.\n- **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.\n- **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.\n- **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.\n- **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.\n- **Command-line tool**: A `uniclip` CLI mirrors the GUI flow and works headlessly — built for terminals, SSH sessions, scripts, and tmux workflows.\n- **Secure encryption**: XChaCha20-Poly1305 AEAD keeps data encrypted in transit and at rest — even the relay only sees ciphertext.\n- **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.\n\n## Installation\n\n### Download from Releases\n\nVisit the [GitHub Releases](https://github.com/UniClipboard/UniClipboard/releases) page to download the installation package for your operating system.\n\n### One-line install script (Linux / macOS)\n\nDon't want to pick a package by hand? One command does it:\n\n```bash\ncurl -fsSL https://uniclipboard.app/install.sh | bash\n```\n\nThe script detects OS and CPU automatically:\n\n- **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).\n- **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).\n\nCommon flags:\n\n```bash\n# Pin a specific version\ncurl -fsSL https://uniclipboard.app/install.sh | bash -s -- --version v0.9.0\n\n# Force AppImage (rootless even when sudo is available)\ncurl -fsSL https://uniclipboard.app/install.sh | bash -s -- --format appimage\n```\n\nUninstall with the matching script:\n\n```bash\n# Remove the app only, keep data and config\ncurl -fsSL https://raw.githubusercontent.com/UniClipboard/UniClipboard/main/scripts/uninstall.sh | bash\n\n# Full wipe — also removes data directories, config, and cache\ncurl -fsSL https://raw.githubusercontent.com/UniClipboard/UniClipboard/main/scripts/uninstall.sh | bash -s -- --purge\n\n# Preview what would be removed without deleting anything\ncurl -fsSL https://raw.githubusercontent.com/UniClipboard/UniClipboard/main/scripts/uninstall.sh | bash -s -- --dry-run\n```\n\n\u003e 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.\n\n### Linux\n\nEach release ships `.deb`, `.rpm`, and `.AppImage` artifacts for both `x86_64` and `aarch64` (where supported).\n\n**Fedora / RHEL / openSUSE — via COPR (recommended, auto-updating)**\n\n```bash\nsudo dnf copr enable mkdir700/uniclipboard-alpha   # alpha channel; or mkdir700/uniclipboard for stable\nsudo dnf install uniclipboard\n```\n\nAfter enabling, `sudo dnf upgrade` will pick up new releases automatically.\n\n**Or download a single .rpm / .deb / AppImage from the Releases page:**\n\n```bash\n# Debian / Ubuntu\nsudo dpkg -i uniclipboard_\u003cversion\u003e_amd64.deb\nsudo apt-get install -f                                 # resolve missing deps if any\n\n# Fedora / RHEL / openSUSE (one-shot, no COPR)\nsudo dnf install ./UniClipboard-\u003cversion\u003e-1.x86_64.rpm\n\n# AppImage (any distro)\nchmod +x UniClipboard_\u003cversion\u003e_amd64.AppImage\n./UniClipboard_\u003cversion\u003e_amd64.AppImage\n```\n\n\u003e 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.\n\n### Homebrew (macOS)\n\nOn macOS, install via the official tap [`UniClipboard/homebrew-tap`](https://github.com/UniClipboard/homebrew-tap):\n\n```bash\nbrew tap UniClipboard/tap\n\n# Homebrew 6.0+ requires you to trust third-party taps before it will load\n# their formulae/casks. Skip this and you'll hit\n# \"Refusing to load ... from untrusted tap\". It only needs to run once.\nbrew trust UniClipboard/tap\n\n# Desktop app (.app bundle)\nbrew install --cask uniclipboard\n\n# CLI only — installs the `uniclip` command\nbrew install uniclipboard\n```\n\nOr install in a single command without tapping first (still trust the tap once):\n\n```bash\nbrew trust UniClipboard/tap                          # Homebrew 6.0+, one-time\nbrew install --cask UniClipboard/tap/uniclipboard    # GUI\nbrew install UniClipboard/tap/uniclipboard           # CLI\n```\n\nThe cask and the formula can coexist — install both if you want the GUI plus the `uniclip` command.\n\n### Build from Source\n\n```bash\n# Clone the repository (`--recurse-submodules` pulls the iroh-blobs fork\n# under src-tauri/vendor/iroh-blobs/; without it `cargo build` fails).\ngit clone --recurse-submodules https://github.com/UniClipboard/UniClipboard.git\ncd UniClipboard\n\n# Install dependencies\nbun install\n\n# Start development mode\nbun tauri dev\n\n# Build application\nbun tauri build\n```\n\n## Usage\n\n### First Device (Create a Space)\n\n1. Launch the app and choose **Create a Space**\n2. Set an encryption passphrase — this protects all data inside the space\n3. Done. Copied content is stored encrypted in this space.\n\n### Adding More Devices (Join via Invitation)\n\n1. On an existing device, open the **Devices** page and **generate an invitation code** (short-lived, valid for several minutes)\n2. On the new device, choose **Join an existing space**, enter the invitation code together with the space passphrase\n3. Once verified, the device joins and syncing starts automatically.\n\n\u003e 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.\n\n### Pair a Mobile Device (current compatibility mode) \u003ca id=\"mobile-companion-lan\"\u003e\u003c/a\u003e\n\nThe **[UniClipboard mobile app](https://github.com/UniClipboard/UniClip)** is a single client for both **iOS** (now in [TestFlight public beta](https://testflight.apple.com/join/nyNQ8dQe)) and **Android** (APKs in [releases](https://github.com/UniClipboard/UniClip/releases/latest)). Current releases use a time-limited **HTTP compatibility mode**: the desktop daemon exposes a small HTTP service, and the phone reads/writes the clipboard against it. This path receives only security, compatibility, and migration fixes; the target architecture makes mobile devices full P2P space peers.\n\n1. 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).\n2. Click **Add device** to generate a QR code with the listener URL, username, and one-time password.\n3. **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.\n   \u003e ⚠️ 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 TestFlight goes direct. Re-enable it after the app is installed.\n4. **Android** — install the [**UniClipboard mobile app**](https://github.com/UniClipboard/UniClip) (APK in [releases](https://github.com/UniClipboard/UniClip/releases/latest)) and enter the same URL and credentials.\n5. Copy on either side; the other side picks it up over Wi-Fi.\n\nCompatibility-mode limitations:\n\n- **Current releases are not P2P** — the compatibility client does not NAT-hole-punch or use the relay. It works on the LAN out of the box, and reaches across networks via a self-hosted server node (public HTTPS) or a Tailscale / VPN overlay.\n- **Plain HTTP + Basic Auth at the listener** — put it behind a TLS reverse proxy (e.g. a server node) for HTTPS; native listener TLS is planned for v2. Only expose the bare listener on networks you trust.\n- **Compatibility clients are not space peers** — they do not get a node ID or read the encrypted history database. This limitation belongs to the migration path, not the shared P2P core.\n- **iOS has no silent background sync** — iOS doesn't grant apps a general-purpose background clipboard hook, so the iOS app receives/sends only while it's in the foreground (or via notification tap). This is a platform restriction, not a missing feature; even WeChat's keyboard can only sync clipboard at the moment it's invoked. See [FAQ — iOS background sync](https://www.uniclipboard.app/docs/faq#why-cant-the-ios-app-sync-clipboard-silently-in-the-background-like-the-desktop).\n\nSee the [Mobile sync guide](https://www.uniclipboard.app/docs/guides/mobile-sync) for the full setup flow, or the [headless server node guide](https://www.uniclipboard.app/docs/guides/self-host-server-node) to reach your phone over HTTPS from any network.\n\n### Main Pages\n\n- **Dashboard** — Clipboard history with full-text search and detailed preview\n- **Quick Panel** — Keyboard-shortcut overlay for fast clipboard access\n- **Devices** — Manage paired desktops and mobile clients, presence, invitation codes, QR pairing, switch spaces\n- **Settings** — General, sync, security, network, storage, and search-index options\n\n## Advanced Features\n\n### How it Works\n\n```mermaid\nflowchart LR\n  subgraph A[\"Device A (your laptop)\"]\n    direction TB\n    CC[\"Ctrl+C\"] --\u003e EA[\"encrypt\u003cbr/\u003e(your key)\"]\n  end\n  subgraph B[\"Device B (your desktop)\"]\n    direction TB\n    DB[\"decrypt\u003cbr/\u003e(your key)\"] --\u003e CV[\"Ctrl+V\"]\n  end\n  EA --\u003e|\"P2P hole-punch\"| DB\n  EA -.-\u003e|\"falls back\"| R[\"Relay\u003cbr/\u003e(sees only\u003cbr/\u003eencrypted bytes)\"]\n  R -.-\u003e DB\n```\n\n- **Pairing**: Devices exchange a public key once, locally — no cloud account, no email.\n- **Transport**: Direct connection when devices can reach each other (same Wi-Fi or via NAT hole-punching across home/office networks); falls back to an encrypted relay otherwise.\n- **Encryption**: Payload encryption is independent of the transport — even a malicious relay only sees ciphertext.\n- **Storage**: Local history is encrypted at rest, and the search index is encrypted too.\n- **Resilience**: Connections recover automatically after Wi-Fi switches, sleep/wake, or brief disconnects — no re-pairing required.\n\n### Command-line Tool\n\nThe `uniclip` CLI mirrors the GUI flow and works headlessly (e.g. on servers):\n\n```bash\nuniclip init                    # Create a new encrypted space on this device\nuniclip invite                  # Generate a short-lived invitation code\nuniclip join \u003ccode\u003e             # Join a space (re-pair, non-destructive)\nuniclip join --switch \u003ccode\u003e    # Switch to another space (re-encrypts local history)\nuniclip members                 # List paired devices and presence\nuniclip send \"hello\"            # Send clipboard content to other devices\nuniclip watch                   # Stream incoming clipboard events\nuniclip status / start / stop   # Daemon lifecycle\n```\n\n### Privacy \u0026 Security\n\n**What we collect** — Anonymous telemetry to help improve the app — never your clipboard content or any of your personal data. You can turn it off anytime in **Settings**, and we fully respect that choice.\n\n**What a relay can see** — Encrypted bytes and connection metadata (source / destination peer IDs). It can't decrypt your content, ever.\n\n**What's stored on disk** — An encrypted SQLite database, plus a search index designed so full-text search works without exposing plaintext.\n\n**If you lose a device** — Revoke it from any other paired device. Future syncs will exclude it immediately.\n\n**You can audit it** — Every line, including the cryptography, lives on GitHub. Trust the code, not the marketing.\n\n#### Cryptography details\n\n- **End-to-end encryption**: Data is encrypted in transit between devices and remains encrypted at rest in local storage.\n- **XChaCha20-Poly1305 AEAD** — modern authenticated encryption.\n  - 24-byte random nonce effectively eliminates nonce-reuse risk\n  - 32-byte (256-bit) encryption key\n  - Provides ciphertext integrity and authenticity verification\n- **Argon2id key derivation** — securely derives encryption keys from your passphrase.\n  - Memory cost: 128 MB · Iterations: 3 · Parallelism: 4 threads\n  - Resistant to GPU / ASIC cracking attacks\n- **Layered key architecture**:\n  - MasterKey encrypts clipboard content\n  - Key Encryption Key (KEK) is derived from your passphrase via Argon2id\n  - KEK is stored in the system keyring (macOS Keychain, Windows Credential Manager, Linux Secret Service)\n  - MasterKey is encrypted and stored in a KeySlot file\n- **Per-space isolation**: Each space has its own MasterKey; switching to another space re-encrypts local history under the new space's MasterKey.\n- **Device authorization**: Precise control over each paired device's access permissions.\n\n## FAQ\n\n\u003cdetails\u003e\n  \u003csummary\u003e\u003cstrong\u003eWhy not just use iCloud Universal Clipboard?\u003c/strong\u003e\u003c/summary\u003e\n\nIf you only use Apple devices, don't need history, and fully trust Apple's closed-source end-to-end encryption — iCloud is fine. The moment you add a Windows or Linux machine, want a searchable history, or want to verify the encryption yourself, you need something else.\n\u003c/details\u003e\n\n\u003cdetails\u003e\n  \u003csummary\u003e\u003cstrong\u003eWhy not a self-hosted clipboard sync (e.g. ClipCascade)?\u003c/strong\u003e\u003c/summary\u003e\n\nSelf-hosted means you have to run a server. UniClipboard works out of the box — direct P2P first, encrypted relay only as a fallback. You never have to operate any infrastructure.\n\u003c/details\u003e\n\n\u003cdetails\u003e\n  \u003csummary\u003e\u003cstrong\u003eDoes it work fully offline / LAN-only?\u003c/strong\u003e\u003c/summary\u003e\n\nYes. Devices on the same Wi-Fi connect directly without going through the relay. Even if the relay is unreachable, devices on the same network keep syncing.\n\u003c/details\u003e\n\n\u003cdetails\u003e\n  \u003csummary\u003e\u003cstrong\u003eWhere does my clipboard history actually live?\u003c/strong\u003e\u003c/summary\u003e\n\nOnly on your devices. Local storage is encrypted at rest with a key that never leaves the device's system keyring. No UniClipboard server ever receives or stores your clipboard content.\n\u003c/details\u003e\n\n\u003cdetails\u003e\n  \u003csummary\u003e\u003cstrong\u003eIs there a mobile app?\u003c/strong\u003e\u003c/summary\u003e\n\nYes — the **[UniClipboard mobile app](https://github.com/UniClipboard/UniClip)** covers both iOS and Android. Current releases use the time-limited HTTP compatibility mode described above; they work on the LAN or through a server node/Tailscale, but do not perform P2P NAT traversal themselves. The target mobile architecture uses the same full P2P core as desktop and HarmonyOS. See [Pair a Mobile Device](#mobile-companion-lan) for the current setup flow.\n\u003c/details\u003e\n\n## Contributing\n\nContributions of all kinds are welcome! Please read [CONTRIBUTING.md](./CONTRIBUTING.md) for the full development setup, branching strategy, commit conventions, and PR process.\n\nQuick start:\n\n1. Fork this repository\n2. Create your feature branch (`git checkout -b feature/amazing-feature`)\n3. Commit your changes following the project's [commit conventions](./CONTRIBUTING.md#commit-conventions)\n4. Push to the branch (`git push origin feature/amazing-feature`)\n5. Open a Pull Request against the `main` branch\n\n## License\n\nThis project is licensed under the AGPL-3.0 License - see the [LICENSE](./LICENSE) file for details.\n\n## Acknowledgments\n\n- [Tauri](https://tauri.app) - Cross-platform application framework\n- [React](https://react.dev) - Frontend UI development framework\n- [Rust](https://www.rust-lang.org) - Safe and efficient backend implementation language\n- [iroh](https://www.iroh.computer) - QUIC-based P2P networking that powers cross-network direct connections and blob transfer\n- [Tokio](https://tokio.rs) - Asynchronous runtime that drives every networking and I/O path\n- [shadcn/ui](https://ui.shadcn.com) - Composable component recipes built on Radix UI\n- [Radix UI](https://www.radix-ui.com) - Unstyled, accessible primitives behind the desktop interface\n- [Tailwind CSS](https://tailwindcss.com) - Utility-first styling for the entire UI\n- [SQLite](https://www.sqlite.org) - Embedded database that stores clipboard history locally\n\n## Community\n\nJoin us to chat with other users and the dev team:\n\n\u003ctable align=\"center\"\u003e\n  \u003ctr\u003e\n    \u003ctd align=\"center\"\u003e\u003cstrong\u003eQQ Group\u003c/strong\u003e\u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\u003cstrong\u003eWeChat Group\u003c/strong\u003e\u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\u003cstrong\u003eTelegram Group\u003c/strong\u003e\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd align=\"center\"\u003e\u003cimg src=\"./assets/qq-group-qrcode.jpg\" alt=\"QQ Group QR Code\" width=\"250\" /\u003e\u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\u003cimg src=\"./assets/wechat-group-qrcode.png\" alt=\"WeChat Group QR Code\" width=\"250\" /\u003e\u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\u003ca href=\"https://t.me/uniclipboard\"\u003e\u003cimg src=\"./assets/telegram-group-qrcode.jpg\" alt=\"Telegram Group QR Code\" width=\"250\" /\u003e\u003c/a\u003e\u003c/td\u003e\n  \u003c/tr\u003e\n\u003c/table\u003e\n\n---\n\n**Have questions or suggestions?** [Create an Issue](https://github.com/UniClipboard/UniClipboard/issues/new) or contact us to discuss!\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FUniClipboard%2FUniClipboard","html_url":"https://awesome.ecosyste.ms/projects/github.com%2FUniClipboard%2FUniClipboard","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FUniClipboard%2FUniClipboard/lists"}