- Cooldown cells become clickable buttons when Ready, opening Torn Items page
- New Booster cooldown link setting (Boosters/Alcohol)
- Accessibility support for action buttons
When cooldowns reach Ready, cells become clickable buttons opening
the corresponding Torn Items page. Booster target configurable
in Settings (Boosters/Alcohol).
When a cooldown reaches 0, the cell becomes a clickable button that
opens the corresponding Torn Items subsection. Booster target
(boosters vs alcohol) is read from @AppStorage preference.
- Add NetworkMonitor with NetworkConnectivity protocol for DI and testability
- Deduplicate flag mapping (MenuBarLabel now uses TornDestination.flag(for:))
- Centralize logger subsystem string in TornConstants.logSubsystem
- Fold API error check into parseDataInBackground, removing double JSON parse
- Fix fetchFactionData double JSON parse (single parse with early error check)
- Parallelize user data parse and faction fetch with async let
- Deduplicate refreshNow() by delegating to startPolling()
- Remove redundant showLoginError state in SettingsView (use computed Binding)
- Batch watchlist saves after concurrent price fetches (N saves → 1 save)
- Add change detection for offline errorMsg to avoid no-op @Published updates
- Remove unused ObservableObject conformance from NetworkMonitor
- Fix tokens CodingKey (company_funds → donator)
- Replace print() calls with os.log Logger
- Remove stub UI tests that only asserted window.exists
- Replace force unwrap developer.tornID! with safe optional binding
- Generate travel notification IDs dynamically from TravelNotificationSetting.defaults
instead of hardcoded strings, preventing cancellation gaps
- Extract duplicated developer ID (2362436) into TornConstants enum
- Change DateFormatter from computed property to static let to avoid
expensive re-creation on every render
- Remove redundant objectWillChange.send() already handled by @Published
- Migrate deprecated onChange(of:) { _ in } to new parameterless closure form
- Rename waitForExistence() to waitForAppearance() in UI test helpers
to fix infinite recursion caused by shadowing XCUIElement's built-in method
- Add else branch in fetchItemPrice() so watchlist items show "Parse Error"
instead of staying stuck in loading state when JSON parsing fails
- Change AttackResult.id from computed property (generating new UUID on
every access) to stored property assigned once at init, preventing
SwiftUI re-render thrashing in ForEach
Delete binary release archives MacTorn-v1.4.4.zip through MacTorn-v1.4.7.zip from the repository. Removes the four zipped release files from version control to clean up binary assets and reduce repo size.
- Add preferred browser support for opening Torn links
- Add GitHub Actions integration with Claude Code
- Add BrowserManager utility for managing browser preferences
Add in-app feedback prompt with progressive timing thresholds
(1 hour, 1 week, 1 month) and 5-minute cooldown. Includes
FeedbackPromptView, AppFeedbackState model, and comprehensive
test coverage.
The "Released! 🎉 - You are now free" notification was incorrectly
triggering when landing from airplane travel. Changed condition to
only fire when transitioning from Hospital or Jail status, not any
non-Okay state like Traveling.
Bumps version to 1.4.6.
Added a markdown file with instructions for creating a new version release, including changelog and version updates. Also added the MacTorn-v1.4.5.zip file for direct distribution.
- Use API timestamp directly for travel countdown calculations
- Add fallback to timeLeft for backward compatibility
- Add comprehensive test coverage for remainingSeconds method
- Bump version to 1.4.5
- Add CHANGELOG.md
Create wiki/ directory with 11 markdown pages covering:
- Home, Installation, Getting Started guides
- Features documentation for all tabs
- API Setup with permissions and security
- Configuration options and settings
- Troubleshooting and FAQ
- Development guide with architecture overview
- Changelog with version history
- Sidebar navigation
Extract watchlist mutations into dedicated @MainActor functions to avoid
actor-isolated property access issues in async context. This fixes CI
build failures caused by strict concurrency checking.
Refactored watchlist item updates to use value semantics by copying, modifying, and reassigning the item in the array. This prevents issues with direct mutation of value types in Swift arrays and ensures changes are properly reflected.
- Fix Reduce Transparency mode in light mode (dark buttons issue)
- Lower opacity values for better readability when reduceTransparency is enabled
- Add Accessibility section to README documenting macOS accessibility support
- Update README with new light/dark mode screenshots
- Bump version to 1.4.4
- New Travel tab with flight status, progress bar, and quick destination picker
- Live countdown timer in menu bar during flight (✈️🇺🇸 5:32 format)
- Pre-arrival notifications (configurable: 2min, 1min, 30sec, 10sec before landing)
- Country flag emojis for all 11 Torn destinations
- Live countdown updates every second in both menu bar and app views
- Bump version to 1.4
- Add bombel as developer/creator with highlighted section
- Add Special Thanks: kaszmir, dylanwishop, constanziagatta
- Add faction link: The Masters
- Add company link: Glory Holes Productions
- All entries link to respective Torn pages
- Create CreditsView with placeholder contributors
- Contributors can have Torn profile links (auto-generated from ID)
- Support for multiple sections (Special Thanks, Beta Testers)
- Navigate to Credits via heart icon button in Settings footer