Skip to content

feat: add mobile support#23

Merged
sirily11 merged 8 commits into
mainfrom
mobile-support
May 19, 2026
Merged

feat: add mobile support#23
sirily11 merged 8 commits into
mainfrom
mobile-support

Conversation

@sirily11
Copy link
Copy Markdown
Contributor

No description provided.

sirily11 added 6 commits May 19, 2026 18:33
…iews/Inspector/RightInspectorPanel.swift, RxCode/Views/Settings/MobileSettingsTab.swift, RxCodeMobile/AppDelegate.swift, RxCodeMobile/State/MobileAppState.swift, RxCodeMobileNotificationService/NotificationService.swift

- modernize the service structures
- improve code readability and maintainability
- streamline notifications handling
Copilot AI review requested due to automatic review settings May 19, 2026 16:03
@vercel
Copy link
Copy Markdown

vercel Bot commented May 19, 2026

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
rxcode Ready Ready Preview, Comment May 19, 2026 4:22pm

Request Review

Copy link
Copy Markdown

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Adds a new mobile companion app, encrypted relay/APNs sync infrastructure, and related desktop/website integration for pairing, notifications, and shared chat rendering.

Changes:

  • Adds iOS app views, app/extension configuration, mobile settings, pairing links, and universal link support.
  • Introduces RxCodeSync package APIs for pairing, relay transport, encryption, APNs alert encryption, and payload tests.
  • Adds a Go relay server with WebSocket routing, APNs forwarding, Docker/Makefile docs, plus desktop-side mobile notification/settings hooks.

Reviewed changes

Copilot reviewed 116 out of 118 changed files in this pull request and generated 19 comments.

Show a summary per file
File Description
website/app/pair/page.tsx Adds mobile pairing landing page and metadata.
website/app/.well-known/apple-app-site-association/route.ts Serves Apple universal link association.
RxCodeTests/RxCodeMobile/SETUP.md Documents manual mobile target setup.
RxCodeTests/RxCodeMobile/** Adds duplicate/test-area mobile source stubs.
RxCodeMobile/** Adds main iOS companion app source, assets, entitlements, and plist.
RxCodeMobileNotificationService/** Adds APNs notification service extension for encrypted alert decryption.
RxCodeMobileTests/** Adds mobile unit test target template.
RxCodeMobileUITests/** Adds mobile UI test target templates.
RxCode/Views/SettingsView.swift Adds Mobile settings tab.
RxCode/Views/Sidebar/HistoryListView.swift Uses shared session sidebar row.
RxCode/Views/RunProfile/RunConfigurationsView.swift Adds Make target discovery picker.
RxCode/Views/Inspector/RightInspectorPanel.swift Updates file selection/right-click behavior.
RxCode/Services/RunProfile/RunProfileDetector.swift Exposes Makefile target parsing helpers.
RxCode/Services/NotificationService.swift Fans desktop notifications to mobile sync.
RxCode/App/RxCodeApp.swift Starts mobile sync service on app launch.
RxCode/Info.plist Allows local networking for relay use.
RxCode.xcodeproj/xcshareddata/xcschemes/RxCodeMobile.xcscheme Adds shared mobile scheme.
relay-server/** Adds Go relay server, APNs forwarding, health endpoint, Docker, and docs.
Packages/Package.swift Adds iOS platform support and RxCodeSync product.
Packages/Sources/RxCodeSync/** Adds sync protocol, crypto, pairing, relay, APNs alert, and client APIs.
Packages/Tests/RxCodeSyncTests/** Adds payload and pairing token tests.
Packages/Sources/RxCodeCore/** Makes shared core utilities/views more cross-platform.
Packages/Sources/RxCodeChatKit/** Refactors chat rendering for shared/mobile use and gates macOS-only views.
.gitignore Ignores relay secrets/build artifacts.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment thread relay-server/relay.go
Comment on lines +136 to +154
func (h *Hub) ServeWS(w http.ResponseWriter, r *http.Request) {
pubkey := r.URL.Query().Get("pubkey")
if !isValidPubkeyHex(pubkey) {
http.Error(w, "invalid pubkey", http.StatusBadRequest)
return
}
ws, err := upgrader.Upgrade(w, r, nil)
if err != nil {
log.Printf("upgrade: %v", err)
return
}
ws.SetReadLimit(maxEnvelopeBytes)
c := &Conn{
pubkey: pubkey,
ws: ws,
send: make(chan []byte, 32),
hub: h,
}
h.register <- c
Comment thread relay-server/push.go
Comment on lines +73 to +78
// pushHandler returns an http.HandlerFunc that signs and forwards APNs pushes.
//
// Auth is intentionally minimal in v1: any client may submit, since the
// payload itself is E2E-encrypted to the recipient device. A future hardening
// pass should require a signed sender token (see plan: risk areas).
func pushHandler(sender *PushSender) http.HandlerFunc {
Comment on lines +18 to +21
3. Product Name: **`RxCodeMobile`**
4. Bundle Identifier: **`com.idealapp.RxCode.Mobile`**
5. Interface: SwiftUI · Language: Swift · Storage: None · Tests: optional
6. Deployment target: **iOS 26.0** (or whatever you confirmed in the plan)
Comment thread relay-server/README.md
Comment on lines +110 to +112
- Generate a `.p8` auth key in https://developer.apple.com/account/resources/authkeys/list.
- `-apns-topic` must equal the iOS app's bundle identifier exactly
(`com.idealapp.RxCode.Mobile`).
Comment on lines +51 to +53
let content = notification.request.content
let requestID = notification.request.identifier
logger.info("[APNs] willPresent request=\(requestID, privacy: .public) title=\(content.title, privacy: .public) body=\(content.body, privacy: .public) category=\(content.categoryIdentifier, privacy: .public) keys=\(content.userInfo.keys.map { "\($0)" }.sorted().joined(separator: ","), privacy: .public) aps=\(Self.apnsSummary(content.userInfo), privacy: .public)")
Comment on lines +10 to +16
public let v: Int
public let relayURL: String
public let desktopPubkeyHex: String
public let sessionID: UUID
public let oneTimeSecretHex: String
public let issuedAt: Date
public let expiresAt: Date
Comment on lines +5 to +6
<key>aps-environment</key>
<string>development</string>
Comment on lines +42 to +43
case .denied, .restricted:
scannerLogger.error("camera access denied/restricted")
Comment on lines +111 to +117
if !threadHits.isEmpty {
Section("Threads") {
ForEach(threadHits) { hit in
NavigationLink(value: hit.sessionID) {
threadHitRow(hit, project: projectsByID[hit.projectID])
}
}
Comment on lines +2 to +29
"images" : [
{
"idiom" : "universal",
"platform" : "ios",
"size" : "1024x1024"
},
{
"appearances" : [
{
"appearance" : "luminosity",
"value" : "dark"
}
],
"idiom" : "universal",
"platform" : "ios",
"size" : "1024x1024"
},
{
"appearances" : [
{
"appearance" : "luminosity",
"value" : "tinted"
}
],
"idiom" : "universal",
"platform" : "ios",
"size" : "1024x1024"
}
…nts and simplify logic

- consolidate assignments into a single block
- reduce repeated calculations and conditional checks
- improve readability and maintainability
- remove redundant variables
@sirily11 sirily11 merged commit d5f3760 into main May 19, 2026
6 checks passed
@sirily11 sirily11 deleted the mobile-support branch May 19, 2026 16:24
@sirily11
Copy link
Copy Markdown
Contributor Author

🎉 This PR is included in version 1.6.0 🎉

The release is available on GitHub release

Your semantic-release bot 📦🚀

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

enhancement New feature or request released

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants