All notable changes to SaneHosts will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
- Keeps a paid unlock in place after an update, so you do not have to enter your license key again.
- Fits the first-run Welcome window to its canvas so the card is not sitting inside leftover workspace chrome.
- Keeps every feature available for 14 days, then turns protection off and asks to buy once. There is no free forever mode.
- Refills an empty first-run Essentials profile instead of saving a blank stub.
- After you allow SaneHosts in Login Items once, switching profiles does not ask for your password each time.
- Fixes DNS refresh after an administrator-authorized fallback hosts write by keeping the cache commands inside the same privileged operation.
- Restores the main window close control when cached license state replaces the expired-trial gate with the normal workspace.
- Records a DNS refresh only after both cache commands complete successfully.
- Prevents concurrent first-run loading from creating duplicate Essentials and Existing Entries profiles.
- Makes protection-level rows, sidebar profiles, and host entries work with VoiceOver and other macOS Accessibility controls.
Improved trial-ending guidance.
Fixed: SaneApps Everything Bundle licenses now unlock Pro correctly in SaneHosts.
Fixed: very large blocklists like Kitchen Sink and Steven Black Unified now activate reliably. The active-profile card explains that protection stays on when the app quits, the action is now Turn Off Protection, and deleting a profile asks first. Thanks again to a sharp-eyed customer.
Fixed: the Pro Features padlock in the sidebar now opens once Pro is active. Thanks to a sharp-eyed customer report.
Important update to onboarding, licensing, and reliability. Recommended for all users.
Pro is now free to try for 14 days. Basic remains included after the trial.
Pro is now free to try for 14 days. Basic remains included after the trial.
Adds a clear 30-day Pro trial countdown and upgrade path after the trial ends. Keeps paid Pro users unaffected and preserves Basic/Pro routing during the trial. Removes retired distribution cruft and keeps the release surface leaner.
Improves profile management reliability and keeps Basic/Pro gates, remote import, merge, activation, and deactivation surfaces consistent after the main window UI cleanup.
Improves profile management reliability and keeps Basic/Pro gates, remote import, merge, activation, and deactivation surfaces consistent after the main window UI cleanup.
Enables the 30-day Pro trial for direct-download users so first-run onboarding and Basic/Pro gating match the shared SaneUI license model.
Fixes the first-run tutorial overlay and Tahoe dark-mode readability, reduces launch memory for very large saved profiles, and hardens remote import, activation, deactivation, export, duplicate, merge, and DNS-refresh paths so profile state stays consistent under heavier use.
Improves Tahoe readability, keeps the included Basic profile available, and prevents long IP addresses from wrapping in the Entries table.
Fixes license-key paste reliability in activation and settings.
Improves first-launch and settings navigation reliability, keeps direct-download install handling consistent, and verifies release signing before launch.
Adds the macOS utility app category to release metadata so system and distribution checks classify SaneHosts correctly.
Hardens remote blocklist imports, hosts file validation, local profile storage permissions, and helper fallback paths. Clarifies privacy disclosures while keeping hosts data local, and refreshes Basic/Pro UI copy so release surfaces stay readable, privacy-first, and consistent.
Updates Pro pricing screens so onboarding and upgrade prompts consistently show the current $14.99 one-time unlock, and refreshes release metadata for the direct-download channel.
Fixes Settings routing from the menu bar and Dock so the settings window reopens reliably.
Shared settings layout now matches the rest of the app. Added in-app diagnostics-backed bug reporting. Improved direct license activation reliability and messaging. Fixed the release build failure caused by duplicate app icon resources.
Fixed menu bar and Dock navigation so SaneHosts opens reliably from a cold start. Standardized Settings, About, and License screens for a cleaner and more readable layout. Improved bug reporting, update controls, and overall polish across the app.
Improved onboarding interaction reliability in Basic.
Fix Essentials startup lockout in free mode; improve startup selection reliability; harden update/release channel integrity checks.
- Product screenshots on website and README
- 14-perspective documentation audit with security fixes
- SaneProcess hooks for session management
- Centralized support email (hi@saneapps.com)
- Logger subsystem standardized to
com.mrsane.SaneHostsacross all services - Force unwraps replaced with guard-let / nil coalescing (ProfileStore, ProfilePresets, MainView)
print()replaced withos_logthroughout codebase- Website icon updated
- Tracked binary coverage file (
default.profraw) removed from git
1.0.0 - 2026-01-21
- Profile management (create, read, update, delete) with JSON file persistence
- Entry management (add, edit, delete, toggle) within profiles
- Profile activation via AppleScript with administrator privileges
- Automatic DNS cache flush after hosts file changes
- Data persistence in
~/Library/Application Support/SaneHosts/ - Existing
/etc/hostsentries auto-imported on first run
- 5 curated protection tiers: Essentials, Balanced, Strict, Aggressive, Kitchen Sink
- Each tier bundles appropriate blocklists from 200+ curated sources
- Guided onboarding with coach mark tutorial for first-time users
- Welcome flow with philosophy page
- Remote URL import from 200+ curated blocklists (Steven Black, Hagezi, AdGuard, OISD, etc.)
- 10+ blocklist categories (ads, trackers, malware, social, adult, gambling, etc.)
- Custom URL import for any hosts-format blocklist
- Merge profiles with automatic hostname deduplication
- Export profiles as standard
.hostsformat files - Smart auto-naming for combined blocklist imports
- URL health checks with visual availability indicators
- Domain-only blocklist format support
- Bulk enable/disable entries via selection mode
- Bulk delete selected entries
- Duplicate profiles
- Profile drag-to-reorder in sidebar
- Menu bar icon with network status indicator
- Active profile name display
- Quick profile switcher dropdown
- One-click activate/deactivate from menu bar
- Hide Dock icon option (menu-bar-only mode)
- Native SwiftUI design system with dark mode support
- App icon (dark blue gradient with cyan network symbol)
- Keyboard shortcuts (Cmd+N, Cmd+I, Cmd+E, Cmd+D, Cmd+M, Cmd+Shift+A, Cmd+Shift+D)
- Source freshness indicator (days since last sync)
- Entry count display on profiles in sidebar
- Search and filter across large profiles (handles 100K+ entries)
- Color-coded profile types (blue for remote, purple for merged)
- Dock menu with Settings and Open actions
- Full menu system (New Profile, Import Blocklist, Deactivate All)
- Optimized for 100K+ entry profiles with single-pass counting
- 300ms search debouncing for large datasets
- Background thread DNS flush
- Crash resilience with automatic backup/recovery (3 backups per profile)
- Background thread profile loading to prevent launch hangs
- NotificationCenter sync replacing 1-second polling
- Hosts file modifications require admin authentication
- Touch ID / LocalAuthentication support (with AppleScript fallback)
- XPC protocol scaffold for privileged helper
- Comment newline injection sanitization
- HTTPS warning for HTTP blocklist URLs
- Hardened runtime enabled
- Code signed and notarized by Apple
- DEBUG bypass for auth in debug builds
- Sparkle auto-update framework integration
- Unified release command (
./scripts/SaneMaster.rb release) - Appcast generator (
scripts/generate_appcast.sh) - Landing page website
- Privacy policy page
- GitHub repository at github.com/sane-apps/SaneHosts
- IP filtering:
RemoteSyncServiceno longer rejects valid non-loopback IPs - Bulk operations: single disk write instead of one per entry
- Menu bar state: shared
ProfileStoresingleton replaces separate instance - Deactivate now properly updates
ProfileStorestate - Atomic writes for
createRemoteinProfileStore - Parser instance reuse during large imports (was creating 100K+ instances)
- App icon sizes corrected for all asset catalog slots
- 6 broken blocklist URLs replaced (OISD discontinuation, 404s, 403s)
- Settings window accessible from Dock and Menu Bar
- Launch crash with disable-library-validation entitlement
- Hosts file modifications require admin authentication
- No network access except for remote hosts import
- All data stored locally in Application Support