Describe the bug
After importing a WhatsApp iOS chat export (.zip with media), voice notes are not displayed as playable audio. Instead, the raw placeholder text <attached: 00000004-AUDIO-2026-06-26-20-31-14.opus> appears inside the message bubble. Because the audio isn't recognized as media, the Transcribe button never appears, and the Media Gallery shows no audio files.
The README states "Voice messages can be transcribed using Whisper, which runs in your browser via WebGPU" and "Media Gallery gives you a visual overview of all photos, videos, and audio files", but neither works for this export.
To Reproduce
- Export chat from WhatsApp iOS: Open chat → Contact name → Export Chat → Attach Media → Save to Files → AirDrop to Mac
- Resulting zip contains
_chat.txt + 00000004-AUDIO-...opus, 00000007-AUDIO-...opus, etc. (confirmed by unzipping)
- Open whats-reader v1.30.4 (tried both):
- Drag and drop the zip into "Import Chat"
- Chat loads (62 messages shown correctly)
- Observe: audio references appear as plain text inside messages, not as separate media players
Expected behavior
- Each
.opus reference should be parsed and rendered as an audio player in the chat timeline
- Clicking the player should show a "Transcribe" button that runs Whisper locally via WebGPU
- Audio should also appear in Media Gallery > Audio filter
Actual behavior
- Audio files are treated as text:
[26/06/2026, 15:00:00] Alex: <attached: 00000004-AUDIO-2026-06-26-20-31-14.opus>
- No waveform, no play button, no Transcribe option
- Media Gallery is empty for this chat
- Search does not find transcriptions (because none were created)
Environment
- App version: v1.30.4 (dev build)
- OS: macOS 26.5.1
- Browser (dev mode): Chrome 149.0.7827.197
- WebGPU status: WebGPU: Hardware accelerated
- WhatsApp export: iOS, Spanish locale, "Attach Media" enabled, 62 messages, 5 voice notes
- File names in zip:
00000004-AUDIO-2026-06-26-20-31-14.opus, 00000007-AUDIO-2026-06-26-20-32-49.opus, etc.
- Console errors:
MediaThumbnail.svelte:96 Failed to extract audio duration: Error: Failed to load audio
at HTMLAudioElement. (video-thumbnails.ts:329:11)
ensureAudioDuration @ MediaThumbnail.svelte:96
await in ensureAudioDuration
(anonymous) @ MediaThumbnail.svelte:192
Additional context
- The
_chat.txt uses iOS timestamp format [26/06/2026, 15:00:00] inside the message body, which seems to be duplicated in the export. This may be confusing the parser — it looks like WhatsApp iOS is embedding the attachment line as part of the previous text message instead of a separate line.
- I confirmed the .opus files are present and play fine in VLC, so it's not a missing-media issue.
- Tried re-zipping the export and using the web version at rodrigogs.github.io/whats-reader — same result.
Possible cause (guess)
Parser for iOS exports may not handle the case where <attached: ...opus> appears on the same line as preceding text, or when the zip structure has files at root vs. in a media subfolder.
Describe the bug
After importing a WhatsApp iOS chat export (.zip with media), voice notes are not displayed as playable audio. Instead, the raw placeholder text
<attached: 00000004-AUDIO-2026-06-26-20-31-14.opus>appears inside the message bubble. Because the audio isn't recognized as media, the Transcribe button never appears, and the Media Gallery shows no audio files.The README states "Voice messages can be transcribed using Whisper, which runs in your browser via WebGPU" and "Media Gallery gives you a visual overview of all photos, videos, and audio files", but neither works for this export.
To Reproduce
_chat.txt+00000004-AUDIO-...opus,00000007-AUDIO-...opus, etc. (confirmed by unzipping)npm run dev→ http://localhost:5173Expected behavior
.opusreference should be parsed and rendered as an audio player in the chat timelineActual behavior
[26/06/2026, 15:00:00] Alex: <attached: 00000004-AUDIO-2026-06-26-20-31-14.opus>Environment
00000004-AUDIO-2026-06-26-20-31-14.opus,00000007-AUDIO-2026-06-26-20-32-49.opus, etc.MediaThumbnail.svelte:96 Failed to extract audio duration: Error: Failed to load audio
at HTMLAudioElement. (video-thumbnails.ts:329:11)
ensureAudioDuration @ MediaThumbnail.svelte:96
await in ensureAudioDuration
(anonymous) @ MediaThumbnail.svelte:192
Additional context
_chat.txtuses iOS timestamp format[26/06/2026, 15:00:00]inside the message body, which seems to be duplicated in the export. This may be confusing the parser — it looks like WhatsApp iOS is embedding the attachment line as part of the previous text message instead of a separate line.Possible cause (guess)
Parser for iOS exports may not handle the case where
<attached: ...opus>appears on the same line as preceding text, or when the zip structure has files at root vs. in a media subfolder.