**Tester's Note: **
I discovered this issue myself and used Claude Opus 4.7 to diagnose the likely cause and propose a fix. I did not attempt a PR myself as I do not have the experience to validate AI generated code. However, I did confirm that the bug is repeatable on iOS, so hopefully the suggested solution will provide a head start on solving it.
Claude generate report follows.
Both the file pull (Browse and Access) and “Unofficial Supernote by Ratta Integration: Insert a Supernote screen mirroring image as attachment” commands work fine in Obsidian on macOS but fail to connect when running the same vault on Obsidian for iOS.
Environment
• iPhone 17 Pro, iOS 26.5
• Obsidian iOS, plugin v2.9.1
• Supernote A5X2 (Manta), reachable over Tailscale at a 100.x tailnet IP
Repro
1. Configure the Supernote IP in plugin settings (tailnet IP in my case).
2. Run “Insert Supernote mirror image” (or any Browse and Access command).
3. Notice popup: Error: Load failed. Is the Supernote connected to Wifi on IP and running Screen Mirroring?
What I’ve ruled out
• Network connectivity. The same tailnet IP and short name load fine in Mobile Safari on the same iPhone. Both the Browse and Access page (:8089) and the mirror MJPEG stream (:8080/screencast.mjpeg) work in Safari.
• Wrong IP / device asleep. Confirmed Supernote is awake, on Wi-Fi, with Browse and Access and Screen Mirroring active.
Likely cause
The “Load failed” string is the iOS WKWebView signature error for a blocked fetch(). The plugin’s network calls (FileListModal.loadFiles, DownloadListModal.onChooseSuggestion, UploadListModal.onChooseSuggestion, fetchMirrorFrame) all use the browser fetch() API directly. On desktop Electron this works, but iOS WKWebView blocks cross-origin HTTP requests from the app://obsidian.md origin to the Supernote (no Access-Control-Allow-Origin header from the device, plus mixed-content blocking).
The standard Obsidian-blessed fix is to swap fetch for requestUrl from the obsidian API, which goes through the native layer and bypasses WebView restrictions. The file list, download, and upload paths look like good candidates. Screen mirror is trickier since requestUrl doesn’t expose a streaming body for the multipart MJPEG response, though for “Insert mirror image” only one frame is needed, so it may still be solvable.
**Tester's Note: **
I discovered this issue myself and used Claude Opus 4.7 to diagnose the likely cause and propose a fix. I did not attempt a PR myself as I do not have the experience to validate AI generated code. However, I did confirm that the bug is repeatable on iOS, so hopefully the suggested solution will provide a head start on solving it.
Claude generate report follows.
Both the file pull (Browse and Access) and “Unofficial Supernote by Ratta Integration: Insert a Supernote screen mirroring image as attachment” commands work fine in Obsidian on macOS but fail to connect when running the same vault on Obsidian for iOS.
Environment
• iPhone 17 Pro, iOS 26.5
• Obsidian iOS, plugin v2.9.1
• Supernote A5X2 (Manta), reachable over Tailscale at a 100.x tailnet IP
Repro
1. Configure the Supernote IP in plugin settings (tailnet IP in my case).
2. Run “Insert Supernote mirror image” (or any Browse and Access command).
3. Notice popup: Error: Load failed. Is the Supernote connected to Wifi on IP and running Screen Mirroring?
What I’ve ruled out
• Network connectivity. The same tailnet IP and short name load fine in Mobile Safari on the same iPhone. Both the Browse and Access page (:8089) and the mirror MJPEG stream (:8080/screencast.mjpeg) work in Safari.
• Wrong IP / device asleep. Confirmed Supernote is awake, on Wi-Fi, with Browse and Access and Screen Mirroring active.
Likely cause
The “Load failed” string is the iOS WKWebView signature error for a blocked fetch(). The plugin’s network calls (FileListModal.loadFiles, DownloadListModal.onChooseSuggestion, UploadListModal.onChooseSuggestion, fetchMirrorFrame) all use the browser fetch() API directly. On desktop Electron this works, but iOS WKWebView blocks cross-origin HTTP requests from the app://obsidian.md origin to the Supernote (no Access-Control-Allow-Origin header from the device, plus mixed-content blocking).
The standard Obsidian-blessed fix is to swap fetch for requestUrl from the obsidian API, which goes through the native layer and bypasses WebView restrictions. The file list, download, and upload paths look like good candidates. Screen mirror is trickier since requestUrl doesn’t expose a streaming body for the multipart MJPEG response, though for “Insert mirror image” only one frame is needed, so it may still be solvable.