UI for visualizing data and relationships from iMessage's chat.db. More complete being the year-in-review stories feature on the dashboard.
Since there is no public API for messages, this is a macOS app and will not support iOS. Typically, the database file lives at ~/Library/Messages/chat.db. The two files chat.db-shm and chat.db-wal are shared memory and write-ahead log files used for concurrent access. However, it is not good practice to modify the original chat.db provided by iMessage. This project will not write to the database, however it is strongly recommended to copy chat.db elsewhere in the file-system.
iMessageWrapped will copy the provided chat.db to a temporary directory and create new shared memory and log files.
That is, you should copy ~/Library/Messages/chat.db somewhere else, then give this copy to iMessageWrapped so it can make another copy.
Unidirectional from data to the UI.
Manages the entry-point and high-level state: onboarding, loading, presentation.
Manages the database and it's entities (Chat, Message, Handle) using GRDB to bridge the SQL to Codable Swift structures.
Logic and analysis for interpreting data. Creates snapshots (e.g., this calendar year) and pre-processes the data. Defines StoryGenerators for additional filters and results for the UI format. Interacts with the Contacts API to resolve phone numbers and contact photos.
Presentation and rendering for displaying data from the domain.
- Contacts for identifying phone numbers and photographs to show them in the UI
- File-system to access
chat.db
Total WIP, these typically are written in Domain/Analyzers/ and displayed in the dashboard view.
Currently:
- A chart to show volume over time
- Ghosted threads where you haven't responded in 7+ days
New stories land in Domain/Stories/Generators/. Each new StoryGenerator requires the StoryContext describing messages and handles that can be filtered for your target result. The end product is a StoryPage with the relevant information to display. Each StoryPage is tied to a Interface/Stories/StoryLayouts/ to describe the appearance in the UI. New stories must be registered in Domain/Stories/StoryOrchestrator.swift. (but I don't want to keep adding them to the static factory)