DebugLog.write is called from any thread, but its relay assumed the
main actor. MetricKit delivers payloads on a background queue, so
CrashReports.didReceive trapped in MainActor.assumeIsolated on launch,
and every crash queued another payload for the next launch.
Claude-Session: https://claude.ai/code/session_01KN6Wd5bdgWERis2b4x9Rm3
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
- Drop the private UIApplication suspend selector (guideline 2.5.1); Cmd+H and the home flick remain
- iphoneagent:// debug commands only in Debug builds, so web pages can't start runs
- MetricKit crash/hang reports kept in Documents/diagnostics and included in Export all logs
- About › Report a bug opens a prefilled GitHub issue
- PrivacyInfo.xcprivacy for app and widget; ITSAppUsesNonExemptEncryption = false
- App and widget share MARKETING_VERSION / CURRENT_PROJECT_VERSION
- fastlane beta: Release archive with the LLM preset cleared and checked, then TestFlight upload
- Store listing draft (fastlane/metadata) and docs/privacy.md
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Add OpenRouter configuration and searchable model selection, improve Bluetooth setup guidance, expose request timings and run status, and provide clear failure details with reconnect-before-retry recovery. All four CI checks passed.
SwiftUI app: BLE link, VideoToolbox decode, planner/actor loop ported from the server, pointer calibration and
aim, four-step setup, run replay and review, Live Activity / Dynamic Island, widgets, Siri and Shortcuts,
self-healing when the board, hotspot or mirroring drops, redacted run export. Prompts live in prompts/.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- AirPlay mirroring receiver ported from UxPlay (src/airplay/, GPL-3.0): mDNS, RTSP, pairing, FairPlay, AES-CTR
- Own Wi-Fi hotspot with a random per-board password in NVS (optional STA mode for testing)
- BLE GATT link (NimBLE-Arduino): commands, status, H.264 video forwarded from a PSRAM GOP buffer
- USB HID unchanged in spirit; adds the consumer Home key
- Host tests (bplist, GOP buffer) and a Mac BLE test harness (tools/)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- a task watchdog restarts the board if its loop stops responding
- retry the server every 200 ms so the board shows up right after it joins Wi-Fi
- when the phone's USB is suspended, try to wake it and otherwise answer 'err phone usb asleep'
- greet the server with the last reset reason and uptime
- README (EN/ZH): protocol hello, automatic calibration, motion switch, XIAO antenna, landscape limitation
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- taps get a large red ring and an animated ripple; a Motion switch turns animation off
- calibration progress and instructions show right under the phone
- manual controls no longer get cut off when expanded
- Clear history also empties the task box; precise taps are labelled in the log
- first example: set a 7:00 AM alarm that repeats every day
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- ping the board every 2 s so an unplugged or silent board shows as gone within seconds
- never nudge the pointer right after the board connects or while the phone is not mirroring
- read and log the board's hello (last reset reason, uptime)
- serve the web UI with Cache-Control: no-cache so updates show on refresh
- LLM_TOKEN_PARAM (auto by default) for models that want max_completion_tokens
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- calibration finds the pointer at two distances and fits scale and offset; it is saved with the
landings seen while aiming, so every later move is corrected
- search the whole screen when the pointer is far from the target; ignore implausible readings
- rest before lifting a swipe (no momentum) and after a click (no accidental drag)
- detect small changes such as a checkmark, masking the pointer and the status bar
- mirroring counts as live only while the phone is connected to UxPlay (Linux)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- give several DO lines when actions do not depend on each other (e.g. ticking days)
- 'tap X Y precise' locates the pointer and corrects it before tapping small targets
- reject an action that just changed nothing; repeating a scroll that still moves is not 'stuck'
- history shows actions and their effect only, so the model looks again instead of echoing itself
- prompt rules for momentum-free swipes, time wheels (tap then type) and searching lists
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>