Recovering Lost Apple Reminders from the Local SQLite Database

Sometimes after syncing devices or migrating to a new computer, Apple Reminders may show lists with a ⚠️ warning icon and apparently no reminders inside them.

In many cases, the reminders are not actually lost. The data still exists inside the local Reminders database, but the application has lost the correct references between lists and reminders.

This guide explains how to:

  • inspect the Apple Reminders SQLite database
  • locate the real reminders
  • export them safely
  • reconstruct them using Apple's official EventKit API

This avoids modifying the database directly and keeps iCloud synchronization safe.


Understanding the Problem

A common symptom is:

  • several reminder lists display a ⚠️ symbol
  • the lists appear empty
  • a strange reminder like "Where are my reminders?" may appear

These are placeholder reminders created by the Reminders application when synchronization fails to resolve the real content.

The real reminders usually still exist elsewhere in the database.


Where Apple Reminders Stores Data

Reminders uses a local SQLite database.

On macOS it typically lives inside a container similar to:

group.com.apple.reminders/Container_v1/Stores/

Inside this directory you will find a file similar to:

Data-XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX.sqlite

⚠️ Important:
Always work on a copy of the database, never the live file.


Exploring the Database

Open the database with:

sqlite3 Data-XXXX.sqlite

List tables:

.tables

Important tables include:

ZREMCDREMINDER ZREMCDBASELIST ZREMCDOBJECT


Key Tables

ZREMCDREMINDER

Stores the reminders themselves.

Important fields:

Field Description


ZTITLE reminder title ZNOTES notes ZLIST reference to list ZDUEDATE due date ZCREATIONDATE creation timestamp

ZREMCDBASELIST

Stores reminder lists.

Field Description


Z_PK primary key ZNAME list name


Listing Reminder Lists

SELECT Z_PK, ZNAME
FROM ZREMCDBASELIST;

This typically shows:

  • normal user lists
  • system lists
  • placeholder lists with ⚠️

Viewing Reminders

SELECT ZTITLE, ZLIST
FROM ZREMCDREMINDER
LIMIT 20;

Join reminders with their list:

SELECT
  r.ZTITLE,
  l.ZNAME
FROM ZREMCDREMINDER r
JOIN ZREMCDBASELIST l
ON r.ZLIST = l.Z_PK;

Apple Date Format

Reminders stores timestamps relative to January 1st 2001.

To convert them:

datetime(ZCREATIONDATE + 978307200, 'unixepoch')

978307200 seconds converts Apple's reference epoch to Unix time.


Exporting Reminders to JSON

SQLite can export directly to JSON:

.mode json

SELECT
  ZTITLE AS title,
  ZNOTES AS notes,
  ZDUEDATE
FROM ZREMCDREMINDER;

This produces a JSON file suitable for reconstruction.


Why You Should Not Modify the Database

Directly editing the SQLite database is risky.

Reminders relies on internal metadata including:

  • CloudKit synchronization data
  • replication state
  • transaction history
  • serialized objects

Changing references manually can break synchronization or corrupt the store.

Instead, export the data and recreate reminders using the official API.


Rebuilding Reminders Using EventKit

Apple provides EventKit, a framework for interacting with reminders and calendars.

Example:

import EventKit

let store = EKEventStore()

store.requestFullAccessToReminders { granted, error in
    guard granted else { return }

    let reminder = EKReminder(eventStore: store)
    reminder.title = "Recovered reminder"

    try? store.save(reminder, commit: true)
}

Using this approach ensures compatibility with iCloud synchronization.


Preserving Original Metadata

Apple does not allow restoring some internal fields such as the original creation date.

However, the original timestamps can be preserved inside the note field:

[Recovered from SQLite] Original created: 2021-08-16 Original modified: 2021-08-16

This keeps historical context while remaining compatible with the API.


Recommended Recovery Workflow

  1. Copy the Reminders database
  2. Explore lists and reminders with SQLite
  3. Export reminders to JSON
  4. Use an EventKit script to recreate them
  5. Import into new lists
  6. Verify the recovered reminders

Final Notes

Even when the Reminders UI appears empty, the data often still exists in the database.

By carefully inspecting the SQLite store and rebuilding reminders through EventKit, it is possible to recover nearly all reminder content safely.

Always test the recovery with a small sample before importing everything.


Tools Used

  • SQLite CLI
  • Apple EventKit framework
  • JSON export

You can find a link to the repository here: