{"id":50989145,"url":"https://github.com/appdev/ClipDock","last_synced_at":"2026-07-07T22:00:49.180Z","repository":{"id":358470989,"uuid":"1239468534","full_name":"appdev/ClipDock","owner":"appdev","description":"A local-first clipboard shelf for macOS.在 macOS 上找回、预览、固定并复用剪贴板内容，支持与手机同步、P2P 下载文件","archived":false,"fork":false,"pushed_at":"2026-06-12T06:09:31.000Z","size":108527,"stargazers_count":46,"open_issues_count":2,"forks_count":2,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-06-12T06:17:40.687Z","etag":null,"topics":["android","clipboard-manager","clipboard-tool","macos-app","p2p-network","paste","selfhosted"],"latest_commit_sha":null,"homepage":"https://clip.run.ci","language":"Swift","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/appdev.png","metadata":{"files":{"readme":"README.en.md","changelog":null,"contributing":null,"funding":null,"license":null,"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,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":"AGENTS.md","dco":null,"cla":null}},"created_at":"2026-05-15T05:55:46.000Z","updated_at":"2026-06-12T06:09:35.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/appdev/ClipDock","commit_stats":null,"previous_names":["appdev/clipshelf","appdev/clipdock"],"tags_count":13,"template":false,"template_full_name":null,"purl":"pkg:github/appdev/ClipDock","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/appdev%2FClipDock","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/appdev%2FClipDock/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/appdev%2FClipDock/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/appdev%2FClipDock/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/appdev","download_url":"https://codeload.github.com/appdev/ClipDock/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/appdev%2FClipDock/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":35243953,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-07-07T02:00:07.222Z","response_time":90,"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":["android","clipboard-manager","clipboard-tool","macos-app","p2p-network","paste","selfhosted"],"created_at":"2026-06-20T00:00:28.873Z","updated_at":"2026-07-07T22:00:49.167Z","avatar_url":"https://github.com/appdev.png","language":"Swift","funding_links":[],"categories":["Clipboard"],"sub_categories":["Text"],"readme":"# ClipDock\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"macOS/Sources/ClipDock/Resources/AppIcon.png\" alt=\"ClipDock app icon\" width=\"96\" height=\"96\"\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003cstrong\u003eRecall, preview, pin, sync, and reuse clipboard history on macOS.\u003c/strong\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003cimg alt=\"macOS 13+\" src=\"https://img.shields.io/badge/macOS-13%2B-black\"\u003e\n  \u003cimg alt=\"Local-first\" src=\"https://img.shields.io/badge/local--first-yes-brightgreen\"\u003e\n  \u003cimg alt=\"Self-hosted sync\" src=\"https://img.shields.io/badge/self--hosted-sync-blue\"\u003e\n  \u003cimg alt=\"P2P transfer\" src=\"https://img.shields.io/badge/P2P-iroh--blobs-violet\"\u003e\n  \u003cimg alt=\"Open source\" src=\"https://img.shields.io/badge/open%20source-yes-blue\"\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"README.md\"\u003e中文\u003c/a\u003e ·\n  \u003ca href=\"https://clip.run.ci/\"\u003eOfficial Website\u003c/a\u003e\n\u003c/p\u003e\n\n![ClipDock current shelf](docs/assets/marketing/clipdock-panel-overview-screen-real.webp)\n\n\u003e The ClipDock screenshots in this README are captured from a real running macOS app window with sample clipboard content on a clean desktop background.\n\n## What It Is\n\nClipDock is a local-first clipboard shelf for macOS. It keeps recent text, links, colors, images, and files close at hand, then opens as a compact panel at the bottom of the screen when you need something back.\n\nThe app is built around a simple habit: bring up the shelf, recognize the right item, preview it if needed, and reuse it without switching into a heavy management window.\n\nRecent builds add cross-device capability: run your own ClipDock Sync Server, join devices to the same sync space with a 5-character pairing code, and let large image/file payloads move over an on-demand P2P path while the server handles authentication, event sync, and P2P coordination metadata.\n\n## Why ClipDock\n\nMost clipboard work is small but frequent: a paragraph from a document, a link from the browser, a color value from a design file, a screenshot, or a file path you copied a few minutes ago. macOS keeps the latest item. ClipDock keeps the useful trail.\n\n## What You Can Do\n\n- **Open without breaking flow**\u003cbr\u003e\n  Press `Command + Shift + X` to open the shelf from the bottom edge of the screen.\n\n- **Use it entirely from the keyboard**\u003cbr\u003e\n  Move with arrow keys, search with `Command + F`, preview with `Space`, copy with `Command + C`, use `Command + 1` through `Command + 9` for visible clips, delete with `Delete`, and close with `Esc`.\n\n- **Find recent copies quickly**\u003cbr\u003e\n  Scan recent clips visually, or search when the history grows.\n\n- **Recognize content by type**\u003cbr\u003e\n  Text, rich text, links, colors, images, and files each get a dedicated card treatment.\n\n- **Preview before reuse**\u003cbr\u003e\n  Open a focused preview for text, links, colors, images, and files before reusing them.\n\n- **Pin reusable material**\u003cbr\u003e\n  Save important clips into Pinboards so they do not get buried in short-lived clipboard history.\n\n- **Stay local first, sync when needed**\u003cbr\u003e\n  Clipboard history starts on your device. When you need multiple devices, connect to your own ClipDock Sync Server and sync clipboard events inside one sync space.\n\n- **Pair devices with short codes**\u003cbr\u003e\n  Create a sync space on macOS, then let another Mac or Android client join with a one-time 5-character pairing code. Joined devices use device tokens, without a public account system.\n\n- **Move large payloads over P2P**\u003cbr\u003e\n  Full images, files, and other large payloads can be downloaded through `iroh-blobs` P2P. The server registers endpoints, providers, and path quality; it does not relay the large payload bytes.\n\n## A More Natural Clipboard\n\nClipboard history should feel like part of the desktop, not a separate place you have to manage. ClipDock stays low, visual, and quick enough for daily use across writing, development, research, design, communication, and documentation.\n\nThe goal is not to archive everything forever. It is to make the things you just copied easy to find, easy to confirm, and easy to reuse.\n\n## Preview And Pinboards\n\nThe shelf combines search, Pinboard shortcuts, and typed content cards in one horizontal workspace. You can move through recent clips without opening a full library view, and the core flow works from the keyboard.\n\nPreview is part of the core interaction. Text stays readable, images show the real image, files expose a document preview, colors render as swatches, and links can show page metadata. The GitHub card in the screenshot is backed by a ready Open Graph preview for `https://github.com/`.\n\n![ClipDock preview popover](docs/assets/marketing/clipdock-preview-screen-real.webp)\n\n![ClipDock pinboard filter](docs/assets/marketing/clipdock-panel-pinboard-screen-real.webp)\n\nPinboards separate durable material from short-lived history. Product notes, design references, release text, customer documents, and team knowledge can stay one click away.\n\nSettings support the workflow without becoming the product surface. General behavior, privacy rules, keyboard shortcuts, and about information are kept in focused pages behind the main shelf.\n\n## Sync And P2P\n\nClipDock sync is self-hosted, sync-space scoped, and local-first:\n\n- **Self-hosted Sync Server**: `Server/` contains the Rust/Axum service for sync-space creation, device pairing, event logs, snapshots, and small preview assets.\n- **One-time pairing codes**: clients create a sync space with `POST /v2/sync/create`, then use short-lived 5-character codes to join new devices. Device tokens are stored as hashes on the server.\n- **Event and snapshot sync**: clipboard items sync through `item_upsert` / `item_delete` events with cursor pulls, idempotent replay, and tombstone propagation.\n- **P2P coordination metadata**: devices report P2P endpoints and asset providers to the server so peers in the same sync space can discover available sources.\n- **Real payloads are downloaded on demand**: full images and files are fetched by clients through `iroh-blobs`. The server does not run Iroh, perform NAT traversal, or relay large payload bytes.\n- **Android client**: `Android/` includes sync-space joining, snapshot/event pull, P2P image/file downloads, and a floating overlay entry point.\n\n## Privacy\n\nClipDock starts locally. A client sends sync events only after you explicitly enable sync and configure a server URL.\n\nSync data is scoped by sync space. Knowing the server URL is not enough to read existing data; a device must create a sync space or join one with a valid pairing code. P2P endpoint and provider records are visible only inside the same sync space.\n\n## Install\n\nVisit the official website for the current product introduction and release information: [https://clip.run.ci/](https://clip.run.ci/).\n\nDownload the latest release, drag ClipDock into Applications, then press `Command + Shift + X` to open the shelf.\n\nIf macOS says Apple cannot verify ClipDock the first time you open it, follow the ordinary-user guide: [First-open help](https://clip.run.ci/open-clipdock.html).\n\n\u003e Public release packages will be published with the first GitHub release.\n\n## Open Source\n\nClipDock is open source because clipboard tools are personal infrastructure. You should be able to inspect how it works, run it locally, and help shape a tool that sits close to everyday work.\n\n## Developer Notes\n\n\n### Requirements\n\n- macOS 13.0 or later\n- Xcode command line tools\n- Swift 6.1 toolchain\n- Rust stable toolchain\n- Android Studio / Android SDK when working on the Android client\n\n### Run The macOS App From Source\n\n```bash\ncd macOS\nscripts/build-rust-core.sh\nswift run ClipDock\n```\n\nThe source executable and release product are both named `ClipDock`.\n\n### Run The Self-hosted Sync Server\n\n```bash\ncd Server\ncargo run -- --bind 127.0.0.1:8787\n```\n\nSee [Server/README.md](Server/README.md) and [Server/docs/protocol-v2.md](Server/docs/protocol-v2.md) for deployment boundaries and API details.\n\n### Common Verification\n\n```bash\ncd macOS \u0026\u0026 swift test\ncd macOS \u0026\u0026 cargo test --manifest-path rust/Cargo.toml\ncd Server \u0026\u0026 cargo fmt --check \u0026\u0026 cargo test \u0026\u0026 cargo clippy --all-targets -- -D warnings\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fappdev%2FClipDock","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fappdev%2FClipDock","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fappdev%2FClipDock/lists"}