// WRITING - Word Tracker
Journey
Auto-generated, unpolished by design — a raw log of what changed and when, not a curated changelog. Each entry is a short line pulled straight from commit and build activity, timestamped and permalinked. Read the Journey rollup instead for the synthesized, editorial version of this same activity.
- 19/08/2026Bumped the version to 2.0.2.#
- 17/08/2026Fixed a notification suppression bug where ViewModels failed to refresh active project data when a project was resolved via fallback logic. The fix ensures each data change handler is self-sufficient by calling resolveActiveProject() instead of getActive().#
- 16/08/2026Fixed several performance hangs in the projects list and statistics charts by optimizing SwiftData queries, batching fetches, and switching to a LazyVStack for row rendering. I also addressed a continuous idle-hang issue caused by redundant CloudKit remote-change notifications by suppressing no-ops at the source.#
- 14/08/2026I added a synthetic dataset for stress-testing the app under heavy SwiftData load, including a large number of projects and high-frequency entries. I also hooked it into a launch-environment flag and wrote UI tests to catch app hangs under these specific high-load scenarios.#
- 13/08/2026Fixed a main-thread hang caused by synchronous CloudKit remote-change notifications piling up in SwiftUI's AttributeGraph. I also addressed an iPad-specific keyboard focus crash when dismissing edit sheets and filtered out noise from the Firebase Installations API in Sentry.#
- 11/08/2026Fixed a fatal hang during launch and CloudKit sync by replacing in-memory entry sorting with targeted FetchDescriptor queries in BookProjectHelper/EntryHelper.#
- 10/08/2026Fixed an issue where Firebase Analytics wasn't correctly capturing counts_match because it's a budget-constrained the raw Swift Bool type. I encoded it as a String to ensure it's reported correctly in GA4.#
- 28/07/2026Updated App Store metadata and screenshots for version 2.0, specifically reflecting the changes to the SwiftUI and CloudKit sync model. Also handled some Fastlane configuration and version bumping.#
- 27/07/2026Fixed a bug where the AppRating prompt appeared on every word count update by adding a 7-day throttle. Replaced the Survey SPM package with a native graduated re-prompt system for better control over survey logic.#
- 26/07/2026Refactored BookProjectController to use a constructor-injected SwiftDataServiceProtocol, aligning with the service isolation pattern used by RemoteConfig and Crashlytics. I also removed the AppNavigating proxy in favor of direct AppCoordinator references for non--mutating navigation and consolidated analytics logging into a single persistence call.#
- 25/07/2026Removed the legacy Realm CRUD wrapper and its associated UserController, cleaning up the codebase by switching to direct SwiftData reads and writes. This included pruning the core database service wiring and removing related mock and test files.#
- 21/07/2026I'm tidying up the codebase by strictly trimming multi-line comments across the core, unit tests, and UI tests. Moved complex logic explanations to `docs/tech_notes/` to keep the file contents cleaner.#
- 20/07/2026I replaced the BuyMeCoffee sheet flow with an inline tip jar on the ProfileView. This included refactoring the theme injection via environment variables and updating the UI tests to handle the deterministic purchase flow.#
- 18/07/2026Added analytics for project deletion and setup cancellation, and updated the SwiftData and CloudKit error reporting to include Crashlytics non-fatals for previously silent failures.#
- 17/07/2026Fixed a layout issue where the circular progress ring was being compressed by SwiftUI's stack-layout flexibility probing in narrow layouts. Audited and closed several analytics coverage gaps across the migration onboarding and project setup flows, including adding telemetry for 1.4 to 2.0 data migrations.#
- 16/07/2026Switched to tolerant precision for live-vibrancy alert snapshots to handle GPU-compositor-driven jitter in UIVisualEffectView. The previous zero-tolerance approach caused non-deterministic test failures.#
- 15/07/2026I replaced the Daily Progress keyboard toolbar 'Done' button with an inline '+' button to resolve a race condition and added a survey alert system with associated analytics and snapshot testing.#
- 14/07/2026I've updated the active project state to be stored in per-device UserDefaults instead of SwiftData, avoiding potential CloudKit sync races. I also introduced a DraftBookProject to stage project setup edits, ensuring writes to the grant store only occur once on confirmation.#
- 13/07/2026I added a new script and updated the Fastlane test lane to support scoped UI test identifiers. This allows CI and local dev to run only the changed UI tests instead of the full suite, significantly speeding up the test cycle.#
- 12/07/2026Fixed stale SPM package version pins in `project.yml` to resolve `xcodegen` generation errors. This also addressed a dangling revision for `UICircularProgressRing`.#
- 08/07/2026Fixed UI freezes in the project list when creating a new project and corrected the navigation logic for cancelling project setup steps. Also addressed a state seeding issue in the calendar view to ensure it opens to the told month for existing deadlines.#
- 07/07/2026Fixed a Sendable violation in the app coordinator by scoping @MainActor to the ModelContext construction, and addressed a recurring SwiftUI keyboard-toolbar frame warning that's a known framework artifact.#
- 06/07/2026Added regression coverage for project setup, soft-delete flows, and multi-device warnings. Fixed a regression where the app rating prompt was missing from the production call site and corrected accessibility labels on several icon-only controls and DSTextField instances.#
- 05/07/2026Fixed a crash in the migration process by pinning the migration Task to the MainActor to ensure thread-safe access to SwiftData's ModelContext. Also improved CI stability by switching to ad-hoc signing for test builds and fixing a Firebase data collection gate to prevent hanging test runners.#
- 04/07/2026Added comprehensive regression testing for the Dashboard, Projects List, Statistics, and Profile views to verify SwiftData persistence across the Realm migration. Fixed several CI test runner hangs and environment variable leaks in the UI test suite, including a fix for a race condition during app restarts.#
- 03/07/2026Fixed two migration race conditions where users could end up with phantom projects or lost data. Implemented lock-protected, shared migration tasks and a data-validation cleanup step to ensure idempotent, successful migrations.#
- 02/07/2026I handled a series of complex Realm migration and synchronization issues, including a schema version bump to resolve a property removal conflict. I also implemented a live-step derivation for project setup and a lazy database service to prevent premature file creation.#
- 01/07/2026Migrated the persistence layer to SwiftData, replacing Realm-based CRUD. Also worked through a multi-round debugging process to establish live CloudKit sync via silent push notifications and corrected the navigation flow for clearing all user data.#
- 29/06/2026I implemented a one-time Realm to SwiftData migration service that runs on the main actor during the splash screen. I also fixed several issues that were causing the splash screen to hang on fresh installs, primarily related to a CloudKit-backed ModelContainer save and auth observation sequencing.#
- 28/06/2026Restructured the project layout to move all Xcode content into an ios_app/ subdirectory, updated Fastlane configurations for CI compatibility, and set up GitHub Actions workflows with selfongan-hosted runners.#
- 23/03/2026Fixed refresh issues in the Projects View and corrected the back navigation logic on project setup screens.#
- 22/03/2026Styled the Auth page.#
- 03/03/2026Migrated the Access View to use routes and reorganized folder structures to clean up dependency injection. Also added the profile routes.#
- 02/03/2026Refactored the coordinator to an observable pattern and moved Firebase Auth to a dedicated AuthService. Added new route structures and a splash screen.#
- 28/02/2026Refactored the ViewModels to handle all dependencies, moving them away from the view layer. Cleaned up some logic by simplifying the general return types and conditional guards.#
- 26/02/2026Fixed crashes related to Firebase model versioning and navigation to the Profile page, and addressed an issue where the logout alert was missing.#
- 22/02/2026Moved Realm SPM to GitHub and updated the codebase with documentation for adding code and tests.#
- 18/02/2026Added Claude agents for PO (Product Owner) and BA (Business Analyst) roles.#
- 17/02/2026Fixed a portion of the issues with the authentication system.#
- 16/02/2026Fixed several navigation and word count bugs, and updated the project deadline screen's snapshot tests.#
- 15/02/2026Cleaned up SwiftUI views and updated snapshots across multiple screens (Access, Daily Progress, Statistics, and others) to reflect UI changes.#
- 14/02/2026Added the Auth screen to the SwiftUI version of the app and fixed several UI and navigation bugs, including a crash on the Profile screen.#
- 13/02/2026Integrated the DesignSystem SPM package into the SwiftUI version of the app to reuse shared components.#
- 11/02/2026Migrated the project from CocoaPods to Swift Package Manager for SnapshotTesting, SwiftChart, and RealmDatabaseService, then removed the CocoaPods configuration.#
- 13/10/2022Updated the project to run in Xcode 16.#
- 02/03/2022Merged the firebase auth feature and updated Apple Review notes for the release.#
- 01/03/2022Updated the mock store kit to differentiate it from production data and switched to using openConnection for all Firestore calls. Also fixed a state synchronization issue where the active project state was lost when removed on a secondary device.#
- 28/02/2022Updated tests for the sync and merge book projects controllers, added a product ID return for purchase restores, and implemented a basic loading indicator across the project.#
- 27/02/2022Updated tests for BookProjectController and DateHelper, and refactored sync book project logic to improve testability.#
- 26/02/2022Didn't store isActive state for BookProject in Firestore DB. Added a retention day count for a deleted book project.#
- 24/02/2022Added a `cloudSyncEnabled` flag to Remote Config to allow for an emergency disable of the sync service. Fixed a UI lag in the Profile Scene and adjusted layout constraints for the DailyProgressCard to handle multitasking.#
- 23/02/2022Fixed a bug where listeners were enabled before purchase, and optimized Firestore calls during project creation by skipping the sync step until after the project is fully added.#
- 22/02/2022Fixed a broken DB migration and moved entitlements to the resources directory.#
- 21/02/2022Added Apple Sign-in for authentication, and updated tests for RemoteConfig, Analytics, and the profile scene.#
- 20/02/2022Fixed test compilation errors and resolved several missing file references throughout the project.#
- 19/02/2022Handled IAP purchase flows and fixed styling and height issues for product cards in the scroll view.#
- 18/02/2022Added support for In-App Purchases (IAP), including profile buttons, UI styling, and analytics tracking. Started migrating hardcoded IAP products to a dynamic table.#
- 17/02/2022Started implementing in-app purchases (IAP) and set up a controller to handle transactions, analytics, and crashlytics.#
- 16/02/2022Refactored `Encodable.asDictionary()` and updated the analytics tracking for `User` types, while also running a battery of tests for the/ProfileViewModel and AccessViewModel.#
- 10/02/2022Moved all mocks to a static library to clean up the main WordTracker target. Also prepped FirestoreHelper for testing.#
- 07/02/2022I'm testing and updating tests for the sync controller and user controllers, focusing on day-to-day logic like login and account changes.#
- 06/02/2022Refactored the sync logic for book projects to consolidate merge logic and cloud listener triggers. I also started testing the `getMergedAndForDeletionBookProjects` method.#
- 03/02/2022Tested several methods in SyncController to validate account management and project synchronization behaviors, specifically focusing on user listeners and cloud purchase flows.#
- 02/02/2022Tested the SyncController.updateActiveBookProjectInCloud() method to ensure correct cloud project state synchronization.#
- 30/01/2022Finished the basic book projects merge logic and updated the cloud sync for title changes, word counts, and project management actions. Also fixed several listener rules and account management flows.#
- 28/01/2022I started working on the book projects merge and added logic for merging entries.#
- 27/01/2022Started work on syncing book projects to handle cases where projects are deleted. Added a test for the update-deleted-book-project action and an extension to convert Codable objects to a Dictionary.#
- 25/01/2022Refactored UserController and moved mocks to separate files for better organization. Fixed a bug with UserSyncStatus and updated the DashboardCoordinator to refresh the UI after login and cloud user changes.#
- 24/01/2022Started refactoring the sync engine, though the project is currently in a state where it's compiling but not yet fully functional.#
- 23/01/2022Updated and added flow charts for cloud sync in the documentation to reflect current architecture, and updated the models.#
- 20/01/2022Started refactoring the AuthService.#
- 19/01/2022Refactored FirestoreService to clean up the service layer.#
- 17/01/2022Added a listener for book project changes and refined the cloud update logic to handle specific use cases like deletion and switching.#
- 16/01/2022I've implemented the cloud sync data coordinators and controllers, along with a listener for user changes in the cloud. I also fixed a bug where new projects stayed on the dashboard after being added.#
- 14/01/2022Refactored the Firestore collection names for better consistency.#
- 13/01/2022Integrated Firestore for the backend database and implemented the basic authentication logic.#
- 11/01/2022Added a profile photo avatar for logged-in users, styled the profile scene for smaller screens, and implemented the scene's login/logout logic with a confirmation alert.#
- 10/01/2022I added an empty profile scene, a toast notification for errors, and logic for handling logged-in users who haven't purchased the cloud feature.#
- 08/01/2022Added an Access Scene as the first scene of the experience.#
- 07/01/2022Created the AuthService to handle Firebase Auth logic and added an auth delegate to manage actions following login.#
- 04/01/2022Added FirebaseUI for Google and OAuth, along with a URL Scheme for Google Sign-in.#
- 30/12/2021Fixed a crash on initialization for iOS versions below 15.0 using a workaround for Xcode release notes issues.#
- 14/12/2021Released version 1.3.2_1.#
- 13/12/2021I added a Crashlytics service to manage crash reporting and non-fatal errors based on the scheme, with a few updates to the build script and Firebase version.#
- 01/12/2021Updated certificates and profiles, and automated the debug mode toggle.#
- 30/11/2021Updated the ViewFactory Swift Package and the corresponding SP, added a new BaseCell, and cleared up Xcode warnings.#
- 28/11/2021Moved ViewFactory to a separate repository and modularized it into a Swift Package to clarify dependencies and reorganize the folder structure.#
- 27/11/2021Prepared Button and Input factories, plus ViewFactoryProtocol dependencies, for migration to Swift Package Manager (SPM).#
- 22/11/2021Updated RealmDatabaseService to support Xcode 13.#
- 11/11/2021Rebuilt the pod components.#
- 22/04/2021Refactored CalendarView to use StringHelper for weekday labels and moved the selected date holder to the calendar control. Removed redundant month name strings.#
- 10/04/2021Moved the CalendarView into its own package and added a README.#
- 07/04/2021Updated snapshots and snapshot tests, and tweaked the description for the project card delete action.#
- 30/03/2021Updated the images on the promo website.#
- 26/03/2021Merged release 1.3.0_1 and addressed several project setup and migration issues, including a bug where migrating projects would reset the creation date to 1970.#
- 25/03/2021Updated the project title scene to include a cancel button and performed extensive snapshot testing across various project states (active, inactive, expired). Migrated the database and updated demo projects for the AppStore submission.#
- 24/03/2021Tested various `ProjectViewModel` methods and the `ProjectsCoordinator` to verify state management and progress tracking logic.#
- 23/03/2021Handled expired projects and ran a suite of tests for ProjectsViewModel methods, including sorting and localization.#
- 22/03/2021Fixed UI layout issues and added analytics tracking for button interactions and project switching.#
- 21/03/2021Added project card logic, handled click events, and fixed several UI bugs related to project card state and sorting.#
- 20/03/2021Implemented the project list view using a table factory and cell view models. Switched to a card-based layout for the projects table.#
- 19/03/2021Added logic for managing multiple book projects, including the title setup flow, active project selection, and basic view controller components.#
- 14/03/2021Merged the release 1.2.6_1 and updated the AppStore screenshots and readme.#
- 02/03/2021Added survey responses and generated a report based on 11 of them.#
- 20/02/2021Added a survey response feature to the product.#
- 17/02/2021Tested and refined animation functions and chart highlighting in the StatisticsViewController, while updating snapshot tests and increasing button sizes for accessibility.#
- 16/02/2021Added a progress ring to the WordCountCard and implemented logic for calculating the overall progress percentage. Also cleaned up and updated various unit and snapshot tests to ensure build stability.#
- 09/02/2021Added Firebase Remote Config and refactored the AnalyticsService to allow for concurrent use with the new remote config logic.#
- 08/02/2021Added a new Survey module with its own protocol, mocks, and unit tests for various alert and button interactions. Integrated analytics and connected the production survey link.#
- 07/02/2021Reorganized the project structure to improve modularity, specifically focusing on the restyling of target folders and the most common UI components. I also began migrating parts of the logical flow to a new Survey module.#
- 04/02/2021Tested the lifecycle and setters for both DailyProgressViewController and StatisticsViewController, specifically checking how the input fields and page transitions work.#
- 01/02/2021Refactored ScrollFactory and CardFactory classes to separate out ScrollView, and completed unit tests for the input and lifecycle logic in ProjectWordCountViewController and ProjectDeadlineViewController.#
- 31/01/2021Refactored ProjectSetup, DailyProgress, and Statistics view controllers to align with new logic. Also updated the ConstraintHelper for improvements.#
- 26/01/2021Refactored factories and helpers into StyleHelper and ViewFactory, and standardized test environment mocking by replacing Date.current with MockDate.now across the app.#
- 25/01/2021Refactored the view layer to expose subviews and updated the factory pattern to include DependencyProtocols for ViewControllers.#
- 19/01/2021Removed duplication in AnalyticsHelper and completed testing for DateFormatHelper, StringHelper, and DemoHelper.#
- 18/01/2021Refactored ApplicationCoordinator for code reuse and added leak tests to ensure memory stability. Also addressed a bug where calendar changes wouldn't persist due to an incorrect deadline update logic.#
- 14/01/2021Refactored DashboardCoordinator to improve code organization and added unit tests.#
- 13/01/2021Refactored the project and statistics coordinators, adding tests for each. Also fixed a bug where preserved scenes state was incorrectly handled when deleting a project.#
- 12/01/2021Refactored StartupController to reduce dependencies and added coordinators for better orchestration.#
- 22/12/2020Refactored the test suite to isolate snapshot tests into a different target. Also updated the DateFormatHelper to use a protocol and added more model validation tests.#
- 20/12/2020Tested the localization of various view models including ProjectTitleViewModel, ProjectWordCountViewModel, ProjectDeadlineViewModel, and DailyProgressViewModel. I also updated the AppStore metadata and fixed a fastlane test lane for snapshot tests.#
- 17/12/2020Added an upload missing symbols lane to the Fastlane configuration.#
- 15/12/2020Moved Firebase initialization to the AppDelegate to fix a crash. Also added split-screen support for iPad.#
- 14/12/2020Fixed the calendar deadline display for past-due dates and addressed issues with invalid metadata.#
- 13/12/2020Fixed navigation bugs during project deletion and corrected the tick info logic to include initial tick, createdAt, and deadline dates.#
- 12/12/2020Refactored chart data logic, added labels for date values, and implemented TDD for tick value calculations. Also addressed some UI polish on the data visualization pages and handled the App Store screenshot updates.#
- 11/12/2020Moved logic for dates and entries into dedicated helper functions to clean up the controller logic.#
- 06/12/2020I added a tab bar for the Dashboard and Statistics scenes, split the chart setup into separate modules, and implemented the data fetching for the progress chart.#
- 05/12/2020Added snapshot testing for project deadlines and daily progress views, then integrated a chart pod to display overall progress. I also fixed a pod issue that was blocking device runs and split the progress views into separate components.#
- 04/12/2020Added snapshot testing for the project overview and progress view controllers, along with various use cases for title and word count.#
- 29/11/2020Added project deletion functionality and fixed a persistent ViewModels issue during project removal. I also addressed memory leaks and updated the project target versions to align the pods.#
- 28/11/2020Refactored the dependency injection system using a DIP pod and a Dependency Container, moving away from manual ViewModel initialization. Also broke out individual cards into separate views to declutter the main ViewControllers.#
- 22/11/2020I've set up Firebase, fastlane for CI/CD, and integrated Google Analytics for button clicks and project updates. I also finalized the core promotional website and adjusted UI fixes for the iPad version.#
- 21/11/2020Updated the calculation logic for book project parameters and adjusted the UI to display the base word count separately. Fixed a scroll view issue and added deadline validation to the title setup flow.#
- 20/11/2020Updated the UI with a new color palette, adjusted layout spacing and progress indicators, and disabled automatic navigation on completion to allow for input review.#
- 19/11/2020Refactored the progress ring components to support custom values over 100% and moved the setup logic into a factory. Added a motion effect for device tilting and updated some minor UI styling.#
- 18/11/2020Fixed a scroll issue on the iPhone SE (1st gen) and added a header with navigation controls for the month view in the calendar.#
- 17/11/2020Refactored layout constraints using a ConstraintHelper to standardize UI components across multiple view controllers, while adding unit tests for the view models and styling the Daily Progress page.#
- 16/11/2020TDD-driven development of the BookProjectController methods for word count progress tracking. Added a calendar view and UI styling for the project title and word count pages.#
- 15/11/2020Added project setup pages, a new word count view, and a deadline view with their respective ViewModels. Also tested and refactored logic for book project controller actions.#
- 14/11/2020Created the project skeleton with Realm for persistence, added basic models and a DailyProgressViewModel with initial unit tests.#