haven

@june

Haven is a macOS menu bar app for browsing Wallhaven and setting your desktop wallpaper. You can also browse images in local folders, save favorites, and return to wallpapers you've used before.

Swift

v0.7.1 · 40 saves · 5,319 lines · updated 1 week ago

40 files
dcd6d0c01ad8
back to HEAD
Sources/89.6 KB · 3 weeks ago
Tests/85.9 KB · 3 weeks ago
.gitignore203 B · 3 months ago.kohconfig588 B · 1 week agoAppIcon.icns464.7 KB · 3 months agobundle_app.shBundle Haven into a signed .app and zip it for distribution.2.8 KB · 1 week agocoverage.shRun the full Haven test suite and enforce physical source-line coverage.2.7 KB · 2 months agogenerate_icns.sh1.2 KB · 3 months agoHaven.entitlements308 B · 3 months agoInfo.plist951 B · 1 week agokoh.build140 B · 1 week agoLICENSE32.5 KB · 2 months agoPackage.resolved643 B · 2 months agoPackage.swiftswift-tools-version: 6.0771 B · 2 months agoREADME.mdHaven is a macOS menu bar app for browsing Wallhaven and setting your desktop wallpaper.2.9 KB · 1 week ago
dcd6d0c01ad8record verified 0.7.1 upload and missing Kepr release listing1 week agoa3008b2a3fc0fix Koh 3 architecture selection and separate archives (v0.7.1)1 week ago1afee265a6cbrewrite README with plain usage guidance; verification blocked by toolchain1 week agob4de15a31c7amigrate: rename kepr.build to koh.build1 week agoc5efec246aadpublish builds from the offer path: set kepr.build trigger to on-offer3 weeks ago493d07ba5c1ashow wallhaven outages as status in explore tab instead of a broken-looking grid (v0.7.0)3 weeks ago1fabc2abdbf1report wallhaven status page as an outage instead of a decoding failure (v0.6.3)3 weeks ago987de19ffe51fix feed pill hit area, name wallhaven failures by cause, drop duplicate launch searches (v0.6.2)3 weeks ago300c20aa6f13record wallpaper-set fix and install upgrade in continuity log2 months ago990b5a2cae9abump to 0.6.1/7 for the wallpaper-set/caching fix2 months agoa2be433d8dcdcache downloaded wallpapers persistently instead of deleting them right after NSWorkspace reads them2 months agob11e22357970install Haven 0.6.0/6 to /Applications and record upgrade (v0.6.0)2 months ago704ac0fcc8adpolish UI: error banner, nested manager observation, ultrawide fit, resolution badge, neutral pills, sources list (v0.6.0)2 months ago1ac917959d28add multi-source local folders with idempotent migration (v0.6.0)2 months agoc3734780b18aland in-flight hardening: status-item removal, temp-file cleanup, defensive pictures directory (v0.6.0)2 months agof5f88eb6cf9crecord phase 3 completion and final audit (v0.6.0)2 months ago1e8dc98e1ecfresolve phase 3 low-priority findings (v0.6.0)2 months agodeb6c7320fc3record phase 2 completion and concurrency review fix (v0.6.0)2 months ago4887ee5521b8fix stale pagination flag and Swift 6 scan capture warning (v0.6.0)2 months ago8d1af4a87126resolve phase 2 medium-priority findings (v0.6.0)2 months ago0380f9710032record phase 1 completion and review limitation (v0.6.0)2 months agoe914f0190456finalize phase 1 verification and portable coverage command (v0.6.0)2 months ago6498ed1e1ed6resolve phase 1 audit: WallpaperManager filename collisions and EventMonitor start leak2 months agoc5489c5f1f28wip: exclude .claude/worktrees/ from koh tracking2 months agobbaee0ec96b2record coverage verification and source audit follow-ups (v0.6.0)2 months agob13c84a91187enforce 100% physical source coverage and inject desktop adapter (v0.6.0)2 months agoed611667ffbbcover folder picker completion without presenting UI (v0.6.0)2 months agoda67964f1b5eadd GPLv3 LICENSE file; point README License section at it with Asha Software copyright2 months agoe98dd097a746add Latest/Toplist/Random pill row to ExploreView with mode-tinted colors and active state2 months ago28727ecf1209add FeedMode enum and AppState.feedMode; route fetchWallpapers through feedMode.sorting; reset on mode change2 months agoc49d4c72208aadd WallhavenSorting enum; make searchWallpapers accept sorting; drop unused fetchRandomWallpapers2 months ago15af22478aa0point kepr.build at bundle_app.sh and Haven.app.zip; add zip to kohignore3 months ago21cf39065e7frewrite bundle_app.sh to build release, bundle, sign, and zip into Haven.app.zip via ditto3 months ago2ff9b8e9fbe2set CFBundleShortVersionString to 0.5 and CFBundleVersion to 53 months ago88e7f50fc29cset kepr.build platforms to macos-aarch64, macos-x86_643 months ago72c2b6919117add kepr build config; stop tracking built app bundle3 months ago737201e0d65bauto-retry failed thumbnail loads with backoff instead of manual Retry button3 months ago7b7a808a210cadd README with features, build, and usage docs3 months ago994a65e3093aignore Swift build artifacts and junk (.build, app bundle, run_log) in koh3 months agoaa815fa8fc56clean up Haven: fix Local view + filter broken images, rebalance Settings, popover-safe folder picker, remove NSFW3 months ago
details

Haven

Haven is a macOS menu bar app for browsing Wallhaven and setting your desktop wallpaper. You can also browse images in local folders, save favorites, and return to wallpapers you've used before.

Screenshot 2026-10-09 at 9.41.35 PM

Using Haven

Click Haven's menu bar icon to open it. The app has no Dock icon.

Tab What you can do
Explore Search Wallhaven or browse Latest, Toplist, and Random. Open the slider controls to filter by category, purity, resolution, or aspect ratio. More results load as you scroll.
Local Browse images from your source folders, including when you're offline. Haven skips files it can't read as images.
Favorites Revisit wallpapers you've marked with a heart.
History Find wallpapers you've recently set.
Settings Choose storage and source folders, turn local saving on or off, and enable launch at login.

Click a wallpaper to set it on your active display. Haven uses Wallhaven's public search API, so you don't need an API key. Browsing is limited to SFW and Sketchy content, with General, Anime, and People category filters.

When local saving is enabled, downloaded wallpapers go to ~/Pictures/Haven by default. Choose another folder in Settings → Storage → Location. Use Source folders in Settings to add other folders to the Local tab.

If Wallhaven is unavailable, Explore explains the outage and gives you a link to its status page and a retry button.

Building and running

You'll need macOS 13 (Ventura) or later and a Swift 6.1+ toolchain, provided by Xcode or the Swift command-line tools.

Build an ad-hoc signed .app bundle and launch it:

./bundle_app.sh
open Haven.app

To run during development:

swift build
swift run

Tests and coverage

Run the test suite and the checked-in coverage check:

bash coverage.sh

The script runs swift test --enable-code-coverage and a smoke run of the executable to measure the entry point. It requires 100% coverage of physical source lines, excluding blank lines, comment-only lines, and structural brace lines. The LLVM aggregate report also counts compiler-generated SwiftUI mappings, so its percentage can be lower.

The last recorded coverage run left 27 UI lines uncovered. The coverage check requires those lines to be covered even when the tests pass.

Source layout

Sources/Haven/
  API/          Wallhaven client and response models
  Managers/     Wallpaper, local library, favorites, history, autostart, cache
  UI/           AppState, menu bar controller, and SwiftUI views
  main.swift    Entry point

License

Haven is licensed under the GNU General Public License, version 3 or any later version. You may redistribute and modify it under those terms. See LICENSE for the full text.

Haven — a macOS menu bar app for browsing, setting, and managing wallpapers.
Copyright (C) 2026 Asha Software