Rebrand entire project from Feels to Reflect

Complete rename across all bundle IDs, App Groups, CloudKit containers,
StoreKit product IDs, data store filenames, URL schemes, logger subsystems,
Swift identifiers, user-facing strings (7 languages), file names, directory
names, Xcode project, schemes, assets, and documentation.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
Trey t
2026-02-26 11:47:16 -06:00
parent b1a54d2844
commit 0442eab1f8
380 changed files with 858 additions and 1077 deletions

View File

@@ -1,6 +1,6 @@
//
// AppLogger.swift
// Feels
// Reflect
//
// Centralized logging using OSLog for production-ready logging.
//
@@ -29,6 +29,6 @@ enum AppLogger {
// MARK: - Private
private static var subsystem: String {
Bundle.main.bundleIdentifier ?? "com.tt.feels"
Bundle.main.bundleIdentifier ?? "com.88oakapps.reflect"
}
}

View File

@@ -1,6 +1,6 @@
//
// BiometricAuthManager.swift
// Feels
// Reflect
//
// Manages Face ID / Touch ID authentication for app privacy lock.
//
@@ -93,7 +93,7 @@ class BiometricAuthManager: ObservableObject {
do {
let success = try await context.evaluatePolicy(
policy,
localizedReason: "Unlock Feels to access your mood data"
localizedReason: "Unlock Reflect to access your mood data"
)
isUnlocked = success
@@ -120,7 +120,7 @@ class BiometricAuthManager: ObservableObject {
do {
let success = try await context.evaluatePolicy(
.deviceOwnerAuthentication,
localizedReason: "Unlock Feels to access your mood data"
localizedReason: "Unlock Reflect to access your mood data"
)
isUnlocked = success

View File

@@ -1,6 +1,6 @@
//
// ExportService.swift
// Feels
// Reflect
//
// Handles exporting mood data to CSV and PDF formats with beautiful visualizations.
//
@@ -76,7 +76,7 @@ class ExportService {
func exportCSV(entries: [MoodEntryModel]) -> URL? {
let csv = generateCSV(entries: entries)
let filename = "Feels-Export-\(formattedDate()).csv"
let filename = "Reflect-Export-\(formattedDate()).csv"
let tempURL = FileManager.default.temporaryDirectory.appendingPathComponent(filename)
do {
@@ -107,7 +107,7 @@ class ExportService {
let contentWidth = pageWidth - (margin * 2)
let pdfMetaData = [
kCGPDFContextCreator: "Feels App",
kCGPDFContextCreator: "Reflect App",
kCGPDFContextTitle: title
]
@@ -167,7 +167,7 @@ class ExportService {
return nil
}
let filename = "Feels-Report-\(formattedDate()).pdf"
let filename = "Reflect-Report-\(formattedDate()).pdf"
let tempURL = FileManager.default.temporaryDirectory.appendingPathComponent(filename)
do {
@@ -624,7 +624,7 @@ class ExportService {
.font: footerFont,
.foregroundColor: UIColor.lightGray
]
let footerString = NSAttributedString(string: "Generated by Feels - Your Mood Tracking Companion", attributes: footerAttributes)
let footerString = NSAttributedString(string: "Generated by Reflect - Your Mood Tracking Companion", attributes: footerAttributes)
let footerSize = footerString.size()
footerString.draw(at: CGPoint(x: (pageWidth - footerSize.width) / 2, y: footerY))
}

View File

@@ -1,6 +1,6 @@
//
// ExportableInsightsViews.swift
// Feels
// Reflect
//
// Exportable insights views with sample AI-generated insights for screenshots.
//

View File

@@ -1,6 +1,6 @@
//
// ExportableWatchViews.swift
// Feels
// Reflect
//
// Exportable watch views that match the real watchOS layouts.
// These views accept tint/icon configuration as parameters for batch export.
@@ -292,7 +292,7 @@ struct ExportableRectangularComplication: View {
.font(.system(size: 24))
VStack(alignment: .leading, spacing: 2) {
Text("Feels")
Text("Reflect")
.font(.system(size: 14, weight: .semibold))
Text("Tap to log mood")
.font(.system(size: 12))

View File

@@ -1,6 +1,6 @@
//
// ExportableWidgetViews.swift
// Feels
// Reflect
//
// Exportable widget views that match the real WidgetKit widgets pixel-for-pixel.
// These views accept tint/icon configuration as parameters for batch export.
@@ -180,7 +180,7 @@ struct ExportableVotingView: View {
}
}
// MARK: - Exportable Voted Stats View (matches VotedStatsView from FeelsVoteWidget.swift)
// MARK: - Exportable Voted Stats View (matches VotedStatsView from ReflectVoteWidget.swift)
struct ExportableVotedStatsView: View {
enum Size {
@@ -303,7 +303,7 @@ struct ExportableVotedStatsView: View {
}
}
// MARK: - Exportable Timeline Small View (matches SmallWidgetView from FeelsTimelineWidget.swift)
// MARK: - Exportable Timeline Small View (matches SmallWidgetView from ReflectTimelineWidget.swift)
struct ExportableTimelineSmallView: View {
let config: WidgetExportConfig
@@ -359,7 +359,7 @@ struct ExportableTimelineSmallView: View {
}
}
// MARK: - Exportable Timeline Medium View (matches MediumWidgetView from FeelsTimelineWidget.swift)
// MARK: - Exportable Timeline Medium View (matches MediumWidgetView from ReflectTimelineWidget.swift)
struct ExportableTimelineMediumView: View {
let config: WidgetExportConfig
@@ -469,7 +469,7 @@ struct ExportableMediumDayCell: View {
}
}
// MARK: - Exportable Timeline Large View (matches LargeWidgetView from FeelsTimelineWidget.swift)
// MARK: - Exportable Timeline Large View (matches LargeWidgetView from ReflectTimelineWidget.swift)
struct ExportableTimelineLargeView: View {
let config: WidgetExportConfig

View File

@@ -1,6 +1,6 @@
//
// FoundationModelsInsightService.swift
// Feels
// Reflect
//
// Created by Claude Code on 12/13/24.
//
@@ -112,7 +112,7 @@ class FoundationModelsInsightService: ObservableObject {
private var defaultSystemInstructions: String {
"""
You are a supportive mood analyst for the Feels app. Analyze mood data and provide warm, actionable insights.
You are a supportive mood analyst for the Reflect app. Analyze mood data and provide warm, actionable insights.
Style: Encouraging, empathetic, concise (1-2 sentences per insight). Reference specific data.

View File

@@ -1,6 +1,6 @@
//
// HealthService.swift
// Feels
// Reflect
//
// Manages Apple Health integration for mood correlation insights.
//

View File

@@ -1,6 +1,6 @@
//
// ImageCache.swift
// Feels
// Reflect
//
// In-memory image cache for thumbnail images to improve scrolling performance.
//
@@ -13,7 +13,7 @@ final class ImageCache {
static let shared = ImageCache()
private let cache = NSCache<NSString, UIImage>()
private let queue = DispatchQueue(label: "com.tt.feels.imagecache", qos: .userInitiated)
private let queue = DispatchQueue(label: "com.88oakapps.reflect.imagecache", qos: .userInitiated)
private var memoryWarningToken: NSObjectProtocol?

View File

@@ -1,6 +1,6 @@
//
// InsightsExporter.swift
// Feels
// Reflect
//
// Debug utility to export insights view screenshots with sample AI data.
//

View File

@@ -1,6 +1,6 @@
//
// MoodDataSummarizer.swift
// Feels
// Reflect
//
// Created by Claude Code on 12/13/24.
//

View File

@@ -1,6 +1,6 @@
//
// PhotoManager.swift
// Feels
// Reflect
//
// Manages photo storage for mood entries.
// Photos are stored as JPEG files in the app group Documents directory.

View File

@@ -1,6 +1,6 @@
//
// ReviewRequestManager.swift
// Feels
// Reflect
//
// Manages in-app review requests using StoreKit.
// Follows Apple's guidelines: requests at moments of delight,
@@ -28,10 +28,10 @@ final class ReviewRequestManager {
// MARK: - UserDefaults Keys
private enum Keys: String {
case lastReviewRequestDate = "feels_lastReviewRequestDate"
case totalReviewRequests = "feels_totalReviewRequests"
case totalMoodEntriesLogged = "feels_totalMoodEntriesLogged"
case lastReviewRequestVersion = "feels_lastReviewRequestVersion"
case lastReviewRequestDate = "reflect_lastReviewRequestDate"
case totalReviewRequests = "reflect_totalReviewRequests"
case totalMoodEntriesLogged = "reflect_totalMoodEntriesLogged"
case lastReviewRequestVersion = "reflect_lastReviewRequestVersion"
}
private init() {}

View File

@@ -1,6 +1,6 @@
//
// SharingScreenshotExporter.swift
// Feels
// Reflect
//
// Debug utility to export sharing template screenshots.
//

View File

@@ -1,6 +1,6 @@
//
// WatchConnectivityManager.swift
// Feels
// Reflect
//
// Central coordinator for Watch Connectivity.
// Used for immediate UI updates (Live Activity, widget refresh).
@@ -18,7 +18,7 @@ final class WatchConnectivityManager: NSObject, ObservableObject {
static let shared = WatchConnectivityManager()
private static let logger = Logger(subsystem: "com.tt.feels", category: "WatchConnectivity")
private static let logger = Logger(subsystem: "com.88oakapps.reflect", category: "WatchConnectivity")
private var session: WCSession?

View File

@@ -1,6 +1,6 @@
//
// WatchExporter.swift
// Feels
// Reflect
//
// Debug utility to export all watch view previews to PNG files.
// Uses the exportable watch views from ExportableWatchViews.swift.

View File

@@ -1,6 +1,6 @@
//
// WidgetExporter.swift
// Feels
// Reflect
//
// Debug utility to export all widget previews to PNG files.
// Uses the real widget view layouts from ExportableWidgetViews.swift.