Zamienia iPhone'a w bezprzewodowa mysz, klawiature i pilot multimediow dla Maca. Jeden projekt Xcode, dwa cele: aplikacja iOS (kontroler) i aplikacja macOS (serwer).
Status: wczesna wersja, nie do codziennego uzytku. Aplikacja macOS wstrzykuje zdarzenia myszy i klawiatury do systemu, wiec przeczytaj sekcje Model bezpieczenstwa, zanim ja uruchomisz.
iPhone (kontroler) Mac (serwer)
dotyk / zyroskop ──► CursorEvent ──► CGEvent / AppleScript ──► kursor,
(JSON przez klawiatura,
MultipeerConnectivity) multimedia
Mac rozglasza usluge cursorly-ctrl w sieci lokalnej i pokazuje 6-cyfrowy kod
parowania. iPhone znajduje Maca, wysyla kod i po akceptacji przejmuje sterowanie.
- Parowanie kodem PIN — 6 cyfr, z limitem prob i rotacja kodu
- Touchpad — ruch jednym palcem, przewijanie dwoma, tap = lewy przycisk, tap dwoma palcami = prawy
- Air Mouse — sterowanie zyroskopem (Ustawienia > Tryb Air Mouse), z filtrem dolnoprzepustowym i pauza, gdy telefon lezy plasko
- Pilot multimediow — odtwarzanie/pauza, poprzedni/nastepny, glosnosc, mute
- Klawiatura zdalna — przepisywanie tekstu na Maca
- Parowanie kodem QR — Mac pokazuje kod, iPhone go skanuje
- MenuBarExtra na macOS — status polaczenia w pasku menu
- Polaczenie po adresie IP — ekran istnieje, ale mowi wprost, ze tryb nie dziala. MultipeerConnectivity nie laczy sie po adresie; wymagaloby to osobnego transportu na Network.framework.
- Tryb Cloud / przez Internet — zaslepka.
- Backspace w klawiaturze zdalnej — znane ograniczenie, patrz .claude/backlog.md.
Przeczytaj to, zanim uruchomisz aplikacje macOS.
- Aplikacja macOS wymaga uprawnien Dostepu Uniwersalnego (Accessibility) i dziala bez sandboxa — inaczej nie moze wstrzykiwac zdarzen wejscia.
- Kazdy sparowany peer moze poruszac kursorem, klikac i wpisywac dowolny tekst. Sparowane urzadzenie ma wiec praktycznie taka kontrole nad Makiem, jak osoba siedzaca przy klawiaturze.
- Jedyna bariera jest kod parowania: 6 cyfr, maksimum 3 bledne proby, potem rotacja kodu i 60 s blokady. Nieuzyty kod wygasa po 5 minutach.
- Transport jest szyfrowany (
MCSessionz.required), ale peery nie sa uwierzytelniane certyfikatem — MultipeerConnectivity uzywa certyfikatow self-signed. - Uruchamiaj serwer tylko w sieci, ktorej ufasz, i zatrzymuj go, gdy z niego nie korzystasz.
Znalazles problem bezpieczenstwa? Zglos go przez GitHub Issues w tym repozytorium.
Wymagania: Xcode 26+, iOS 16+, macOS 13+.
# testy i buildy — to samo, co odpala hook pre-push
bash scripts/local-ci.shRecznie:
xcodebuild -project Cursorly.xcodeproj -scheme Cursorly \
-destination 'platform=iOS Simulator,name=iPhone 17' test
xcodebuild -project Cursorly.xcodeproj -scheme Cursorly-macOS \
-destination 'platform=macOS' buildNazwa symulatora zmienia sie z wersja Xcode — scripts/local-ci.sh wykrywa
dostepny automatycznie.
W Xcode: uruchom cel Cursorly-macOS na Macu, nadaj mu uprawnienia Dostepnosci, potem cel Cursorly na iPhonie i sparuj kodem z ekranu Maca.
Cursorly/
├── CursorlyApp.swift punkt wejscia; wybiera UI wg platformy
├── Connectivity/ ConnectivityManager — parowanie, transport,
│ wstrzykiwanie zdarzen na macOS
├── Managers/ MotionManager (zyroskop), QRCodeGenerator +
│ PairingPayload, IPAddressHelper
├── Models/ CursorEvent — protokol przesylany po sieci
├── Views/ ekrany SwiftUI (iOS i macOS)
└── CursorlyTests.swift testy jednostkowe (cel CursorlyTests)
Konwencje, backlog i stan: AGENTS.md oraz katalog
.claude/. Projekt nie ma hosted CI — gate'y uruchamia
scripts/local-ci.sh z hooka pre-push (decyzja D-003).
git config core.hooksPath .githooks # jednorazowo po sklonowaniu