GitHub Issue
macOS: Cursor telemetry not saved after DMG install (Apple Silicon, macOS 26)
## Bug Description
After installing Recordly v1.1.7 via the DMG on macOS 26.2 (Apple Silicon M3), cursor telemetry `.cursor.json` files are not being created alongside recordings. The editor shows "No cursor telemetry available — Record a screencast first to generate cursor-based suggestions."
## Environment
- **OS**: macOS 26.2 (Build 25C56) — Apple Silicon (M3 MacBook Pro)
- **Recordly version**: v1.1.7 (DMG install to `/Applications/Recordly.app`)
- **Permissions granted**: Screen Recording ✅, Accessibility ✅
- **Quarantine flags**: Cleared via `xattr -cr`
## Reproduction Steps
1. Install Recordly v1.1.7 via DMG
2. Grant Screen Recording and Accessibility permissions in System Settings
3. Record a screencast (any duration, tried multiple 30s+ recordings)
4. Open recording in editor
5. Click the zoom suggestions / wand button
6. See toast: "No cursor telemetry available"
## Evidence
Recordings made with `npm run dev` (dev build) **do** produce `.cursor.json` files. Recordings made with the DMG-installed app **do not**.
```
# Recordings WITH cursor.json (dev build, same machine, same day):
recording-1774718957877.mp4.cursor.json (1.5MB, ~10:35am)
recording-1774719579103.mp4.cursor.json (1.5MB, ~10:45am)
recording-1774743781164.mp4.cursor.json (77KB, ~5:23pm)
# Recordings WITHOUT cursor.json (DMG install, 7pm onward):
recording-1774749616308.mp4 ← no .cursor.json
recording-1774750149033.mp4 ← no .cursor.json
recording-1774750394518.mp4 ← no .cursor.json
record...
View Raw Thread
Developer & User Discourse
JoshCork • Mar 29, 2026
## Confirmed Fix
Symlinking `node_modules/ffmpeg-static/ffmpeg` to Homebrew's `/opt/homebrew/bin/ffmpeg` resolves the issue completely. Cursor telemetry, auto-zoom suggestions, and audio muxing all work.
### Root Cause (refined)
The `ffmpeg-static` npm package bundles an unsigned ffmpeg binary that **cannot be ad-hoc signed** (`codesign` returns "invalid or unsupported format for signature"). macOS 26 (Tahoe) blocks execution of unsigned binaries, producing `Unknown system error -88` at spawn time.
### Workaround
```bash
# Install ffmpeg via Homebrew (if not already installed)
brew install ffmpeg
# Replace the broken npm binary with a symlink
mv node_modules/ffmpeg-static/ffmpeg node_modules/ffmpeg-static/ffmpeg.broken
ln -s /opt/homebrew/bin/ffmpeg node_modules/ffmpeg-static/ffmpeg
```
### Suggested Permanent Fix
Consider one of:
1. **Prefer system ffmpeg** — check `which ffmpeg` before falling back to `ffmpeg-static`
2. **Ad-hoc sign during postinstall** — though this specifi...
Symlinking `node_modules/ffmpeg-static/ffmpeg` to Homebrew's `/opt/homebrew/bin/ffmpeg` resolves the issue completely. Cursor telemetry, auto-zoom suggestions, and audio muxing all work.
### Root Cause (refined)
The `ffmpeg-static` npm package bundles an unsigned ffmpeg binary that **cannot be ad-hoc signed** (`codesign` returns "invalid or unsupported format for signature"). macOS 26 (Tahoe) blocks execution of unsigned binaries, producing `Unknown system error -88` at spawn time.
### Workaround
```bash
# Install ffmpeg via Homebrew (if not already installed)
brew install ffmpeg
# Replace the broken npm binary with a symlink
mv node_modules/ffmpeg-static/ffmpeg node_modules/ffmpeg-static/ffmpeg.broken
ln -s /opt/homebrew/bin/ffmpeg node_modules/ffmpeg-static/ffmpeg
```
### Suggested Permanent Fix
Consider one of:
1. **Prefer system ffmpeg** — check `which ffmpeg` before falling back to `ffmpeg-static`
2. **Ad-hoc sign during postinstall** — though this specifi...
Litemint09 • Mar 30, 2026
Awesome input Josh, did you try the 119 version already? and see if those issue are persistent?
m13v • Mar 30, 2026
the macOS 26 unsigned binary rejection thing bit us too. we build a screen capture SDK and initially tried bundling ffmpeg for encoding, but the codesigning requirements on Tahoe made it unreliable. switched to using VideoToolbox's VTCompressionSession for H.265 encoding directly - no child process to spawn, no permission issues, and the hardware encoder on Apple Silicon is basically free. biggest gotcha was getting the pixel format right from the ScreenCaptureKit output - kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange works but you need to match the color space or you get washed out colors in the output.
m13v • Mar 30, 2026
fwiw here's how we handle the VideoToolbox encoding pipeline for screen capture: https://github.com/m13v/macos-session-replay/blob/main/Sources/SessionReplay/VideoChunkEncoder.swift - the chunked encoding approach means you can write segments to disk continuously without keeping everything in memory.
SaaS Metrics
The cursor telemetry issue is a **downstream symptom** of an ffmpeg permission error.
### Error Chain
1. `node_modules/ffmpeg-static/ffmpeg` lacks execute permission after `npm install --ignore-scripts`
2. Audio muxing fails: `spawn ffmpeg EACCES`
3. `validateRecordedVideo()` fails because the MP4 can't be decoded (audio mux produced no output)
4. `finalizeStoredVideo()` throws at the validation step (line ~2611)
5. **`persistPendingCursorTelemetry()` is never reached** — cursor data is lost
### Fix
```bash
chmod +x node_modules/ffmpeg-static/ffmpeg
```
### Suggested Code Fix
`finalizeStoredVideo()` should persist cursor telemetry **before** video validation, or at minimum wrap validation in a try-catch so telemetry isn't lost when validation fails:
```typescript
async function finalizeStoredVideo(videoPath: string) {
// Persist cursor telemetry FIRST — don't let validation failures lose cursor data
snapshotCursorTelemetryForPersistence()
currentVideoP...