Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
42 changes: 42 additions & 0 deletions .github/ISSUE_TEMPLATE/bug.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
name: Bug report
description: Report reproducible RemoMouse behavior.
title: "Bug: "
labels: []
body:
- type: textarea
id: behavior
attributes:
label: What happened?
description: Describe the behavior and what you expected instead.
validations:
required: true
- type: input
id: macos
attributes:
label: macOS version and build
placeholder: macOS 26.5.1 (25F80)
validations:
required: true
- type: dropdown
id: remote
attributes:
label: Siri Remote model
options:
- First generation (black glass)
- Second generation (silver, Lightning)
- Third generation (silver, USB-C)
validations:
required: true
- type: textarea
id: reproduction
attributes:
label: Reproduction steps
validations:
required: true
- type: checkboxes
id: privacy
attributes:
label: Privacy check
options:
- label: I removed serial numbers, Bluetooth addresses, usernames, and private paths.
required: true
30 changes: 30 additions & 0 deletions .github/ISSUE_TEMPLATE/feature.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
name: Feature request
description: Propose a focused RemoMouse improvement.
title: "Feature: "
labels: []
body:
- type: textarea
id: problem
attributes:
label: Problem
description: What workflow or limitation should this solve?
validations:
required: true
- type: textarea
id: behavior
attributes:
label: Proposed behavior
description: Describe the user-visible result rather than an implementation.
validations:
required: true
- type: dropdown
id: remote
attributes:
label: Remote generation
options:
- First generation (black glass)
- Second generation (silver, Lightning)
- Third generation (silver, USB-C)
- Not hardware-specific
validations:
required: true
35 changes: 35 additions & 0 deletions .github/ISSUE_TEMPLATE/hardware.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
name: Hardware compatibility report
description: Report what macOS exposes for a Siri Remote.
title: "Hardware: "
labels: []
body:
- type: dropdown
id: remote
attributes:
label: Siri Remote model
options:
- First generation A1513/A1962
- Second generation A2540
- Third generation A2854
validations:
required: true
- type: input
id: macos
attributes:
label: macOS version and build
validations:
required: true
- type: textarea
id: capabilities
attributes:
label: Generated capability summary
description: Paste only the sanitized Markdown produced by RemoMouse Probe.
validations:
required: true
- type: checkboxes
id: privacy
attributes:
label: Privacy check
options:
- label: The report contains no serial number, Bluetooth address, username, or home path.
required: true
7 changes: 7 additions & 0 deletions .github/dependabot.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
version: 2
updates:
- package-ecosystem: github-actions
directory: /
schedule:
interval: weekly
open-pull-requests-limit: 5
19 changes: 19 additions & 0 deletions .github/pull_request_template.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
## Summary

<!-- Explain the user-visible and architectural changes. -->

Closes #

## Evidence

- Tests:
- Hardware validation:
- Accessibility impact:

## Checklist

- [ ] The linked issue's acceptance criteria are satisfied.
- [ ] New behavior was developed test-first.
- [ ] `swift test --parallel` passes.
- [ ] Hardware captures and diagnostics are redacted.
- [ ] Documentation reflects user-visible or architectural changes.
36 changes: 36 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
name: CI

on:
pull_request:
push:
branches: [main]
workflow_dispatch:

permissions:
contents: read

concurrency:
group: ci-${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true

jobs:
test:
name: CI
runs-on: macos-26
timeout-minutes: 15
env:
DEVELOPER_DIR: /Applications/Xcode_26.6.app/Contents/Developer
steps:
- uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4.3.1
- name: Show Swift version
run: swift --version
- name: Run tests
run: swift test --parallel
- name: Package RemoMouse
run: Scripts/package-app.sh release
- name: Verify RemoMouse signature
run: codesign --verify --deep --strict .build/RemoMouse.app
- name: Package hardware probe
run: Scripts/package-probe-app.sh debug
- name: Verify generated-file cleanliness
run: git diff --exit-code
43 changes: 43 additions & 0 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
name: Release

on:
push:
tags: ["v*"]

permissions:
contents: write

jobs:
release:
name: Build and publish
runs-on: macos-26
timeout-minutes: 20
env:
DEVELOPER_DIR: /Applications/Xcode_26.6.app/Contents/Developer
steps:
- uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4.3.1
- name: Verify release tag
run: |
version=$(/usr/libexec/PlistBuddy -c 'Print :CFBundleShortVersionString' Resources/RemoMouseInfo.plist)
test "$GITHUB_REF_NAME" = "v$version"
- name: Test
run: swift test --parallel
- name: Build app
run: Scripts/package-app.sh release
- name: Verify signature
run: codesign --verify --deep --strict .build/RemoMouse.app
- name: Archive and checksum
run: |
ditto -c -k --sequesterRsrc --keepParent .build/RemoMouse.app "RemoMouse-${GITHUB_REF_NAME}-macOS.zip"
shasum -a 256 "RemoMouse-${GITHUB_REF_NAME}-macOS.zip" > "RemoMouse-${GITHUB_REF_NAME}-macOS.zip.sha256"
- name: Create draft GitHub Release
env:
GH_TOKEN: ${{ github.token }}
run: |
gh release create "$GITHUB_REF_NAME" \
"RemoMouse-${GITHUB_REF_NAME}-macOS.zip" \
"RemoMouse-${GITHUB_REF_NAME}-macOS.zip.sha256" \
--title "RemoMouse $GITHUB_REF_NAME" \
--generate-notes \
--draft \
--prerelease
11 changes: 11 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1 +1,12 @@
.worktrees/
.build/
DerivedData/
*.xcuserstate
.DS_Store
Captures/
*.remocapture
*.p12
*.cer
*.provisionprofile
*.mobileprovision
diagnostics-*.zip
12 changes: 12 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
# Changelog

All notable user-visible changes are documented here. This project follows [Semantic Versioning](https://semver.org/).

## 0.1.0 — 2026-08-09

- Add a native macOS menu-bar application for first-generation Siri Remote hardware.
- Add touch-surface pointer movement, primary and secondary click, macOS-style double-click, drag, and scroll mode.
- Add continuous pixel scrolling with gesture phases, fractional smoothing, bounded acceleration, cancellable momentum, axis locking, dead-zone filtering, and click stabilization.
- Add Play/Pause mode switching, Siri pause/resume, speed controls, and Mission Control mapping.
- Add local hardware diagnostics with privacy redaction.
- Re-enumerate touch input after the remote disconnects and reconnects.
5 changes: 5 additions & 0 deletions CODE_OF_CONDUCT.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
# Code of Conduct

RemoMouse follows the [Contributor Covenant, version 2.1](https://www.contributor-covenant.org/version/2/1/code_of_conduct/).

Be respectful, constructive, and focused on the work. Report unacceptable behavior privately through the repository owner's GitHub profile. Maintainers may remove content or restrict participation when necessary to protect the community.
14 changes: 14 additions & 0 deletions CONTRIBUTING.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
# Contributing

Thanks for improving RemoMouse. Keep changes focused, local-only, and safe for an always-running input utility.

## Development

1. Fork the repository and create a focused branch.
2. Add or update tests before production behavior.
3. Run `swift test --parallel` and `Scripts/package-app.sh debug`.
4. Open a pull request using the repository template.

Hardware reports must remove serial numbers, Bluetooth addresses, usernames, and private filesystem paths. Do not commit signing identities, provisioning profiles, captures, or generated app bundles.

By contributing, you agree that your contribution is licensed under the MIT License.
21 changes: 21 additions & 0 deletions LICENSE
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
MIT License

Copyright (c) 2026 kefrulz

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
72 changes: 72 additions & 0 deletions Package.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
// swift-tools-version: 6.2

import PackageDescription

let package = Package(
name: "RemoMouse",
platforms: [.macOS(.v26)],
products: [
.library(name: "RemoMouseDomain", targets: ["RemoMouseDomain"]),
.library(name: "RemoMouseHardware", targets: ["RemoMouseHardware"]),
.library(name: "RemoMouseCapture", targets: ["RemoMouseCapture"]),
.executable(name: "RemoMouseProbe", targets: ["RemoMouseProbe"]),
.executable(name: "RemoMouse", targets: ["RemoMouseApp"]),
],
targets: [
.target(
name: "RemoMouseDomain",
linkerSettings: [.linkedFramework("CryptoKit")]
),
.target(
name: "RemoMouseHardware",
dependencies: ["RemoMouseDomain", "CMultitouchBridge"],
linkerSettings: [
.linkedFramework("CoreHID"),
.linkedFramework("GameController"),
.linkedFramework("IOKit"),
]
),
.target(
name: "CMultitouchBridge",
linkerSettings: [.linkedFramework("IOKit")]
),
.target(
name: "RemoMouseCapture",
dependencies: ["RemoMouseDomain", "RemoMouseHardware"],
linkerSettings: [.linkedFramework("CryptoKit")]
),
.executableTarget(
name: "RemoMouseProbe",
dependencies: [
"RemoMouseDomain",
"RemoMouseHardware",
"RemoMouseCapture",
],
linkerSettings: [
.linkedFramework("AppKit"),
.linkedFramework("SwiftUI"),
]
),
.executableTarget(
name: "RemoMouseApp",
dependencies: ["RemoMouseHardware"],
linkerSettings: [
.linkedFramework("AppKit"),
.linkedFramework("ApplicationServices"),
.linkedFramework("SwiftUI"),
]
),
.testTarget(
name: "RemoMouseDomainTests",
dependencies: ["RemoMouseDomain"]
),
.testTarget(
name: "RemoMouseHardwareTests",
dependencies: ["RemoMouseHardware"]
),
.testTarget(
name: "RemoMouseCaptureTests",
dependencies: ["RemoMouseCapture"]
),
]
)
Loading
Loading