Virtual workspaces for macOS that put your windows back where you left them.
Choose the apps, arrange the windows, and give the workspace a shortcut. EDN brings it back instantly, with no Mission Control animation.
Workspaces are editable from the menu bar, plain JSON, or the edn CLI. EDN restores layouts; it does not calculate them for you.
Download EDN for macOS → · macOS 13+ · Apple Silicon and Intel
EDN is pronounced “Eden.”
1. Start empty. Create a workspace without inheriting whatever happens to be open.
2. Choose the apps. Membership is explicit and searchable.
3. Give it a shortcut and arrange it. The numbered menu-bar indicator shows where you are. Switch away and EDN remembers the layout exactly as you left it.
Requires macOS 13 or newer. The download is universal for Apple Silicon and Intel Macs.
Step 3 is Apple's supported override; never disable Gatekeeper globally. Beta builds use an ad-hoc signature, so macOS may request Accessibility approval again after an update. Developer ID signing and notarization will remove this friction from stable releases.
View all releases and checksums →
For a local development build:
scripts/setup-local-signing.sh
scripts/build-app.sh
scripts/install-local.sh
The one-time local signing setup gives rebuilds a persistent macOS identity, so Accessibility approval survives development updates. It creates a self-signed certificate in your login keychain trusted only for code signing; it does not make the app suitable for public distribution.
The packaged CLI lives at EDN.app/Contents/Helpers/edn. A future Homebrew Cask will expose it automatically alongside the app.
Every finite command supports --json, so people, scripts, and agents use the same interface. Human-readable output remains the default.
edn list --json
edn windows --json
edn inspect coding --json
edn switch coding --json
edn focus next --json
edn focus next --window --json
windows reports the live desktop; inspect separates configured, remembered, and effective frames. Together they let an agent understand both what EDN was asked to do and what is actually on screen.
With --json, successful results go to standard output. Failures are emitted as a stable object on standard error and return a nonzero exit status:
{"error":{"code":"workspace_not_found","message":"workspace not found: coding","command":"inspect"}}
edn daemon --json is the one long-running exception: it emits one compact JSON event per line as hotkeys are registered and switches occur.
~/.config/edn/config.json.~/.local/state/edn/state.json.EDN requires macOS 13 or newer and Swift 5.9 or newer. It has no third-party runtime dependencies.
swift test
scripts/build-app.sh
open dist/EDN.app
Set EDN_UNIVERSAL=1 to build a universal Intel and Apple Silicon app. Set EDN_CODE_SIGN_IDENTITY to a Developer ID Application identity for distribution signing; local builds are ad-hoc signed.
Found a bug or have a focused improvement? Open an issue. Please use GitHub's private vulnerability reporting for security-sensitive reports.
Contributions are welcome; read CONTRIBUTING.md before proposing a new feature so EDN's deliberately small scope stays coherent.
EDN is inspired by FlashSpace's instant workspace switching and AeroSpace's config-first macOS tooling. EDN is an independent implementation centered on replaying layouts that users arrange themselves.
GitHub’s release workflow expects these repository secrets:
APPLE_CERTIFICATE_P12_BASE64APPLE_CERTIFICATE_PASSWORDAPPLE_SIGNING_IDENTITYAPPLE_IDAPPLE_APP_SPECIFIC_PASSWORDAPPLE_TEAM_IDRELEASE_KEYCHAIN_PASSWORDA beta tag builds and publishes an ad-hoc-signed universal app. A stable v* tag requires Developer ID credentials, notarizes the app and disk image with Apple, staples the tickets, and publishes the DMG, ZIP, and SHA-256 checksums.
MIT
22 commits
Swift
96.4%
Shell
3.6%
Virtual workspaces for macOS that put your windows back where you left them.
Choose the apps, arrange the windows, and give the workspace a shortcut. EDN brings it back instantly, with no Mission Control animation.
Workspaces are editable from the menu bar, plain JSON, or the edn CLI. EDN restores layouts; it does not calculate them for you.
Download EDN for macOS → · macOS 13+ · Apple Silicon and Intel
EDN is pronounced “Eden.”
1. Start empty. Create a workspace without inheriting whatever happens to be open.
2. Choose the apps. Membership is explicit and searchable.
3. Give it a shortcut and arrange it. The numbered menu-bar indicator shows where you are. Switch away and EDN remembers the layout exactly as you left it.
Requires macOS 13 or newer. The download is universal for Apple Silicon and Intel Macs.
Step 3 is Apple's supported override; never disable Gatekeeper globally. Beta builds use an ad-hoc signature, so macOS may request Accessibility approval again after an update. Developer ID signing and notarization will remove this friction from stable releases.
View all releases and checksums →
For a local development build:
scripts/setup-local-signing.sh
scripts/build-app.sh
scripts/install-local.sh
The one-time local signing setup gives rebuilds a persistent macOS identity, so Accessibility approval survives development updates. It creates a self-signed certificate in your login keychain trusted only for code signing; it does not make the app suitable for public distribution.
The packaged CLI lives at EDN.app/Contents/Helpers/edn. A future Homebrew Cask will expose it automatically alongside the app.
Every finite command supports --json, so people, scripts, and agents use the same interface. Human-readable output remains the default.
edn list --json
edn windows --json
edn inspect coding --json
edn switch coding --json
edn focus next --json
edn focus next --window --json
windows reports the live desktop; inspect separates configured, remembered, and effective frames. Together they let an agent understand both what EDN was asked to do and what is actually on screen.
With --json, successful results go to standard output. Failures are emitted as a stable object on standard error and return a nonzero exit status:
{"error":{"code":"workspace_not_found","message":"workspace not found: coding","command":"inspect"}}
edn daemon --json is the one long-running exception: it emits one compact JSON event per line as hotkeys are registered and switches occur.
~/.config/edn/config.json.~/.local/state/edn/state.json.EDN requires macOS 13 or newer and Swift 5.9 or newer. It has no third-party runtime dependencies.
swift test
scripts/build-app.sh
open dist/EDN.app
Set EDN_UNIVERSAL=1 to build a universal Intel and Apple Silicon app. Set EDN_CODE_SIGN_IDENTITY to a Developer ID Application identity for distribution signing; local builds are ad-hoc signed.
Found a bug or have a focused improvement? Open an issue. Please use GitHub's private vulnerability reporting for security-sensitive reports.
Contributions are welcome; read CONTRIBUTING.md before proposing a new feature so EDN's deliberately small scope stays coherent.
EDN is inspired by FlashSpace's instant workspace switching and AeroSpace's config-first macOS tooling. EDN is an independent implementation centered on replaying layouts that users arrange themselves.
GitHub’s release workflow expects these repository secrets:
APPLE_CERTIFICATE_P12_BASE64APPLE_CERTIFICATE_PASSWORDAPPLE_SIGNING_IDENTITYAPPLE_IDAPPLE_APP_SPECIFIC_PASSWORDAPPLE_TEAM_IDRELEASE_KEYCHAIN_PASSWORDA beta tag builds and publishes an ad-hoc-signed universal app. A stable v* tag requires Developer ID credentials, notarizes the app and disk image with Apple, staples the tickets, and publishes the DMG, ZIP, and SHA-256 checksums.
MIT
22 commits
Swift
96.4%
Shell
3.6%