SwiftMiner 1.33
A broad compatibility and reliability update: SwiftMiner now supports macOS 14 Sonoma, explains subscription-gated campaigns more clearly, simplifies single-miner setups, and hardens the Twitch transports that keep mining sessions alive.
Wider Mac Compatibility
SwiftMiner now supports macOS 14.0 or later on both Apple Silicon and Intel Macs.
- Lowers the deployment target from macOS 26 to macOS 14 across the app, core and service libraries, command-line tools, publisher, and test targets.
- Keeps native arm64 and x86_64 release slices so supported Apple Silicon and Intel Macs run without translation.
- Retains graceful visual fallbacks for newer platform features: macOS 15 receives Mesh Gradient artwork and macOS 26 receives Liquid Glass, while Sonoma keeps the established material-based appearance.
- Updates the website, download metadata, and README to publish the new macOS 14 minimum consistently.
- Documents the long-term support policy: SwiftMiner will keep supporting the oldest practical macOS versions and Intel hardware until a required feature or Apple framework makes a newer platform necessary.
Clearer Campaign Status
Account linking and paid-subscription requirements now appear only where they genuinely affect mining.
- Stops unrelated unlinked public campaigns from making a miner look account-blocked after its priority filters have already ruled those campaigns out.
- Reserves the account-link blocked state for attemptable priority campaigns that genuinely belong to the miner's effective priority list.
- Falls back to no eligible campaigns when the only visible priority campaign is subscription-only and cannot earn watch progress.
- Exposes subscription-required drop counts and campaign gating through the dashboard API instead of flattening those rewards into ordinary upcoming work.
- Removes fully subscription-gated campaigns from the WebUI's Up Next list and presents a dedicated Subscription required card with clear Needs Sub labels.
- Preserves the existing priority rule: prioritised games can still be attempted before the external game account is linked when Twitch provides eligible work.
Mining Reliability
Watch sessions now follow Twitch's current transport behavior and recover their live subscriptions more predictably.
- Preserves approved-channel lists for short-lived esports campaigns when Twitch returns channels using the compact
id/namerepresentation. - Merges approved channels discovered through Inventory when the Drops dashboard omits them, allowing official broadcasts outside the exact game directory to be probed directly.
- Tracks restricted campaigns whose approved-channel list is unavailable as a distinct diagnostic state instead of silently treating them as unrestricted directory campaigns.
- Moves known approved streams ahead of directory verification limits and directly verifies restricted campaigns whenever the bounded directory scan did not find them.
- Rotates bounded directory and approved-channel probes across their overflow, ensuring lower-viewer and later-listed eligible streams are eventually checked without increasing per-scan request limits.
- Rejects unverified approved-channel guesses after directory failures and keeps empty-campaign polling at five-minute intervals so newly started drops are discovered promptly.
- Updates the Twitch live-directory persisted query used to discover eligible Drops streams.
- Sends watch heartbeats directly through Spade as the primary transport, with Twitch GQL retained as an automatic fallback when direct delivery fails.
- Tracks the PubSub topics SwiftMiner wants independently from the topics submitted on the current socket, so reconnecting cannot silently lose desired subscriptions.
- Restores PubSub topics deterministically after reconnects, splits listen and unlisten changes into bounded batches of 20, and retries failed restoration attempts with backoff.
- Force-refreshes the active campaign's complete Twitch inventory after verified progress, keeping parallel drops synchronized from server-confirmed state without inventing local progress.
Cleaner Single-Miner Experience
Controls intended for multi-account setups stay out of the way when SwiftMiner has only one miner.
- Hides the per-miner global-priorities toggle in both the native app and WebUI when only one miner is configured.
- Exposes the configured miner count through dashboard projections so every interface makes the same single-versus-multi-miner decision.
- Lets the native Miners workspace use the full available window width instead of reserving space for a secondary pane that is not needed.
- Refreshes website wording to describe SwiftMiner simply as Built for Mac.
Release Quality & Coverage
The compatibility and mining changes are backed by focused regression coverage and cleaner project metadata.
- Adds tests for unrelated unlinked campaigns, prioritised unlinked campaigns, subscription-only priority campaigns, and single-miner dashboard behavior.
- Adds focused coverage for approved-channel parsing and dashboard/inventory merging, bounded channel-probe rotation, subscription-gated WebUI state, dashboard API projections, current Twitch query metadata, PubSub batching and replay, heartbeat fallback, and campaign-wide progress refreshes.
- Cleans redundant Swift access modifiers and immutable HTTP response headers so the affected application targets build without those compiler warnings.
- Updates generated Xcode project and scheme metadata for Xcode 26.6 while keeping
project.ymlas the source of truth. - Configures GitHub Linguist to keep the repository language bar focused on the native Swift application rather than website, documentation, and release-automation assets.
- Prepared as SwiftMiner 1.33, build 2026072116.