[](https://formulae.brew.sh/cask/flashspace)
[](https://github.com/wojciech-kulik/FlashSpace/releases)
[](#)
[](https://github.com/wojciech-kulik/FlashSpace/actions/workflows/xcode-build-check.yml)
# ⚡ FlashSpace
FlashSpace is a blazingly-fast virtual workspace manager for macOS, designed to
enhance and replace native macOS Spaces. No more waiting for macOS animations.
## ⚙️ Installation
**Requirements:**
- macOS 14.0 or later.
- Enabled "Displays have separate Spaces" in "Desktop & Dock" system settings.
### Homebrew
```bash
brew install flashspace
```
### Download Binary
See: [Releases Page].
### Build From Source
See: [Build From Source](#%EF%B8%8F-build-from-source).
## 🎥 Demo
The video shows a sample configuration where I use 3 workspaces and switch
between them using hotkeys.
https://github.com/user-attachments/assets/09c574c5-512f-47b5-b644-feac0e1de4b0
## 💬 How to use
1. Move all your apps to a single macOS space (per display).
1. Create a workspace.
1. Assign apps to it.
1. Assign a display to the workspace (or use [dynamic mode](#%EF%B8%8F-display-assignment-modes)).
1. Set a hotkey for quick workspace activation.
1. Follow the same steps for other workspaces.
1. Switch between configured workspaces using hotkeys.
### The Same App In Multiple Workspaces
If you want to keep the same app in multiple workspaces, you can use the
"Floating Apps" feature from the app settings or you can add the app to multiple
workspaces from the main app window.
## 👉 How it works
FlashSpace allows to define virtual workspaces and assign apps to them. Each workspace is
also assigned to a specific display. When you switch to a workspace, the assigned apps are
automatically presented and all other apps from the assigned display are hidden.
The app allows workspaces to be switched independently on each display.
## ✨ Features
- [x] Blazingly fast workspace switching
- [x] Multiple displays support
- [x] [Space Control](#-space-control) - preview all workspaces and switch between them
- [x] [Workspace Switcher](#-workspace-switcher) - quickly switch between workspaces using `Option + Tab`
- [x] Hotkeys - manage apps and workspaces using keyboard
- [x] Focus detection - activate workspace on app focus
- [x] [Focus manager](#-focus-manager) - switch focus between apps using keyboard
- [x] Cursor manager - auto-center the cursor in the active window
- [x] Profiles - quickly switch between different configurations
- [x] Menu bar - configurable icon & text (per workspace)
- [x] Swipe Gestures - customize swipe gesture actions for your trackpad
- [x] Floating apps - keep apps visible across all workspaces
- [x] Configuration through GUI and config file
- [x] Support for multiple config file formats: JSON, YAML, and TOML
- [x] [Dynamic display assignment](#%EF%B8%8F-display-assignment-modes)
- [x] [CLI](#-command-line-interface) - interact with the app using the command line interface
- [x] [Picture-in-Picture](#-picture-in-picture-support) support
- [x] [SketchyBar] integration
- [x] [Raycast extension] created by [krmbzds](https://github.com/krmbzds)
## ⚖️ Project Values
- **Performance** - The app should be as fast as possible.
- **Simplicity** - The app should be easy to use and configure.
- **Reliability** - The app should work without glitches and unexpected behavior.
- **Invisible** - The app should help, not disturb.
- **UNIX Philosophy** - The app should do one thing and do it well - manage workspaces.
## 🔭 Space Control
Space Control allows you to preview all workspaces on a grid and switch between them.
Use 0-9 and arrow keys to switch between workspaces.
https://github.com/user-attachments/assets/4c801433-2c70-4cb9-85d8-ff75dbbfab7e
## ⚡ Workspace Switcher
Workspace Switcher allows you to quickly switch between workspaces using
`Option + Tab` (by default).
It shows a list of workspaces and allows you to switch them in a similar way
to macOS app switcher (`CMD + Tab`).
https://github.com/user-attachments/assets/aa814d3d-55c4-4af8-b1de-ceb7cc41eb7a
## 🪟 Focus Manager
FlashSpace enables fast switching of focus between windows. Use hotkeys to
shift focus in any desired direction. It also allows you to jump between
displays.
https://github.com/user-attachments/assets/9bc22b19-7cd7-48f8-a679-0adf4adc3aef
## 🎥 Picture-In-Picture Support
FlashSpace supports Picture-In-Picture mode. This is an experimental feature
and can be disabled in the App Settings -> Workspaces.
macOS does not offer a public API to hide a specific window, and hiding the app
also hides the PiP window. To work around this issue, FlashSpace identifies if
the app supports PiP and **hides in a screen corner** all windows except the
PiP window.
If the PiP window is not visible, the standard behavior is applied.
Supported browsers: Safari, Zen Browser, Chrome, Firefox, Brave, Vivaldi, Arc, Dia, Opera, Microsoft Edge, Comet.
**Please note that this feature may not work if your browser language is not set to
English.**
## 🖥️ Display Assignment Modes
FlashSpace supports two modes of display assignment:
- **Static (default)** - Each workspace is assigned to a specific display. This is
perfect for users who want to have a dedicated workspace for each display,
similar to how macOS Spaces work. This mode can be challenging if you use
multiple displays and change their arrangement frequently.
- **Dynamic** - Each workspace is automatically assigned to the displays where
its apps are located. In this mode, one workspace can be shown on multiple
displays at the same time. This is useful for users who want to rearrange
workspaces by moving apps between displays without changing the configuration.
You can't show empty workspaces with this mode.
The display assignment mode can be changed in the App Settings -> Workspaces.
## 🖥️ SketchyBar Integration
FlashSpace can be integrated with [SketchyBar] and other tools. The app runs a
configurable script when the workspace is changed.
You can enable the integration in the app settings.
Configuration Example
### Only Active Workspace
##### `sketchybarrc`
```bash
sketchybar --add item flashspace left \
--set flashspace \
background.color=0x22ffffff \
background.corner_radius=5 \
label.padding_left=5 \
label.padding_right=5 \
script="$CONFIG_DIR/plugins/flashspace.sh" \
--add event flashspace_workspace_change \
--subscribe flashspace flashspace_workspace_change
```
##### `plugins/flashspace.sh`
```bash
#!/bin/bash
sketchybar --set $NAME label="$WORKSPACE - $DISPLAY"
```
### All Workspaces
##### `sketchybarrc`
```bash
sketchybar --add event flashspace_workspace_change
SID=1
WORKSPACES=$(/Applications/FlashSpace.app/Contents/Resources/flashspace list-workspaces)
for workspace in $WORKSPACES; do
sketchybar --add item flashspace.$SID left \
--subscribe flashspace.$SID flashspace_workspace_change \
--set flashspace.$SID \
background.color=0x22ffffff \
background.corner_radius=5 \
background.padding_left=5 \
label.padding_left=5 \
label.padding_right=5 \
label="$workspace" \
script="$CONFIG_DIR/plugins/flashspace.sh $workspace"
SID=$((SID + 1))
done
```
##### `plugins/flashspace.sh`
```bash
#!/bin/bash
if [ "$1" = "$WORKSPACE" ]; then
sketchybar --set $NAME label.color=0xffff0000
else
sketchybar --set $NAME label.color=0xffffffff
fi
```
If you are a Raycast user, you can use the [Raycast extension] to manage
FlashSpace without leaving your keyboard.
Big thanks to [krmbzds](https://github.com/krmbzds) for creating this extension!
## 💛 Sponsors
Big thanks to all the sponsors who support this project 🍻!
### Monthly Sponsors