TL;DR: Copy on one device, paste on another. Clipy syncs clipboard text across devices using Firebase and lightweight clients for Android and desktop.
Overview • Features • Architecture • Data Model & Security • Usage • Roadmap • Notes
Clipy is a universal clipboard that lets you copy text on one device and paste it on another with minimal friction.
The current repo includes:
- A desktop client (Python) that pushes/pulls clipboard text.
- An Android client (Java/Android Studio) prototype for mobile sync.
- A Firebase Realtime Database backend for transport and state.
Optional enhancement: FCM push to wake clients for near real-time sync without polling.
- One-tap copy/paste across devices
- Channel-based sync (link specific devices to a channel key)
- Stateless transport via Firebase Realtime Database
- Lightweight clients (Python desktop + Android)
- Graceful fallbacks (polling) with optional push (FCM) integration
flowchart LR
subgraph Clients
D["Desktop Client<br/>(Python + pyperclip)"]
A["Android App<br/>(Java/Android)"]
end
subgraph Firebase["Firebase Backend"]
RTDB["Realtime Database<br/>(/clipboards/<channelId>)"]
FCM["Optional: FCM Push<br/>notify device to pull"]
end
D <--> RTDB
A <--> RTDB
FCM --> D
FCM --> A
sequenceDiagram
autonumber
participant User as User
participant D as Desktop
participant A as Android
participant RT as RTDB
participant P as (Optional) FCM
User->>D: Copy text (OS clipboard)
D->>RT: Write {text, ts, from, channelId}
Note right of RT: onDataChange triggers on clients
RT-->>A: onDataChange delivers payload
A->>A: Validate channel + freshness
A-->>User: Paste into focused input (UX flow)
alt optional push
RT->>P: Emit notification
P->>A: Wake / fetch latest
end
/clipboards/<channelId>/messages/<pushId> = {
"text": "<string>",
"from": "<deviceId>",
"ts": "<epochMillis>"
}
- Use channel IDs (shared secret) to isolate devices.
- Prefer data messages via FCM (optional) to nudge clients, and pull content from RTDB to avoid putting clipboard content in push payloads.
- Consider client-side encryption of
text(e.g., AES-GCM) if you want end-to-end protection; store only ciphertext and metadata in RTDB.
- Pick a channelId (e.g.,
family-room,dev-laptop-phone). - Launch desktop client with that channel; pair Android app with the same channel.
- Copy on one device → paste on another.
- 🔒 End-to-end encryption with device keys
- 📸 Image/file payloads with temporary object storage (S3/GCS) + signed URLs
- 🔔 Push-first flow (FCM data messages) to reduce polling
- 🧪 Conflict handling & per-message ACKs
- 🖥️ Native desktop tray UI + auto-start
- 📱 Android foreground service + battery-aware backoff
- This repository currently focuses on text payloads and a Firebase RTDB transport with Python & Android prototypes.