Productivity

Calendar

Overview

The macOS Calendar application (formerly iCal) stores all calendar data in a SQLite database called "Calendar Cache". This Core Data store contains events, attendees, locations, recurrence rules, alarms, and account synchronisation state across all configured calendar accounts (iCloud, Google, Exchange, CalDAV). Individual calendar events are also stored as ICS files on disk.

Forensic Significance

Evidence TypeForensic Value
Event detailsMeeting subjects, descriptions, and notes
AttendeesPeople invited to or attending meetings
LocationsPhysical and virtual meeting locations
Time rangesWhen events were scheduled (including timezone)
RecurrenceRecurring meeting patterns (daily standups, weekly meetings)
Event creation/modificationWhen events were created or changed
Account sourcesWhich calendar services are configured (iCloud, Google, Exchange)
Deleted eventsRecently deleted calendar events

File Locations

ArtifactPathFormat
Calendar Cache~/Library/Calendars/Calendar CacheSQLite (Core Data)
WAL file~/Library/Calendars/Calendar Cache-walSQLite WAL
SHM file~/Library/Calendars/Calendar Cache-shmSQLite SHM
ICS events~/Library/Calendars/<UUID>.calendar/Events/*.icsICS text
Calendar metadata~/Library/Calendars/<UUID>.calendar/Info.plistPlist

Database Schema

The Calendar Cache is a Core Data SQLite store. Key entities:

ZCALENDARITEM (Events and Reminders)

ColumnTypeDescription
Z_PKINTEGERPrimary key
Z_ENTINTEGEREntity type (16=event, 17=reminder)
ZTITLETEXTEvent title/subject
ZLOCATIONTEXTEvent location
ZNOTESTEXTEvent description/notes
ZSTARTDATEREALStart time (Core Data timestamp)
ZENDDATEREALEnd time (Core Data timestamp)
ZCREATEDDATEREALWhen the event was created
ZLASTMODIFIEDDATEREALWhen the event was last modified
ZCALENDARINTEGERForeign key to calendar
ZISALLDAYINTEGERWhether this is an all-day event
ZISDETACHEDINTEGERWhether this is a detached recurrence instance
ZTIMEZONEINTEGERFK to timezone
ZRECURRENCERULEINTEGERFK to recurrence rule

ZATTENDEE

ColumnTypeDescription
ZCOMMONNAMETEXTAttendee display name
ZADDRESSTEXTEmail address (typically mailto: URI)
ZSTATUSINTEGERAttendance status (accepted, declined, tentative)
ZROLEINTEGERRole (required, optional, chair)
ZEVENTINTEGERFK to event

ZCALENDAR

ColumnTypeDescription
ZTITLETEXTCalendar name
ZEXTERNALIDTEXTExternal identifier
ZSOURCERELATIVEURLTEXTAccount source URL

Key Fields for Analysis

Essential Query

SELECT
    ci.ZTITLE AS title,
    ci.ZLOCATION AS location,
    datetime(ci.ZSTARTDATE + 978307200, 'unixepoch') AS start_time,
    datetime(ci.ZENDDATE + 978307200, 'unixepoch') AS end_time,
    ci.ZNOTES AS notes,
    c.ZTITLE AS calendar_name
FROM ZCALENDARITEM ci
LEFT JOIN ZCALENDAR c ON ci.ZCALENDAR = c.Z_PK
WHERE ci.Z_ENT = 16
ORDER BY ci.ZSTARTDATE DESC;

Events with Attendees

SELECT
    ci.ZTITLE AS event,
    datetime(ci.ZSTARTDATE + 978307200, 'unixepoch') AS start_time,
    a.ZCOMMONNAME AS attendee,
    a.ZADDRESS AS email
FROM ZCALENDARITEM ci
JOIN ZATTENDEE a ON a.ZEVENT = ci.Z_PK
WHERE ci.Z_ENT = 16
ORDER BY ci.ZSTARTDATE DESC;

Timestamps

Calendar uses Core Data timestamps (seconds since 2001-01-01 00:00:00 UTC).

Unix timestamp = core_data_timestamp + 978307200

Analysis Notes

  • Meeting reconstruction: Combine event titles, locations, attendees, and notes to reconstruct meeting activity and identify who the user met with.
  • Location tracking: Calendar event locations (both physical addresses and virtual meeting URLs like Zoom/Teams links) reveal movement patterns and communication tools used.
  • Account enumeration: The calendar accounts configured on the system reveal organisational affiliations (Exchange accounts indicate employer, Google accounts may be personal).
  • ICS files: Individual .ics files in the calendar directories contain event data in a text format that may include information not present in the SQLite cache.
  • Deleted events: Core Data soft-deletes may leave traces of removed events in the database.
  • Timezone analysis: Event timezones combined with creation timestamps can indicate where the user was when they created the event.

Version Differences

macOS VersionChanges
10.8+Calendar Cache SQLite format (Core Data)
10.15 (Catalina)Additional metadata fields
13 (Ventura)Enhanced iCloud sync metadata

Tool Support

ToolSupport
macforNot yet implemented (planned)
sqlite3Manual database inspection
Calendar.app (macOS built-in)GUI calendar viewer
mac_aptOpen-source calendar parser

References

Previous
Productivity Overview