CertifiedCopy

Export your messages to PDF, without handing them to anyone.

CertifiedCopy reads a Messages database in your browser and writes a PDF or CSV of any conversation. The reading, the searching and the PDF are all done by your own computer. Nothing is uploaded, because there is no server to upload it to.

Open the app How it works

Free. No account. Works in Chrome, Safari and Firefox.

How it works

1. Choose a file

Point it at a chat.db from your Mac, or hand it a whole iPhone backup folder and it finds the messages itself. Or the sms.db inside an iPhone backup. The file is opened in the page, the way a photo editor opens a photo.

2. Read the conversation

Threads on the left, messages on the right, the way they looked on the phone — including tapbacks, replies, edits and attachments.

3. Export it

A PDF transcript or a CSV. Both begin with a record of exactly which file they came from and what that file hashed to.

Why "nothing is uploaded" is a fact here, not a policy

Most tools promise not to misuse the data you send them. CertifiedCopy makes a narrower and more checkable claim: your messages never leave the browser tab. The parser, the SQLite engine and the PDF renderer are compiled to WebAssembly and run on your machine. You can confirm it — open your browser's network panel while you export, and you will see no request carrying your data. Our own test suite asserts exactly that on every change.

Using an export as evidence

Every PDF opens with a certification page: the file it was produced from, that file's SHA-256 digest, its size, the conversation, the number of messages, the date range actually covered, and the participants. Re-computing the digest over the same file yields the same value; any alteration yields a different one.

That supports the specific thing Federal Rule of Evidence 902(14) contemplates — self-authentication of a digital copy through a certification describing hash verification.

What we do not claim. No tool can make a document admissible. Admissibility is decided by a court under FRE 901, on the whole record. CertifiedCopy produces a copy and describes it accurately. What weight that carries is not ours to promise, and any tool telling you otherwise is overselling.

What it reads

SourceWhere it comes fromSupported
Mac Messages database~/Library/Messages/chat.dbYes — copy it out first
iPhone backupChoose the backup folder — a backup stores every file under a 40-character hash, and CertifiedCopy derives the right oneYes
Connected iPhoneOver USB or Wi-Fi, with the optional agent belowDetects it; reading a live phone is not finished

A live chat.db is in WAL mode and incomplete on its own. CertifiedCopy refuses it rather than reading a partial copy, and tells you how to make a self-contained one:

sqlite3 "file:$HOME/Library/Messages/chat.db?mode=ro" "VACUUM INTO 'messages.db'"

Reading a phone

Nothing needs installing. Make a backup with Finder — which most people already do — and drop the backup folder onto this page. CertifiedCopy finds the Messages database inside it and reads it in your browser, exactly as it reads a chat.db.

  1. Plug the iPhone in and open Finder. The phone appears in the sidebar.
  2. Choose General, then Back up all of the data on your iPhone to this Mac, then Back Up Now. The first one takes a while.
  3. Open the app and choose an iPhone backup folder. It lives in ~/Library/Application Support/MobileSync/Backup, one folder per device.

You never have to find a file inside it. A backup stores everything flat under a 40-character hash of its original path — the Messages database is 3d/3d0d7e5fb2ce288813306e4d4636395e047a3d28, with no extension — and CertifiedCopy works that name out rather than asking you to.

Why the browser cannot read the phone directly

It is worth saying plainly, because it sounds like something that should be possible. A web page has to claim a USB interface to talk to a device, and on a Mac every interface an iPhone exposes already has an exclusive owner — the one carrying backups and messages belongs to usbmuxd, which macOS starts for you. You can see it yourself:

ioreg -r -c IOUSBHostInterface -w0 | grep -B8 UsbExclusiveOwner

An interface that already has an exclusive owner cannot be granted to a second one, so the browser's request fails no matter how you answer its permission dialog. The phone may still appear in the picker; being listed and being reachable are not the same thing. Windows works the same way through Apple's driver.

Which is why the route above goes through Finder. Finder is already the program that owns that conversation, it is already on the machine, and the backup it writes is a format this page can read.

The optional agent

If you would rather not use Finder, there is a small agent that makes the backup for you and tells the page when a phone is plugged in. It is a convenience and nothing more — everything above works without it, and your messages are read and exported in the browser either way.

curl -fsSL https://certified.sh/install.sh | sh

Read the script first — it is served as plain text so you can. It downloads one archive, checks its digest, and puts a universal binary in ~/.certifiedcopy. Removing it is rm -rf ~/.certifiedcopy. What it tells this site is limited on purpose: whether a phone is attached and what to do next, never its serial number and never a message.

Questions

Do my messages get uploaded?

No. There is no server that receives them. The page does the work.

Does it work without an internet connection?

Yes. It installs as an app and runs offline.

Is anything stored?

Only if you ask. There is a checkbox to keep a database in your browser between visits, off by default, and one button to forget it.

Can it export a date range?

A whole conversation today. Date-range and message selection are in progress.

What does it cost?

Nothing.