Description
When sending an audio attachment with isAudioMessage: true and method: private-api, the recipient receives a voice bubble that shows 0 seconds duration, has an identical waveform regardless of content, and is unplayable. The same audio file sent as a regular attachment plays correctly.
Environment
- BlueBubbles Server: 1.9.9
- macOS: 26.2.0 (Tahoe)
- Private API: Enabled
Steps to Reproduce
- Have any valid MP3 file (I used ffmpeg sine waves at 3s and 10s)
- Send via the attachment API:
curl -X POST "https://<SERVER>/api/v1/message/attachment?password=<PASSWORD>" \
-F "attachment=@test.mp3;type=audio/mpeg" \
--form-string "chatGuid=<CHAT_GUID>" \
-F "name=test.mp3" \
-F "tempGuid=temp-$(date +%s)" \
-F "method=private-api" \
-F "isAudioMessage=true"
- Voice bubble arrives but shows "0 seconds", flat waveform, won't play
Expected Behavior
Voice bubble plays audio with correct duration and waveform.
Actual Behavior
Voice bubble is broken — 0s duration, identical waveform regardless of content, unplayable.
Test Results
I tested the same audio files across three scenarios to isolate the issue:
- Group A (baseline): Regular attachments without
isAudioMessage — confirms the audio files are valid
- Group B: Same files sent as voice memos with
isAudioMessage=true — the broken case
- Group C: Voice memo flag set, but with
apple-script or no method instead of private-api — isolates the delivery path
All tests used the same 3s sine wave MP3 unless noted. The 10s variant rules out duration as a factor.
| Test |
Format |
Method |
isAudioMessage |
Result |
Playable |
| A1 |
MP3 3s |
private-api |
false |
MP3 attachment, 3s |
✅ |
| A2 |
MP3 10s |
private-api |
false |
MP3 attachment, 10s |
✅ |
| B1 |
MP3 3s |
private-api |
true |
Voice bubble, 0s |
❌ |
| B2 |
MP3 10s |
private-api |
true |
Voice bubble, 0s |
❌ |
| B3 |
CAF (AAC) 3s |
private-api |
true |
Voice bubble, 0s |
❌ |
| C1 |
MP3 3s |
apple-script |
true |
CAF attachment, 3s |
✅ |
| C2 |
MP3 3s |
(none) |
true |
CAF attachment, 3s |
✅ |
C1/C2 are key: the same 3s MP3 from B1 is converted MP3→CAF by the server and plays correctly when sent via apple-script or default method. The bug is specifically in the private-api + isAudioMessage=true code path. B3 (pre-converted CAF) is also broken, so the issue is downstream of format conversion.
Additional Info
API returns 200 with successful conversion (e.g. 49KB MP3 → 271KB CAF, UTI com.apple.coreaudio-format), but the resulting voice memo is broken.
Description
When sending an audio attachment with
isAudioMessage: trueandmethod: private-api, the recipient receives a voice bubble that shows 0 seconds duration, has an identical waveform regardless of content, and is unplayable. The same audio file sent as a regular attachment plays correctly.Environment
Steps to Reproduce
Expected Behavior
Voice bubble plays audio with correct duration and waveform.
Actual Behavior
Voice bubble is broken — 0s duration, identical waveform regardless of content, unplayable.
Test Results
I tested the same audio files across three scenarios to isolate the issue:
isAudioMessage— confirms the audio files are validisAudioMessage=true— the broken caseapple-scriptor no method instead ofprivate-api— isolates the delivery pathAll tests used the same 3s sine wave MP3 unless noted. The 10s variant rules out duration as a factor.
C1/C2 are key: the same 3s MP3 from B1 is converted MP3→CAF by the server and plays correctly when sent via
apple-scriptor default method. The bug is specifically in theprivate-api+isAudioMessage=truecode path. B3 (pre-converted CAF) is also broken, so the issue is downstream of format conversion.Additional Info
API returns 200 with successful conversion (e.g. 49KB MP3 → 271KB CAF, UTI
com.apple.coreaudio-format), but the resulting voice memo is broken.