As someone who switched to macos from the hot pile of mess called windows last year, my biggest point of pain was the window management. I use Rectangle Pro, and it helps a lot, but IMHO workspace integration is poor still.
I'll give this one a try. BTW, if this works, can you please consider asking money for it? Keep it open source but perhaps add a friction-less support channel (read: not github issues) for paying customers. Just an idea.
In any case, thanks for the hard work and making it open-source.
Very cool to see movement in this space, and congrats on launching! Agree that it looks polished, I also like that you chose to show screenshots from settings on the LP.
I use yabai and I've been wanting something similar to what you built. Instead of one desktop per workspace, I'd like to be able to have "sets of desktops" per workspace as it were, because not all work I do that involves multiple apps needs them on the same screen at all times (or even ever).
As an example: I might have IDE + browser on one desktop, Fork.app and local server on another, and Music.app on a third (as I like to listen to music while I work). So to me, those are all related, but don't make sense on one desktop.
The other consideration is that I also tend to use tiling more on bigger displays. Since I sometimes do work with just the builtin display, I have to reorganize windows and desktops every time I switch, which is a bit of a PITA. With a solution like yours, but for sets of desktops, I could just switch to a different set and be done in seconds.
not fully yet but what you can do today is create separate profiles for each Space (ide+browser on one, Fork+server on another,music on a third) and they auto switch as you swipe between desktops. So the per Space part works but what's missing is the "group" bit there's no way to say "these 3 profiles are all part of my Coding workspace, activate them all at once." That's exactly where I want to take this though. The building blocks are mostly there, just need that workspace layer on top. The display switching thing with snapshotting per display config so laptop only vs docked setups just work is a bit PITA to build but I am working on it
I have a really wide screen (52') and all these window managment apps fails for me at the point that I only can divide the screen in thirds or halfs. Thirds for three apps is too small, halfes to large. I need custom areas like 3/7, 3/7, 1/7. The only app which i found which this offers is 1piece
Just having watched the video, the session setup, close, and launch seem tied to the idea of a single window per app. Is that right? What kinds of workflows is this explicitly meant vs. not meant to support?
The way a user switches window sets with backtick and app windows within them with tab is inverted from the usual major and minor shortcuts. Normally you switch apps with tab and windows within them with backtick, or in the case of stage manager, you switch window sets with tab and windows within them with backtick. As a default I think the keys make less sense than they could.
This looks awesome and polished. I've made similar app for myself coming from similar setup (Rectangle, altTab)
I needed custom icons, custom names for windows, obligatory custom and persistent order, 'always on' option and keyboard nav for showing/moving windows from the strip. Could not be happier.
I've been building HopTab as a free alternative to the combination of Cmd+Tab replacers and window managers. It started as a simpleapp switcher — pin your apps, Option+Tab through them. But the latest release adds a lot.
*What's new*
Global window tiling shortcuts — Ctrl+Opt+Arrow for halves, Ctrl+Opt+UIJK for quarters, Ctrl+Opt+DFG for thirds. Works anytime, no switcher needed. All 17 directions are configurable.
Cycle through sizes — press Ctrl+Opt+Left twice and the window goes from 1/2 to 1/3, press again for 2/3. Same for right. This is the Rectangle feature I missed most.
Undo snap — Ctrl+Opt+Z restores the previous window position. Every snap saves the old frame automatically.
Move between monitors — Ctrl+Opt+Cmd+Arrow throws the window to the next display with proportional placement.
Configurable gaps — 0–20pt gaps between snapped windows. Settings slider with live preview.
Profile switcher shows app icons — instead of generic person avatars, the Option+` overlay shows a grid of each profile's actual pinned app icons.
*What was already there*
Pin apps, Option+Tab to cycle through only those
Profiles per workflow (Coding, Design, etc.) with per-profile hotkeys
Layout templates (50/50, IDE 60/40, three columns, 2×2 grid)
Session save/restore — saves every window's position, size, z-order per profile
Assign profiles to macOS Spaces — auto-switches when you swipe desktops
Window picker for multi-window apps
Cmd+Q/H/M while switcher is open
Sticky notes per profile
What it replaces
I was using Rectangle + AltTab + some manual window dragging. HopTab combines the app switching, window tiling, and workspace management into one app. The main difference from AltTab is that you pin specific apps instead of seeing everything. The main difference from Rectangle is that tiling is integrated with profiles and layouts — snap your windows, save the session, restore it tomorrow.
This looks very cool. Does the window picker for multi-window apps work with the pinning? So if I have a safari windows I want to have associated with a profile, and the option-tab will ignore all the other windows?
It is a constant pain when I cmd-tab in a space with safari, and it throws me out of the space to another one because the window that gets focus isn’t the “closest” one on the current space.
right now it shows all safari windows not just the ones on your current space, so the "wrong space" problem could still happen.
I'll look into Space aware window filtering.
Cmd+Tab is one of those things that shipped in 2003 and nobody at Apple has touched since. Surprised it took this long for someone to properly replace it.
I mean to be fair, (1) there are replacements, AltTab and Switcher for example, and (2) why replace ot touch something that isn't broken? Cmd+Tab is supposed to switch to the next open window, and it does exactly that.
No, Cmd+Tab switches to the next application. This is what people get surprised and annoyed by. I've been using Mac for 15 years now and I find it super awkward to switch between windows within an app. On my machine it's Cmd ` or something strange like that. This is also doubly bound sometimes, such that I can only cycle forwards OR backwards. Complete mess.
It's absolutely terrible. Want to get one of your terminals and one of your vs code windows next to each other to check something visually? Can't do it. CMD-tab brings ALL of your terminal windows to the front, or ALL of your vs code windows :/
I still can't understand who ever thought this was a good idea...
I think there is too much customization and options. Maybe having a .*aml/json file would be good.
I have a few hammerspoon customization for me to choose and open the applications I have. I put those on different desktop but use this to open applications. Whereas for the tiling itself use either aerospace or Loop.
Here is the hammerspoon code for opening the apps using keyboard more like vim jump options.
```
----show all windows of the clicked application
local function showAppWindows(window)
local app = window:application()
local appWindows = app:allWindows()
if #appWindows > 1 then
hs.hints.windowHints(appWindows, function(selectedWindow)
selectedWindow:focus()
local frame = selectedWindow:frame()
hs.mouse.setAbsolutePosition({ x = frame.x + frame.w / 2, y = frame.y + frame.h / 2 })
end)
else
window:focus()
local frame = window:frame()
hs.mouse.setAbsolutePosition({ x = frame.x + frame.w / 2, y = frame.y + frame.h / 2 })
end
end
local function createWindowSearchModal()
local allWindows = hs.window.allWindows()
local windowChoices = {}
for i, window in ipairs(allWindows) do
if window:title() and window:title() ~= "" then
local app = window:application()
local appName = app and app:name() or "Unknown"
table.insert(windowChoices, {
text = appName .. " - " .. window:title(),
subText = "Window " .. i,
window = window,
id = i
})
end
end
local chooser = hs.chooser.new(function(choice)
if choice and choice.window then
choice.window:focus()
local frame = choice.window:frame()
hs.mouse.absolutePosition({ x = frame.x + frame.w / 2, y = frame.y + frame.h / 2 })
end
end)
chooser:choices(windowChoices)
chooser:searchSubText(true)
chooser:show()
---- window search modal for active application only
local function createActiveAppWindowSearchModal()
local frontmostApp = hs.application.frontmostApplication()
if not frontmostApp then
hs.alert.show("No active application detected")
return
end
local appWindows = frontmostApp:allWindows()
local windowChoices = {}
for i, window in ipairs(appWindows) do
if window:title() and window:title() ~= "" then
table.insert(windowChoices, {
text = window:title(),
subText = "Window " .. i,
window = window,
id = i
})
end
end
if #windowChoices == 0 then
hs.alert.show("No windows found for active application")
return
end
local chooser = hs.chooser.new(function(choice)
if choice and choice.window then
choice.window:focus()
local frame = choice.window:frame()
hs.mouse.absolutePosition({ x = frame.x + frame.w / 2, y = frame.y + frame.h / 2 })
end
end)
chooser:choices(windowChoices)
chooser:searchSubText(true)
chooser:show()
end
As someone who switched to macos from the hot pile of mess called windows last year, my biggest point of pain was the window management. I use Rectangle Pro, and it helps a lot, but IMHO workspace integration is poor still.
I'll give this one a try. BTW, if this works, can you please consider asking money for it? Keep it open source but perhaps add a friction-less support channel (read: not github issues) for paying customers. Just an idea.
In any case, thanks for the hard work and making it open-source.
There is AltTab[0] (free and open-source) also, to get a windows-ish windows management on macOS.
[0] https://github.com/lwouis/alt-tab-macos
thanks for the kind words and I might create a discord server for the support but I havent really thought about it.
Very cool to see movement in this space, and congrats on launching! Agree that it looks polished, I also like that you chose to show screenshots from settings on the LP.
I use yabai and I've been wanting something similar to what you built. Instead of one desktop per workspace, I'd like to be able to have "sets of desktops" per workspace as it were, because not all work I do that involves multiple apps needs them on the same screen at all times (or even ever).
As an example: I might have IDE + browser on one desktop, Fork.app and local server on another, and Music.app on a third (as I like to listen to music while I work). So to me, those are all related, but don't make sense on one desktop.
The other consideration is that I also tend to use tiling more on bigger displays. Since I sometimes do work with just the builtin display, I have to reorganize windows and desktops every time I switch, which is a bit of a PITA. With a solution like yours, but for sets of desktops, I could just switch to a different set and be done in seconds.
Is something similar possible using HopTab?
not fully yet but what you can do today is create separate profiles for each Space (ide+browser on one, Fork+server on another,music on a third) and they auto switch as you swipe between desktops. So the per Space part works but what's missing is the "group" bit there's no way to say "these 3 profiles are all part of my Coding workspace, activate them all at once." That's exactly where I want to take this though. The building blocks are mostly there, just need that workspace layer on top. The display switching thing with snapshotting per display config so laptop only vs docked setups just work is a bit PITA to build but I am working on it
I have a really wide screen (52') and all these window managment apps fails for me at the point that I only can divide the screen in thirds or halfs. Thirds for three apps is too small, halfes to large. I need custom areas like 3/7, 3/7, 1/7. The only app which i found which this offers is 1piece
Divvy handles this very well. It's been my go-to for like fifteen years: https://mizage.com/divvy/
Same. Divvy is simple and effective and "just works".
Fifty two feet?! Damn!
https://www.youtube.com/watch?v=gbDostWXpcU
Is humblebragcomplain a word? ;)
Just having watched the video, the session setup, close, and launch seem tied to the idea of a single window per app. Is that right? What kinds of workflows is this explicitly meant vs. not meant to support?
The way a user switches window sets with backtick and app windows within them with tab is inverted from the usual major and minor shortcuts. Normally you switch apps with tab and windows within them with backtick, or in the case of stage manager, you switch window sets with tab and windows within them with backtick. As a default I think the keys make less sense than they could.
This looks awesome and polished. I've made similar app for myself coming from similar setup (Rectangle, altTab)
I needed custom icons, custom names for windows, obligatory custom and persistent order, 'always on' option and keyboard nav for showing/moving windows from the strip. Could not be happier.
I've been building HopTab as a free alternative to the combination of Cmd+Tab replacers and window managers. It started as a simpleapp switcher — pin your apps, Option+Tab through them. But the latest release adds a lot.
*What's new*
Global window tiling shortcuts — Ctrl+Opt+Arrow for halves, Ctrl+Opt+UIJK for quarters, Ctrl+Opt+DFG for thirds. Works anytime, no switcher needed. All 17 directions are configurable.
Cycle through sizes — press Ctrl+Opt+Left twice and the window goes from 1/2 to 1/3, press again for 2/3. Same for right. This is the Rectangle feature I missed most.
Undo snap — Ctrl+Opt+Z restores the previous window position. Every snap saves the old frame automatically.
Move between monitors — Ctrl+Opt+Cmd+Arrow throws the window to the next display with proportional placement.
Configurable gaps — 0–20pt gaps between snapped windows. Settings slider with live preview.
Profile switcher shows app icons — instead of generic person avatars, the Option+` overlay shows a grid of each profile's actual pinned app icons.
*What was already there*
Pin apps, Option+Tab to cycle through only those Profiles per workflow (Coding, Design, etc.) with per-profile hotkeys Layout templates (50/50, IDE 60/40, three columns, 2×2 grid) Session save/restore — saves every window's position, size, z-order per profile Assign profiles to macOS Spaces — auto-switches when you swipe desktops Window picker for multi-window apps Cmd+Q/H/M while switcher is open Sticky notes per profile What it replaces
I was using Rectangle + AltTab + some manual window dragging. HopTab combines the app switching, window tiling, and workspace management into one app. The main difference from AltTab is that you pin specific apps instead of seeing everything. The main difference from Rectangle is that tiling is integrated with profiles and layouts — snap your windows, save the session, restore it tomorrow.
Free, open source, no telemetry. ~3MB binary.
Website: https://www.royalbhati.com/hoptab
GitHub: https://github.com/royalbhati/HopTab
This looks very cool. Does the window picker for multi-window apps work with the pinning? So if I have a safari windows I want to have associated with a profile, and the option-tab will ignore all the other windows?
It is a constant pain when I cmd-tab in a space with safari, and it throws me out of the space to another one because the window that gets focus isn’t the “closest” one on the current space.
right now it shows all safari windows not just the ones on your current space, so the "wrong space" problem could still happen. I'll look into Space aware window filtering.
Cmd+Tab is one of those things that shipped in 2003 and nobody at Apple has touched since. Surprised it took this long for someone to properly replace it.
I mean to be fair, (1) there are replacements, AltTab and Switcher for example, and (2) why replace ot touch something that isn't broken? Cmd+Tab is supposed to switch to the next open window, and it does exactly that.
No, Cmd+Tab switches to the next application. This is what people get surprised and annoyed by. I've been using Mac for 15 years now and I find it super awkward to switch between windows within an app. On my machine it's Cmd ` or something strange like that. This is also doubly bound sometimes, such that I can only cycle forwards OR backwards. Complete mess.
It's absolutely terrible. Want to get one of your terminals and one of your vs code windows next to each other to check something visually? Can't do it. CMD-tab brings ALL of your terminal windows to the front, or ALL of your vs code windows :/
I still can't understand who ever thought this was a good idea...
> CMD-tab brings ALL of your terminal windows to the front, or ALL of your vs code windows
Cmd+Tab to the app, then press ↓ to choose a window from the app. Arrange using the basic OS window manager or your favorite 3rd-party window manager.
Does it have custom layouts? I can see it mentioned, I have rotated monitors so none of the standard ones really suit.
they are supported under the hood but the UI for creating them isnt built yet but its on the roadmap.I'll prioritize it (:
Looks like this is going to find a place full-time on my mac and replace Rectangle, only problem being I don't have more menu bar icon space.
https://github.com/jordanbaird/Ice Try this. I am not affiliated in anyway. It's my must have macos app.
I use Rectangle but I don't have it in the menu bar. If I want the control panel I'll just use Spotlight to bring it up.
wish I could solve your menubar mess
Rectangle is a nice no-config solution for me.
Is there any app switcher that doesn't need manual reload of configuration each time you open a new app so that it sees it?
I think there is too much customization and options. Maybe having a .*aml/json file would be good.
I have a few hammerspoon customization for me to choose and open the applications I have. I put those on different desktop but use this to open applications. Whereas for the tiling itself use either aerospace or Loop.
Here is the hammerspoon code for opening the apps using keyboard more like vim jump options.
```
----show all windows of the clicked application
local function showAppWindows(window) local app = window:application() local appWindows = app:allWindows() if #appWindows > 1 then hs.hints.windowHints(appWindows, function(selectedWindow) selectedWindow:focus() local frame = selectedWindow:frame() hs.mouse.setAbsolutePosition({ x = frame.x + frame.w / 2, y = frame.y + frame.h / 2 }) end) else window:focus() local frame = window:frame() hs.mouse.setAbsolutePosition({ x = frame.x + frame.w / 2, y = frame.y + frame.h / 2 }) end end
hs.hotkey.bind({ "cmd", "ctrl", "alt", "shift" }, "p", function() hs.hints.windowHints(nil, showAppWindows) end)
----window search modal
local function createWindowSearchModal() local allWindows = hs.window.allWindows() local windowChoices = {}
endhs.hotkey.bind({ "cmd", "ctrl", "alt", "shift" }, "o", function() createWindowSearchModal() end)
---- window search modal for active application only
local function createActiveAppWindowSearchModal()
local frontmostApp = hs.application.frontmostApplication() if not frontmostApp then hs.alert.show("No active application detected") return end local appWindows = frontmostApp:allWindows() local windowChoices = {} for i, window in ipairs(appWindows) do if window:title() and window:title() ~= "" then table.insert(windowChoices, { text = window:title(), subText = "Window " .. i, window = window, id = i }) end end if #windowChoices == 0 then hs.alert.show("No windows found for active application") return end local chooser = hs.chooser.new(function(choice) if choice and choice.window then choice.window:focus() local frame = choice.window:frame() hs.mouse.absolutePosition({ x = frame.x + frame.w / 2, y = frame.y + frame.h / 2 }) end end) chooser:choices(windowChoices) chooser:searchSubText(true) chooser:show() end
hs.hotkey.bind({ "cmd" }, "1", function() createActiveAppWindowSearchModal() end) ```
You cannot seriosly think that dropping a whole snippet as a comment is a smart move