Can you recommend a Window Manager for the Mac? I would like to have a keyboard shortcut that would snap a windows to the left or right half of my screen.

  • 4
    I don't think you can snap in or out a window manager under OS X.
    – zneak
    Aug 30, 2010 at 16:18
  • @mankoff This question was asked 6 months ago. Your question is a duplicate of this one. Mar 5, 2011 at 19:14
  • @Kyle the new question is attempting to be a more generic question. This one is specific to snapping left/right. There are lots of specific windowing questions. Sorry, not trying to cause problems with your good +11 answer here, just trying to make a single reference place for all WM questions.
    – user588
    Mar 5, 2011 at 19:20
  • @mankoff I'm not worried about my answer, I'm just saying that this question shouldn't be closed as a "duplicate" of a newer question. Mar 5, 2011 at 20:56
  • I agree it shouldn't actually be closed, but it is still a duplicate. Time is irrelevant, they are each duplicates of each other and should reference each other. I was just trying to follow the last paragraph of this post: blog.stackoverflow.com/2011/01/…
    – user588
    Mar 5, 2011 at 22:26

16 Answers 16


SizeUp is exactly what you need:

SizeUp allows you to quickly position a window to fill exactly half the screen (splitscreen), a quarter of the screen (quadrant), full screen, or centered via the menu bar or configurable system-wide shortcuts (hotkeys). Similar to "tiled windows" functionality available on other operating systems.

  • 1
    It seems weird that there's no free alternative, but this was worth the cost. I really only use 'Full Screen' and 'Next Monitor', but it's worth it. Aug 30, 2010 at 17:02
  • @Fishtoaster The company that makes SizeUp also made a free version called TwoUp, but it's been discontinued Aug 30, 2010 at 17:37
  • 1
    This. SizeUp rocks my world on a daily basis.
    – Matt
    Aug 31, 2010 at 14:51
  • This has a ton of great default positions. Thanks for the suggestion. Aug 31, 2010 at 16:10
  • 1
    @citadelgrad: if this solved your problem, don't forget to check the √ mark next to the post.
    – zneak
    Aug 31, 2010 at 16:33


Divvy is a little menubar app that allows you to automatically resize any active window. Divviy virtually divides your screen into a 6x6 grid. When invoked, Divvy brings up a little HUD in the middle of the screen with this 6x6 grid. Depending on what part of your screen you want to resize your active window, just drag and select those squares on the HUD and the window does the rest. It’s that simple.


After testing SizeUp and Breeze, I've decided that Breeze fits my needs the best. Both allow you to position windows on the left, right, or Fullscreen. The feature that sold it for me was setting a default size & position for an application and assigning it a shortcut key.

  • Awesome. Thanks for sharing what you decided on. For 8 bucks looks great.
    – mkelley33
    Feb 2, 2011 at 3:03

ShiftIt (original version at link discontinued) does this, and is free and open source.

Edit: The project is now on GitHub, however the last release was in November 2010.

  • 1
    This is what I was gonna say. Works fine on Snow Leopard. Supports assignable keyboard shortcuts as well.
    – Randy6T9
    Feb 2, 2011 at 2:47
  • It's cool that it is open source, but the fact that it requires X11 makes it a no go for me Apr 25, 2013 at 18:48


I've heard some people talk this one up too:

Do you spend a lot of time moving and zooming windows, so you can better see and work with all the content on your Mac? Instead of doing that work yourself, let Moom handle the task for you.


If you have a magic mouse or magic trackpad, BetterTouchTool is better as you can set specific gestures to manage the windows. Like a four finger left swipe can be to resize the window to the left 50% of the screen.


Moom is great. You can snap windows to: full screen, half screen, quarter screen. You can also resize with a grid. It supports custom keyboard shortcuts, too.

Moom screenshot

  • +1 for including an image, since that it quite useful for getting an idea of how it works. Nov 3, 2011 at 22:31

I personally use SizeUp and Divvy on a daily basis. If I had known about ShiftIt earlier, I probably wouldn't have paid for SizeUp. Another one to check out that hasn't been mentioned yet is BetterTouchTool, which has a lot of other features, but hidden in the advanced options is a nice feature they call "Window Snapping" which snaps the window to the left or right of the screen when you drag it to the side. Doesn't have keyboard shortcut functionality included, but it is a nice supplement to SizeUp and Divvy.

  • 1
    BetterTouchTool is what I now use for this, it's one of the best free apps out there. Sep 19, 2011 at 0:31

I found here from an off topic question on Stack Overflow:

There were two Open Source mangers mentioned there that did not show up on this list:

Another from the App Store

  • There's a nice overview of Slate and what it can do in this blog post titled: Using Slate: A Hacker's Window Manager for Macs
    – slm
    Mar 16, 2015 at 12:40
  • I use Spectacle myself. It does have one issue with a specific application—the undo command doesn't seem to work on Firefox windows. It also doesn't seem to have as many features as Slate.
    – SilverWolf
    Oct 10, 2017 at 17:14

You can also try Slate which is free and open source.

You might also want to read this article about it.


Here is an Applescript that will tile all of the open windows in the frontmost application. Add to ~/Library/Scripts and call from the Applescript menu in the menu bar. Add salt to taste (and free).

--tile windows of frontmost applications in a grid
--this script is useful for
--multiple window chatting
--working side by side of several windows of the same app

--make need to make it as a stay open application later
--for now assume that it is opened and closed per invokation

property horizontalSpacing : 10 -- sets the horizontal spacing between windows
property verticalSpacing : 10 -- sets the vertical spacing between windows
property maxRows : 2
property maxCols : 2

on run {}
    local a
    set userscreen to my getUserScreen()

    --display dialog (getFrntApp() as string)
        set applist to getFrntApp()
        if length of applist = 0 then
        end if
        set a to item 1 of getFrntApp()
    on error the error_message number the error_number
        display dialog "Error: " & the error_number & ". " & the error_message buttons {"OK"} default button 1
    end try

        tileScriptable(a, userscreen)
    on error the error_message number the error_number
        --display dialog "Error: " & the error_number & ". " & the error_message buttons {"OK"} default button 1
            tileUnscriptable(a, userscreen)
        on error the error_message number the error_number
            display dialog "Error: " & the error_number & ". " & the error_message buttons {"OK"} default button 1
        end try
    end try

end run

on tileScriptable(a, screen)
    local i, c
    set i to 1
    tell application named a
        set theWindows to every window of application a whose visible is true and floating is false and ¬
            modal is false -- and miniaturized is false
        set c to count theWindows
        if c = 0 then
        end if
        set tiles to calTileBounds(c, screen, 1)
        repeat with theWindow in theWindows
            my tileScriptableWindow(a, theWindow, item i of tiles)
            set i to i + 1
        end repeat
    end tell
end tileScriptable

on tileUnscriptable(a, screeninfo)
    -- unscriptable app
    local i, c
    set i to 1
    tell application "System Events"
        set theWindows to (every window of application process a)
        --set theWindows to my filterUnscriptableInvisible(theWindows)

        set c to count theWindows

        if c = 0 then
        end if

        --display dialog screeninfo as string giving up after 5
        set tiles to my calTileBounds(c, screeninfo, 1)
        repeat with theWindow in theWindows
            --display dialog (class of visible of theWindow)
            my tileUnScriptableWindow(a, theWindow, item i of tiles)
            set i to i + 1
        end repeat

    end tell
end tileUnscriptable

on filterUnscriptableInvisible(ws)
    -- filter out from ws windows that are docked    
    set newws to {}
    set docklist to getNamesDocked()
    --display dialog (docklist as string)
    repeat with theWindow in ws
        if name of theWindow is not in docklist then
            set end of newws to theWindow
        end if
    end repeat

    --display dialog (count newws)
    return newws
end filterUnscriptableInvisible

on getNamesDocked()
    tell application "System Events" to tell process "Dock"'s list 1
        set l to name of UI elements whose subrole is "AXMinimizedWindowDockItem"
    end tell

    return l
end getNamesDocked

on tileScriptableWindow(a, w, bound)
    tell application a
        set bounds of w to bound
    end tell
end tileScriptableWindow

on tileUnScriptableWindow(a, w, bound)
    tell application "System Events"
        --display dialog (count position of w)
        set AppleScript's text item delimiters to " "

        set position of w to {(item 1 of bound), (item 2 of bound)}

        -- why the -5?
        set size of w to {(item 3 of bound) - (item 1 of bound) - 5, ¬
            (item 4 of bound) - (item 2 of bound) - 5}
        --display dialog (count properties of w)
    end tell
end tileUnScriptableWindow

on calTileBounds(nWindows, screen, direction)
    -- return a list of lists of window bounds
    -- a simple tile algo that tiles along direction (current only 1=horizontal)

    local nrows, nColumns, irow, icolumn, nSpacingWidth, nSpacingHeight, nWindowWidth, nWindowHeight
    set {x0, y0, availScreenWidth, availScreenHeight} to screen
    set ret to {}

    set nrows to (nWindows div maxCols)
    if (nWindows mod maxCols) ≠ 0 then
        set nrows to nrows + 1
    end if

    if nrows < maxRows then
        set nSpacingHeight to (nrows - 1) * verticalSpacing
        set nWindowHeight to (availScreenHeight - nSpacingHeight) / nrows
        set nSpacingHeight to (maxRows - 1) * verticalSpacing
        set nWindowHeight to (availScreenHeight - nSpacingHeight) / maxRows
    end if

    repeat with irow from 0 to nrows - 1
        if nrows ≤ maxRows and irow = nrows - 1 then
            set nColumns to nWindows - irow * maxCols
            set nColumns to maxCols
        end if
        set nSpacingWidth to (nColumns - 1) * horizontalSpacing
        set nWindowWidth to (availScreenWidth - nSpacingWidth) / nColumns
        set nTop to y0 + (irow mod maxRows) * (verticalSpacing + nWindowHeight)
        --display dialog "Top: " & nTop buttons {"OK"} default button 1
        repeat with icolumn from 0 to nColumns - 1
            set nLeft to x0 + (icolumn) * (horizontalSpacing + nWindowWidth)
            set itile to {¬
                nLeft, ¬
                nTop, ¬
                nLeft + nWindowWidth, ¬
                nTop + nWindowHeight}
            set end of ret to itile
            --display dialog item 3 of itile as string
            --set itile to {x0 + (icolumn - 1) * wgrid, y0, wgrid, hgrid}
            --set item 3 of itile to ((item 1 of itile) + (item 3 of itile))
            --set item 4 of itile to ((item 2 of itile) + (item 4 of itile))
        end repeat
    end repeat

    return ret
end calTileBounds

on getFrntApp()
    tell application "System Events" to set frntProc to ¬
        name of every process whose frontmost is true and visible ≠ false
    return frntProc
end getFrntApp

on getUserScreen()
    -- size of the menubar
    tell application "System Events"
        set {menuBarWidth, menuBarHeight} to size of UI element 1 of application process "SystemUIServer"
        --display dialog "Menubar width: " & menubarWidth & ", height: " & menubarHeight
        set dockApp to (application process "Dock")
        set {dockWidth, dockHeight} to size of UI element 1 of dockApp
        --display dialog "Dock width: " & dockWidth & ", height: " & dockHeight
        set dockPos to position of UI element 1 of dockApp
        --display dialog "Dock x: " & (item 1 of dockPos) & ", y: " & (item 2 of dockPos)
    end tell

    -- size of the full screen
   {word 3 of (do shell script "defaults read /Library/Preferences/com.apple.windowserver | grep -w Width") as number, ¬
       word 3 of (do shell script "defaults read /Library/Preferences/com.apple.windowserver | grep -w Height") as number}
    tell application "Finder"
        set screenSize to bounds of window of desktop
        set screenWidth to item 3 of screenSize
        set screenHeight to item 4 of screenSize
    end tell
    --display dialog "Screen width: " & screenWidth & ", height: " & screenHeight

    -- by default, set the available screen size to the full screen size
    set availableWidth to screenWidth
    set availableHeight to screenHeight - menuBarHeight
    set availableX to 0
    set availableY to menuBarHeight

    --determine the userscreen origin and size

    -- case 0: hidden dock
    -- if (item 1 of dockPos < 0 or item 1 of dockPos ≥ screenHeight) then
    -- no need to change anything
    -- end if

    -- case 1: bottom dock
    if ((item 2 of dockPos) + dockHeight = screenHeight) then
        set availableHeight to availableHeight - dockHeight
    end if

    -- case 2: left dock
    if (item 1 of dockPos = 0) then
        set availableWidth to availableWidth - dockWidth
        set availableX to dockWidth
    end if

    -- case 3: right dock
    if ((item 1 of dockPos) + dockWidth = screenWidth) then
        set availableWidth to availableWidth - dockWidth
    end if

    return {availableX, availableY, availableWidth, availableHeight}
end getUserScreen

Source: MacScripter via Google


From what I've seen and heard, Cinch is a great application for bringing the window management of Windows 7 to Mac OS X.

  • Window management of Windows 7 is mostly non-existent apart from Aero Snap, though. *nix has much more options, which these pieces of software are likely influenced by. Jan 15, 2012 at 21:01

First of all, if free is important to you, get ShiftIt.

If convenience from a mouse is important to you, get Cinch. It's in the Mac App Store.

Finally if you have a Macbook or a Magic Trackpad, get JiTouch. It will allow you to assign a gesture to many, many things; one of which is full screen, half-left, half-right. Seriously check it out if you like gestures even a little. It's like having a mouse with 100+ buttons. JiTouch



You might also look at MercuryMover, which gives you a range of window moving tools under a series of keyboard mappings. I used to use this a lot when struggling with a small laptop screen, and you can get it to flip a window to the edge of a screen etc. It most closely maps the 'move' system menu functionality that you get in normal Windows 'windows'.


I'm using Magnet, is available on the AppStore

enter image description here



As far as I understand you question, you want to stick the window to the edge of the screen, so that the side of the window is directly on the edge of the screen. This is now possible on macOS Sierra (10.12) natively.

All you need to do is to move the window you want to position (by clicking and dragging the top of the window) to the side that you want it to stick to. You need to do this slowly, or else it won't work. After you drag the window over to the edge, it will stick a while and that's when you should stop.

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .