SwiftMiner Release Notes
Recent Sparkle update history
- Combines artwork and miner-picture choices into General settings, removes unused display controls, leaves IRL campaigns off by default, and simplifies local dashboard credential changes.
- Uses Discord's official mark for Discord sign-in and reports public dashboard availability from the live SwiftBot connection.
- Updates Twitch's campaign-discovery and inventory queries to the current persisted-query revisions, clearly flags future compatibility changes, and safely handles duplicate progress records from Twitch.
- Uses linked Discord or Twitch profile pictures in the web dashboard and native miner list, falling back to the miner status symbol when neither is available.
- Adds a direct Overview button to each native miner operator header.
- Updates SwiftMiner to version 1.36.7 build 2026080212.
- Uses a linked Discord display picture in the web dashboard when Twitch only has its generic placeholder.
- Updates SwiftMiner to version 1.36.6 build 2026073112.
- Fixes Release builds showing a Twitch-placeholder avatar in the web dashboard by waiting for Keychain accounts to load before avatar resolution begins.
- Updates SwiftMiner to version 1.36.5 build 2026073015.
- Loads the web dashboard's Twitch profile picture before its first page instead of showing a placeholder.
- Adds independent Twitch and Discord OAuth provider switches in Settings.
- Gives a linked Discord operator the full web dashboard, matching the native operator designation.
- Updates SwiftMiner to version 1.36.4 build 2026073014.
- Unifies miner status across the app, Discord, and web dashboard, with clearer waiting, authentication, recovery, and stalled-mining states.
- Keeps completed campaign history and artwork visible outside the live curated feed, including on the web dashboard.
- Improves dashboard account identity, completed-drop summaries, and priority artwork for older game rules.
- Shows prioritised games in a responsive Overview grid, adding a second row instead of clipping games off the right edge.
- Updates SwiftMiner to version 1.36.3 build 2026073013.
- A miner now describes itself from one shared state, so its details and its card can no longer contradict each other.
- Stops the wait between scans drifting: time spent checking approved channels used to push every later check further out, stretching a sixty-second re-check closer to seventy.
- Adds profiling markers around channel selection and approved-channel checks to help explain high CPU use while idle.
- Adds a state-consistency test suite that fails if any two surfaces claim a miner is both finished and working.
- Preserves every critical Twitch mining signal in delivery order, including claims and stream-offline notices, while reconciling silent real-time progress safely.
- Uses macOS network notifications for immediate recovery, protects active watch heartbeats from App Nap, and records safe per-host request timings for support diagnostics.
- Registers for MetricKit reports to surface system-observed hangs, energy issues, and crashes.
- Keeps prioritised games mineable while placing link warnings in Pending instead of the actionable queue; Up Next omits ended and fully-earned campaigns.
- Prevents idle miners from showing a vague Attention label and makes muted link reminders name the unlinked game account.
- Explains miner failures directly in the miner tab, keeps overview cards focused on status, adds a selected-miner-only refresh action to the Miners toolbar, and gives priority queues a stable global-priorities layout.
- Prevents refreshes from overlapping a new watch session, ignores intentionally cancelled heartbeats, and explains attention caused by missing drop progress.
- Updates SwiftMiner to version 1.36.2 build 2026073009.
- A miner waiting for a stream no longer reports Drops complete while its card says Looking for Streams.
- Records the campaign a miner is waiting on when the channel search comes up empty, so its reported state matches reality.
- Backs off re-checking approved channels that have been offline a long time, capped so rediscovery stays within five minutes.
- Stops retrying the followed-channel lookup for sessions Twitch will never serve it for, which was costing a token refresh every attempt.
- Updates SwiftMiner to version 1.36.1 build 2026072912.
- Game artwork saved before higher-resolution box art existed now upgrades itself on load, instead of staying soft on an upgraded install while a fresh one looked correct.
- Explains why clearing the artwork cache never helped: it discarded the images, then refetched them from the same low-resolution link.
- Leaves your own uploaded artwork untouched, and still discards artwork remembered from a purgeable system cache folder.
- Updates SwiftMiner to version 1.36 build 2026072911.
- Restores real-time drop progress for every account: a made-up 30-day token deadline was failing each refresh instantly and silently taking the live connection offline, even though the token was still valid.
- Revalidates such tokens with Twitch instead of trusting an invented expiry, and surfaces a genuinely rejected token as an account needing reconnection.
- Shares approved-channel liveness checks across miners, ending the 641 probes and 22 minutes of rate-limit backoff that idle miners were spending every few minutes.
- Keeps the liveness cache window below the probe interval so an approved channel going live is still caught on the next tick.
- Stops the followed-channel lookup retrying after failure, which was forcing a doomed token refresh every time.
- Stops a miner waiting for a stream reporting Drops complete by including the game the scheduler actually chose.
- Updates SwiftMiner to version 1.35.11 build 2026072910.
- Stops a miner reporting Subscription Required as its current state; subscription-gated campaigns count as finished work and stay visible as a mutable Pending reminder.
- Stops a subscription-gated campaign suppressing the Up next row for another campaign in the same game.
- Fixes the multi-miner launch slowdown that could leave accounts on Updating for more than three minutes by combining a bounded fleet request budget with the existing five-request-per-second ceiling for each miner.
- Coalesces campaign refreshes at the Twitch client boundary so the mining engine and dashboard share one campaign-detail fan-out.
- Lets simultaneous miners share safe campaign definitions while keeping progress, claims, authentication and uncertain account-link state isolated per account.
- Prioritises followed streamers with one paginated lookup instead of one subscription request per candidate channel.
- Explains Smart's deadline-first queue ordering and reports real per-miner channel checks instead of claiming every queued campaign has no eligible live channel.
- Keeps completed and unlinked campaigns out of prospective Up next and Then positions, and only says Watching or Currently mining for a real watch session.
- Restores the Drops "Needs Setup" filter so live unlinked campaigns remain visible without blocking explicitly prioritised mining.
- Updates SwiftMiner to version 1.35.1 build 2026072909.
- Restores drop claiming by reading Twitch's current
claimDropRewards mutation response, which SwiftMiner had never been reading, while retaining compatibility with the legacy field.
- Recognises Twitch's real successful and already-claimed statuses, making repeated claim attempts safely idempotent.
- Confirms an otherwise unreported claim across several spaced inventory reads rather than one immediate read that Twitch's inventory had not yet caught up with.
- Surfaces Twitch GraphQL messages, distinguishes an explicitly empty claim payload from an unrecognised response shape, and names the fields Twitch actually returned.
- Restores claim counters, the earning ledger, claim notifications, Discord claim events, per-drop claim tracking and Twitch inbox cleanup, all of which depend on a recorded claim.
- Records every claim per account so claim history and the Discord "claims today" and "drops claimed this week" figures report real numbers instead of always zero.
- Restores credited watch progress by sending Twitchβs complete current minute-watched beacon payload, while preserving heartbeat fallback behaviour.
- Shows cumulative watched minutes out of required minutes across every timed drop in a campaign, with live timers and progress bars consistent between Overview and Miners.
- Brings WebUI progress into parity with the app by using the miner's reconciled persisted ledger rather than only the partial drops in Twitch's latest inventory response.
- Redesigns each miner as an operator detail view with identity and live health, a Now β Next β Then summary, a resolved campaign queue, compact subsystem checks and priority controls, with detailed recovery history kept secondary.
- Adopts macOS Tahoe grouped surfaces with sentence-case sections, roomier spacing, larger concentric corners and a plain source list with a soft selection pill.
- Gives the current and upcoming campaign matching artwork sized to fit the detail beside it, with larger queue thumbnails and a vertical fallback at constrained widths.
- Groups uptime, last poll and the miner's actual health verdict into equal-width header cells, and aligns health-check statuses and timestamps into fixed columns below.
- Carries the same status cluster into the Overview banner with fleet-wide averages and a health summary across every miner.
- Reports the health verdict itself instead of restating the current campaign, and removes duplicated claim and status summaries.
- Shows the linked Discord account avatar in the miner header when available, with a local initial fallback.
- Adds a Settings βΊ Appearance option to take miner pictures from Twitch instead of Discord, with a fallback to the other service and cached pictures that appear immediately at launch.
- Shows Updating during launch-time campaign and progress refreshes instead of prematurely reporting Up to Date, and no longer presents unlinked, non-prioritised campaigns as mineable.
- Removes completed campaigns from the queue while retaining prioritised unlinked games as actionable Needs setup rows.
- Keeps a prioritised game in the Drops feed for its whole run instead of hiding it once its rewards are all claimed.
- Counts campaigns a miner is actually watching, so a campaign one account has finished is still counted while another account mines it.
- Keeps prioritised artwork visually stable when returning to Overview instead of replaying a placeholder crossfade.
- Restores prioritised Overview artwork from the launch cache and shares a persistent campaign-image cache with Drops, so artwork survives relaunches.
- Requests sharp 600Γ800 Twitch artwork, defaults to Twitch instead of Steam, and rejects Steam's blank grey placeholders so games such as THE FINALS and Battlefield 6 keep real artwork.
- Smooths Miners-tab scrolling with lazy off-screen sections, a single activity-snapshot resolve per row, a lighter header treatment and reduced uptime redraws.
- Only requests Discord display names when a miner is actually linked, so an unreachable companion service cannot delay opening the Miners tab.
- Restores campaign details, account-link state and recent progress from disk during the first live refresh, avoiding the cold-launch details fan-out without letting cached data drive mining.
- Centers animated refresh symbols on their visible glyph so they rotate in place instead of orbiting.
- Refreshes the website captures and adds 36 light/dark contextual screenshots across all 20 help articles.
- Adds claim regression coverage built from real Twitch responses, plus coverage for campaign ordering, cumulative progress, WebUI parity, eligibility filtering, startup status, persistent caches, account isolation, avatars and beacon payload parity.
- Updates SwiftMiner to version 1.35 build 2026072814.
- Fixes a 1.34.5 launch regression that made multi-account miners wait behind a large dashboard campaign refresh before their workers could start.
- Gives mining startup first use of the coordinated Twitch request budget by moving account-state hydration into delayed background work.
- Coalesces simultaneous campaign refreshes for the same account so the mining engine and dashboard cannot duplicate the full campaign-detail request fan-out.
- Updates SwiftMiner to version 1.34.51 build 2026072615.
- Rebuilds earning accounting around stable account IDs, monotonic per-drop movement and authoritative inventory reconciliation, rejecting impossible jumps and repeated external-claim detections.
- Hardens PubSub, dual-transport heartbeat delivery, probationary channel selection and automatic recovery for both single- and multi-account installations.
- Coordinates Twitch requests and server-directed cooldowns across every miner account, preventing multi-account request bursts and recovery stampedes while the Mac is offline.
- Correctly treats HTTP 408, 429 and temporary 5xx responses as recoverable, with cancellation-safe jittered retries and support for both numeric and HTTP-date Retry-After headers.
- Places monotonic deadlines around staged recovery so a stuck refresh, restart or authentication operation cannot block the watchdog indefinitely.
- Confirms ambiguous drop claims against a fresh authoritative inventory and backs off classified transient failures instead of repeatedly submitting the same claim.
- Moves active mining cadences and candidate cooldowns onto monotonic, cancellation-aware timing.
- Adds combined-fault and repeated multi-client soak coverage for outages, 503s, 429s, recovery deadlines and ambiguous claims.
- Updates SwiftMiner to version 1.34.5 build 2026072614.
- Fixes the Watching β Not Earning check added in 1.34.3, which never fired because normal mining reset its timer every few minutes before it could reach its threshold.
- Fixes the Earning Ledger, which derived earnings from an account-wide total that falls when a drop is claimed and jumps when a campaign rejoins the account; earnings are now counted per drop. Figures recorded by 1.34.3 should not be trusted.
- Cuts campaign detail requests to Twitch by roughly twenty times: the cache expired at exactly the refresh interval so it never hit, and shared campaign details are now reused across accounts for unlinked campaigns too.
- Watching without earning is now shown in the app and diagnostics without sending a notification, and is recorded separately from the supervisor's Mining Progress Stalled alert.
- Updates SwiftMiner to version 1.34.4 build 2026072516.
- Detects miners that keep watching without earning any drop progress and flags them as Watching β Not Earning, with a notification; previously this could continue for hours while every health check reported the miner as healthy.
- Adds an Earning Ledger recording how many drop minutes each miner banked per hour spent watching, kept for seven days and available from Settings β Advanced β Diagnostics.
- Diagnostic reports now include earning history and non-earning hours, and the miner Recovery Timeline shows real events instead of always being empty.
- Corrects the README platform badge, which advertised macOS 26 or later instead of macOS 14 or later.
- Updates SwiftMiner to version 1.34.3 build 2026072413.
- Fixed the Overview progress bars resetting to zero and sweeping up on every open or refresh; each bar now shows its true progress immediately and animates only real changes.
- Updates SwiftMiner to version 1.34.2 build 2026072310.
- Reconnects the Twitch live-events (PubSub) channel from within the mining loop, so a mid-session drop no longer leaves real-time progress detection offline until the app or a miner restarts.
- Stops looping on a campaign that can't earn: after repeated stalls with no progress or external claims, SwiftMiner skips it for a cooldown and finds other work or goes idle, then retries later β any verified progress clears the skip immediately.
- Adds tests for the non-earning campaign cooldown.
- Updates SwiftMiner to version 1.34.1 build 2026072309.
- Fixed a reconnect loop in the Twitch live-events (PubSub) client where a replaced connection's own shutdown could be misread as a failure and trigger extra reconnects; cancelled connections now exit quietly, keeping live drop-progress tracking stable.
- Corrected the active-watch loop's timing so stream-offline detection and the fallback progress poll run on their intended sixty-second schedule instead of roughly every two and a half minutes.
- No longer abandons a drop within about ten minutes of completing when a higher-priority campaign goes live, unless that new campaign's own window is about to close.
- Prefers the campaign whose next drop is closest to completing when other ranking factors are equal, so partially-earned drops are finished first.
- Honors Twitch rate-limit responses by waiting out a short Retry-After and retrying automatically instead of surfacing an error.
- Detects an unclean shutdown (crash, force-quit, or power loss) and offers a pre-filled bug report on the next launch.
- Routes the mining engine's diagnostics through the macOS unified log so installed-build activity is recoverable with Console.app, without ever logging authentication tokens.
- Reworks settings observation and trims the Overview render path so changing one preference no longer refreshes unrelated interface, and unchanged refreshes are skipped.
- Adds continuous integration (build, full test suite, and a Sparkle-configuration check on every change), splits several large source files, and expands automated coverage to close to 390 checks.
- Updates SwiftMiner to version 1.34 build 2026072216.
- Lowers SwiftMiner's minimum requirement to macOS 14.0 across the app, libraries, tools, publisher, and tests while retaining native Apple Silicon and Intel release support.
- Keeps newer macOS 15 and macOS 26 visual features behind availability checks so Sonoma receives the established material-based appearance.
- Documents a compatibility-first support policy: older macOS versions and Intel remain supported until required features or Apple frameworks make a newer platform necessary.
- Softens account-link status so unrelated unlinked public campaigns no longer make a healthy miner look blocked after priority filtering leaves nothing to mine.
- Shows account-link blocked only for attemptable campaigns that belong to the miner's effective priority list.
- Falls back to no eligible campaigns when a priority campaign is subscription-only and cannot be watched for progress.
- Exposes paid-subscription gating through the dashboard API, removes fully gated campaigns from Up Next, and adds a dedicated Subscription required card with Needs Sub labels.
- Hides the global-priorities toggle for single-miner setups, shares miner-count projections with the WebUI, and expands the native Miners workspace to the full available width.
- Updates Twitch live-directory discovery and uses direct Spade watch heartbeats with automatic Twitch GQL fallback.
- Separates desired PubSub topics from socket state, then restores subscriptions deterministically in bounded batches after reconnects.
- Refreshes the active campaign's complete server-confirmed inventory after verified progress so parallel drops stay synchronized.
- Confirms priority mining behavior is unchanged: prioritised games can still be attempted before the external game account is linked.
- Cleans compiler warnings, aligns generated Xcode 26.6 metadata with project configuration, and keeps GitHub's language statistics focused on Swift.
- Refreshes website copy and structured download metadata for the wider macOS support range.
- Preserves approved esports channels across Twitch's compact channel response shape and the dashboard/inventory campaign merge, so official broadcasts outside the exact game directory are probed directly.
- Reports restricted campaigns with unavailable approved-channel metadata explicitly instead of silently treating them as unrestricted.
- Prioritises known approved streams, rotates bounded directory and approved-channel probes through their overflow, and avoids unverified channel guesses after directory failures.
- Keeps empty-campaign polling at five-minute intervals so newly started Drops campaigns are not delayed by an escalating idle backoff.
- Adds regression coverage for account-link status, channel-probe rotation, subscription-gated WebUI state, dashboard projections, single-miner behavior, PubSub replay batching, heartbeat fallback, and campaign progress refreshes.
- Updates SwiftMiner to version 1.33 build 2026072116.
- Softens account-link status so unrelated unlinked public campaigns no longer make a healthy miner look blocked after priority filtering leaves nothing to mine.
- Shows account-link blocked only for attemptable campaigns that belong to the miner's effective priority list.
- Falls back to no eligible campaigns when a priority campaign is subscription-only and cannot be watched for progress.
- Confirms priority mining behavior is unchanged: prioritised games can still be attempted before the external game account is linked.
- Adds regression coverage for unrelated unlinked campaigns, prioritised unlinked campaigns, and subscription-only priority campaigns.
- Updates SwiftMiner to version 1.32.5 build 2026070308.
- Improves the Drops tab miner picker so selected miners hide unrelated idle merged-feed campaigns while keeping their current, prioritised, in-progress, claimed, setup-needed, blocked, and priority-ready work visible.
- Scopes grouped game-card account rows and miner counts to the selected miner.
- Shares static campaign metadata, available-drops, live-directory, and game-slug lookups across miners without sharing account-specific progress or claim state.
- Caches negative subscription checks longer, limits broad channel verification adaptively, and backs off repeated no-candidate scans.
- Updates SwiftMiner to version 1.32.4 build 2026070219.
- Fixes the Drops tab miner picker so selected miners hide unrelated idle campaigns and card miner counts follow the filter.
- Keeps refresh, idle, and blocked miner states visible when liveness metadata is stale, instead of collapsing the Overview into repeated No Recent Activity cards.
- Adds miner health, worker-state, liveness timestamp, and stall-signal details to exported diagnostic logs.
- Keeps long-running diagnostics useful by retaining more Activity Log history, filtering repetitive INFO-only background chatter, summarising campaign/channel checks, and moving raw Twitch GQL debug output behind the debug trace switch.
- Adds performance diagnostics for resource usage, Twitch request latency/retry/rate-limit behavior, integrity-token fetches, and mining-cycle timings.
- Shares static campaign metadata, available-drops, live-directory, and game-slug lookups across miners, caches negative subscription checks longer, limits broad channel verification adaptively, and backs off repeated no-candidate scans.
- Updates SwiftMiner to version 1.32.3 build 2026070216.
- Ranks campaigns by live-stream availability first, so a limited-time campaign with no live channel no longer starves a game (such as Overwatch) that has streams ready to mine.
- Stops the periodic churn where a working watch session was torn down for a higher-ranked campaign with no stream to switch to, while still grabbing a restricted esports drop the moment it goes live.
- Uses Twitch's campaign slug and category search as fallbacks, then verifies the directory game ID before accepting live drops-enabled streams, so renamed or branded categories resolve without hardcoded aliases.
- Skips exact-match internal/test-looking Twitch Drops fixtures so SwiftMiner does not watch or claim them.
- Hides and disables supervisor stall recovery while its restart logic is being tightened, avoiding unnecessary miner restarts from idle states.
- Updates SwiftMiner to version 1.32.2 build 2026070116.
- Updates the Twitch live-channel directory query hash used when finding streams for Drops campaigns.
- Treats Twitch's IRL category as a special earn-anywhere campaign category, matching recent TwitchDropsMiner behavior.
- Adds a Mining setting to skip IRL campaigns without managing a manual game exclusion.
- Updates SwiftMiner to version 1.32.1 build 2026062915.
- Asks new users whether to check for updates automatically and offers unattended updates in the same Sparkle prompt.
- Adds persistent unattended-health snapshots, stable incident identities, and recovery outcome history.
- Shows persisted unattended health details in Overview, including operating duration and recent progress, Twitch, and recovery activity.
- Sends one macOS action-required alert when authentication expires, mining remains stalled, automatic recovery is exhausted, updates fail, or the configured dashboard cannot start, without repeating the same incident notification.
- Adds test network guards that catch unexpected external requests.
- Keeps the Overview status banner hidden until at least one miner account is configured.
- Uses a neutral outline on the top Overview status card instead of tinting the card green.
- Refreshes the website with a five-account Overview preview in both light and dark appearances.
- Adds a thank-you page that starts the latest ZIP download, provides installation steps, and links to the GitHub repository.
- Updates SwiftMiner to version 1.32 build 2026062609.
Version 1.31.1
- Keeps the newest 1,000 Activity Log entries across app restarts, including mining, update, Discord, system, and web audit activity.
- Logs automatic update download and installation plans before relaunch, then records the successful version transition when SwiftMiner starts again.
- Shows a dedicated update-complete notification with a What's New action, independently of drop notification preferences and quiet hours.
- Makes Clear Log remove both the visible timeline and its persistent history.
- Isolates automated tests from saved Debug accounts and background app services.
- Released as build 2026062412.
π§ Version 1.31 Draft
- Noticeably lowers CPU usage by eliminating repeated miner-card and campaign-feed calculations, caching decoded game preferences, reusing Twitch date parsers, and pausing campaign-card animation while SwiftMiner is inactive.
- Adds optional game-specific failover streamers that are verified and used after genuine progress stalls, with cooldown handling to avoid repeatedly retrying a stalled fallback.
- Keeps prioritised games visible in Drops Active even when Twitch reports the active campaign as unlinked.
- Preserves subscription-required reward treatment for same-game campaigns, including the credit-card badge and Sub label on paid-sub reward thumbnails.
- Shows pink Needs Sub status in the Drops Active list for subscription-required rewards.
- Updates campaign detail rows so subscription-required drops say Needs Sub and Paid Twitch sub required instead of appearing as a generic locked reward.
- Stops the Overview card from showing a same-game watch campaign under Up Next while the currently visible live campaign is subscription-gated.
- Restores the Drops Active filter guard so unlinked, non-prioritised public campaigns do not clutter the active campaign list.
- Adds a clickable swiftminer.app link to About SwiftMiner and a SwiftMiner Website item to the app menu.
- Adds a SwiftMiner Help item to the Help menu so the hosted help guide is available from inside the app.
- Simplifies Settings with a dedicated Appearance tab, a combined simpler-visual-effects option, an always-visible Integrations tab, and Discord notification presets with a Custom mode.
- Simplifies account management around the current Add Account flow.
- Adds an in-app help link and detailed guide for game priorities, exclusions, account-specific ordering, and failover streamers.
- Updates SwiftMiner build metadata to 2026062409.
π― Version 1.30
- Detects when live Twitch channels for a game are advertising a subscription-required campaign instead of the watch-minable campaign SwiftMiner is trying to mine.
- Prevents miners from treating paid-sub rewards as watch-mineable streams.
- Adds clearer channel-selection logs when a live stream is running a same-game subscription-required campaign.
- Shows Subscription Required on the Overview miner card when the blocking reward needs a paid Twitch subscription.
- Preserves subscription-required reward state when SwiftMiner merges campaign data across multiple miner accounts.
- Adds regression coverage for same-game campaign verification, subscription-only campaign diagnostics, and the Overview subscription state.
- Updates SwiftMiner to version 1.30 build 2026062409.
π Version 1.29.5
- Adds an Override Stream action to miner cards so a miner can be pinned to a specific Twitch streamer.
- Keeps the override active until that streamer goes offline, while still verifying the stream is advertising an eligible drop before watching.
- Fixes the web sign-in page on mobile browsers so the animated background and login card fill the visible browser viewport, including Safari's dynamic toolbar area.
- Replaces the plain web dashboard loading placeholder with an animated SwiftMiner loading state, rotating status text, a moving meter, and skeleton cards for slower dashboard starts.
- Respects reduced-motion preferences for the new loading animation.
π Version 1.29.4
- Changes OAuth token exchange and user fetch failure status codes from 502 to 400. This prevents reverse proxies (like Cloudflare or Nginx) from intercepting the failure and replacing it with a generic "Bad Gateway" page, ensuring the user can see the actual error page.
- Implements verbose logging for OAuth failures, writing raw Twitch/Discord API response payloads and HTTP status codes to OSLog and the Activity Log (audit callback).
π Version 1.29.3
- Excludes campaigns classified as `.irrelevant` (not prioritized and not linked to any active game accounts) from `feedCampaigns` in `CampaignView`. This prevents unprioritized and unlinked public Twitch campaigns from cluttering the Drops tab.
π Version 1.29.2
- Adds an optional web dashboard for browser-based miner visibility, including local operator sign-in and a Discord-user view scoped to the signed-in user's own mined Twitch account.
- Adds SwiftBot-backed Discord sign-in with signed assertions, replay protection, local-only operator login, Twitch sign-in, session audit events, and self-service Twitch linking from the dashboard.
- Adds an Up Next campaign browser with box art, start/end timing, issue buttons, and one-tap prioritising for linked miners.
- Adds polished web sign-in assets, app icons, favicons, dashboard timing refinements, loading fixes, and a small salute easter egg on the missed Drops tagline.
- Adds SwiftMiner campaign events for SwiftBot Patchy announcements, including game artwork and up to three drop reward images for rich Discord embeds.
- Keeps progress/status cards separate from diagnostics so Idle - no campaigns remains visible while stall confidence stays hidden until requested.
- Auto-registers the SwiftMiner dashboard hostname with SwiftBot's tunnel when tunnel details are available.
- Adds update events to the Activity Log and settings for automatic update checks and unattended install options when macOS allows them.
- Adds a dedicated Priorities section to each miner, including personal-first ordering, global-priority opt-in/out, quick removal, and refreshes for running miners after priority changes.
- Shows claimed-but-unlinked campaigns as completed with a distinct question-badge status so the drop claim and missing game link are both visible.
- Fixes completed campaign timing in the web projection so active-but-already-claimed campaigns no longer look like they completed one minute ago forever.
- Tightens public dashboard route matching and adds regression coverage for local sign-in, sessions, CSRF handling, Discord sign-in, activation flows, route exposure, and emitted dashboard JavaScript syntax.
- Modernizes the Add Twitch Account login sheet with a cleaner approval flow, stronger code presentation, copy feedback, and clearer waiting, success, and retry states.
- Removes the unused miner detail panel so the Miners tab is the single source of truth for priority, streamer, campaign, controls, and log UI.
- Clarifies Drops campaign cards so claimed-but-unlinked rewards are the visible account-link state, while pre-claim unlinked prioritised games no longer appear as a separate actionable setup state.
- Preloads the Drops view from cached campaign data on launch and replaces the empty first-load placeholder with an animated loading splash.
- Removes per-reward progress strips from grouped Drops cards and keeps the claimed-but-unlinked icon as a green check with an orange question badge.
- Updates SwiftMiner build metadata to 2026061914.
π¬ Version 1.28
- Adds Discord controls for miner-specific game priorities, including full priority-list replacement from SwiftBot's edit-games modal.
- Shows personal miner priorities in the Miners tab, with quick removal controls so app and Discord priority state stay easy to audit.
- Lets prioritised unlinked games keep mining when Twitch exposes usable drops, while keeping account-link warnings visible instead of treating linking as a hard stop.
- Adds Discord link-warning controls so known account-link reminders can be ignored or paused without muting the rest of SwiftBot.
- Improves Discord status and preview messages with recent campaign context, realistic debug samples, cached avatars, and quieter notification defaults.
- Improves mining reliability by recognizing claimed multi-reward drops from any matching Twitch benefit ID and by continuing inventory claim checks even when a claimable drop only appears in Twitch inventory.
- Deduplicates repeated reward tiles in grouped Drops cards so the shown reward count matches the visible rewards.
- Polishes the overview refresh path so miners can restart from refresh without clearing artwork, adds a miner account button, and slows the Looking for Streams animation to feel more native.
- Updates SwiftMiner to version 1.28 build 2026061820 and tightens Sparkle guardrails.
π‘οΈ Version 1.27
- Fixed Sparkle update signing by restoring the current SPARKLE_PUBLIC_ED_KEY.
- Shows each miner's active priority list in the Miners tab, including miner-specific priorities set from Discord DMs.
- Allows prioritised games to be attempted when Twitch exposes usable drops even if the external game account is not linked yet, while keeping the account-link warning visible.
- Updates the stable Sparkle appcast and release-note metadata for SwiftMiner 1.27 build 2026060620.
π Version 1.26
- Adds update error handling and an Updates settings surface so Sparkle failures are visible and users have a manual download fallback.
- Fixes merged Drops campaign account states so one claimed miner no longer makes every miner appear claimed in the card popover.
- Updates the stable Sparkle appcast and release-note metadata for SwiftMiner 1.26 build 2026060111.
π Version 1.25
- Redesigns Drops campaign cards into an Apple-style cohesive horizontal band, keeping game artwork as the prominent biggest card item and shrinking reward artwork (72x72) to highlight the game hero.
- Uses clean, content-first SF Symbols (gift, calendar, and people) in the metadata row to keep visual elements quiet, structured, and native.
- Introduces elegant remaining-time formatting, reporting time in days or a mixture of weeks and days (e.g. "1 week and 2 days left") instead of raw hours.
- Removes the permanent text metadata below reward tiles, overlaying compact watch duration badges directly onto clean, animation-free static reward cards instead.
- Animates the reward name under the tile dynamically on hover, maximizing visual efficiency and reducing card height.
- Refines the aggregate status pill with soft, low-saturation capsule styling to keep visual focus on the rewards.
- Compacts the miner details inspector popover with denser layout and SF Symbols matching native macOS styling.
- Ensures only eligible and actionable miners are represented on the card and popover surfaces.
- Introduces an Ended campaign status and filter (clock symbol) to cleanly separate expired/finished campaigns from completed ones.
- Refines Needs Setup and Blocked states to only trigger if a campaign has obtainable rewards remaining, ignoring fully claimed or subscription-only drops.
- Integrates Discord API integration tests and automated release tooling (bump_build_number.sh and preflight_release.sh).
π©Ί Version 1.24
- Moves miner diagnostics into the Miners view, directly beneath Prioritised Campaigns.
- Adds a collapsible diagnostics panel with miner health, recovery timeline, stall signals, and inline help explaining stall confidence.
- Replaces the stall confidence percentage label with clearer Normal, Early Warning, Likely Trouble, and High Risk states using native status icons and risk colours.
- Removes the duplicate Operations screen and the rewards ledger surface now that diagnostics live with each miner.
- Fixes the Drops dashboard's Most active miner card so claimed counts come from inventory-backed per-account drop totals instead of the live session counter.
- Updates the stable Sparkle appcast and release-note metadata for SwiftMiner 1.24 build 2026052509.
π Version 1.23
- Adds quiet hours for local claim notifications and Discord DM events.
- Adds settings backup and restore for preferences, game rules, filters, quiet hours, and integration endpoints.
- Adds Discord self-service miner controls for linked users: status, pause, resume, and refresh.
- Updates the stable Sparkle appcast and release-note metadata for SwiftMiner 1.23 build 2026052419.
π‘οΈ Version 1.22
- Raises the stall-recovery liveness threshold from 6 to 15 minutes so the supervisor no longer flags healthy miners during normal idle periods between campaign rescans.
- Adds a distinct yellow rotate icon and readable summaries for stall-recovery activity in the Activity Log, routed under the Warnings filter so recoveries are easy to spot and review.
- Classifies the underlying cause of each stall recovery β network connectivity, Twitch API failure, rate limiting, authentication, or watch-session failure β and surfaces it in the Activity Log entry so the trigger is obvious at a glance.
- Adds DEBUG-only SwiftBot DM previews for individual messages and the full ordered DM sequence without mutating production user state.
- Changes the Discord admin Preview DM action to send the full ordered SwiftBot DM flow in DEBUG builds only.
- Updates the stable Sparkle appcast and release-note links for SwiftMiner 1.22 build 2026051110.
π‘οΈ Version 1.21
- Adds a What's New window in the app menu so the current release notes can be opened directly from SwiftMiner.
- Derives release-note links from the configured stable or beta Sparkle feed, keeping in-app notes aligned with the selected update channel.
- Summarises how many miners are currently mining instead of naming only the first active campaign.
- Refreshes miner activity cards periodically so the displayed current and upcoming work stays fresh while the app remains open.
- Adds a dedicated miner supervisor that detects stalled miners, records worker liveness, and recovers an individual miner without restarting the app.
- Shows Miner Unresponsive and Recovering states so a stalled miner no longer appears as No Campaigns while other miners are still active.
- Updates grouped Drops cards to show which miners are mining or claimed instead of relying on a combined progress bar.
- Debounces Twitch category searches, cancels stale requests, and keeps the loading state steady while you type.
- Removes the Claim All Drops app command now that ready rewards are claimed automatically.
- Adds a Stall recovery setting, enabled by default, that restarts an individual miner when it appears stuck after a long progress stall or recoverable network error.
- Adds a Help > Raise Issue on GitHub⦠action that opens the SwiftMiner issues page prefilled with version and macOS details.
- Removes the unused View menu and restricts Start minimised to login launches, only showing the option once Start at login is enabled.
- Detects false-positive account connections and adds a 1-hour cooldown for campaigns that never produce an active drop session, so miners stop getting stuck on bad campaign selections.
- Adds Software Updates controls for choosing the stable or beta Sparkle feed.
- Adds settings for prompting when updates are available and allowing unattended update installs when macOS permits them.
- Adds in-app TipKit hints that explain adding miners, prioritising games, drag-to-reorder, miner nicknames, drop filters, and the Steam artwork option, with a General settings toggle to disable them.
- Tidies the Advanced settings layout with grouped sections, consistent labels, and clearer destructive actions.
- Uses miner nicknames everywhere a miner is shown, including the Drops campaign cards and the Activity Log.
- Adds SwiftBot integration so new miners can be created and managed through the bot workflow without manual setup in SwiftMiner.
- Tidies the SwiftBot integrations settings by hiding pairing once connected, removing redundant advanced controls, and adding a repair action beside connection testing.
- Updates the stable Sparkle appcast and release-note links for SwiftMiner 1.21 build 2026050811.
- Improves completed drop history when Twitch no longer exposes an expired campaign.
- Uses cached completed campaign data only as a fallback when a campaign is missing from Twitch, while fresh Twitch campaign data continues to win when available.
- Fixes completed miner rows that could appear as waiting after both accounts had already claimed the campaign.
- Adds a maintenance action in Advanced settings to clear cached drop history without removing accounts or app preferences.
πΊ Version 1.20
- Adds smarter stream selection, including optional stream spreading so multiple miners avoid piling onto the same verified live channel when enough alternatives are available.
- Adds an option to prioritise followed and subscribed Twitch streamers, with subscriptions ranked ahead of follows during channel selection.
- Adds a Watching Streamer panel to miner views so each account clearly shows the channel and campaign it is currently using.
- Refreshes the Activity Log with clearer filters, optional category icons, new-row animation, timestamp formatting, and the new Activity Log navigation name.
- Adds login launch controls, including Start at login, Start minimised, and approval/error messaging for macOS login item setup.
- Improves drop claiming by syncing Twitch inventory before and after claims so completed and claimed rewards stay accurate.
- Cleans up Overview and miner status language by removing the old Up Next/debug queue surfaces and showing waiting states more accurately.
- Updates the Sparkle appcast and release-note links so the in-app updater can show richer What's New content.
Version 1.11
- Ships the latest SwiftMiner dashboard, search, and miner workflow improvements through the stable update feed.
- Improves update reliability so future SwiftMiner releases can include richer release notes in-app.
Version 1.10
- Keeps the update path moving forward after the previous build metadata issue.
- No user-facing SwiftMiner behavior changed in this release.
Version 1.09
- Continues the update-feed repair work needed for stable auto updates.
- No user-facing SwiftMiner behavior changed in this release.
Version 1.08 and 1.07
- Adds a richer miner dashboard with activity overview, miner health status, and clearer campaign detail screens.
- Adds paused-state handling, ordered Mining/Queued rails, and drag-to-reorder game priority rules.
- Improves Twitch game search with better no-drop hints, availability badges, sequel-style query fallback, and clearer empty/error states.
- Automatically refreshes expired Twitch tokens where possible and gives clearer re-auth guidance when a session needs attention.
- Polishes onboarding, account details, notification handling, and the Set Steam ID flow.
Version 1.30 release page
Version 1.29.5 release page
Version 1.29.4 release page
Version 1.29.3 release page
Version 1.29.2 release page
Version 1.28 release page
Version 1.27 release page
Version 1.26 release page
Version 1.25 release page
Version 1.24 release page
Version 1.23 release page
Version 1.22 release page
Version 1.21 release page
Version 1.20 release page