feat: extract call recording transcripts from Apple Notes CRDT#35
feat: extract call recording transcripts from Apple Notes CRDT#35ephraimm wants to merge 3 commits into
Conversation
- Add 'memo recordings' command to list, view, extract, and search call recordings - get_recordings.py: dual-strategy detection (smart folder + name-pattern fallback) - recording_utils.py: transcript retrieval, attachment listing, audio extraction - search_memo.py: refactor fzf into reusable _run_fzf(); add fuzzy_recordings() - 12 new tests, all 35 tests pass
Replace speculative proposal with actual implementation docs. Also commit uv.lock for reproducible builds.
Reverse-engineer Apple's CRArchive protobuf format (NSKeyedArchiver over protobuf) to extract call recording transcripts from the ZMERGEABLEDATA1 column in NoteStore.sqlite. Key implementation: - Schema-driven protobuf parser for CRArchive structure - Walk ICTTTranscriptSegment objects with speaker/text/timestamp resolved through registerLatest→NSString/NSNumber chains - Timestamp-based sorting for correct reading order - Speaker labels from root ICTTAudioRecording (callLocalSpeakerHandle / callRemoteSpeakerHandle) - Contact name resolution via macOS Contacts AppleScript Includes 8 regression tests with a real CRDT blob fixture validating ground-truth transcript ordering and speaker assignment.
|
Hello @ephraimm! I am not sure if this is a feature available in Europe (I have never tried to do it). Could you explain shortly how this works? Thanks!) |
|
Hi Antonio,
The iPhone includes a native call recording feature that utilizes Apple's
transcription service. Both the recording and the transcript are saved
within a specific section in the Notes app.
Similar to other media attachments, extracting this data is not
straightforward due to the convoluted Protobuf model used in the Notes
database. However, I managed to reverse-engineer the structure using Claude
and the tests pointing to a transcription manually copied from the app.
Best regards,
Ephraim Moss
[image: image.png]
…On Thu, Mar 26, 2026 at 12:43 PM Antonio Rodriguez ***@***.***> wrote:
*antoniorodr* left a comment (antoniorodr/memo#35)
<#35?email_source=notifications&email_token=AAVMPVOXSWF5HE2YGXISKM34SUCVHA5CNFSNUABFM5UWIORPF5TWS5BNNB2WEL2JONZXKZKDN5WW2ZLOOQXTIMJTGM2TGNJYGU2KM4TFMFZW63VHNVSW45DJN5XKKZLWMVXHJNLQOJPWG33NNVSW45C7N5YGK3S7MNWGSY3L#issuecomment-4133535854>
Hello @ephraimm <https://github.com/ephraimm>!
I am not sure if this is a feature available in Europe (I have never tried
to do it). Could you explain shortly how this works?
Thanks!)
—
Reply to this email directly, view it on GitHub
<#35?email_source=notifications&email_token=AAVMPVOXSWF5HE2YGXISKM34SUCVHA5CNFSNUABFM5UWIORPF5TWS5BNNB2WEL2JONZXKZKDN5WW2ZLOOQXTIMJTGM2TGNJYGU2KM4TFMFZW63VHNVSW45DJN5XKKZLWMVXHJNLQOJPWG33NNVSW45C7N5YGK3S7MNWGSY3L#issuecomment-4133535854>,
or unsubscribe
<https://github.com/notifications/unsubscribe-auth/AAVMPVKET7IR5TZIMLIPZYL4SUCVHAVCNFSM6AAAAACW7DY6D6VHI2DSMVQWIX3LMV43OSLTON2WKQ3PNVWWK3TUHM2DCMZTGUZTKOBVGQ>
.
You are receiving this because you were mentioned.Message ID:
***@***.***>
|
|
Hi @ephraimm I understand. I have not a note with a call transcript to tests this PR against, unfortunately. But I can try to find (or create) one. I am still not sure if this feature is available in Europe. Thanks! |
|
Hi Antonio,
If you can't find one I can create a test note to share.
The feature is only available in Europe, AFAIK. My phone's region is set to
UK.
Ephraim
…On Fri, Mar 27, 2026 at 1:40 PM Antonio Rodriguez ***@***.***> wrote:
*antoniorodr* left a comment (antoniorodr/memo#35)
<#35?email_source=notifications&email_token=AAVMPVPZK6SRBYOG4RT3M6D4SZSBPA5CNFSNUABFM5UWIORPF5TWS5BNNB2WEL2JONZXKZKDN5WW2ZLOOQXTIMJUGE4TSOJZGM4KM4TFMFZW63VHNVSW45DJN5XKKZLWMVXHJNLQOJPWG33NNVSW45C7N5YGK3S7MNWGSY3L#issuecomment-4141999938>
Hi @ephraimm <https://github.com/ephraimm>
I understand. I have not a note with a call transcript to tests this PR
against, unfortunately.
But I can try to find (or create) one. I am still not sure if this feature
is available in Europe.
Thanks!
—
Reply to this email directly, view it on GitHub
<#35?email_source=notifications&email_token=AAVMPVPZK6SRBYOG4RT3M6D4SZSBPA5CNFSNUABFM5UWIORPF5TWS5BNNB2WEL2JONZXKZKDN5WW2ZLOOQXTIMJUGE4TSOJZGM4KM4TFMFZW63VHNVSW45DJN5XKKZLWMVXHJNLQOJPWG33NNVSW45C7N5YGK3S7MNWGSY3L#issuecomment-4141999938>,
or unsubscribe
<https://github.com/notifications/unsubscribe-auth/AAVMPVNIFZ76UL5UZOU42VT4SZSBPAVCNFSM6AAAAACW7DY6D6VHI2DSMVQWIX3LMV43OSLTON2WKQ3PNVWWK3TUHM2DCNBRHE4TSOJTHA>
.
You are receiving this because you were mentioned.Message ID:
***@***.***>
|
|
Hi again,
Feel free sharing the note so I can test it out
Thanks!
|
|
Hello @ephraimm I hope you are doing well. Do you have the test note we spoke about? So I can test this PR out and see if it works as expected. I am looking forward to hearing from you. |
|
what format should I send it as?
Ephraim Moss
Founder & Chief Excitement Officer
*C*+27 72 679 6838
***@***.***
*W*www.goseamless.co.za
*The information contained in this email is confidential and may contain
proprietary information. It is meant solely for the intended recipient.
Access to this email by anyone else is unauthorised. If you are not the
intended recipient, any disclosure, copying, distribution or any action
taken or omitted in reliance on this, is prohibited and may be unlawful. No
liability or responsibility is accepted if information or data is, for
whatever reason corrupted or does not reach its intended recipient. No
warranty is given that this email is free of viruses.*
…On Wed, Apr 15, 2026 at 11:13 AM Antonio Rodriguez ***@***.***> wrote:
*antoniorodr* left a comment (antoniorodr/memo#35)
<#35 (comment)>
Hello @ephraimm <https://github.com/ephraimm>
I hope you are doing well. Do you have the test note we spoke about? So I
can test this PR out and see if it works as expected.
I am looking forward to hearing from you.
—
Reply to this email directly, view it on GitHub
<#35 (comment)>, or
unsubscribe
<https://github.com/notifications/unsubscribe-auth/AAVMPVJADUHTYH6VKV5S3NT4V5HEHAVCNFSM6AAAAACW7DY6D6VHI2DSMVQWIX3LMV43OSLTON2WKQ3PNVWWK3TUHM2DENJQG42TGMRRGY>
.
You are receiving this because you were mentioned.Message ID:
***@***.***>
|
I think markdown should be fine, if it keeps the information tho. |
Reverse-engineers Apple's CRArchive protobuf format (NSKeyedArchiver over protobuf) to extract call recording transcripts from the
ZMERGEABLEDATA1column inNoteStore.sqlite.Key changes
CRArchive decoder (
recording_utils.py)ICTTTranscriptSegmentobjects with speaker/text/timestamp resolved throughregisterLatest → NSString/NSNumberchainsICTTAudioRecording(callLocalSpeakerHandle/callRemoteSpeakerHandle)Regression tests (
test_transcript_parsing.py)9 structural tests using a local-only CRDT blob fixture (gitignored) validating:
Checklist