Keep using Photos.app like you always do. Attic quietly backs up your originals and edits to an S3 bucket you control. One-way, append-only.
3
fork

Configure Feed

Select the types of activity you want to include in your feed.

chore: swiftformat fixes for CI

+8 -10
+1 -1
Sources/AtticCore/BackupUpload.swift
··· 64 64 fileURL: fileURL, 65 65 contentType: contentTypeForExtension(ext), 66 66 ) 67 - } 67 + }, 68 68 ) 69 69 70 70 // Build and upload metadata
+3 -4
Tests/AtticCoreTests/RetryQueueTests.swift
··· 1 + @testable import AtticCore 1 2 import Foundation 2 3 import Testing 3 4 4 - @testable import AtticCore 5 - 6 - @Suite struct RetryQueueTests { 5 + struct RetryQueueTests { 7 6 private func makeTempDir() throws -> URL { 8 7 let dir = FileManager.default.temporaryDirectory 9 8 .appendingPathComponent("retry-queue-test-\(UUID().uuidString)") ··· 26 25 let store = FileRetryQueueStore(directory: dir) 27 26 let queue = RetryQueue( 28 27 failedUUIDs: ["uuid-1", "uuid-2", "uuid-3"], 29 - updatedAt: "2025-01-15T12:00:00Z" 28 + updatedAt: "2025-01-15T12:00:00Z", 30 29 ) 31 30 try store.save(queue) 32 31
+4 -5
Tests/AtticCoreTests/StagingReclaimTests.swift
··· 1 + @testable import AtticCore 1 2 import Foundation 2 3 import LadderKit 3 4 import Testing 4 5 5 - @testable import AtticCore 6 - 7 - @Suite struct StagingReclaimTests { 6 + struct StagingReclaimTests { 8 7 private func makeTempDir() throws -> URL { 9 8 let dir = FileManager.default.temporaryDirectory 10 9 .appendingPathComponent("staging-reclaim-test-\(UUID().uuidString)") ··· 68 67 69 68 // Only one file should remain in the dir 70 69 let remaining = try FileManager.default.contentsOfDirectory( 71 - at: dir, includingPropertiesForKeys: nil 70 + at: dir, includingPropertiesForKeys: nil, 72 71 ) 73 72 #expect(remaining.count == 1) 74 73 } ··· 86 85 87 86 // The other-uuid file should still exist (untouched) 88 87 let allFiles = try FileManager.default.contentsOfDirectory( 89 - at: dir, includingPropertiesForKeys: nil 88 + at: dir, includingPropertiesForKeys: nil, 90 89 ) 91 90 #expect(allFiles.count == 2) 92 91 }