55 lines
3.4 KiB
Plaintext
55 lines
3.4 KiB
Plaintext
MikeMail local archive, format 1
|
|
|
|
Location: Application Support/MikeMail/Archive inside the macOS app sandbox.
|
|
Mail.sqlite is the SwiftData index, with a versioned schema/migration plan.
|
|
Objects/<SHA-256>.eml contains immutable original RFC 5322/MIME bytes, including
|
|
all attachments. Paths are relative and content-addressed; user attachment
|
|
filenames are never used as filesystem paths. Identical messages share an object.
|
|
format.json identifies the archive format.
|
|
|
|
Account settings, folder trees and recipient history are stored in the database.
|
|
Existing UserDefaults settings migrate on first archive creation. Passwords stay
|
|
in Keychain and are never included in snapshots. A restore to another Mac needs
|
|
passwords entered again.
|
|
|
|
Refresh inventories all selectable folders and compares UIDVALIDITY/UID/FLAGS.
|
|
Only missing message bodies download. Removed messages and old UID generations
|
|
are hidden from the current folder but retained in the archive. New bodies are
|
|
staged before a complete inventory is reconciled. Failed downloads can resume.
|
|
Offline folder selection performs no network access. Server-side read flags are
|
|
stored; this change does not add local read/delete/move editing operations.
|
|
Initial synchronization downloads all messages, subject to the transport's 40 MB
|
|
per-message limit; failed folders are reported and remain incomplete.
|
|
|
|
Future backup UI should call MailArchive.exportSnapshot(to:) after synchronization
|
|
finishes, rather than copying the live SQLite file (which may have a WAL).
|
|
The logical snapshot includes manifest.json with formatVersion, date, complete
|
|
configuration, every message record (including hidden ones), and its EML objects.
|
|
Export serializes with archive mutations, verifies SHA-256, writes a staging
|
|
directory, then renames it. No absolute paths or credentials are exported.
|
|
Unreferenced orphan objects from interrupted writes are not exported.
|
|
|
|
MailArchive.restoreSnapshot(from:to:) validates version, unique record IDs, file
|
|
references and hashes, then reconstructs a NEW database. It refuses an existing
|
|
destination. A future restore UI must first stage/validate, stop all sync and
|
|
close the current archive, then switch archives while retaining the previous one
|
|
for rollback. Do not replace an open SQLite store. Restore is local only and
|
|
does not upload or delete server mail.
|
|
|
|
Backup/restore engine is implemented and tested; user-facing backup/restore
|
|
buttons, scheduling, compression and encryption are intentionally not yet added.
|
|
A backup contains only mail already downloaded, not inaccessible server mail.
|
|
|
|
App icon: generated using built-in image_gen, resized with macOS sips.
|
|
Asset: MikeMail/Assets.xcassets/AppIcon.appiconset/MikeMail-1024.png
|
|
Generation prompt:
|
|
Use case: stylized-concept. Asset: production macOS application icon for MikeMail,
|
|
square 1024x1024. Create a beautiful premium blue 3D mail app icon: a sculpted
|
|
pearly white envelope with crisp folded triangular flap, softly rounded edges,
|
|
hovering subtly above a rich cobalt-to-azure blue rounded-square tile, depth and
|
|
bevel, restrained luminous cyan rim highlights, soft studio reflections and
|
|
ambient occlusion. Straight-on view, balanced centered composition, clear simple
|
|
silhouette readable at 16px. Blue tile occupies about 88% of canvas, transparent
|
|
outside rounded tile with soft small shadow. No text, letters, badges, watermark,
|
|
extra objects or presentation mockup. Actual standalone icon artwork.
|