A cross-platform desktop wallpaper app for NASA Astronomy Picture of the Day and nine other image sources, with image caching and an ambient mode.
Caelum lives entirely in your menu bar - no Dock icon, no windows, no clutter. Every day it fetches the latest Astronomy Picture of the Day from NASA and sets it as your desktop wallpaper, automatically, in the background. Click the orbit glyph in your menu bar and a panel of frosted obsidian glass floats over your desktop, where you can switch between ten image libraries, read the day's explanation, or kick off a full-screen ambient slideshow.
It's designed around a single idea: the interface should wear the colours of the cosmos. Caelum extracts the dominant colour of each image and re-tints its own accents to match.
- Always the latest APOD - fetched daily and set as your wallpaper, automatically. Uses NASA's new keyless APOD endpoint on science.nasa.gov, with a per-day fallback if the list route misbehaves.
- Updates itself, if you want - Caelum checks GitHub Releases, announces new versions right in the panel with a one-click install, and can optionally install them automatically (Settings → Updates).
- 10 stellar sources - APOD is the star, joined by ESA/Hubble, James Webb, ESO, NASA EPIC, the NASA Image Library, Bing, Wikimedia, NASA Image of the Day, and a hand-curated gallery.
- Cinematic ambient mode - a full-screen, multi-display ken-burns slideshow on idle. Your own planetarium. Move the mouse to return.
- Menu-bar only -
LSUIElement, zero Dock footprint. - The UI wears the cosmos - dynamic accent colour extracted from each image.
- Multi-display - sets the wallpaper on every screen.
- Smart downloads - huge gigapixel images (yes, APOD does this) are automatically capped to a sensible size for wallpaper.
- Instant switching - all source libraries are pre-cached in the background so any click is immediate, with no on-demand download delay.
- Private & open source - no accounts, no tracking, no analytics whatsoever. Images come straight from public APIs. MIT-licensed.
| # | Source | What you get | API key |
|---|---|---|---|
| ⭐ | NASA APOD | The Astronomy Picture of the Day | - |
| 2 | ESA/Hubble | Hubble Picture of the Week | - |
| 3 | James Webb | ESA/Webb image releases | - |
| 4 | ESO | European Southern Observatory Picture of the Week | - |
| 5 | NASA EPIC | Full-disk Earth from the DSCOVR spacecraft | shares NASA key |
| 6 | NASA Library | NASA Image & Video Library (rotating queries) | - |
| 7 | Bing | Bing Photo of the Day (4K) | - |
| 8 | Wikimedia | Wikimedia Commons Picture of the Day | - |
| 9 | NASA Image of the Day | NASA's curated daily feed | - |
| 10 | Caelum Curated | A hand-picked gallery of the finest space imagery, refreshed OTA - no app update needed | - |
Everything works out of the box - no API keys needed. The same sources power the Windows and Linux app.
brew tap ProfessorEngineergit/caelum
brew install --cask caelumHomebrew handles Gatekeeper automatically - no quarantine steps needed.
- Download the latest
Caelum.zipfrom the Releases page and unzip it into/Applications. - Right-click → Open. Caelum is free and open source, so it isn't notarized by Apple. On first
launch, right-click the app and choose Open to get past Gatekeeper (you only do this once).
If macOS still refuses, run:xattr -dr com.apple.quarantine /Applications/Caelum.app
- Find the star - the orbit glyph appears in your menu bar. Click it, pick a source, and fly.
Requirements: macOS 13 (Ventura) or later.
Caelum also runs on Windows 10/11 and Linux (x64 and ARM64) as a tray app with the same ten sources, daily wallpaper refresh and in-app updates. Grab the file for your system from the Releases page:
| System | File | Notes |
|---|---|---|
| Windows | Caelum-Setup-<version>.exe |
Installs per user, no admin needed. Not code-signed - if SmartScreen asks, choose More info → Run anyway. |
| Linux | Caelum-<version>-<arch>.AppImage |
chmod +x and run. Updates itself in place. |
| Debian / Ubuntu | caelum_<version>_<arch>.deb |
sudo apt install ./caelum_…deb. New versions are announced in the panel and install from there. |
| Fedora | caelum.x86_64.rpm / caelum.aarch64.rpm |
One command, see below. |
sudo dnf install https://github.com/ProfessorEngineergit/caelum/releases/latest/download/caelum.x86_64.rpm(On ARM: caelum.aarch64.rpm.) That's all. The package adds the Caelum repository, so
sudo dnf upgrade keeps it current; the panel also offers new versions. On Fedora Workstation (GNOME)
it brings the AppIndicator extension along, which shows Caelum's icon in the top bar. Caelum switches the
extension on itself; after the very first install, log out and back in once so GNOME loads it.
In the top bar, a click on Caelum's icon opens its menu: the current picture, Set as Wallpaper, next/previous image, the source list, settings and updates. A double click opens the full panel under the bar (GNOME's extension keeps the single click for the menu; on KDE and most other desktops a click opens the panel and the right button the menu).
The wallpaper is set natively on Windows and on GNOME, KDE Plasma, Xfce, Cinnamon, MATE, LXQt/LXDE
and Sway - with feh/nitrogen as a fallback for other X11 window managers. On GNOME, tray icons need
the AppIndicator extension (preinstalled on Ubuntu); without it, launch Caelum from the app grid
to open its panel.
- Click the menu-bar glyph to open the panel.
- Set as Wallpaper applies the current image to every display.
- Shuffle pulls the next image from the active source.
- Sources strip switches between the ten libraries.
- Explanation opens the day's write-up.
- Footer: Settings · Ambient mode · Refresh · Quit.
- Right-click the menu-bar glyph for a quick menu (Refresh / Ambient / Quit).
| Setting | Default | Description |
|---|---|---|
| Refresh daily automatically | on | Fetch & apply the newest image each day (and on wake). |
| Set on all displays | on | Apply to every screen. |
| Same wallpaper on every desktop | on | macOS keeps a wallpaper per Space; Caelum carries its image to each Space as you switch to it. |
| Rotate through the library | off | Cycle images every N minutes. |
| Tint interface to the image | on | Dynamic accent colour. |
| Chime when wallpaper updates | on | A subtle sound on update. |
| Launch at login | off | Start Caelum automatically (SMAppService). |
| Install updates automatically | off | Download, verify and apply new releases without asking. |
Caelum is a native Swift 6 + AppKit + SwiftUI app, built with the Swift Package Manager
(no .xcodeproj required).
Sources/Caelum/
├── App/ main · AppDelegate · StatusItemController (glass panel) · AmbientController · AppState
├── Core/ CosmicImage · ImageSource · SourceRegistry · ImageCache · WallpaperManager · Prefetcher
│ ├── Net/ HTTPClient (retry/backoff) · RSSParser
│ └── Sources/ APOD · Djangoplicity (Hubble/Webb/ESO) · EPIC · NASA Library · Bing · Wikimedia · NASA IOTD · Curated
└── UI/ Theme (the design system) · GlassBackground · HeroView · ControlDeck · SourceStrip · ExplanationSheet · SettingsView · OrbitalLoader · AmbientView
- Wallpaper uses the documented
NSWorkspace.setDesktopImageURL(_:for:options:)perNSScreen. - Ambient mode presents borderless full-screen windows on every display and keeps the display
awake with an
IOPMAssertion. - Idle detection uses
CGEventSourceinput timestamps. - Background prefetching caches previews for every image in every source so any click is instant, with no on-demand download.
- Adding a source is one file conforming to
ImageSource+ one line inSourceRegistry.
A precision instrument carved from black glass that carries the cosmos: layered vibrancy, a luminous
hairline, the aurora gradient (cyan → violet → magenta) used sparingly, instrument typography with
tabular figures, and spring-based "orbital" motion throughout. The full system lives in
Theme.swift.
git clone https://github.com/ProfessorEngineergit/caelum.git
cd caelum
# Run the source smoke-test (fetches the latest image from all 10 sources)
swift run Caelum --smoke-test
# Build a signed .app bundle into dist/
bash scripts/build-app.sh release
open dist/Caelum.app| Script | Purpose |
|---|---|
scripts/build-app.sh [debug|release] [--universal] |
Compile + assemble dist/Caelum.app, ad-hoc signed. |
scripts/make-icon.sh |
Render the app icon and build AppIcon.icns. |
scripts/render-icon.swift |
Draw the brand mark (used by make-icon.sh). |
Releases are built automatically by GitHub Actions on every v* tag - and whenever a commit on
main bumps the version, the matching v<version> release is created for you (see
.github/workflows/release.yml). One release carries all platforms:
Caelum.zip for macOS, the Windows installer and the Linux AppImage/deb, plus the latest*.yml
manifests the Windows/Linux updater reads. To release, bump both
CFBundleShortVersionString in Resources/Info.plist and version in desktop/package.json - the
workflow refuses mismatched versions or a tag that differs from them, since the in-app updaters rely on it.
An Electron port of the Mac app: same sources (src/main/sources.js, with the curated galleries
generated from StaticGallerySource.swift by scripts/extract-galleries.py), tray + panel UI, daily
refresh, and updates via electron-updater from the same GitHub releases.
cd desktop
npm install
npm start # run from source
npm test # unit tests (parsers, registry)
npm run smoke # live check: every source returns a loadable image
npm run dist:linux # AppImage + deb in desktop/dist
npm run dist:win # NSIS installer (on Windows)- OTA curated gallery packs - new themed image collections will be pushed over-the-air without requiring an app update. New packs appear automatically in your Caelum Curated source.
- More sources - expanding the library with additional space agencies and observatories.
- Contributions welcome - see Contributing below.
Caelum is designed to collect absolutely nothing about you. Here is the complete list of every network request Caelum ever makes - there are no others:
| Request | When | Who receives it | Why |
|---|---|---|---|
science.nasa.gov/wp-json/wp/v2/apod-basic |
Daily / on launch | NASA | Fetch APOD metadata |
assets.science.nasa.gov |
When an APOD image is shown | NASA | Download the APOD image (full-resolution original + preview) |
api.github.com/repos/ProfessorEngineergit/caelum/releases/latest |
On launch, every ~6 h | GitHub | Check for a new Caelum version |
github.com/…/releases/download/… |
Only when you install an update | GitHub | Download Caelum.zip |
hubblesite.org/api/… |
On source load | STScI / NASA | Hubble image feed |
esawebb.org/rss/… |
On source load | ESA | Webb image feed |
eso.org/public/images/… |
On source load | ESO | ESO image feed |
api.nasa.gov/EPIC/… |
On source load | NASA | Earth imagery |
images-api.nasa.gov/… |
On source load | NASA | NASA Image Library |
www.bing.com/HPImageArchive.aspx |
On source load | Microsoft | Bing Photo of the Day |
commons.wikimedia.org/… |
On source load | Wikimedia Foundation | Picture of the Day |
www.nasa.gov/rss/… |
On source load | NASA | NASA Image of the Day feed |
| Image files from the above domains | On demand | Same as above | Download images for wallpaper |
That is everything. There is no telemetry, no crash reporting, no usage analytics, no tracking pixels, no third-party SDKs, and no sign-in of any kind. Caelum never phones home. The app has no server of its own - it is a thin client that talks directly to the public APIs listed above, and only to those APIs.
Images are cached in ~/Library/Application Support/Caelum/Cache on your local disk. This
directory is never read by anyone but you and Caelum.
The future OTA gallery feature works the same way: Caelum will fetch a static JSON file from this GitHub repository's releases. The file is a plain list of image URLs - no personal data is sent or received. You can inspect the file here at any time.
Contributions are very welcome. The most impactful thing you can do is add a new image source:
- Create a file in
Sources/Caelum/Core/Sources/conforming toImageSource. - Register it with one line in
SourceRegistry.swift. - Open a pull request.
For bug reports and feature requests, please use GitHub Issues.
Caelum is free and open source. If it brings a little wonder to your day, a small Ko-fi helps cover the time spent building it and keeps future development going:
Caelum is MIT-licensed - see LICENSE.
Astronomical imagery is provided by NASA, ESA, ESO, the Hubble and James Webb Space Telescope teams, Bing, and Wikimedia Commons, and remains the property of its respective owners under each provider's terms. Caelum is an independent project and is not affiliated with or endorsed by NASA, ESA, or ESO.
Made for the love of the night sky.
Some code contributions are explicitly attributed to AI tools: generated with Claude Code. This applies to those contributions, not every file.