<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Charles West</title>
    <description>The latest articles on DEV Community by Charles West (@charles_west_99af57fcbac3).</description>
    <link>https://dev.to/charles_west_99af57fcbac3</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3854493%2F7a2c762f-e319-48f5-899b-131a5c35ec60.jpg</url>
      <title>DEV Community: Charles West</title>
      <link>https://dev.to/charles_west_99af57fcbac3</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/charles_west_99af57fcbac3"/>
    <language>en</language>
    <item>
      <title>The Evidence Is in the Phone. Most of It Never Makes It Into the Case.</title>
      <dc:creator>Charles West</dc:creator>
      <pubDate>Wed, 01 Apr 2026 03:08:48 +0000</pubDate>
      <link>https://dev.to/charles_west_99af57fcbac3/the-evidence-is-in-the-phone-most-of-it-never-makes-it-into-the-case-mle</link>
      <guid>https://dev.to/charles_west_99af57fcbac3/the-evidence-is-in-the-phone-most-of-it-never-makes-it-into-the-case-mle</guid>
      <description>&lt;p&gt;In every custody dispute, every contested divorce, every harassment claim — the phone is the richest source of evidence available. Both sides know it. Attorneys request text message exports. PIs take screenshots. Forensic examiners produce reports.&lt;/p&gt;

&lt;p&gt;And almost every time, what ends up in the case file is a fraction of what's actually there.&lt;/p&gt;

&lt;p&gt;I'm a technologist — 25 years in software, QA, systems design — and when I cracked open my own iPhone backup, what I found changed the way I think about phone evidence entirely. This article walks through what's actually inside an iTunes/Finder backup at the file and database level, because most people — including many professionals — have never looked.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Backup Structure: What Apple Actually Stores
&lt;/h2&gt;

&lt;p&gt;When you back up an iPhone to a computer via iTunes (Windows) or Finder (macOS), Apple creates a folder in a predictable location:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;macOS:&lt;/strong&gt; &lt;code&gt;~/Library/Application Support/MobileSync/Backup/&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Windows:&lt;/strong&gt; &lt;code&gt;%APPDATA%\Apple Computer\MobileSync\Backup\&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Inside, you'll find a folder named with the device's UDID. Open it and you'll see thousands of files with 40-character hexadecimal filenames — no extensions, no directory structure. It looks like chaos.&lt;/p&gt;

&lt;p&gt;It's not. Every one of those filenames is a &lt;strong&gt;SHA-1 hash&lt;/strong&gt; of the file's original domain and path on the device.&lt;/p&gt;

&lt;h2&gt;
  
  
  How the Hashing Works
&lt;/h2&gt;

&lt;p&gt;Apple uses a consistent hashing scheme. Each file on the device has a &lt;em&gt;domain&lt;/em&gt; (like &lt;code&gt;HomeDomain&lt;/code&gt; or &lt;code&gt;MediaDomain&lt;/code&gt;) and a &lt;em&gt;relative path&lt;/em&gt; (like &lt;code&gt;Library/SMS/sms.db&lt;/code&gt;). The backup filename is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nc"&gt;SHA1&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;domain&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;-&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;relativePath&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For example, the messages database:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;SHA1("HomeDomain-Library/SMS/sms.db")
= 3d0d7e5fb2ce288813306e4d4636395e047a3d28
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That hash &lt;strong&gt;is&lt;/strong&gt; the filename in the backup folder. No extension, no directory hierarchy — just the hash. This means if you know the domain and path of a file on the device, you can calculate exactly which backup file contains it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Manifest.db: The Rosetta Stone
&lt;/h2&gt;

&lt;p&gt;The most important file in any backup is &lt;code&gt;Manifest.db&lt;/code&gt; — a SQLite database that maps every hashed filename back to its original path, domain, and metadata. Its structure looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;TABLE&lt;/span&gt; &lt;span class="n"&gt;Files&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;fileID&lt;/span&gt; &lt;span class="nb"&gt;TEXT&lt;/span&gt; &lt;span class="k"&gt;PRIMARY&lt;/span&gt; &lt;span class="k"&gt;KEY&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="k"&gt;domain&lt;/span&gt; &lt;span class="nb"&gt;TEXT&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;relativePath&lt;/span&gt; &lt;span class="nb"&gt;TEXT&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;flags&lt;/span&gt; &lt;span class="nb"&gt;INTEGER&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;file&lt;/span&gt; &lt;span class="nb"&gt;BLOB&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;fileID&lt;/code&gt; — the SHA-1 hash (the filename in the backup folder)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;domain&lt;/code&gt; — the app or system domain (&lt;code&gt;HomeDomain&lt;/code&gt;, &lt;code&gt;AppDomain-com.app.name&lt;/code&gt;, etc.)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;relativePath&lt;/code&gt; — the original file path on the device&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;flags&lt;/code&gt; — file type (1 = file, 2 = directory, 4 = symlink)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;file&lt;/code&gt; — a binary plist blob containing file metadata (size, timestamps, permissions)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Query it and you get a complete directory listing of the entire device:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;fileID&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;domain&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;relativePath&lt;/span&gt; &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;Files&lt;/span&gt;
&lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;flags&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
&lt;span class="k"&gt;ORDER&lt;/span&gt; &lt;span class="k"&gt;BY&lt;/span&gt; &lt;span class="k"&gt;domain&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;relativePath&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This single query reveals every file backed up from the phone — thousands of entries spanning messages, photos, call logs, browser history, app data, and more.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Key SQLite Databases
&lt;/h2&gt;

&lt;p&gt;Here's where it gets interesting. Several of the backed-up files are SQLite databases themselves, each containing structured, queryable data. The most important ones:&lt;/p&gt;

&lt;h3&gt;
  
  
  Messages — &lt;code&gt;sms.db&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Hash:&lt;/strong&gt; &lt;code&gt;3d0d7e5fb2ce288813306e4d4636395e047a3d28&lt;/code&gt;&lt;br&gt;
&lt;strong&gt;Path:&lt;/strong&gt; &lt;code&gt;HomeDomain-Library/SMS/sms.db&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="c1"&gt;-- Key tables&lt;/span&gt;
&lt;span class="n"&gt;message&lt;/span&gt;          &lt;span class="c1"&gt;-- every SMS and iMessage&lt;/span&gt;
&lt;span class="n"&gt;chat&lt;/span&gt;             &lt;span class="c1"&gt;-- conversation threads&lt;/span&gt;
&lt;span class="n"&gt;chat_message_join&lt;/span&gt; &lt;span class="c1"&gt;-- links messages to chats&lt;/span&gt;
&lt;span class="n"&gt;handle&lt;/span&gt;           &lt;span class="c1"&gt;-- phone numbers / email addresses&lt;/span&gt;
&lt;span class="n"&gt;attachment&lt;/span&gt;       &lt;span class="c1"&gt;-- photos, videos, files sent in messages&lt;/span&gt;

&lt;span class="c1"&gt;-- Useful query: messages with contact info and timestamps&lt;/span&gt;
&lt;span class="k"&gt;SELECT&lt;/span&gt;
    &lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ROWID&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;text&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;date&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;           &lt;span class="c1"&gt;-- Apple epoch: seconds since 2001-01-01&lt;/span&gt;
    &lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;is_from_me&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;date_read&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;date_delivered&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;h&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;contact&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;message&lt;/span&gt; &lt;span class="n"&gt;m&lt;/span&gt;
&lt;span class="k"&gt;LEFT&lt;/span&gt; &lt;span class="k"&gt;JOIN&lt;/span&gt; &lt;span class="n"&gt;handle&lt;/span&gt; &lt;span class="n"&gt;h&lt;/span&gt; &lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;handle_id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;h&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ROWID&lt;/span&gt;
&lt;span class="k"&gt;ORDER&lt;/span&gt; &lt;span class="k"&gt;BY&lt;/span&gt; &lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;date&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Note: Apple timestamps use &lt;strong&gt;Core Data epoch&lt;/strong&gt; — seconds (or nanoseconds, depending on iOS version) since &lt;strong&gt;January 1, 2001&lt;/strong&gt;, not the Unix epoch. You'll need to convert:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;datetime&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;datetime&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;timedelta&lt;/span&gt;

&lt;span class="n"&gt;APPLE_EPOCH&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;datetime&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2001&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;apple_timestamp_to_datetime&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ts&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;ts&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mf"&gt;1e15&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;  &lt;span class="c1"&gt;# nanoseconds (iOS 14+)
&lt;/span&gt;        &lt;span class="n"&gt;ts&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ts&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mf"&gt;1e9&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;APPLE_EPOCH&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nf"&gt;timedelta&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;seconds&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;ts&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Call History — &lt;code&gt;call_history.db&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Hash:&lt;/strong&gt; &lt;code&gt;2b2b0084a1bc3a5ac8c27afdf14afb42c61a19ca&lt;/code&gt;&lt;br&gt;
&lt;strong&gt;Path:&lt;/strong&gt; &lt;code&gt;HomeDomain-Library/CallHistoryDB/CallHistory.storedata&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="c1"&gt;-- Key table: ZCALLRECORD&lt;/span&gt;
&lt;span class="k"&gt;SELECT&lt;/span&gt;
    &lt;span class="n"&gt;ZADDRESS&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;          &lt;span class="c1"&gt;-- phone number&lt;/span&gt;
    &lt;span class="n"&gt;ZDATE&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;             &lt;span class="c1"&gt;-- Apple epoch timestamp&lt;/span&gt;
    &lt;span class="n"&gt;ZDURATION&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;         &lt;span class="c1"&gt;-- call duration in seconds&lt;/span&gt;
    &lt;span class="n"&gt;ZORIGINATED&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;       &lt;span class="c1"&gt;-- 1 = outgoing, 0 = incoming&lt;/span&gt;
    &lt;span class="n"&gt;ZANSWERED&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;         &lt;span class="c1"&gt;-- 1 = answered, 0 = missed/declined&lt;/span&gt;
    &lt;span class="n"&gt;ZCALLTYPE&lt;/span&gt;          &lt;span class="c1"&gt;-- 1 = voice, 8 = FaceTime video, 16 = FaceTime audio&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;ZCALLRECORD&lt;/span&gt;
&lt;span class="k"&gt;ORDER&lt;/span&gt; &lt;span class="k"&gt;BY&lt;/span&gt; &lt;span class="n"&gt;ZDATE&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Photos Metadata — &lt;code&gt;Photos.sqlite&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Path:&lt;/strong&gt; &lt;code&gt;CameraRollDomain-Media/PhotoData/Photos.sqlite&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="c1"&gt;-- Key tables: ZASSET, ZADDITIONALASSETATTRIBUTES&lt;/span&gt;
&lt;span class="k"&gt;SELECT&lt;/span&gt;
    &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ZFILENAME&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ZDATECREATED&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ZLATITUDE&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ZLONGITUDE&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;attr&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ZORIGINALFILESIZE&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;attr&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ZCAMERAMAKE&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;attr&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ZCAMERAMODEL&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;ZASSET&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;
&lt;span class="k"&gt;LEFT&lt;/span&gt; &lt;span class="k"&gt;JOIN&lt;/span&gt; &lt;span class="n"&gt;ZADDITIONALASSETATTRIBUTES&lt;/span&gt; &lt;span class="n"&gt;attr&lt;/span&gt;
    &lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Z_PK&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;attr&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ZASSET&lt;/span&gt;
&lt;span class="k"&gt;ORDER&lt;/span&gt; &lt;span class="k"&gt;BY&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ZDATECREATED&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Every photo with GPS coordinates, camera model, exact timestamp — all queryable.&lt;/p&gt;

&lt;h3&gt;
  
  
  Safari Browser History — &lt;code&gt;History.db&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Hash:&lt;/strong&gt; &lt;code&gt;e74113c185fd8297e140571f7e3beb3cfceddb58&lt;/code&gt;&lt;br&gt;
&lt;strong&gt;Path:&lt;/strong&gt; &lt;code&gt;HomeDomain-Library/Safari/History.db&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt;
    &lt;span class="n"&gt;hi&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;hi&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;visit_count&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;hv&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;visit_time&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;    &lt;span class="c1"&gt;-- Apple epoch&lt;/span&gt;
    &lt;span class="n"&gt;hv&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;title&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;history_items&lt;/span&gt; &lt;span class="n"&gt;hi&lt;/span&gt;
&lt;span class="k"&gt;JOIN&lt;/span&gt; &lt;span class="n"&gt;history_visits&lt;/span&gt; &lt;span class="n"&gt;hv&lt;/span&gt; &lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="n"&gt;hi&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;hv&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;history_item&lt;/span&gt;
&lt;span class="k"&gt;ORDER&lt;/span&gt; &lt;span class="k"&gt;BY&lt;/span&gt; &lt;span class="n"&gt;hv&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;visit_time&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Other Key Databases
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Data&lt;/th&gt;
&lt;th&gt;File Path&lt;/th&gt;
&lt;th&gt;Hash&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Notes&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;HomeDomain-Library/Notes/notes.sqlite&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Varies by iOS version&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Contacts&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;HomeDomain-Library/AddressBook/AddressBook.sqlitedb&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;31bb7ba8914766d4ba40d6dfb6113c8b614be442&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Voicemail&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;HomeDomain-Library/Voicemail/voicemail.db&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Varies&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Wi-Fi locations&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;SystemPreferencesDomain-SystemConfiguration/com.apple.wifi.plist&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Varies&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Calendar&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;HomeDomain-Library/Calendar/Calendar.sqlitedb&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Varies&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  What Most People Miss
&lt;/h2&gt;

&lt;p&gt;Here's the problem: an attorney requests "text messages between the parties." Someone scrolls through the phone, takes screenshots, maybe exports a PDF through a consumer app.&lt;/p&gt;

&lt;p&gt;That workflow misses almost everything.&lt;/p&gt;

&lt;p&gt;It misses the call that happened two minutes before the text — the one that provides context for why the message was sent. It misses the browser search at 1 AM that shows state of mind. It misses the GPS coordinates on a photo that contradict a stated alibi. It misses the voicemail that was listened to but never saved.&lt;/p&gt;

&lt;p&gt;Most critically, it misses the &lt;strong&gt;pattern&lt;/strong&gt; — the escalation visible only when you lay out messages, calls, and locations on a single timeline across weeks or months.&lt;/p&gt;

&lt;p&gt;Individual screenshots are moments frozen in isolation. The real story lives in the connections between data points across multiple channels.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Tooling Gap
&lt;/h2&gt;

&lt;p&gt;The professional forensic tools — Cellebrite, Magnet AXIOM, Oxygen — are powerful, but they're built for law enforcement and enterprise labs. They cost thousands per license and require training and certification.&lt;/p&gt;

&lt;p&gt;Consumer tools let you browse messages and export contacts, but they don't do cross-channel analysis. They don't reconstruct timelines. They don't let you see a call log, text thread, browser history, and location data side by side in chronological order.&lt;/p&gt;

&lt;p&gt;There's a gap in the middle — and it's exactly where most family law cases, PI investigations, and civil disputes live.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Built
&lt;/h2&gt;

&lt;p&gt;I built &lt;a href="https://openextract.app" rel="noopener noreferrer"&gt;OpenExtract&lt;/a&gt; to fill that gap. It's a free, open-source desktop app that reads a local iPhone backup and extracts everything — messages, calls, photos, contacts, voicemails, notes, browser history, and more — into structured, searchable, exportable formats.&lt;/p&gt;

&lt;p&gt;It parses &lt;code&gt;Manifest.db&lt;/code&gt;, resolves the SHA-1 hashes, opens each SQLite database, converts Apple-epoch timestamps, and produces unified, cross-referenced output. It runs locally — no cloud, no account, no subscription.&lt;/p&gt;

&lt;p&gt;If you work with phone evidence and you've never opened &lt;code&gt;Manifest.db&lt;/code&gt; in a SQLite browser, I'd encourage you to try it. You might be surprised by how much data is sitting right there, already preserved, waiting to be queried.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Site:&lt;/strong&gt; &lt;a href="https://openextract.app" rel="noopener noreferrer"&gt;openextract.app&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;GitHub:&lt;/strong&gt; &lt;a href="https://github.com/openextract" rel="noopener noreferrer"&gt;github.com/openextract&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Charles is a retired technologist and the developer behind OpenExtract. This is the third in a series of articles about phone data, personal records, and the tools we use to make sense of them.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>iphone</category>
      <category>forensics</category>
    </item>
  </channel>
</rss>
