{"id":50867438,"url":"https://github.com/switchifyapp/switchify-pc","last_synced_at":"2026-06-15T02:36:23.895Z","repository":{"id":364740914,"uuid":"1259561618","full_name":"switchifyapp/switchify-pc","owner":"switchifyapp","description":null,"archived":false,"fork":false,"pushed_at":"2026-06-14T10:17:19.000Z","size":476,"stargazers_count":0,"open_issues_count":2,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-06-14T10:21:17.852Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"agpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/switchifyapp.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"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":"AGENTS.md","dco":null,"cla":null}},"created_at":"2026-06-04T16:20:51.000Z","updated_at":"2026-06-14T10:17:22.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/switchifyapp/switchify-pc","commit_stats":null,"previous_names":["switchifyapp/switchify-pc"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/switchifyapp/switchify-pc","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/switchifyapp%2Fswitchify-pc","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/switchifyapp%2Fswitchify-pc/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/switchifyapp%2Fswitchify-pc/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/switchifyapp%2Fswitchify-pc/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/switchifyapp","download_url":"https://codeload.github.com/switchifyapp/switchify-pc/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/switchifyapp%2Fswitchify-pc/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34345578,"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-15T02:00:07.085Z","response_time":63,"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":[],"created_at":"2026-06-15T02:36:23.109Z","updated_at":"2026-06-15T02:36:23.887Z","avatar_url":"https://github.com/switchifyapp.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Switchify PC\n\nDesktop companion app for Switchify Android.\n\n## Status\n\nSwitchify PC is early-stage Windows-first software. It is intended for local-network use with paired Switchify Android devices.\n\n## Development\n\nInstall dependencies:\n\n```powershell\nnpm install\n```\n\nRun the Electron app in development mode:\n\n```powershell\nnpm run dev\n```\n\nBuild the compiled Electron output:\n\n```powershell\nnpm run build\n```\n\nBuild the native Windows cursor overlay helper:\n\n```powershell\nnpm run native:build-overlay\n```\n\nRun checks before pushing implementation changes:\n\n```powershell\nnpm run typecheck\nnpm test\n```\n\n## Windows packaging\n\nCreate a local Windows x64 package:\n\n```powershell\nnpm run package:win\n```\n\nThe package script runs `npm run build` and `npm run native:build-overlay` first, then creates an unpacked Windows artifact in `dist/win-unpacked` and a per-machine NSIS installer in `dist`.\n\n## Windows uiAccess packaging\n\nSwitchify PC uses `uiAccess=\"true\"` so the installed app can interact with elevated or higher-integrity windows for accessibility and input automation scenarios.\n\nWindows only honors `uiAccess` when all of these are true:\n\n- The app executable manifest has `level=\"highestAvailable\"` and `uiAccess=\"true\"`.\n- The executable is Authenticode signed.\n- The executable is installed in a secure location such as `C:\\Program Files\\Switchify PC\\`.\n- Signing happens after icon and manifest resource embedding.\n\nThe packaged Windows app also disables the Chromium GPU child-process sandbox at startup. Without that switch, Electron's GPU child process can fail to launch under `uiAccess=true`, causing the app to exit even when the manifest, signature, and install location are valid.\n\nPackaged Windows builds include `SwitchifyCursorOverlay.exe`, a native self-contained cursor overlay helper under app resources. The Electron app controls it over stdin JSON lines so cursor feedback can render as a per-pixel-alpha ring over protected UI. If the helper cannot start, Switchify PC falls back to the Electron overlay instead of failing input commands.\n\nDevelopment builds can use a local certificate chain trusted on the test machine. The script creates a local dev root CA, creates a code-signing leaf certificate, exports the leaf PFX, stores the leaf thumbprint for `signtool`, and imports trust material into the current user and local machine certificate stores. Accept the UAC prompt so Windows can trust the certificate machine-wide for `uiAccess`.\n\n```powershell\n$env:SWITCHIFY_DEV_CERT_PASSWORD = \"choose-a-local-password\"\nnpm run signing:create-dev-cert\n```\n\nThen package and verify:\n\n```powershell\n$env:SWITCHIFY_DEV_CERT_PASSWORD = \"same-password\"\nnpm run package:win\nnpm run package:win:verify-uiaccess\n```\n\nRun the generated installer from `dist` and install per-machine. To verify the installed Program Files copy launches and stays running, use:\n\n```powershell\n$env:SWITCHIFY_VERIFY_INSTALLED_LAUNCH = \"1\"\nnpm run package:win:verify-uiaccess\n```\n\nRunning from `npm run dev`, `dist/win-unpacked`, AppData, Downloads, or the repo does not prove that `uiAccess` is active.\n\nSelf-signed certificates are for dev/testing only. Production users should not be asked to trust a self-signed certificate manually. Azure Artifact Signing is the preferred low-cost production signing path when eligible; traditional OV/EV code-signing certificates remain possible. Production signing configuration must come from environment variables or CI secrets, never committed files.\n\n## Bluetooth connection expectations\n\nSwitchify PC uses Bluetooth for PC control pairing and reconnect. The Android device must be near the PC, Bluetooth must be enabled on both devices, and the first pairing still requires approval on the PC.\n\nPaired devices reconnect over Bluetooth using the existing app-level pairing token and authenticated command flow. Local-network WebSocket control, mDNS discovery, manual IP entry, and QR connection are not part of the product path.\n\n## Security\n\nBluetooth proximity is not authentication. Pairing approval and authenticated commands remain required, and pairing tokens, auth proofs, and typed text payloads must not be exposed in logs or UI.\n\nPlease report vulnerabilities by email to owen@switchifyapp.com instead of opening public issues.\n\n## Release CI\n\nRelease builds are published from tags named `vX.Y.Z`, where `X.Y.Z` matches `package.json`.\n\n```powershell\ngit tag v0.1.0\ngit push origin v0.1.0\n```\n\nThe release workflow builds the Windows x64 installer and uploads it to GitHub Releases. Current CI release installers are unsigned until production code signing is configured.\n\n## MVP smoke checklist\n\nUse this checklist after packaging changes and before publishing any installer:\n\n- App launches from `Switchify PC.exe`.\n- Tray menu opens and can show the main window.\n- Bluetooth helper starts and reports a safe status.\n- No QR/manual local-network connection UI appears.\n- No local IP address or WebSocket address appears in Settings or troubleshooting.\n- Pairing approval requests appear and can be accepted or rejected.\n- Android can pair with the PC using Bluetooth and approval.\n- Paired Android device can disconnect and reconnect without deleting the saved pairing.\n- Authenticated ping receives an ack.\n- Relative mouse movement works and remains responsive under repeated movement.\n- Cursor highlight appears as a green ring, not a square, including over the Start menu.\n- Cursor highlight does not steal focus or block clicks.\n- Left click works.\n- Right-click works.\n- Scroll works.\n- Text typing works in a focused text field.\n- Keyboard shortcut works, for example `Ctrl+C` or `Ctrl+V`.\n- Media key command works, for example play/pause or volume up.\n- Window control commands work, for example next app and show desktop.\n- Disconnect all removes active Bluetooth sessions.\n- Quit exits the app, removes the tray icon, and exits the native cursor overlay helper.\n\n## License\n\nSwitchify PC is licensed under the GNU Affero General Public License v3.0 or later. See `LICENSE`.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fswitchifyapp%2Fswitchify-pc","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fswitchifyapp%2Fswitchify-pc","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fswitchifyapp%2Fswitchify-pc/lists"}