{"id":16856037,"url":"https://github.com/Sathvik-Rao/ClipCascade","last_synced_at":"2025-11-09T14:30:16.554Z","repository":{"id":257824345,"uuid":"850944233","full_name":"Sathvik-Rao/ClipCascade","owner":"Sathvik-Rao","description":"ClipCascade is a lightweight utility that automatically syncs the clipboard across devices, no key press required.","archived":false,"fork":false,"pushed_at":"2025-02-06T09:20:51.000Z","size":762131,"stargazers_count":662,"open_issues_count":2,"forks_count":11,"subscribers_count":7,"default_branch":"main","last_synced_at":"2025-02-06T10:26:23.153Z","etag":null,"topics":["android","clipboard","clipboard-sync","docker","files","image","linux","macos","multi-user","open-source","productivity","self-hosting","server","text","windows"],"latest_commit_sha":null,"homepage":"https://clipcascade.sathvik.dev/","language":"Python","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/Sathvik-Rao.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":".github/FUNDING.yml","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},"funding":{"github":["Sathvik-Rao"],"patreon":null,"open_collective":null,"ko_fi":null,"tidelift":null,"community_bridge":null,"liberapay":null,"issuehunt":null,"lfx_crowdfunding":null,"polar":null,"buy_me_a_coffee":null,"thanks_dev":null,"custom":["https://www.paypal.com/donate/?business=SKHQU2CL3TCLN\u0026no_recurring=0\u0026item_name=Support+Sathvik-Rao%27s+open+source+work\u0026currency_code=USD"]}},"created_at":"2024-09-02T06:14:01.000Z","updated_at":"2025-02-06T09:32:48.000Z","dependencies_parsed_at":"2025-02-06T10:34:48.098Z","dependency_job_id":null,"html_url":"https://github.com/Sathvik-Rao/ClipCascade","commit_stats":null,"previous_names":["sathvik-rao/clipcascade"],"tags_count":13,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Sathvik-Rao%2FClipCascade","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Sathvik-Rao%2FClipCascade/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Sathvik-Rao%2FClipCascade/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Sathvik-Rao%2FClipCascade/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Sathvik-Rao","download_url":"https://codeload.github.com/Sathvik-Rao/ClipCascade/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":239576650,"owners_count":19662109,"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":["android","clipboard","clipboard-sync","docker","files","image","linux","macos","multi-user","open-source","productivity","self-hosting","server","text","windows"],"created_at":"2024-10-13T14:01:36.096Z","updated_at":"2025-11-09T14:30:16.519Z","avatar_url":"https://github.com/Sathvik-Rao.png","language":"Python","readme":"# \u003cimg src=\"https://github.com/user-attachments/assets/710bb1c3-0eda-48cf-819a-e066bde3a3ec\" alt=\"ClipCascade Logo\" width=\"34\" /\u003e ClipCascade\n\n**ClipCascade** is a lightweight, open-source utility that automatically syncs your clipboard across multiple devices—no manual input required. It ensures seamless sharing with robust end-to-end encryption, providing a secure and reliable clipboard experience across workstations.\n\n🚀 **No Server? No Problem!** Instantly sync your clipboard using the **Live Community Server** at **[clipcascade.sathvik.dev](http://clipcascade.sathvik.dev/)**—**no setup needed**. Just create an account and start sharing your clipboard across devices in seconds!\n\n\u003cdiv align=\"center\"\u003e\n\n\u003ctable\u003e\n  \u003ctr\u003e\n    \u003cth\u003eDocker\u003c/th\u003e\n    \u003cth\u003eWindows\u003c/th\u003e\n    \u003cth\u003emacOS\u003c/th\u003e\n    \u003cth\u003eAndroid\u003c/th\u003e\n    \u003cth\u003eLinux\u003c/th\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\n      \u003ca href=\"https://hub.docker.com/r/sathvikrao/clipcascade\"\u003e\n        \u003cimg src=\"https://www.docker.com/wp-content/uploads/2022/03/Moby-logo.png\" alt=\"Docker\" width=\"50\" /\u003e\n      \u003c/a\u003e\n    \u003c/td\u003e\n    \u003ctd\u003e\n      \u003ca href=\"https://github.com/Sathvik-Rao/ClipCascade/releases\"\u003e\n        \u003cimg src=\"https://upload.wikimedia.org/wikipedia/commons/thumb/5/5f/Windows_logo_-_2012.svg/512px-Windows_logo_-_2012.svg.png\" alt=\"Windows\" width=\"50\" /\u003e\n      \u003c/a\u003e\n    \u003c/td\u003e\n    \u003ctd\u003e\n      \u003ca href=\"https://github.com/Sathvik-Rao/ClipCascade/releases\"\u003e\n        \u003cimg src=\"https://upload.wikimedia.org/wikipedia/commons/1/1b/Apple_logo_grey.svg\" alt=\"macOS\" width=\"40\" /\u003e\n      \u003c/a\u003e\n    \u003c/td\u003e\n    \u003ctd\u003e\n      \u003ca href=\"https://github.com/Sathvik-Rao/ClipCascade/releases\"\u003e\n        \u003cimg src=\"https://upload.wikimedia.org/wikipedia/commons/d/d7/Android_robot.svg\" alt=\"Android\" width=\"40\" /\u003e\n      \u003c/a\u003e\n    \u003c/td\u003e\n    \u003ctd\u003e\n      \u003ca href=\"https://github.com/Sathvik-Rao/ClipCascade/releases\"\u003e\n        \u003cimg src=\"https://upload.wikimedia.org/wikipedia/commons/3/35/Tux.svg\" alt=\"Linux\" width=\"40\" /\u003e\n      \u003c/a\u003e\n    \u003c/td\u003e\n  \u003c/tr\u003e\n\u003c/table\u003e\n\n\u003c/div\u003e\n\n\u003cbr /\u003e\n\n\u003cdiv align=\"center\"\u003e\n    \u003cimg src=\"https://github.com/user-attachments/assets/0b7178fd-e40f-400c-9c6f-6ea9f4e5b800\" alt=\"arch_design_p2s\" width=\"360\" height=\"300\" /\u003e\n    \u003cimg src=\"https://github.com/user-attachments/assets/32366820-fc48-4849-914f-fe0474fa308a\" alt=\"arch_design_p2p\" width=\"360\" height=\"300\" /\u003e\n\u003c/div\u003e\n\n\n## 📸 Screenshots\n\n| 🪟 Desktop ([Windows](https://github.com/Sathvik-Rao/ClipCascade?tab=readme-ov-file#-windows-desktop-application)) | 🍏 Desktop ([macOS](https://github.com/Sathvik-Rao/ClipCascade?tab=readme-ov-file#-macos-desktop-application)) | 🤖📱 Mobile ([Android](https://github.com/Sathvik-Rao/ClipCascade?tab=readme-ov-file#-android-mobile-application)) | 🐧🖱️ Desktop ([Linux_GUI](https://github.com/Sathvik-Rao/ClipCascade?tab=readme-ov-file#%EF%B8%8F-linux-desktop-application-gui--%EF%B8%8F-linux-terminal-based-application-cli)) | 🐧⌨️ Desktop ([Linux_CLI](https://github.com/Sathvik-Rao/ClipCascade?tab=readme-ov-file#%EF%B8%8F-linux-desktop-application-gui--%EF%B8%8F-linux-terminal-based-application-cli)) | \n|-----------------------|--------------------|--------------------|--------------------|--------------------|\n| \u003cimg src=\"https://github.com/user-attachments/assets/369d5db5-685c-4284-946d-b6a0e1f4fef9\" alt=\"Desktop (Windows) - 1\" width=\"360\" /\u003e | \u003cimg src=\"https://github.com/user-attachments/assets/2c0a7f4d-652c-4f4c-97e9-ee9b9d66f03f\" alt=\"Desktop (macOS) - 1\" width=\"360\" /\u003e | \u003cimg src=\"https://github.com/user-attachments/assets/a5606f3c-6d8a-434f-8f1d-03d6276e03c0\" alt=\"Mobile (Android) - 1\" width=\"360\" /\u003e | \u003cimg src=\"https://github.com/user-attachments/assets/f1acd9f4-27ee-4eb0-8696-a786a21551ed\" alt=\"Desktop (Linux_GUI) - 1\" width=\"360\" /\u003e | \u003cimg src=\"https://github.com/user-attachments/assets/f3f7c3a9-0299-4f0d-9494-5d9a102a243f\" alt=\"Desktop (Linux_CLI) - 1\" width=\"360\" /\u003e |\n| \u003cimg src=\"https://github.com/user-attachments/assets/3d51539b-69d0-4b0d-8854-e262638333bd\" alt=\"Desktop (Windows) - 2\" width=\"240\" /\u003e | \u003cimg src=\"https://github.com/user-attachments/assets/3d473d8d-601e-4c78-bb7f-0684d39aef67\" alt=\"Desktop (macOS) - 2\" width=\"240\" /\u003e | \u003cimg src=\"https://github.com/user-attachments/assets/607135ff-498f-45ae-b60e-18da525b6b19\" alt=\"Mobile (Android) - 2\" width=\"240\" /\u003e | \u003cimg src=\"https://github.com/user-attachments/assets/394ab014-ae40-475d-8109-d95c9a69645b\" alt=\"Desktop (Linux_GUI) - 2\" width=\"240\" /\u003e | \u003cimg src=\"https://github.com/user-attachments/assets/daf0a4ac-4dcc-4547-9171-7bb0546f6712\" alt=\"Desktop (Linux_non_GUI) - 2\" width=\"240\" /\u003e |\n\n\n\n## ✨ Features  \n\n- **🚀 Instant Clipboard Sync** – Clipboard content updates in real time across all connected devices. Just copy, and it’s there!  \n- **🔒 Secure Authentication** – Ensures only authorized users can sync clipboard data.  \n- **🛡️ End-to-End Encryption** – Protects clipboard content with advanced cryptographic security and hashing techniques.  \n- **🔄 Dual Sync Modes:**  \n  - **☁️ Server-Based Sync** – Reliable cloud-based synchronization via a centralized server.  \n  - **🔗 Peer-to-Peer Sync** – Direct device-to-device connection for ultra-low latency and minimal server dependency.  \n- **💻 Cross-Platform Compatibility** – Works seamlessly on Windows, macOS, Linux, and Android.  \n- **📄📷📁 Universal Clipboard** – Syncs text, images, and files effortlessly across devices.  \n- **📦 Self-Hosting Option** – Deploy your own secure instance using a Docker image or standalone JAR file.  \n- **👥 Multi-User Support** – Isolates clipboard data per user while enabling seamless syncing between personal devices.  \n- **🌐 Web-Based Dashboard** – Track clipboard activity and manage settings through an intuitive interface.  \n- **⚙️ Customizable Preferences** – Fine-tune sync settings for performance, security, and usability.  \n- **🔔 Smart Update Notifications** – Stay informed about new features, security patches, and enhancements.  \n\n   \n\u003cdiv align=\"center\"\u003e\n\u003ctable\u003e\n  \u003ctr\u003e\n    \u003cth\u003eType\u003c/th\u003e\n    \u003cth\u003eWindows\u003c/th\u003e\n    \u003cth\u003eMacOS\u003c/th\u003e\n    \u003cth\u003eLinux GUI\u003c/th\u003e\n    \u003cth\u003eLinux CLI\u003c/th\u003e\n    \u003cth\u003eAndroid\u003c/th\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\u003cstrong\u003eText\u003c/strong\u003e\u003c/td\u003e\n    \u003ctd\u003e✔\u003c/td\u003e\n    \u003ctd\u003e✔\u003c/td\u003e\n    \u003ctd\u003e✔\u003c/td\u003e\n    \u003ctd\u003e✔\u003c/td\u003e\n    \u003ctd\u003e✔\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\u003cstrong\u003eImage\u003c/strong\u003e\u003c/td\u003e\n    \u003ctd\u003e✔\u003c/td\u003e\n    \u003ctd\u003e✔\u003c/td\u003e\n    \u003ctd\u003e✔\u003c/td\u003e\n    \u003ctd\u003e✔\u003c/td\u003e\n    \u003ctd\u003e✔\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\u003cstrong\u003eFiles\u003c/strong\u003e\u003c/td\u003e\n    \u003ctd\u003e✔\u003c/td\u003e\n    \u003ctd\u003e✔\u003c/td\u003e\n    \u003ctd\u003e✔\u003c/td\u003e\n    \u003ctd\u003e✔\u003c/td\u003e\n    \u003ctd\u003e✔\u003c/td\u003e\n  \u003c/tr\u003e\n\u003c/table\u003e\n\u003c/div\u003e\n\n\n## 📥 Installation Guide\n\n### 🦾 Self-Hosting ClipCascade on Bare Metal:\n\nTo deploy the ClipCascade server on any operating system that supports Java 17 or later, follow the steps outlined below.\n\n1. **Download the Server JAR File**  \n\n    Obtain the latest release of `ClipCascade-Server-JRE_17.jar` from the [release page](https://github.com/Sathvik-Rao/ClipCascade/releases).\n\n2. **Configure Environment Variables (Optional)**  \n\n    The ClipCascade server supports various environment variables for customization. None of these variables are mandatory, but they can be configured as needed.  \n\n    For a comprehensive list of available environment variables, refer to the [Advanced Details](https://github.com/Sathvik-Rao/ClipCascade?tab=readme-ov-file#%EF%B8%8F-advanced-details) section.\n\n    | Variable                     | Description                                                                                          | Default Value     | Example                           |\n    |------------------------------|------------------------------------------------------------------------------------------------------|-------------------|-----------------------------------|\n    | `CC_MAX_MESSAGE_SIZE_IN_MiB` | Defines the maximum allowed message size in MiB. Ignored if `CC_P2P_ENABLED` is set to `true`.       | `1`               | `3`                               |\n    | `CC_ALLOWED_ORIGINS`         | Specifies the allowed CORS origins for secure cross-origin access.                                   | `*`               | `https://clipcascade.example.com` |\n    | `CC_P2P_ENABLED`             | Enables or disables peer-to-peer mode. When enabled, `CC_MAX_MESSAGE_SIZE_IN_MiB` is ignored.        | `false`           | `true`                            |\n    | `CC_SIGNUP_ENABLED`          | Allows or restricts user self-registration.                                                          | `false`           | `false`                           |\n    | `CC_PORT`                    | Specifies the port on which the server listens for incoming connections.                             | `8080`            | `1234`                            |\n   \n3. **Start the Server**  \n    Run the following command in the terminal to launch the ClipCascade server:\n\n    ```bash\n    java -jar ClipCascade-Server-JRE_17.jar\n    ```\n   \n4. **Access the Server**  \n    Once the server is running, you can access it via:\n\n    ```\n    http://localhost:8080\n    ```\n\n    - **Default Credentials:**  \n      - **Username:** `admin`  \n      - **Password:** `admin123`  \n\n\u003e **Important:** It is strongly recommended to change the default credentials immediately after the initial login.\n\nFor guidance on setting up a **reverse proxy**, refer to the [Reverse Proxy Setup](https://github.com/Sathvik-Rao/ClipCascade?tab=readme-ov-file#-reverse-proxy-setup) section.\n\n[➡️ Explore Advanced Details](https://github.com/Sathvik-Rao/ClipCascade?tab=readme-ov-file#%EF%B8%8F-advanced-details)\n\n* * * * * * *\n\n### 🐳 Self-Hosting ClipCascade Using Docker:\n\n#### Quick Installation (Single Command)\n\nFor users who prefer a one-liner, you can deploy ClipCascade instantly using:\n\n```yaml\ndocker run -d --name clipcascade -p 8080:8080 -e CC_MAX_MESSAGE_SIZE_IN_MiB=1 -v ./cc_users:/database sathvikrao/clipcascade\n```\n\n#### Detailed Installation Steps\n\nTo host ClipCascade on your server using Docker, follow these steps:\n\n1. Create a `docker-compose.yml` File\n\n    Create a `docker-compose.yml` file with the following content, or download it from the [release page](https://github.com/Sathvik-Rao/ClipCascade/releases):\n\n    ```yaml\n    services:\n      clipcascade:\n        image: sathvikrao/clipcascade:latest\n        ports:\n          - \"8080:8080\"  # Expose the ClipCascade server on port 8080\n        restart: always  # Automatically restart the container if it stops\n        volumes:\n          - ./cc_users:/database  # Persistent storage for user data\n        environment:\n          - CC_MAX_MESSAGE_SIZE_IN_MiB=1   # Maximum message size in MiB (ignored if P2P mode is enabled)\n          - CC_P2P_ENABLED=false  # Enables or disables peer-to-peer(P2P) mode\n          # - CC_ALLOWED_ORIGINS=https://clipcascade.example.com  # Defines allowed CORS origins for security\n          # - CC_SIGNUP_ENABLED=false  # Enables or disables user self-registration\n   ```\n    \n   For additional `.yml` configuration files, visit [ClipCascade Server Docker Configuration](https://github.com/Sathvik-Rao/ClipCascade/tree/main/ClipCascade_Server/docker-compose).\n  \n2. Deploy the Docker Container\n\n    Run the Docker container using Docker Compose:\n\n    ```\n    docker-compose up -d\n    ```\n\n3. **Access the Server**  \n    Once the server is running, you can access it via:\n\n    ```\n    http://localhost:8080\n    ```\n\n    - **Default Credentials:**  \n      - **Username:** `admin`  \n      - **Password:** `admin123`  \n\n\n\u003e **Important:** It is strongly recommended to change the default credentials immediately after the initial login.\n\nFor guidance on setting up a **reverse proxy**, refer to the [Reverse Proxy Setup](https://github.com/Sathvik-Rao/ClipCascade?tab=readme-ov-file#-reverse-proxy-setup) section.\n\n[➡️ Explore Advanced Details](https://github.com/Sathvik-Rao/ClipCascade?tab=readme-ov-file#%EF%B8%8F-advanced-details)\n\n\u003cdiv align=\"center\"\u003e\n   \u003cimg src=\"https://github.com/user-attachments/assets/02151726-2a26-42d7-8863-ae4512754eb3\" alt=\"Web Page login\" width=\"300\"  /\u003e\n   \u003cimg src=\"https://github.com/user-attachments/assets/6f346d46-3334-4306-9f62-e0f98f1c0506\" alt=\"Web Page home\" width=\"300\"  /\u003e\n   \u003cimg src=\"https://github.com/user-attachments/assets/74252e8e-e8f9-4a9a-a15d-0c3cc987b09c\" alt=\"Web Page advance\" width=\"300\"  /\u003e\n\u003c/div\u003e\n\n* * * * * * *\n\n### 🪟 Windows Desktop Application:\n\nTo install the ClipCascade Windows desktop application, follow these steps:\n\n1. **Download the Installer**\n    - Get the latest version of ClipCascade from the [Releases page](https://github.com/Sathvik-Rao/ClipCascade/releases).\n2. **Install the Application**\n    - Run the downloaded `.msi` installer and follow the on-screen instructions, and select the default installation path specified by the installer.\n    - Startup is enabled by default; you can disable it in the Task Manager if desired.\n3. **Launch and Configure**\n    - Open ClipCascade after installation and **log in** to start syncing your clipboard across devices.\n    - When prompted, enter your **server's IP address, port number, or domain name**.\n    - If encryption is enabled, ensure it is **enabled on all devices**.\n    - In the **Extra Config** section, you can set a local clipboard size limit. By default, no limit is enforced (note: large file transfers may cause temporary unresponsiveness).\n4. **Network Access Prompt (P2P Mode)**\n    - If the server is running in **P2P mode**, you will see a Windows security prompt asking, **\"Do you want to allow public and private networks to access this app?\"**\n\n      \u003cimg src=\"https://github.com/user-attachments/assets/d5ededb1-0d21-4686-91bd-e0a22cdb54e5\" alt=\"win_network_prompt\" width=\"150\"  /\u003e\n\n    - This is because each client device acts as a **peer** in the network, requiring direct communication.\n    - Click **Allow** to enable clipboard data syncing across your devices without the help of a server. The server is needed only for signaling and authentication.\n\n**Important Note:** Since the application is not published or registered with Microsoft, you may see a warning suggesting that it could be unsafe. This is a standard precaution and does not indicate any issues with the software. You can choose to ignore this warning or temporarily disable your antivirus during installation. All source code is available in this repository, and everything is open source and free. If you prefer, you can compile the executable yourself. Feel free to review the code to ensure your comfort! **Registering the application with Microsoft requires purchasing a certificate subscription, which is quite expensive, especially for an open-source project.**\n\nThe `.exe` file does not need UAC approval because it is standalone executable, while the `.msi` installer will request UAC permissions because it creates a designated folder for the software, adds a startup option, and allows for uninstallation via the Control Panel. Additionally, with the .msi installer, you have the option to choose any location to save the software. However, select locations where even when you create a file manually at that location, Windows shouldn’t prompt for permission to answer \"yes or no\" questions.\n\n[➡️ Explore Advanced Details](https://github.com/Sathvik-Rao/ClipCascade?tab=readme-ov-file#%EF%B8%8F-advanced-details)\n\n* * * * * * *\n\n### 🍏 macOS Desktop Application:\n\nTo install the ClipCascade macOS desktop application, follow these steps:\n\n1. **Download the Application**\n    - Visit the [Releases page](https://github.com/Sathvik-Rao/ClipCascade/releases) and download the appropriate version:\n      - **For M-series chips** (Apple Silicon), download `ClipCascade-Apple_macOS(ARM_M-Series).zip`.\n      - **For Intel chips**, download `ClipCascade-Apple_macOS(Intel-Series).zip`.\n    - You can check your chip type by navigating to **Apple Menu** → **About This Mac**.\n   \n2. **Extract the Archive**\n    - Double-click the `.zip` file to extract its contents.\n\n3. **Locate the Application**\n    - Open the extracted folder to find the **ClipCascade** application.\n    - Move the application to a preferred location, such as the **Applications** folder.\n\n4. **First-time launch (see note below for more information)**\n    - **Right-click** (not double-click) on the **ClipCascade** application and select **Open**.\n     \n        \u003cimg src=\"https://github.com/user-attachments/assets/90b58940-69ed-4d35-a22d-1aa9988c014c\" alt=\"ClipCascade-\u003eRightClick-\u003eOpen\" width=\"500\" /\u003e\n    - If you encounter the warning *\"Apple could not verify 'ClipCascade' is free...\"*, click **Done** or **Ok**. ([Apple Guide](https://support.apple.com/en-us/102445))\n  \n\n       \u003cimg src=\"https://github.com/user-attachments/assets/986c3aef-28cf-4293-8ec8-180508d7e172\" alt=\"Apple Warning\" width=\"150\" /\u003e\n       \u003cimg src=\"https://github.com/user-attachments/assets/8c604467-6dee-4977-8e3e-6473201e0e32\" alt=\"Apple Warning\" width=\"150\" /\u003e\n       \n       - Go to **System Preferences** \u003e **Security \u0026 Privacy** \u003e Click **Open Anyway** (if you see the option), and when you re-run(right click-\u003eopen) the application warning prompt reappears one last time, click **Open Anyway** or **Open**.  ([Apple Guide](https://support.apple.com/en-us/102445))\n         \n           \u003cimg src=\"https://github.com/user-attachments/assets/b6f41164-f73d-4e77-a110-b175a22057c6\" alt=\"settings-\u003esecurity-\u003eopen_anyway\" width=\"250\" /\u003e\n           \u003cimg src=\"https://github.com/user-attachments/assets/41bde005-537a-4950-bfe7-d55c9e767b15\" alt=\"Apple Warning\" width=\"150\" /\u003e\n           \u003cimg src=\"https://github.com/user-attachments/assets/4803a2ba-acdf-41d9-a707-a8f22de12855\" alt=\"Apple Warning\" width=\"150\" /\u003e\n\n5. **Wait for the app to launch**\n    - When you open the application, macOS will scan the application. This may take **10–30 seconds**.\n\n6. **Configure the application**\n    - When prompted, enter your **server's IP address, port number, or domain name**.\n    - If encryption is enabled, ensure it is **enabled on all devices**.\n    - In the **Extra Config** section, you can set a local clipboard size limit. By default, no limit is enforced (note: large file transfers may cause temporary unresponsiveness).\n\n7. **Network Access Prompt (P2P Mode)**\n    - If the server is running in **P2P mode**, you will see a macOS security prompt asking, **\"Allow \"ClipCascade\" to find devices on local networks?\"**\n\n      \u003cimg src=\"https://github.com/user-attachments/assets/91aae27e-f950-45a4-a4a1-09893e0573d3\" alt=\"mac_network_prompt\" width=\"150\" /\u003e\n\n    - This is because each client device acts as a **peer** in the network, requiring direct communication.\n    - Click **Allow** to enable clipboard data syncing across your devices without the help of a server. The server is needed only for signaling and authentication.\n      \n8. **Access the App from the Menu Bar**\n    - Once logged in, the application will run in the **menu bar** with a clipboard icon at the top of your screen.\n\n9. **Enable Auto-Startup**:\n     - Right-click the **ClipCascade** icon in the dock (bottom of the screen).\n     - Select **Options** and then check **Open at Login**.\n\n       \u003cimg src=\"https://github.com/user-attachments/assets/cadeb680-d1fd-4582-9d20-b41ba8713b39\" alt=\"Startup\" width=\"200\" /\u003e\n\n**Important Note:** Since the application is not published or registered with Apple, you may see a warning suggesting that it could be unsafe. This is a standard precaution and does not indicate any issues with the software. You can choose to ignore this warning. All source code is available in this repository, and everything is open source and free. If you prefer, you can compile the executable yourself. Feel free to review the code to ensure your comfort! **Registering the application with Apple requires purchasing a certificate subscription, which is quite expensive, especially for an open-source project.**\n\n[➡️ Explore Advanced Details](https://github.com/Sathvik-Rao/ClipCascade?tab=readme-ov-file#%EF%B8%8F-advanced-details)\n\n* * * * * * *\n\n### 🤖📱 Android Mobile Application:\n\nTo install the ClipCascade mobile application on your Android device, follow these steps:\n\n1. **Download** the latest APK from the [Releases page](https://github.com/Sathvik-Rao/ClipCascade/releases).\n2. **Enable** installation from unknown sources in your device settings, if prompted.\n3. **Install** the APK by following the prompts on your device.\n4. **Open** ClipCascade and log in to begin syncing your clipboard across devices.\n    - When prompted, enter your **server's IP address, port number, or domain name**.\n    - If encryption is enabled, ensure it is **enabled on all devices**.\n    - In the **Extra Config** section, you can set a local clipboard size limit. By default, no limit is enforced (note: large file transfers may cause temporary unresponsiveness).\n\n#### Android Automatic Clipboard Monitoring Setup:\n\nClipCascade supports automatic clipboard monitoring for both rooted and non-rooted devices. To activate this feature, execute the following ADB commands.\n\n##### Install ADB\n\nBefore proceeding, make sure ADB is installed on your system. Follow the instructions [here](https://www.xda-developers.com/install-adb-windows-macos-linux/) to install ADB on Windows, macOS, or Linux.\n\n##### ADB Commands\n\n1. **Grant the `READ_LOGS` permission:**\n   ```bash\n   adb -d shell pm grant com.clipcascade android.permission.READ_LOGS\n   ```\n\n2. **Enable \"Display/Drawing over other apps,\" \"Screen overlay,\" or \"Appear on top\":**\n   This permission can also be enabled from the device's Settings. To set it via ADB, use:\n   ```bash\n   adb -d shell appops set com.clipcascade SYSTEM_ALERT_WINDOW allow\n   ```\n\n3. **Kill the app for the new permissions to take effect:**\n   ```bash\n   adb -d shell am force-stop com.clipcascade\n   ```\n![adb commands](https://github.com/user-attachments/assets/3faa8d71-d099-48d5-9846-4683cf77f285)\n\n\u003e Once the setup is complete, it operates seamlessly without requiring any extra steps. It monitors log entries related to ClipCascade, and if it detects an error during a clipboard copy action, it will trigger an overlay window to gain focus. This overlay allows the app to capture the clipboard content and send it to the connected devices immediately before going out of focus and closing. When the app is uninstalled, these permissions will be removed, requiring you to redo these steps. Additionally, each time you start the foreground service, it will prompt you to choose whether to monitor logs. This ensures that everything remains secure and under your control.\n\nAfter executing three ADB commands, when you click the **Start** button, you will see a pop-up message. Click **\"Allow.\"**\n\n\u003cimg src=\"https://github.com/user-attachments/assets/0d3649d7-1e57-448c-ade9-10641191402d\" alt=\"allow_log_monitoring\" width=\"200\" /\u003e\n\n[➡️ Explore Advanced Details](https://github.com/Sathvik-Rao/ClipCascade?tab=readme-ov-file#%EF%B8%8F-advanced-details)\n\n* * * * * * *\n\n### 🐧🖱️ Linux Desktop Application (GUI) / 🐧⌨️ Linux Terminal-Based Application (CLI):\n\nThis guide provides step-by-step instructions to install ClipCascade on Debian/Ubuntu, Fedora, and Arch-based systems. While the commands are specifically tailored for these distributions, you can adapt the process for other Linux distributions with minor modifications. The Linux code is available on the [Releases page](https://github.com/Sathvik-Rao/ClipCascade/releases) as `ClipCascade_Linux.zip`. Once downloaded, navigate to the `ClipCascade/` folder containing `main.py`, and open a terminal in that directory.\n\u003e **Note:** Linux systems use different display servers, primarily `X11` and `Wayland`. `Wayland` can also include `XWayland`, which supports `X` sessions. The program automatically detects the display server and selects the appropriate interface, either **GUI** or **CLI**, based on the environment.\n\n#### Step 1: Check for updates and install required packages\n\n##### Debian/Ubuntu:\n```\nsudo apt update\nsudo apt install -y python3 python3-pip python3-gi xclip wl-clipboard dunst\n```\n\n##### Fedora:\n```\nsudo dnf check-update\nsudo dnf install -y python3 python3-pip python3-gobject xclip wl-clipboard dunst\n```\n\n##### Arch:\n```\nsudo pacman -Syu --noconfirm python python-pip python-gobject xclip wl-clipboard dunst xdg-utils\n```\n\n\n#### Step 2: Install GTK 3.0 for clipboard monitoring and GUI support\n\n##### Debian/Ubuntu:\n```\nsudo apt install -y python3-gi-cairo gir1.2-gtk-3.0 gir1.2-gdk-3.0\n```\n\n##### Fedora:\n```\nsudo dnf install -y libappindicator-gtk3\n```\n\n##### Arch:\n```\nsudo pacman -S --noconfirm python-gobject gtk3\n```\n\n#### Step 3: Install GNOME tray support extension (if tray icon is unavailable)\nInstall the [GNOME tray support extension](https://extensions.gnome.org/extension/615/appindicator-support/).\n\n\n#### Step 4: Install Python Dependencies\n\n##### Debian/Ubuntu/Fedora:\n```\nsudo pip3 install -r requirements.txt\n```\n\n##### Arch:\n```\nsudo pip install -r requirements.txt\n```\n\n#### Step 4.1: Fix `externally-managed-environment` Error (if applicable)\n\nIf you encounter the `error: externally-managed-environment`, install the required Python packages manually.\n\n##### Debian/Ubuntu:\n```\nsudo apt install -y python3-xxhash python3-pyperclip python3-requests python3-websocket python3-pycryptodome python3-tk python3-pystray python3-pyfiglet python3-bs4 python3-plyer python3-aiortc\n```\n\n##### Fedora:\n```\nsudo dnf install -y python3-xxhash python3-pyperclip python3-requests python3-websocket-client python3-pycryptodomex python3-tkinter python3-pystray python3-pyfiglet python3-beautifulsoup4 python3-plyer python3-aiortc\n```\n\n##### Arch:\n```\nsudo pacman -S --noconfirm python-xxhash python-pyperclip python-requests python-websocket-client python-pycryptodome tk python-pystray python-pyfiglet python-beautifulsoup4 python-plyer python-aiortc\n```\n  - If you encounter the `error: target not found: python-plyer`, install via `yay -S --noconfirm python-plyer`\n  - If you encounter the `error: target not found: python-aiortc`, install via `yay -S --noconfirm python-aiortc`\n\n\n#### Step 4.2: Fix `Package libavformat was not found in the pkg-config search path` Error (if applicable)\n\n##### Debian/Ubuntu:\n```\nsudo apt install -y libavformat-dev libavcodec-dev libavdevice-dev libavutil-dev libavfilter-dev libswscale-dev libswresample-dev pkg-config\n```\n\n##### Fedora:\n```\nsudo dnf install -y ffmpeg ffmpeg-devel\n```\n\n##### Arch:\n```\nsudo pacman -S --noconfirm ffmpeg\n```\n\n\n#### Step 5: Run the Application\n\nStart ClipCascade by running (use sudo if needed):\n   - When prompted, enter your **server's IP address, port number, or domain name**.\n   - If encryption is enabled, ensure it is **enabled on all devices**.\n   - In the **Extra Config** section, you can set a local clipboard size limit. By default, no limit is enforced (note: large file transfers may cause temporary unresponsiveness).\n```\npython3 main.py\n```\n\n\n#### Step 5.1: Fix 'No module named `Crypto`' Error (if applicable)\n\nIf you encounter the `No module named 'Crypto'` error, create a symbolic link for the Cryptodome library:\n[see more](https://github.com/openthread/openthread/issues/1137#issuecomment-140879139)\n\n\n##### Debian/Ubuntu:\n```\nsudo ln -s /usr/lib/python3/dist-packages/Cryptodome /usr/lib/python3/dist-packages/Crypto\n```\n\n##### Fedora:\n```\nsudo ln -s /usr/lib/python3/site-packages/Cryptodome /usr/lib/python3/site-packages/Crypto\n```\n\n##### Arch:\n```\nsudo ln -s /usr/lib/python3.*/site-packages/Cryptodome /usr/lib/python3.*/site-packages/Crypto\n```\n\n#### Step 5.2: Fix 'ModuleNotFoundError: No module named `tkinter`' Error (if applicable)\n\nIf you encounter the `No module named 'tkinter'` error:\n\n##### Debian/Ubuntu:\n```\nsudo apt install -y python3-tkinter\n```\n\n##### Fedora:\n```\nsudo dnf install -y python3-tkinter\n```\n\n##### Arch:\n```\nsudo pacman -S --noconfirm tk\n```\n\n#### Step 5.3:  Fix '`gtk_widget_get_scale_factor: assertion 'GTK_IS_WIDGET (widget)' failed`' Error (if applicable)\n\nThis error occurs due to a missing tray icon extension in GNOME. To resolve it, you can install the extension from [here](https://extensions.gnome.org/extension/615/appindicator-support)\n\n\n#### Step 5.4:  Fix '`g-exec-error-quark`' Error (if applicable)\n\n##### Debian/Ubuntu:\n```\nsudo apt install dbus-x11\n```\n\n##### Fedora:\n```\nsudo dnf install dbus-x11\n```\n\n##### Arch:\n```\nsudo pacman -S --noconfirm dbus\n```\n\n#### Step 6: Run the Application in the Background (if needed)\n\nTo run ClipCascade as a background process (if the GUI setup is functional), use the following command:\n```\nnohup python3 main.py \u0026\u003e /dev/null \u0026\n```\nIf root privileges are required, use:\n```\nsudo nohup python3 main.py \u0026\u003e /dev/null \u0026\n```\n\n\n#### Step 7: Add ClipCascade to Startup Script (if needed)\n\nTo ensure ClipCascade starts automatically when your system boots, modify the file paths as necessary and add the appropriate command to your startup script.\n\n##### Example:\n##### GUI\n```\ncd /path/to/clipcascade/src/ \u0026\u0026 nohup python3 main.py \u0026\u003e /dev/null \u0026\n```\nIf root privileges are required, use:\n```\ncd /path/to/clipcascade/src/ \u0026\u0026 sudo nohup python3 main.py \u0026\u003e /dev/null \u0026\n```\n\n##### CLI\n```\ncd /path/to/clipcascade/src/ \u0026\u0026 python3 main.py\n```\nIf root privileges are required, use:\n```\ncd /path/to/clipcascade/src/ \u0026\u0026 sudo python3 main.py\n```\n\n[➡️ Explore Advanced Details](https://github.com/Sathvik-Rao/ClipCascade?tab=readme-ov-file#%EF%B8%8F-advanced-details)\n\n\n## ⚙️ Advanced Details\n\n\n### 🗄️ Server Configuration\n\n#### Important Security Notice:\n**Change the default admin credentials immediately after logging in** to prevent unauthorized access.  \n\n#### Default Admin Credentials:  \n- **Username:** `admin`  \n- **Password:** `admin123`  \n\n#### Health Check Endpoint  \n- **Purpose:** Verifies if the server is running and operational.  \n- **Endpoint:** `/health`  \n- **Response:** Returns `OK` with a status code `200` when the server is up and running.\n\n#### Built-in Update Checker\n- The server features a built-in update checker, prominently displayed on the homepage, keeping you informed about the latest enhancements and security fixes. This ensures your server stays up to date.\n\n  \u003cimg src=\"https://github.com/user-attachments/assets/8184e4ad-d711-4fda-9382-eb3a252bc07b\" alt=\"server_update\" /\u003e\n  \n\n#### Environment Variables:\n\n\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eEnvironment Variable\u003c/th\u003e\n\u003cth\u003eExtended Description\u003c/th\u003e\n\u003cth\u003eDefault Value\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\n\u003c!-- 1 --\u003e\n\u003ctr\u003e\n\u003ctd\u003eCC_MAX_MESSAGE_SIZE_IN_MiB\u003c/td\u003e\n\u003ctd\u003e\nDefines the maximum message size (in MiB) that the server can handle.\n\u003cbr\u003e\u003cbr\u003e\n\u003cstrong\u003eNote:\u003c/strong\u003e\u003cbr\u003e\n- Android typically supports larger clipboard sizes for images and files but limits text to ~1 MiB.\u003cbr\u003e\n- Desktop supports larger clipboard sizes across text, images, and files.\n\u003cbr\u003e\u003cbr\u003e\n\u003cstrong\u003eAdditional Notes:\u003c/strong\u003e\u003cbr\u003e\n- Clients can set their own limits via the \"Extra Config\" on the login page.\u003cbr\u003e\n- If \u003ccode\u003eCC_P2P_ENABLED\u003c/code\u003e is \u003ccode\u003etrue\u003c/code\u003e, this setting is ignored.\n\u003c/td\u003e\n\u003ctd\u003e1\u003c/td\u003e\n\u003c/tr\u003e\n\n\u003c!-- 2 --\u003e\n\u003ctr\u003e\n\u003ctd\u003eCC_MAX_MESSAGE_SIZE_IN_BYTES\u003c/td\u003e\n\u003ctd\u003e\nProvides finer control over message size by specifying a limit in bytes.\n\u003cbr\u003e\u003cbr\u003e\n\u003cstrong\u003eNote:\u003c/strong\u003e If set above zero, it overrides \u003ccode\u003eCC_MAX_MESSAGE_SIZE_IN_MiB\u003c/code\u003e.\u003cbr\u003e\nIgnored if \u003ccode\u003eCC_P2P_ENABLED\u003c/code\u003e is \u003ccode\u003etrue\u003c/code\u003e.\n\u003c/td\u003e\n\u003ctd\u003e0\u003c/td\u003e\n\u003c/tr\u003e\n\n\u003c!-- 3 --\u003e\n\u003ctr\u003e\n\u003ctd\u003eCC_P2P_ENABLED\u003c/td\u003e\n\u003ctd\u003e\nToggles the Peer-to-Peer (P2P) feature, allowing direct device-to-device communication.\n\u003cbr\u003e\u003cbr\u003e\n\u003cstrong\u003eAdvantages:\u003c/strong\u003e\u003cbr\u003e\n- Reduces server load.\u003cbr\u003e\n- Removes size restrictions, enabling unlimited data transfer.\n\u003cbr\u003e\u003cbr\u003e\n\u003cstrong\u003eImportant Notes:\u003c/strong\u003e\u003cbr\u003e\n- If enabled, \u003ccode\u003eCC_MAX_MESSAGE_SIZE_IN_MiB\u003c/code\u003e and \u003ccode\u003eCC_MAX_MESSAGE_SIZE_IN_BYTES\u003c/code\u003e are ignored.\u003cbr\u003e\n- Some network configurations may not support P2P.\n\u003c/td\u003e\n\u003ctd\u003efalse\u003c/td\u003e\n\u003c/tr\u003e\n\n\u003c!-- 4 --\u003e\n\u003ctr\u003e\n\u003ctd\u003eCC_P2P_STUN_URL\u003c/td\u003e\n\u003ctd\u003e\nDefines the STUN server URL used for P2P communication, helping devices discover each other across NAT.\n\u003cbr\u003e\u003cbr\u003e\n\u003cstrong\u003eNote:\u003c/strong\u003e Required when \u003ccode\u003eCC_P2P_ENABLED\u003c/code\u003e is \u003ccode\u003etrue\u003c/code\u003e.\u003cbr\u003e\nYou can use a public STUN server or host your own.\n\u003c/td\u003e\n\u003ctd\u003estun:stun.l.google.com:19302\u003c/td\u003e\n\u003c/tr\u003e\n\n\u003c!-- 5 --\u003e\n\u003ctr\u003e\n\u003ctd\u003eCC_ALLOWED_ORIGINS\u003c/td\u003e\n\u003ctd\u003e\nSpecifies which domain is permitted to access the WebSocket server (CORS policy).\n\u003cbr\u003e\u003cbr\u003e\n\u003cstrong\u003eSecurity Note:\u003c/strong\u003e\u003cbr\u003e\n- Leaving this unset allows all origins (not recommended for security-sensitive deployments).\u003cbr\u003e\n- To restrict access, specify your domain (e.g., \u003ccode\u003ehttps://clipcascade.example.com\u003c/code\u003e).\n\u003c/td\u003e\n\u003ctd\u003e*\u003c/td\u003e\n\u003c/tr\u003e\n\n\u003c!-- 6 --\u003e\n\u003ctr\u003e\n\u003ctd\u003eCC_SIGNUP_ENABLED\u003c/td\u003e\n\u003ctd\u003e\nDetermines whether new users can sign up.\n\u003cbr\u003e\u003cbr\u003e\n\u003cstrong\u003eDefault:\u003c/strong\u003e \u003ccode\u003efalse\u003c/code\u003e (public signups are disabled).\n\u003c/td\u003e\n\u003ctd\u003efalse\u003c/td\u003e\n\u003c/tr\u003e\n\n\u003c!-- 7 --\u003e\n\u003ctr\u003e\n\u003ctd\u003eCC_MAX_USER_ACCOUNTS\u003c/td\u003e\n\u003ctd\u003e\nDefines the maximum number of user accounts allowed on the server.\n\u003cbr\u003e\u003cbr\u003e\n\u003cstrong\u003eNote:\u003c/strong\u003e \u003ccode\u003e-1\u003c/code\u003e means no limit.\n\u003c/td\u003e\n\u003ctd\u003e-1\u003c/td\u003e\n\u003c/tr\u003e\n\n\u003c!-- 8 --\u003e\n\u003ctr\u003e\n\u003ctd\u003eCC_ACCOUNT_PURGE_TIMEOUT_SECONDS\u003c/td\u003e\n\u003ctd\u003e\nSpecifies the duration (in seconds) after which inactive accounts are deleted.\n\u003cbr\u003e\u003cbr\u003e\n\u003cstrong\u003eExample:\u003c/strong\u003e \u003ccode\u003e63115200\u003c/code\u003e (equivalent to 2 years).\u003cbr\u003e\n\u003cstrong\u003eNote:\u003c/strong\u003e \u003ccode\u003e-1\u003c/code\u003e disables automatic purging.\n\u003c/td\u003e\n\u003ctd\u003e-1\u003c/td\u003e\n\u003c/tr\u003e\n\n\u003c!-- 9 --\u003e\n\u003ctr\u003e\n\u003ctd\u003eCC_PORT\u003c/td\u003e\n\u003ctd\u003e\nDefines the internal port where the ClipCascade server listens for connections.\n\u003cbr\u003e\u003cbr\u003e\n\u003cstrong\u003eDefault:\u003c/strong\u003e 8080, but can be changed if necessary.\n\u003c/td\u003e\n\u003ctd\u003e8080\u003c/td\u003e\n\u003c/tr\u003e\n\n\u003c!-- 10 --\u003e\n\u003ctr\u003e\n\u003ctd\u003eCC_SESSION_TIMEOUT\u003c/td\u003e\n\u003ctd\u003e\nSpecifies the duration before user sessions expire, using minute-based formatting (\u003ccode\u003e[number]m\u003c/code\u003e).\n\u003cbr\u003e\u003cbr\u003e\n\u003cstrong\u003eDefault:\u003c/strong\u003e \u003ccode\u003e525960m\u003c/code\u003e (~1 year).\n\u003c/td\u003e\n\u003ctd\u003e525960m\u003c/td\u003e\n\u003c/tr\u003e\n\n\u003c!-- 11 --\u003e\n\u003ctr\u003e\n\u003ctd\u003eCC_MAX_UNIQUE_IP_ATTEMPTS\u003c/td\u003e\n\u003ctd\u003e\nSets the maximum number of failed login attempts from different IP addresses before an account is blocked.\n\u003c/td\u003e\n\u003ctd\u003e15\u003c/td\u003e\n\u003c/tr\u003e\n\n\u003c!-- 12 --\u003e\n\u003ctr\u003e\n\u003ctd\u003eCC_MAX_ATTEMPTS_PER_IP\u003c/td\u003e\n\u003ctd\u003e\nLimits the number of failed login attempts allowed per IP before temporarily blocking that IP.\n\u003c/td\u003e\n\u003ctd\u003e30\u003c/td\u003e\n\u003c/tr\u003e\n\n\u003c!-- 13 --\u003e\n\u003ctr\u003e\n\u003ctd\u003eCC_LOCK_TIMEOUT_SECONDS\u003c/td\u003e\n\u003ctd\u003e\nDefines the initial lockout duration (in seconds) after too many failed login attempts.\n\u003c/td\u003e\n\u003ctd\u003e60\u003c/td\u003e\n\u003c/tr\u003e\n\n\u003c!-- 14 --\u003e\n\u003ctr\u003e\n\u003ctd\u003eCC_LOCK_TIMEOUT_SCALING_FACTOR\u003c/td\u003e\n\u003ctd\u003e\nDetermines how the lockout time increases with each consecutive failed attempt.\n\u003cbr\u003e\u003cbr\u003e\n\u003cstrong\u003eExamples:\u003c/strong\u003e\u003cbr\u003e\n- Factor 1: 60, 120, 180…\u003cbr\u003e\n- Factor 2: 120, 240, 360…\u003cbr\u003e\n- Factor 3: 180, 360, 540…\n\u003c/td\u003e\n\u003ctd\u003e2\u003c/td\u003e\n\u003c/tr\u003e\n\n\u003c!-- 15 --\u003e\n\u003ctr\u003e\n\u003ctd\u003eCC_BFA_CACHE_ENABLED\u003c/td\u003e\n\u003ctd\u003e\nControls whether brute force attack (BFA) data is cached in memory and disk.\n\u003c/td\u003e\n\u003ctd\u003efalse\u003c/td\u003e\n\u003c/tr\u003e\n\n\u003c!-- 16 --\u003e\n\u003ctr\u003e\n\u003ctd\u003eCC_BFA_TRACKER_CACHE_MAX_JVM_ENTRIES\u003c/td\u003e\n\u003ctd\u003e\nSpecifies the maximum number of entries in the BFA tracker cache, stored in JVM memory.\n\u003cbr\u003e\u003cbr\u003e\n\u003cstrong\u003eNote:\u003c/strong\u003e Only used if \u003ccode\u003eCC_BFA_CACHE_ENABLED\u003c/code\u003e is \u003ccode\u003etrue\u003c/code\u003e.\n\u003c/td\u003e\n\u003ctd\u003e50\u003c/td\u003e\n\u003c/tr\u003e\n\n\u003c!-- 17 --\u003e\n\u003ctr\u003e\n\u003ctd\u003eCC_BFA_TRACKER_CACHE_RAM_PERCENTAGE\u003c/td\u003e\n\u003ctd\u003e\nDefines the percentage of the BFA tracker cache allocated to off-heap RAM.\n\u003cbr\u003e\u003cbr\u003e\n\u003cstrong\u003eNote:\u003c/strong\u003e Only used if \u003ccode\u003eCC_BFA_CACHE_ENABLED\u003c/code\u003e is \u003ccode\u003etrue\u003c/code\u003e.\n\u003c/td\u003e\n\u003ctd\u003e0\u003c/td\u003e\n\u003c/tr\u003e\n\n\u003c!-- 18 --\u003e\n\u003ctr\u003e\n\u003ctd\u003eCC_BFA_TRACKER_CACHE_DISK_PERCENTAGE\u003c/td\u003e\n\u003ctd\u003e\nDefines the percentage of the BFA tracker cache allocated to disk.\n\u003cbr\u003e\u003cbr\u003e\n\u003cstrong\u003eNote:\u003c/strong\u003e Only used if \u003ccode\u003eCC_BFA_CACHE_ENABLED\u003c/code\u003e is \u003ccode\u003etrue\u003c/code\u003e.\n\u003c/td\u003e\n\u003ctd\u003e40\u003c/td\u003e\n\u003c/tr\u003e\n\n\u003c!-- 19 --\u003e\n\u003ctr\u003e\n\u003ctd\u003eCC_SERVER_DB_USERNAME\u003c/td\u003e\n\u003ctd\u003e\nSpecifies the username for the database connection.\n\u003c/td\u003e\n\u003ctd\u003eclipcascade\u003c/td\u003e\n\u003c/tr\u003e\n\n\u003c!-- 20 --\u003e\n\u003ctr\u003e\n\u003ctd\u003eCC_SERVER_DB_PASSWORD\u003c/td\u003e\n\u003ctd\u003e\nDefines the password used for encrypting the user database.\n\u003cbr\u003e\u003cbr\u003e\n\u003cstrong\u003eNote:\u003c/strong\u003e\u003cbr\u003e\n- (H2) Replace \u003ccode\u003e\u0026lt;file password\u0026gt; \u0026lt;user password\u0026gt;\u003c/code\u003e with secure values.\u003cbr\u003e\n- Once set, you must use the same password whenever you migrate the database.\n\u003c/td\u003e\n\u003ctd\u003eQjuGlhE3uwylBBANMkX1 o2MdEoFgbU5XkFvTftky\u003c/td\u003e\n\u003c/tr\u003e\n\n\u003c!-- 21 --\u003e\n\u003ctr\u003e\n\u003ctd\u003eCC_SERVER_DB_URL\u003c/td\u003e\n\u003ctd\u003e\nDefines the JDBC URL used to connect to the database.\n\u003cbr\u003e\u003cbr\u003e\n\u003cstrong\u003eExamples:\u003c/strong\u003e\u003cbr\u003e\n- PostgreSQL: \u003ccode\u003ejdbc:postgresql://localhost:5432/clipcascade\u003c/code\u003e\n\u003c/td\u003e\n\u003ctd\u003ejdbc:h2:file:./database/clipcascade;CIPHER=AES;MODE=PostgreSQL\u003c/td\u003e\n\u003c/tr\u003e\n\n\u003c!-- 22 --\u003e\n\u003ctr\u003e\n\u003ctd\u003eCC_SERVER_DB_DRIVER\u003c/td\u003e\n\u003ctd\u003e\nSpecifies the JDBC driver class used by the database connection.\n\u003cbr\u003e\u003cbr\u003e\n\u003cstrong\u003eExample:\u003c/strong\u003e \u003ccode\u003eorg.postgresql.Driver\u003c/code\u003e for PostgreSQL.\n\u003c/td\u003e\n\u003ctd\u003eorg.h2.Driver\u003c/td\u003e\n\u003c/tr\u003e\n\n\u003c!-- 23 --\u003e\n\u003ctr\u003e\n\u003ctd\u003eCC_SERVER_DB_HIBERNATE_DIALECT\u003c/td\u003e\n\u003ctd\u003e\nSets the Hibernate dialect for the chosen database.\n\u003cbr\u003e\u003cbr\u003e\n\u003cstrong\u003eExample:\u003c/strong\u003e \u003ccode\u003eorg.hibernate.dialect.PostgreSQLDialect\u003c/code\u003e for PostgreSQL.\n\u003c/td\u003e\n\u003ctd\u003eorg.hibernate.dialect.H2Dialect\u003c/td\u003e\n\u003c/tr\u003e\n\n\u003c!-- 24 --\u003e\n\u003ctr\u003e\n\u003ctd\u003eCC_SERVER_LOGGING_LEVEL\u003c/td\u003e\n\u003ctd\u003e\nSets the logging verbosity level (TRACE, DEBUG, INFO).\n\u003c/td\u003e\n\u003ctd\u003eINFO\u003c/td\u003e\n\u003c/tr\u003e\n\n\u003c!-- 25 --\u003e\n\u003ctr\u003e\n\u003ctd\u003eCC_SERVER_LOG_HISTORY_MAX_DAYS\u003c/td\u003e\n\u003ctd\u003e\nSpecifies how many days of logs to retain before they are rotated or removed.\n\u003c/td\u003e\n\u003ctd\u003e30\u003c/td\u003e\n\u003c/tr\u003e\n\n\u003c!-- 26 --\u003e\n\u003ctr\u003e\n\u003ctd\u003eCC_SERVER_LOG_MAX_CAPACITY\u003c/td\u003e\n\u003ctd\u003e\nDefines the maximum total size of logs to keep before older files are purged.\n\u003c/td\u003e\n\u003ctd\u003e1GB\u003c/td\u003e\n\u003c/tr\u003e\n\n\u003c!-- 27 --\u003e\n\u003ctr\u003e\n\u003ctd\u003eCC_LOG_BRUTE_FORCE_TRACKER_ENABLED\u003c/td\u003e\n\u003ctd\u003e\nEnables detailed logging of each login attempt in the Brute Force Attack (BFA) tracker.\n\u003cbr\u003eUseful for diagnosing repeated login failures.\n\u003c/td\u003e\n\u003ctd\u003efalse\u003c/td\u003e\n\u003c/tr\u003e\n\n\u003c!-- 28 --\u003e\n\u003ctr\u003e\n\u003ctd\u003eCC_EXTERNAL_BROKER_ENABLED\u003c/td\u003e\n\u003ctd\u003e\nDetermines whether an external STOMP broker is used for message handling.\n\u003c/td\u003e\n\u003ctd\u003efalse\u003c/td\u003e\n\u003c/tr\u003e\n\n\u003c!-- 29 --\u003e\n\u003ctr\u003e\n\u003ctd\u003eCC_BROKER_HOST\u003c/td\u003e\n\u003ctd\u003e\nSpecifies the STOMP broker host for external message handling.\n\u003cbr\u003e\u003cbr\u003e\n\u003cstrong\u003eNote:\u003c/strong\u003e Only used if \u003ccode\u003eCC_EXTERNAL_BROKER_ENABLED\u003c/code\u003e is \u003ccode\u003etrue\u003c/code\u003e.\n\u003c/td\u003e\n\u003ctd\u003elocalhost\u003c/td\u003e\n\u003c/tr\u003e\n\n\u003c!-- 30 --\u003e\n\u003ctr\u003e\n\u003ctd\u003eCC_BROKER_PORT\u003c/td\u003e\n\u003ctd\u003e\nSpecifies the STOMP broker port for external message handling.\n\u003cbr\u003e\u003cbr\u003e\n\u003cstrong\u003eNote:\u003c/strong\u003e Only used if \u003ccode\u003eCC_EXTERNAL_BROKER_ENABLED\u003c/code\u003e is \u003ccode\u003etrue\u003c/code\u003e.\n\u003c/td\u003e\n\u003ctd\u003e61613\u003c/td\u003e\n\u003c/tr\u003e\n\n\u003c!-- 31 --\u003e\n\u003ctr\u003e\n\u003ctd\u003eCC_BROKER_USERNAME\u003c/td\u003e\n\u003ctd\u003e\nDefines the STOMP broker username for external message handling.\n\u003cbr\u003e\u003cbr\u003e\n\u003cstrong\u003eNote:\u003c/strong\u003e Only used if \u003ccode\u003eCC_EXTERNAL_BROKER_ENABLED\u003c/code\u003e is \u003ccode\u003etrue\u003c/code\u003e.\n\u003c/td\u003e\n\u003ctd\u003eadmin\u003c/td\u003e\n\u003c/tr\u003e\n\n\u003c!-- 32 --\u003e\n\u003ctr\u003e\n\u003ctd\u003eCC_BROKER_PASSWORD\u003c/td\u003e\n\u003ctd\u003e\nDefines the STOMP broker password for external message handling.\n\u003cbr\u003e\u003cbr\u003e\n\u003cstrong\u003eNote:\u003c/strong\u003e Only used if \u003ccode\u003eCC_EXTERNAL_BROKER_ENABLED\u003c/code\u003e is \u003ccode\u003etrue\u003c/code\u003e.\n\u003c/td\u003e\n\u003ctd\u003eadmin\u003c/td\u003e\n\u003c/tr\u003e\n\n\u003c/tbody\u003e\n\u003c/table\u003e\n\n* * * * * * *\n\n### 🖥️📱 Client Apps\n- Logs (`clipcascade_log.log`) are stored in the installation directory on Windows and Linux, and in `\u003ccurrent user\u003e/Library/Application Support/ClipCascade/` on macOS. These logs allow you to review application activity and are automatically reset each time the application is reopened, preventing indefinite growth.\n- The `DATA` file stores settings and user details, enabling the app to retain this information across both restarts and updates.\n- On Linux and macOS, a `ClipCascade.lock` file is created while the program is running. This file ensures that only a single instance of ClipCascade can be opened at a time.\n- All apps include a built-in update check feature, conveniently displayed on the homepage or taskbar. This ensures you can quickly check for updates within the app, keeping you up to date with the latest enhancements and security fixes.\n\n   \u003ctable\u003e\n    \u003ctr\u003e\n        \u003ctd align=\"center\"\u003e\u003cstrong\u003eDesktop\u003c/strong\u003e\u003c/td\u003e\n        \u003ctd align=\"center\"\u003e\u003cstrong\u003eMobile\u003c/strong\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003e\u003cimg src=\"https://github.com/user-attachments/assets/92583d05-769e-4883-b427-7b4a41815610\" alt=\"desktop_update\" /\u003e\u003c/td\u003e\n        \u003ctd\u003e\u003cimg src=\"https://github.com/user-attachments/assets/4b5b1d34-4f0f-4770-805c-b212d85aaa2b\" alt=\"android_update\" /\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n   \u003c/table\u003e\n  \n#### Extra Config/Advanced Settings (Desktop/Mobile):\n- **Maximum Clipboard Size Local Limit (in bytes)**: If the app crashes or stops unexpectedly, it may be due to receiving clipboard content exceeding the platform's maximum size limit. You can set a local size limit by specifying a value in bytes (e.g., 512 KiB = 524288 bytes) to test different thresholds suitable for your device. This local limit works alongside the server-specified limit to ensure smoother operation without crashes. For example, on Android (particularly on the Pixel 6a as of 2024), the platform limit(for text) is typically less than 1 MiB. Since the server limit cannot go below 1 MiB, setting the local limit to around 900,000 bytes on the Pixel 6a can help prevent crashes.\n- **Store Password Locally (not recommended)**: Enable this option if you frequently encounter session logouts. While the app stores session cookies for an extended period, a server restart may prompt a re-login. If re-entering the password becomes tedious, you can use this option to store your password locally for convenience.\n   \u003e Note: This option will only work if encryption is disabled, as encryption requires the raw password to generate a password hash.\n- **Enable Image Sharing and Enable File Sharing**: Enabling these options allows the app to send images or files. However, the app will continue to receive images and files even if these options are disabled.\n- **Enable Notification**: Turn on this option to receive notifications about WebSocket disconnections and reconnections.\n- **Enable Encryption (recommended)**: Enabling this option activates end-to-end encryption for clipboard data. This ensures that all clipboard content is encrypted before leaving your device. Refer to the section below on E2E encryption for detailed instructions on how it works and how to configure the `salt` and `hash rounds`.\n\n  #### Desktop (Specific):\n  - **Default File Download Location**: When this path is set, the app will save files directly to the specified location without prompting the user each time the \"Download Files\" button is clicked.\n  \n  #### Android (Specific):\n  - **Run on System Startup**: Enable this option to allow the app to automatically start on system reboot. By default, this option is disabled. If you are using the [ADB](https://github.com/Sathvik-Rao/ClipCascade?tab=readme-ov-file#adb-commands) workaround, keep this option disabled to avoid issues with the READ_LOGS permission [popup](https://github.com/Sathvik-Rao/ClipCascade?tab=readme-ov-file#adb-commands) being dismissed, which prevents clipboard monitoring in the background.\n  - **Enable WebSocket Status Notification**: Receive alerts when the WebSocket connection is lost or restored, ensuring you're informed about any connection disruptions.\n    \n    \u003cimg src=\"https://github.com/user-attachments/assets/6a8b903c-ee52-444c-a14e-bed70e31dcee\" alt=\"periodic_check_notification\" width=\"250\" /\u003e\n\n  - **Enable Periodic Checks**: Enabling this option performs periodic checks to ensure clipboard monitoring and the foreground service are running. It verifies the service status when monitoring starts and then checks every 15 minutes in the background. If the service is not running, a notification is displayed. Clicking the notification will restart the service.\n    \n    \u003cimg src=\"https://github.com/user-attachments/assets/7341b960-5e60-4af6-b627-2183088de262\" alt=\"periodic_check_notification\" width=\"250\" /\u003e\n\n* * * * * * *\n\n### 🔒 End-to-End Encryption Configuration for Clipboard Data\n\nWhen encryption is enabled, clipboard data is encrypted directly on the client devices, ensuring true end-to-end encryption. The server does not store the encryption key, offering maximum security for your data.\n\nEnabling the encryption option is all that's needed to activate encryption by default. However, advanced users have the option to further customize the encryption process by adjusting the following parameters:\n\n- **Salt**: An optional string used as an additional input in the hashing process. For example, you could use a unique string like `\"myCustomSalt123\"` to enhance encryption security.\n  \n- **Hash Rounds**: An integer that specifies the number of hashing iterations. Increasing the hash rounds strengthens encryption by making it more computationally demanding. You can increase the default value of 664,937 to a higher number, such as 1,000,000, to boost security.\n\nIt is crucial to ensure the same **salt** and **hash rounds** are used across all client devices to maintain compatibility.\n\nYou can adjust these settings in the **Extra Config** section on the login page for users who require enhanced encryption options.\n\n\u003cimg src=\"https://github.com/user-attachments/assets/59252f1c-c149-43c2-b0a2-c09ca075a5c1\" alt=\"e2e_p2s\" /\u003e\n\n\u003e Note: In a peer-to-peer architecture, clipboard data is broadcasted to all connected devices directly without the need for a server. The encryption mechanism remains unchanged, ensuring the same level of security across all devices.\n\n* * * * * * *\n\n### 📋 Clipboard Functioning\n- **Text and Images**: These are directly copied to the clipboard, enabling seamless sharing across devices.  \n- **Files**: When files are received, a notification icon appears in the system tray (on desktop platforms). Since the clipboard does not store files, only their file paths are retained.  \n  \n   \u003ctable\u003e\n    \u003ctr\u003e\n        \u003ctd align=\"center\"\u003e\u003cstrong\u003eDesktop\u003c/strong\u003e\u003c/td\u003e\n        \u003ctd align=\"center\"\u003e\u003cstrong\u003eMobile\u003c/strong\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003e\u003cimg src=\"https://github.com/user-attachments/assets/c4f06a97-1fc5-47e6-9ff5-d4dc3ff41c68\" alt=\"desktop_tray_icon\" /\u003e\u003c/td\u003e\n        \u003ctd\u003e\u003cimg src=\"https://github.com/user-attachments/assets/7708d786-3c95-4892-8815-0792fc2fd465\" alt=\"android_notification\" width=\"150\" /\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n\t\u003ctd\u003e\u003cimg src=\"https://github.com/user-attachments/assets/eca756ad-76de-4fb9-ba14-619e92172758\" alt=\"desktop_tray_options\" width=\"150\" /\u003e\u003c/td\u003e\n        \u003ctd\u003e\u003cimg src=\"https://github.com/user-attachments/assets/c06e8584-fbed-4ae1-b3b3-d12664115178\" alt=\"android_home_screen\" width=\"150\" /\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n   \u003c/table\u003e\n\n\n- **Clipboard Monitoring**:\n\n   | **Platform**              | **Implementation Details**                                                                                                                                              |\n   |---------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------|\n   | **Windows**               | Uses `win32gui`, `win32api`, `win32con`, and `win32clipboard` to capture clipboard changes in an event-driven manner.                                         |\n   | **macOS**                 | Utilizes the `pasteboard` to monitor the clipboard with polling every 0.3 seconds. Instead of checking clipboard content directly, it compares a counter to detect changes efficiently. |\n   | **Linux (X11)**           | Employs `Gtk.Clipboard` to capture clipboard changes in an event-driven manner, running in GUI mode.                                                         |\n   | **Linux (XWayland, Unknown)** | Switches between `Gtk.Clipboard` (event-based) or `x-clip` (polling every 0.3 seconds) depending on permissions (requires sudo for `Gtk.Clipboard`). Both operate in GUI mode. |\n   | **Linux (Wayland, Hyprland)** | Uses `wl-clipboard` with polling every 1 seconds in CLI mode. The delay accounts for Wayland's requirement to focus a window to grab clipboard content, ensuring smoother OS interaction. |\n   | **Android**               | Leverages `ClipboardManager` to capture clipboard changes in an event-driven manner.                                                                         |\n\n\n  \u003ctable border=\"1\"\u003e\n  \u003ctr\u003e\n    \u003cth rowspan=\"2\"\u003eType\u003c/th\u003e\n    \u003cth colspan=\"5\" align=\"center\"\u003eSend\u003c/th\u003e\n    \u003cth colspan=\"5\" align=\"center\"\u003eReceive\u003c/th\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003cth\u003eWindows\u003c/th\u003e\n    \u003cth\u003eMacOS\u003c/th\u003e\n    \u003cth\u003eLinux GUI\u003c/th\u003e\n    \u003cth\u003eLinux CLI\u003c/th\u003e\n    \u003cth\u003eAndroid\u003c/th\u003e\n    \u003cth\u003eWindows\u003c/th\u003e\n    \u003cth\u003eMacOS\u003c/th\u003e\n    \u003cth\u003eLinux GUI\u003c/th\u003e\n    \u003cth\u003eLinux CLI\u003c/th\u003e\n    \u003cth\u003eAndroid\u003c/th\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003eText\u003c/td\u003e\n    \u003ctd\u003e✱\u003c/td\u003e\n    \u003ctd\u003e✱\u003c/td\u003e\n    \u003ctd\u003e✱\u003c/td\u003e\n    \u003ctd\u003e✱\u003c/td\u003e\n    \u003ctd\u003e✱ / share\u003c/td\u003e\n    \u003ctd\u003e✱\u003c/td\u003e\n    \u003ctd\u003e✱\u003c/td\u003e\n    \u003ctd\u003e✱\u003c/td\u003e\n    \u003ctd\u003e✱\u003c/td\u003e\n    \u003ctd\u003e✱\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003eImage\u003c/td\u003e\n    \u003ctd\u003e✱\u003c/td\u003e\n    \u003ctd\u003e✱\u003c/td\u003e\n    \u003ctd\u003e✱\u003c/td\u003e\n    \u003ctd\u003e✱\u003c/td\u003e\n    \u003ctd\u003e✱ / share\u003c/td\u003e\n    \u003ctd\u003e✱\u003c/td\u003e\n    \u003ctd\u003e✱\u003c/td\u003e\n    \u003ctd\u003e✱\u003c/td\u003e\n    \u003ctd\u003e✱\u003c/td\u003e\n    \u003ctd\u003e✱\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003eFiles\u003c/td\u003e\n    \u003ctd\u003e✱\u003c/td\u003e\n    \u003ctd\u003e✱\u003c/td\u003e\n    \u003ctd\u003e✱\u003c/td\u003e\n    \u003ctd\u003e✱\u003c/td\u003e\n    \u003ctd\u003eshare\u003c/td\u003e\n    \u003ctd\u003eclick\u003c/td\u003e\n    \u003ctd\u003eclick\u003c/td\u003e\n    \u003ctd\u003eclick\u003c/td\u003e\n    \u003ctd\u003eclick\u003c/td\u003e\n    \u003ctd\u003eclick\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003c/table\u003e\n\n\n## ⇄ Reverse Proxy Setup\n\nBelow is a screenshot demonstrating how to configure a reverse proxy using **Cloudflare Tunnels**. Similar configurations can be applied with other providers as well.\n\n\u003cimg src=\"https://github.com/user-attachments/assets/0f45879f-307a-4f5f-9f26-ca5d3de7b1cf\" alt=\"Reverse Proxy web\" width=\"600\" /\u003e\n\n\u003cimg src=\"https://github.com/user-attachments/assets/5cdca092-8d6b-4b3e-ac2b-fb10390a4ca2\" alt=\"login form desktop\" width=\"400\" /\u003e\n\n### Note:\nFor other providers, you may need to configure HTTP to HTTPS redirection manually by adding a permanent redirection rule.\n\nExample: Caddy Configuration\n```\nhttp://clipcascade.sample.com {\n\tredir https://clipcascade.sample.com{uri} permanent\n}\n```\n\n### Note:\nAdditionally, it might be helpful to mention that the server uses WebSockets (ws/wss) for live clipboard broadcasting. In most cases, no extra configuration is needed for WebSockets since they typically rely on an HTTP switching protocol. Most providers will support WebSocket connections out of the box, without requiring additional setup. Example: `ws://localhost:8080/clipsocket`, `ws://localhost:8080/p2psignaling`.\n\n\n## 🔧 Usage\n\n1. **Login:** Use your credentials to log into ClipCascade.\n2. **Sync:** Copy any text or content to your clipboard, and it will automatically sync across your connected devices.\n3. **Monitor:** Open the web-based monitoring page to see your clipboard history in real-time.\n\n## 🌍 Contributing\n\nContributions are always welcome! Whether it's a feature request or a pull request, your input helps make ClipCascade even better.\n\n## 📜 License\n\nClipCascade is licensed under the GNU General Public License v3.0 (GPL-3.0). See the [LICENSE](https://github.com/Sathvik-Rao/ClipCascade/blob/main/LICENSE) file for more details.\n\n\n## 🛠️ TODO\n\nHere are some planned features and improvements for future releases of ClipCascade:\n\n🗳️ **Poll for Prioritization**: Cast your vote to prioritize features [here](https://github.com/Sathvik-Rao/ClipCascade/discussions/25).\n\n- **Clipboard Data Storage:** Implement secure storage for clipboard data to store and access it later. \n- **OIDC/OAuth Authentication:** Integrate OpenID Connect (OIDC) and OAuth authentication for user login and management.  \n- **iOS Support:** Develop and Release a version of ClipCascade for iOS.  \n\n\n## 📦 Versioning\n\nClipCascade uses **Semantic Versioning (SemVer)** for releases:\n\n- **🔴 Major (X)**: Incremented for releases that introduce **backward incompatible changes**.\n- **🟠 Minor (Y)**: Incremented for **backward compatible functionality** added.\n- **🟢 Patch (Z)**: Incremented for **backward compatible bug fixes** or minor improvements.\n\n### Version Format\n\n**X.Y.Z**  \nWhere:\n- **X** is the major version.\n- **Y** is the minor version.\n- **Z** is the patch version.\n  \nExample versioning:\n- **1.0.0**: Initial release.\n- **1.1.0**: Added new features, backward compatible.\n- **2.0.0**: Major changes, **not backward compatible**.\n\n\n## 💬 Support\n\nIf you have any issues or questions, feel free to open an issue on GitHub, start a discussion, or reach out to me via [email](mailto:sathvik.poladi@gmail.com).\n\n","funding_links":["https://github.com/sponsors/Sathvik-Rao","https://www.paypal.com/donate/?business=SKHQU2CL3TCLN\u0026no_recurring=0\u0026item_name=Support+Sathvik-Rao%27s+open+source+work\u0026currency_code=USD"],"categories":["Python","Software","Recently Updated"],"sub_categories":["Miscellaneous","[Mar 08, 2025](/content/2025/03/08/README.md)"],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FSathvik-Rao%2FClipCascade","html_url":"https://awesome.ecosyste.ms/projects/github.com%2FSathvik-Rao%2FClipCascade","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FSathvik-Rao%2FClipCascade/lists"}