Valkey for Mac: a free, native macOS app to run Valkey servers locally — any version, modules (JSON, Bloom), live logs, menu bar. Like Postgres.app, for Valkey.
See the codemacOS menu-bar app for Valkey — the open-source Redis replacement.
Mimics Postgres.app: run several Valkey servers side by side, each on its own port, version and data directory, with its own live log. Valkey versions are installed from a signed registry, so new Valkey releases don't need a new app release.
| Path | What |
|---|---|
app/ | macOS app (Xcode project, SwiftUI sources, DMG script) |
registry/ | registry.json + signature, and tooling to build, package, sign and check Valkey versions |
website/ | valkey.app static site |
Artwork/ | logo and app icon sources |
.github/workflows/ | publish a Valkey version; deploy the website |
Download Valkey.app.zip from Releases, drag to /Applications, launch.
valkey-cli in Terminal), Show in Finder, Start / Stop, and the server's log..command scripts: Terminal, iTerm2, Ghostty, …). Ghostty 1.3+ is
driven through its AppleScript interface, which skips Ghostty's per-script "Allow" prompt; macOS asks
once for permission to control Ghostty.Files, all under ~/Library/Application Support/Valkey/:
Versions/<version>/bin/ — installed valkey-server / valkey-clivar-<port>/ (default per server) — valkey.conf (from app/Valkey/valkey.conf.default), data files, valkey.logThe app reads https://valkey.app/registry.json plus registry.json.sig, kept in registry/
and deployed with the website.
{
"schemaVersion" : 1,
"versions" : [
{
"version" : "9.1.2",
"url" : "https://github.com/alhassanaraouf/Valkey.app/releases/download/valkey-9.1.2/valkey-9.1.2-macos-universal.tar.gz",
"sha256" : "…",
"size" : 3471939,
"minimumMacOS" : "13.0",
"published" : "2026-09-25"
}
]
}
registry.json.sig is an Ed25519 signature over the exact bytes of registry.json. The app only
trusts the registry if it verifies against the public key in app/Valkey/VersionStore.swift, and only
installs a download whose size and SHA-256 match its entry. Versions needing a newer macOS are hidden..tar.gz with bin/valkey-server, bin/valkey-cli (universal, signed) and Valkey's COPYING.defaults write app.valkey.Valkey registryURL http://127.0.0.1:8000/registry.json.Official Valkey modules (JSON and Bloom so far) are listed under modules in the same signed registry
and turned on per server in Server Settings → Modules. The app starts the server with --loadmodule
for each, and refuses to start it if an enabled module isn't installed, since data saved with a module
won't load without it.
valkey) and the architectures it contains;
the app offers only matching builds. Some modules need different builds per line (Bloom has one for 8.0).~/Library/Application Support/Valkey/Modules/<id>/.registry/scripts/package-module.sh
builds a universal .dylib hermetically (hermetic.cmake keeps Homebrew packages out), then
registry/scripts/check-module.sh runs it against the newest registry Valkey of every claimed line —
startup must finish within 10s (an incompatible module can hang), module commands must work, and
module data must survive a restart — before anything is uploaded.Run the Publish Valkey version workflow (Actions → Run workflow) with e.g. 9.1.3. It:
registry/scripts/package-valkey.sh),valkey-<version>,registry/registry.json, signs it, verifies the signature and commits both files,It needs the repository secret VALKEY_REGISTRY_PRIVATE_KEY (contents of the private key file).
Locally, the same steps are:
registry/scripts/package-valkey.sh 9.1.3
swift registry/scripts/registry.swift add registry/registry.json 9.1.3 <release-asset-url> registry/dist/valkey-9.1.3-macos-universal.tar.gz
VALKEY_REGISTRY_PRIVATE_KEY=$(cat ~/.config/valkey-app/registry-signing-key) swift registry/scripts/registry.swift sign registry/registry.json
Signing key. Generated with swift registry/scripts/registry.swift keygen <file>, which writes the private key
to <file> (mode 600) and prints the public key for VersionStore.releaseKey. Keep the private key out of
the repo; anyone holding it can publish binaries the app will install. If it leaks, generate a new pair,
update releaseKey, re-sign the registry and ship an app update.
Valkey.app 1.2+ updates itself with Sparkle. It checks the feed
https://valkey.app/appcast.xml (website/appcast.xml) daily, or on demand via
Check for Updates… (app menu, menu-bar menu, Settings). Settings → Updates turns the daily check on or off.
SUPublicEDKey).
Sparkle replaces the app in place and relaunches it; servers that were running are stopped gracefully and
started again.defaults write app.valkey.Valkey updateFeedURL http://127.0.0.1:8000/appcast.xml.CFBundleShortVersionString and CFBundleVersion (always increasing) in app/Valkey/Info.plist.app/release-notes/<version>.md (Markdown, shown in the update window and on the release page).app-v<version> GitHub release (marked Latest), signs the zip into website/appcast.xml
(app/scripts/appcast.swift), commits it, and redeploys the site.website/ is the static site for valkey.app (plain HTML, no build step). The Deploy website
workflow publishes it to GitHub Pages together with the registry files whenever either changes.
One-time setup: repo Settings → Pages → Source GitHub Actions, custom domain valkey.app.
Preview locally: python3 -m http.server -d website (copy registry/registry.json in to see the version list).
Needs Xcode. Valkey isn't bundled, so app builds are quick.
open app/Valkey.xcodeproj # then Run (⌘R)
xcodebuild -project app/Valkey.xcodeproj -scheme Valkey -configuration Debug -derivedDataPath app/build/DerivedData build
app/scripts/create-dmg.sh # universal Release build → app/build/Valkey.app.zip + Valkey.dmg
registry/scripts/check-registry.sh # end-to-end check: signing, install, tampered registry, corrupted download
Apache License 2.0 — see LICENSE.
Swift
72.7%
HTML
15.7%
Shell
8.7%
Python
1.9%
Valkey for Mac: a free, native macOS app to run Valkey servers locally — any version, modules (JSON, Bloom), live logs, menu bar. Like Postgres.app, for Valkey.
See the codemacOS menu-bar app for Valkey — the open-source Redis replacement.
Mimics Postgres.app: run several Valkey servers side by side, each on its own port, version and data directory, with its own live log. Valkey versions are installed from a signed registry, so new Valkey releases don't need a new app release.
| Path | What |
|---|---|
app/ | macOS app (Xcode project, SwiftUI sources, DMG script) |
registry/ | registry.json + signature, and tooling to build, package, sign and check Valkey versions |
website/ | valkey.app static site |
Artwork/ | logo and app icon sources |
.github/workflows/ | publish a Valkey version; deploy the website |
Download Valkey.app.zip from Releases, drag to /Applications, launch.
valkey-cli in Terminal), Show in Finder, Start / Stop, and the server's log..command scripts: Terminal, iTerm2, Ghostty, …). Ghostty 1.3+ is
driven through its AppleScript interface, which skips Ghostty's per-script "Allow" prompt; macOS asks
once for permission to control Ghostty.Files, all under ~/Library/Application Support/Valkey/:
Versions/<version>/bin/ — installed valkey-server / valkey-clivar-<port>/ (default per server) — valkey.conf (from app/Valkey/valkey.conf.default), data files, valkey.logThe app reads https://valkey.app/registry.json plus registry.json.sig, kept in registry/
and deployed with the website.
{
"schemaVersion" : 1,
"versions" : [
{
"version" : "9.1.2",
"url" : "https://github.com/alhassanaraouf/Valkey.app/releases/download/valkey-9.1.2/valkey-9.1.2-macos-universal.tar.gz",
"sha256" : "…",
"size" : 3471939,
"minimumMacOS" : "13.0",
"published" : "2026-09-25"
}
]
}
registry.json.sig is an Ed25519 signature over the exact bytes of registry.json. The app only
trusts the registry if it verifies against the public key in app/Valkey/VersionStore.swift, and only
installs a download whose size and SHA-256 match its entry. Versions needing a newer macOS are hidden..tar.gz with bin/valkey-server, bin/valkey-cli (universal, signed) and Valkey's COPYING.defaults write app.valkey.Valkey registryURL http://127.0.0.1:8000/registry.json.Official Valkey modules (JSON and Bloom so far) are listed under modules in the same signed registry
and turned on per server in Server Settings → Modules. The app starts the server with --loadmodule
for each, and refuses to start it if an enabled module isn't installed, since data saved with a module
won't load without it.
valkey) and the architectures it contains;
the app offers only matching builds. Some modules need different builds per line (Bloom has one for 8.0).~/Library/Application Support/Valkey/Modules/<id>/.registry/scripts/package-module.sh
builds a universal .dylib hermetically (hermetic.cmake keeps Homebrew packages out), then
registry/scripts/check-module.sh runs it against the newest registry Valkey of every claimed line —
startup must finish within 10s (an incompatible module can hang), module commands must work, and
module data must survive a restart — before anything is uploaded.Run the Publish Valkey version workflow (Actions → Run workflow) with e.g. 9.1.3. It:
registry/scripts/package-valkey.sh),valkey-<version>,registry/registry.json, signs it, verifies the signature and commits both files,It needs the repository secret VALKEY_REGISTRY_PRIVATE_KEY (contents of the private key file).
Locally, the same steps are:
registry/scripts/package-valkey.sh 9.1.3
swift registry/scripts/registry.swift add registry/registry.json 9.1.3 <release-asset-url> registry/dist/valkey-9.1.3-macos-universal.tar.gz
VALKEY_REGISTRY_PRIVATE_KEY=$(cat ~/.config/valkey-app/registry-signing-key) swift registry/scripts/registry.swift sign registry/registry.json
Signing key. Generated with swift registry/scripts/registry.swift keygen <file>, which writes the private key
to <file> (mode 600) and prints the public key for VersionStore.releaseKey. Keep the private key out of
the repo; anyone holding it can publish binaries the app will install. If it leaks, generate a new pair,
update releaseKey, re-sign the registry and ship an app update.
Valkey.app 1.2+ updates itself with Sparkle. It checks the feed
https://valkey.app/appcast.xml (website/appcast.xml) daily, or on demand via
Check for Updates… (app menu, menu-bar menu, Settings). Settings → Updates turns the daily check on or off.
SUPublicEDKey).
Sparkle replaces the app in place and relaunches it; servers that were running are stopped gracefully and
started again.defaults write app.valkey.Valkey updateFeedURL http://127.0.0.1:8000/appcast.xml.CFBundleShortVersionString and CFBundleVersion (always increasing) in app/Valkey/Info.plist.app/release-notes/<version>.md (Markdown, shown in the update window and on the release page).app-v<version> GitHub release (marked Latest), signs the zip into website/appcast.xml
(app/scripts/appcast.swift), commits it, and redeploys the site.website/ is the static site for valkey.app (plain HTML, no build step). The Deploy website
workflow publishes it to GitHub Pages together with the registry files whenever either changes.
One-time setup: repo Settings → Pages → Source GitHub Actions, custom domain valkey.app.
Preview locally: python3 -m http.server -d website (copy registry/registry.json in to see the version list).
Needs Xcode. Valkey isn't bundled, so app builds are quick.
open app/Valkey.xcodeproj # then Run (⌘R)
xcodebuild -project app/Valkey.xcodeproj -scheme Valkey -configuration Debug -derivedDataPath app/build/DerivedData build
app/scripts/create-dmg.sh # universal Release build → app/build/Valkey.app.zip + Valkey.dmg
registry/scripts/check-registry.sh # end-to-end check: signing, install, tampered registry, corrupted download
Apache License 2.0 — see LICENSE.
Swift
72.7%
HTML
15.7%
Shell
8.7%
Python
1.9%