{"id":51677017,"url":"https://github.com/chenyuhao0628/displayweave","last_synced_at":"2026-07-16T09:01:13.782Z","repository":{"id":371159019,"uuid":"1296316079","full_name":"chenyuhao0628/displayweave","owner":"chenyuhao0628","description":"Turn iPhone, iPad, and Android into a second display for macOS / 将 iPhone、iPad 和 Android 变成 Mac 第二屏。Open source, local-first, HEVC, experimental high refresh.","archived":false,"fork":false,"pushed_at":"2026-07-15T06:33:25.000Z","size":13263,"stargazers_count":3,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-07-15T08:25:10.031Z","etag":null,"topics":["120hz","android","external-display","h264","hevc","ios","ipad","iphone","macos","mediacodec","open-source","screen-streaming","screencapturekit","second-screen","videotoolbox","virtual-display"],"latest_commit_sha":null,"homepage":"https://chenyuhao0628.github.io/displayweave/","language":"Swift","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/chenyuhao0628.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":".github/CODEOWNERS","security":"SECURITY.md","support":"SUPPORT.md","governance":null,"roadmap":"ROADMAP.md","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-07-10T09:16:12.000Z","updated_at":"2026-07-15T06:33:29.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/chenyuhao0628/displayweave","commit_stats":null,"previous_names":["chenyuhao0628/displayweave"],"tags_count":11,"template":false,"template_full_name":null,"purl":"pkg:github/chenyuhao0628/displayweave","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/chenyuhao0628%2Fdisplayweave","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/chenyuhao0628%2Fdisplayweave/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/chenyuhao0628%2Fdisplayweave/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/chenyuhao0628%2Fdisplayweave/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/chenyuhao0628","download_url":"https://codeload.github.com/chenyuhao0628/displayweave/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/chenyuhao0628%2Fdisplayweave/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":35537751,"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-16T02:00:06.687Z","response_time":83,"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":["120hz","android","external-display","h264","hevc","ios","ipad","iphone","macos","mediacodec","open-source","screen-streaming","screencapturekit","second-screen","videotoolbox","virtual-display"],"created_at":"2026-07-15T08:00:22.482Z","updated_at":"2026-07-16T09:01:13.716Z","avatar_url":"https://github.com/chenyuhao0628.png","language":"Swift","funding_links":[],"categories":[],"sub_categories":[],"readme":"[English](README.md) | [简体中文](README.zh-CN.md)\n\n# DisplayWeave\n\n**One Mac. A woven field of useful screens.**\n\nDisplayWeave is an independently maintained, GPL-3.0, local-first second-display project derived from [OpenDisplay](https://github.com/peetzweg/opendisplay). It turns iPhone, iPad, and Android devices into extended or mirrored displays for a Mac.\n\n## Current capabilities\n\n- Apple receivers: USB through `usbmuxd` and local WiFi, using the H.264 path.\n- Android receiver: local WiFi or per-device dynamic `adb forward` USB, HEVC/H.265 with H.264 fallback, and 30/60/90/120fps negotiation.\n- Transport selector: Auto, USB, or WiFi. Auto prefers wired USB, performs bounded recovery, falls back only to WiFi with the same install ID, and upgrades back to USB when the cable returns.\n- Input: tap, drag, cursor, and two-finger scrolling return to macOS.\n- Recovery: receiver foreground/surface return, cable unplug/replug, ADB restart, and authorization revoke/reallow were verified on the available OnePlus Android device.\n- Mixed receivers: one current DisplayWeave iPhone over WiFi and one Android receiver ran concurrently.\n- Runtime evidence: capture, encode, send, receive, decode, render, queue, drop, and latency metrics.\n- Performance controls: Auto/Manual/experimental Benchmark bitrate, bounded adaptive changes, quality-aware send queues, and transport-aware keyframe intervals.\n\nAndroid high refresh remains experimental. One OnePlus HEVC/120 WiFi run measured about 109–111 rendered FPS; this does not guarantee stable 120 FPS on other devices or conditions.\n\nThe physical-device recovery and high-refresh observations below were recorded\nduring Preview 2 validation and remain prior evidence; they were not rerun on a\nsecond Android device for this release.\n\n## Download `v0.2.1-p3`\n\n[GitHub Release](https://github.com/chenyuhao0628/displayweave/releases/tag/v0.2.1-p3)\n\n| Platform | Asset | Distribution boundary |\n| --- | --- | --- |\n| macOS | `DisplayWeave-macOS.dmg` | Recommended guided first-install package; ad-hoc signed and not notarized |\n| macOS update | `DisplayWeave-macOS.zip` | Sparkle update payload and equivalent manual install option |\n| Android | `DisplayWeave-Android.apk` | Offline v2-signed APK; future in-app downloads are verified before system confirmation |\n| iOS/iPadOS | `DisplayWeave-Preview-0.1-iOS-unsigned-resigning-input.ipa` | Unsigned re-signing input; cannot be installed directly |\n| Mac feed | `appcast.xml` | Sparkle feed authenticated by the public key embedded in the Mac app |\n| Android feed | `android-update.json` | HTTPS metadata with size, hash, version, package, and pinned certificate |\n| Verification | `SHA256SUMS.txt` | SHA-256 for all Release files |\n\nThis is a development preview, not a production-signed store release. Verify the checksum before use. Android users should also compare the certificate fingerprint in the [release checklist](docs/release-checklist.md).\n\nThe guided Mac packaging flow produces `DisplayWeave-macOS.dmg` beside the ZIP.\nThe DMG is the recommended first-install package: drag\nDisplayWeave into Applications and follow the first-run guidance shown in its\nbackground. The ZIP remains the Sparkle update payload and an equivalent manual\ninstall option. Both containers hold the same `DisplayWeave.app`, so either\ninstallation receives later Sparkle updates after the app is in `/Applications`.\n\nThe refreshed Mac build uses a DisplayWeave-owned application identity. Settings migrate from the legacy OpenDisplay/OpenSidecar preference domains, but macOS will require Screen Recording, Accessibility, and Local Network permission to be granted again after the upgrade.\n\n### One-time migration and later updates\n\n- **Mac:** manually replace the old app with this build in `/Applications`.\n  Gatekeeper may require Control-click → **Open** or Privacy \u0026 Security →\n  **Open Anyway**. Do not enable **Anywhere** globally. Later releases are\n  checked and verified through Sparkle, but the app remains ad-hoc signed and\n  not notarized.\n- **Android:** install this APK over the existing package once. The receiver\n  then checks at most daily, with a manual check in **Settings \u0026 Help**.\n  Downloads are verified by size, SHA-256, package, version, minimum SDK, and\n  the pinned signing certificate before Android shows its system installer.\n- **iOS/iPadOS:** the unsigned re-signing input and existing OpenDisplay\n  receiver protocol are unchanged by the Mac/Android update channel.\n\nSee [automatic updates](docs/automatic-updates.md) for migration and recovery.\n\n## Android USB quick start\n\n1. Enable Developer options and USB debugging on the Android device.\n2. Connect a data-capable cable, open DisplayWeave Receiver, and allow the Mac's RSA debugging identity.\n3. Open DisplayWeave on the Mac and choose **Auto** (recommended) or **USB**.\n4. Auto uses only a true wired `usb:` ADB device. Wireless-debugging endpoints never create a USB session.\n5. If the cable is removed, Auto completes protocol grace and bounded recovery before falling back to the same app installation over WiFi. USB mode does not silently fall back.\n\nADB authorization grants the Mac broad debugging access, not only DisplayWeave access. Revoke it in Android Developer options when it is no longer needed.\n\n## Build from source\n\nApple targets:\n\n```bash\n./generate.sh\nxcodebuild -project OpenSidecar.xcodeproj -scheme OpenSidecarMac \\\n  -configuration Debug -derivedDataPath build-run \\\n  -clonedSourcePackagesDirPath build-run/SourcePackages build\n```\n\nAndroid:\n\n```bash\ncd AndroidReceiver\n./gradlew clean test assembleDebug\n```\n\nCreate the complete offline Preview package set:\n\n```bash\npython3 -m pip install -r tools/dmg-requirements.txt\n./tools/package-preview-0.1.sh\n```\n\nAndroid release signing uses a keystore stored outside the repository. See [development preview distribution](docs/development-preview.md).\n\n## Documentation\n\n- [Documentation index](docs/README.md)\n- [Architecture](ARCHITECTURE.md)\n- [Roadmap](ROADMAP.md)\n- [Android receiver](AndroidReceiver/README.md)\n- [Release checklist](docs/release-checklist.md)\n- [Stability evidence](docs/stability-test-report.md)\n- [USB/WiFi benchmark protocol](docs/usb-vs-wifi-benchmark.md)\n- [Bitrate modes](docs/bitrate-modes.md) and [adaptive bitrate](docs/adaptive-bitrate.md)\n- [Queue analysis](docs/low-latency-queue-analysis.md) and [keyframe strategy](docs/keyframe-strategy.md)\n- [Android decoder throughput, reference recovery, and Surface-rate mapping](docs/android-decoder-throughput-recovery.md)\n- [Security policy](SECURITY.md)\n- [Contributing](CONTRIBUTING.md)\n- [Third-party notices](THIRD_PARTY_NOTICES.md)\n\n## Current limits\n\n- iOS/iPadOS 120Hz is not implemented.\n- Current WiFi TCP video/control traffic is not production-encrypted; use a trusted LAN.\n- Two simultaneous Android devices, the controlled same-condition USB/WiFi benchmark, and 30-minute/2-hour endurance runs remain incomplete.\n- macOS uses private `CGVirtualDisplay` behavior that may change in future macOS versions.\n- Public macOS and iOS packages are not Developer ID/App Store signed.\n\n## Origin and license\n\nDisplayWeave preserves the applicable OpenDisplay history, copyright notices, and GPL-3.0 obligations. Some high-refresh and measurement approaches were informed by the MIT-licensed SideScreen project. See [THIRD_PARTY_NOTICES.md](THIRD_PARTY_NOTICES.md). DisplayWeave itself is distributed under [GPL-3.0](LICENSE).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fchenyuhao0628%2Fdisplayweave","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fchenyuhao0628%2Fdisplayweave","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fchenyuhao0628%2Fdisplayweave/lists"}