{"id":51237689,"url":"https://github.com/mrmedani/chronodesk","last_synced_at":"2026-06-28T22:00:39.115Z","repository":{"id":367802030,"uuid":"1282369397","full_name":"mrmedani/chronodesk","owner":"mrmedani","description":"Open-source remote desktop software - a fast, secure, self-hosted alternative to AnyDesk \u0026 TeamViewer. Built with Rust + Flutter.","archived":false,"fork":false,"pushed_at":"2026-06-27T17:31:38.000Z","size":72,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"master","last_synced_at":"2026-06-27T19:13:38.758Z","etag":null,"topics":["anydesk-alternative","flutter","p2p","remote-desktop","rust","screen-sharing","teamviewer-alternative","webrtc"],"latest_commit_sha":null,"homepage":null,"language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/mrmedani.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","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":null,"dco":null,"cla":null}},"created_at":"2026-06-27T17:19:33.000Z","updated_at":"2026-06-27T17:31:42.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/mrmedani/chronodesk","commit_stats":null,"previous_names":["mrmedani/chronodesk"],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/mrmedani/chronodesk","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mrmedani%2Fchronodesk","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mrmedani%2Fchronodesk/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mrmedani%2Fchronodesk/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mrmedani%2Fchronodesk/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/mrmedani","download_url":"https://codeload.github.com/mrmedani/chronodesk/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mrmedani%2Fchronodesk/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34905180,"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-06-28T02:00:05.809Z","response_time":54,"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":["anydesk-alternative","flutter","p2p","remote-desktop","rust","screen-sharing","teamviewer-alternative","webrtc"],"created_at":"2026-06-28T22:00:26.619Z","updated_at":"2026-06-28T22:00:39.107Z","avatar_url":"https://github.com/mrmedani.png","language":"Rust","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cdiv align=\"center\"\u003e\n  \u003ch1\u003eCHRONODESK\u003c/h1\u003e\n  \u003cp\u003e\u003cstrong\u003eOpen-source remote desktop — a fast, secure, self-hosted alternative to AnyDesk \u0026amp; RustDesk\u003c/strong\u003e\u003c/p\u003e\n\n  \u003cp\u003e\n    \u003ca href=\"https://github.com/mrmedani/chronodesk/actions\"\u003e\u003cimg src=\"https://img.shields.io/github/actions/workflow/status/mrmedani/chronodesk/rust.yml?branch=master\u0026logo=github\u0026label=build\" alt=\"Build Status\" /\u003e\u003c/a\u003e\n    \u003ca href=\"https://github.com/mrmedani/chronodesk/releases\"\u003e\u003cimg src=\"https://img.shields.io/github/v/release/mrmedani/chronodesk?include_prereleases\u0026logo=github\" alt=\"Release\" /\u003e\u003c/a\u003e\n    \u003ca href=\"LICENSE\"\u003e\u003cimg src=\"https://img.shields.io/badge/license-AGPLv3-blue.svg\" alt=\"License\" /\u003e\u003c/a\u003e\n    \u003ca href=\"https://github.com/mrmedani/chronodesk/issues\"\u003e\u003cimg src=\"https://img.shields.io/github/issues/mrmedani/chronodesk?logo=github\" alt=\"Issues\" /\u003e\u003c/a\u003e\n    \u003cbr/\u003e\n    \u003cimg src=\"https://img.shields.io/badge/Rust-1.83%2B-orange?logo=rust\" alt=\"Rust\" /\u003e\n    \u003cimg src=\"https://img.shields.io/badge/Flutter-3.x-blue?logo=flutter\" alt=\"Flutter\" /\u003e\n    \u003cimg src=\"https://img.shields.io/badge/platform-Windows%20%7C%20macOS%20%7C%20Linux-lightgrey\" alt=\"Platform\" /\u003e\n  \u003c/p\u003e\n\u003c/div\u003e\n\n---\n\n## Features\n\n| Capability | Status | Detail |\n|-----------|--------|--------|\n| :computer: Screen capture | Done | DXGI (Windows), multi-monitor, dirty rectangle detection (64x64 tiles) |\n| :satellite: P2P transport | Done | WebRTC with ICE/STUN, NAT traversal, data channel |\n| :signal_strength: Signaling server | Done | Self-hosted WebSocket broker for peer discovery \u0026 SDP relay |\n| :video_camera: Video encoding | Done | H.264 (NVENC/QSV/AMF) with FFmpeg or fallback JPEG |\n| :mouse: Input injection | Done | Mouse move/click, keyboard via `enigo` (Windows/macOS/Linux) |\n| :art: Flutter UI | Done | Single-screen AnyDesk-like UX — peer ID, connect field, remote view, accept/deny dialog |\n| :link: Rust ↔ Flutter bridge | Done | Raw C FFI with event polling, frame buffer, accept/deny flow |\n| :id: ID system | Done | Persistent 9-digit peer ID stored in `%APPDATA%/chronodesk` |\n| :locked: Encryption | Ready | AEAD via `ring` (chacha20-poly1305) — wired, key exchange pending |\n| :clipboard: File transfer | Planning | Planned over WebRTC data channel |\n| :globe_with_meridians: Remote audio | Planning | Planned via WebRTC audio tracks |\n\n---\n\n## Architecture\n\n```\n┌──────────────────────────────────────────────────────────────┐\n│                    CHRONODESK (Flutter App)                    │\n│                                                               │\n│  ┌─────────────────────────────────────────────────────────┐  │\n│  │  Flutter UI  (home_screen.dart)                          │  │\n│  │  ┌──────────┐  ┌──────────┐  ┌──────────────────────┐   │  │\n│  │  │ Peer ID  │  │ Connect  │  │ Remote Screen        │   │  │\n│  │  │ Display  │  │  Field   │  │ (RawImage from RGBA) │   │  │\n│  │  └──────────┘  └──────────┘  └──────────────────────┘   │  │\n│  └─────────────────────────────────────────────────────────┘  │\n│                           │ FFI (C ABI)                        │\n│  ┌─────────────────────────────────────────────────────────┐  │\n│  │  Rust Engine (chronodesk.dll)                            │  │\n│  │  ┌────────────┐  ┌──────────┐  ┌────────────────────┐   │  │\n│  │  │  Event     │  │  Frame   │  │  WebRTC Transport  │   │  │\n│  │  │  Queue     │  │  Buffer  │  │  (webrtc crate)    │   │  │\n│  │  └────────────┘  └──────────┘  └────────────────────┘   │  │\n│  │  ┌────────────┐  ┌──────────┐  ┌────────────────────┐   │  │\n│  │  │  Screen    │  │  Video   │  │  Signaling Client  │   │  │\n│  │  │  Capture   │  │  Encoder │  │  (WebSocket)       │   │  │\n│  │  └────────────┘  └──────────┘  └────────────────────┘   │  │\n│  └─────────────────────────────────────────────────────────┘  │\n│                           │ WebSocket                          │\n└───────────────────────────┼──────────────────────────────────┘\n                            │\n                    ┌───────┴────────┐\n                    │ Signaling Srv  │\n                    │ ws://:21116/ws │\n                    └────────────────┘\n\n                        WebRTC P2P\n                    ┌─────────────────┐\n                    │  ICE / STUN     │\n                    │  DTLS / SCTP    │\n                    │  Data Channel   │\n                    └─────────────────┘\n```\n\n**Protocol flow:**\n1. App starts → Rust loads peer ID (persistent 9-digit), connects to signaling server\n2. Enter remote ID → create WebRTC offer → send via signaling server\n3. Remote receives connection request → accept/deny dialog shown\n4. On accept → WebRTC handshake completes → P2P data channel opens\n5. Host captures screen, encodes frames, sends over data channel\n6. Viewer receives frames, decodes to RGBA, renders via Flutter `RawImage`\n7. Input events flow Viewer → Host over data channel\n\n---\n\n## Quick Start\n\n### Prerequisites\n\n- [Rust](https://rustup.rs/) 1.83+ (`rustup install stable`)\n- [Flutter](https://flutter.dev) 3.x (for the UI)\n- Visual Studio Build Tools (Windows) or CMake (Linux/macOS)\n\n### 1. Start the Signaling Server\n\n```bash\ncargo run --bin signaling-server\n```\n\nThe server listens at `ws://\u003chost\u003e:21116/ws`.\n\n### 2. Build \u0026 Run the Flutter App\n\n```bash\n# Build the Rust DLL\ncargo build --lib\n\n# Copy it to the Flutter release directory\ncopy target\\debug\\chronodesk.dll chronodesk_flutter\\build\\windows\\x64\\runner\\Release\\\n\n# Build \u0026 run Flutter\ncd chronodesk_flutter\nflutter pub get\nflutter run -d windows\n```\n\nThe app launches with your 9-digit peer ID. Enter another peer's ID and click **Connect**.\n\n\u003e **macOS / Linux**: Replace `.dll` with `.dylib` / `.so` and adjust paths accordingly.\n\n---\n\n## Building from Source\n\n### Rust Engine (DLL)\n\n```bash\n# Debug DLL\ncargo build --lib\n\n# Release DLL\ncargo build --release --lib\n\n# With FFmpeg H.264 support\ncargo build --release --features ffmpeg --lib\n```\n\nOutput: `target/debug/chronodesk.dll` (or `.so`/`.dylib`)\n\n### Flutter UI\n\n```bash\ncd chronodesk_flutter\nflutter pub get\nflutter build windows   # or macos / linux\n```\n\n### Standalone Binaries\n\n```bash\n# Signaling server\ncargo build --bin signaling-server\n\n# CLI engine (legacy host/client modes)\ncargo build\n```\n\n---\n\n## Project Structure\n\n```\nchronodesk/\n├── src/                          # Rust core engine\n│   ├── lib.rs                    # Library exports\n│   ├── ffi.rs                    # C FFI exports (ID system, event queue, frame buffer)\n│   ├── bin/signaling.rs          # WebSocket signaling server\n│   ├── capture.rs                # Screen capture (xcap DXGI)\n│   ├── crypto.rs                 # AEAD encryption (ring)\n│   ├── input.rs                  # Input injection (enigo)\n│   ├── video.rs                  # Video encoding (ffmpeg/JPEG)\n│   ├── protocol.rs               # Data channel message protocol\n│   ├── main.rs                   # CLI entrypoint (legacy)\n│   └── network/\n│       ├── transport.rs          # WebRTC PeerConnection\n│       └── signaling.rs          # Signaling client (WebSocket)\n├── chronodesk_flutter/           # Flutter UI\n│   ├── lib/\n│   │   ├── main.dart\n│   │   └── src/\n│   │       ├── app.dart          # App root (single screen)\n│   │       ├── screens/\n│   │       │   └── home_screen.dart  # AnyDesk-like single-screen UX\n│   │       └── ffi/\n│   │           └── native.dart   # Raw C FFI bindings\n│   ├── windows/                  # Windows runner\n│   └── pubspec.yaml\n├── server/                       # Server infrastructure (future)\n├── docs/                         # Documentation\n├── .github/                      # CI/CD workflows\n└── Dockerfile                    # Signaling server container\n```\n\n---\n\n## Tech Stack\n\n| Component | Technology |\n|-----------|-----------|\n| Core engine | **Rust** — performance, safety, memory efficiency |\n| P2P transport | **WebRTC** via `webrtc` crate — ICE, STUN, DTLS, SCTP |\n| Screen capture | **xcap** — DXGI (Windows), CoreGraphics (macOS), X11/PipeWire (Linux) |\n| Video encoding | **FFmpeg** (NVENC/QSV/AMF) or **libjpeg** fallback |\n| Input injection | **enigo** — cross-platform input simulation |\n| Encryption | **ring** — AEAD (ChaCha20-Poly1305) |\n| UI | **Flutter** — Material Design 3, native performance |\n| Bridge | **Raw C FFI** — event polling, RGBA frame buffer, JSON event queue |\n\n---\n\n## Roadmap\n\n- [x] Core P2P connectivity \u0026 signaling\n- [x] Screen capture \u0026 video encoding\n- [x] Input injection\n- [x] Flutter UI with remote screen viewer\n- [x] Rust ↔ Flutter FFI bridge with event system\n- [ ] End-to-end encryption (key exchange)\n- [ ] File transfer over data channel\n- [ ] Audio streaming\n- [ ] Clipboard sync\n- [ ] TURN server for restrictive NATs\n- [ ] Headless mode for servers\n- [ ] Mobile clients (iOS/Android)\n\n---\n\n## Contributing\n\nContributions are welcome! See [CONTRIBUTING.md](CONTRIBUTING.md) for guidelines.\n\n1. Fork the repository\n2. Create your feature branch (`git checkout -b feat/amazing-feature`)\n3. Commit your changes (`git commit -m 'feat: add amazing feature'`)\n4. Push to the branch (`git push origin feat/amazing-feature`)\n5. Open a Pull Request\n\n---\n\n## Security\n\nFound a vulnerability? Read [SECURITY.md](SECURITY.md) and report responsibly.\n\n---\n\n## License\n\nThis project is licensed under the **GNU Affero General Public License v3.0** — see [LICENSE](LICENSE).\n\n---\n\n\u003cdiv align=\"center\"\u003e\n  \u003csub\u003eBuilt with Rust \u0026amp; Flutter\u003c/sub\u003e\n  \u003cbr/\u003e\n  \u003csub\u003e© 2026 CHRONODESK Contributors\u003c/sub\u003e\n\u003c/div\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmrmedani%2Fchronodesk","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmrmedani%2Fchronodesk","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmrmedani%2Fchronodesk/lists"}