Skip to content

Add Google Docs support for iOS - #1997

Merged
abrignoni merged 3 commits into
mainfrom
feat/google-docs-ios
Aug 20, 2026
Merged

Add Google Docs support for iOS#1997
abrignoni merged 3 commits into
mainfrom
feat/google-docs-ios

Conversation

@abrignoni

@abrignoni abrignoni commented Aug 19, 2026

Copy link
Copy Markdown
Owner

Adds Google Docs support for iOS. Eight artifacts from the com.google.Docs container:

  • Documents: titles, identifiers, ownership, and creation, modification, sync and app start times
  • Document Text, one row per document, from the stored command log
  • Document Media, rendered from the per document file store
  • Document Sync State
  • Comment Sync State
  • Accounts
  • Application State
  • Contacts Cache

Property values carry a type code beside them and are decoded by it. Sync state holds the same time in a seconds column and a milliseconds column, each converted by its own unit. Undocumented codes are reported as stored. The localStore and fileStore layouts and the contacts cache file name are shared with other Google apps, so a store is reported only from a container that also holds the app's preferences file, and one that does not is skipped and logged.

Eight artifacts from the com.google.Docs container.

Documents, document text and embedded media come from the per document
stores under Documents/<account id>/localStore/documents/. Property
values carry a type code beside them: text, an eight byte little endian
double, or JSON. Timestamps in those stores are Unix milliseconds.

Document sync state comes from cross_document_metadata, which holds the
same server update time in a seconds column and a milliseconds column,
so each is converted by its own unit. Comment sync state comes from the
comment_items table of comments_snapshot_<account id>.db.

Accounts and application state come from the app preferences property
list. The contacts cache file name is shared across Google apps, so a
cache is only reported when the same container holds the Google Docs
preferences file, and a skip is logged otherwise.

Undocumented codes are reported as stored. Path patterns pick up the
WAL and SHM sidecars, which several of these stores depend on.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@abrignoni
abrignoni force-pushed the feat/google-docs-ios branch from 9e6cceb to c55a8c1 Compare August 19, 2026 22:59
The localStore and fileStore layouts are shared by the Google editor
apps, so a Google Sheets or Google Slides container carries the same
paths. A store is now reported only when the same container also holds
com.google.Docs.plist, and one that does not is skipped and logged.

On a full filesystem image holding a Google Sheets container and no
Google Docs container, the artifacts reported a spreadsheet as a Google
Docs document; they now report nothing there. An image with a Google
Docs container is unchanged.

Document Text is now one row per document rather than one row per
stored command chunk, with the text joined in stored order and a
segment count. Comment Sync State drops the item kind and comment item
version columns, which held the same value on every tested row.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@abrignoni
abrignoni force-pushed the feat/google-docs-ios branch from 378b551 to 1e812b2 Compare August 19, 2026 23:33
A container holds a directory per signed in account, and the same
document can be open under more than one of them. The store map was
keyed on the document id alone, so one copy overwrote the other and a
document went unreported. The account directory is now part of the key
and each account's copy is its own row.

cross_document_metadata does not carry last_sync_finish_timestamp in
older stores, so selecting it unconditionally failed the read and
Document Sync State reported nothing on a store that held rows. The
query now resolves against the file's own schema.

On a full filesystem image whose container holds two account
directories, Documents goes from 3 rows to 4, Document Text from 2 to
3, and Document Sync State from none to 4, matching counts measured
from the stores by separate code.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@abrignoni
abrignoni merged commit 7580376 into main Aug 20, 2026
8 checks passed
@abrignoni
abrignoni deleted the feat/google-docs-ios branch August 20, 2026 00:02
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant