HackerReposA FIELD GUIDE TO OPEN SOURCE
ProSponsor the shelf♧ 0
← Back to top all-time
jigish
slate
Objective-C2011–2024
jigish / slate

slate

A window management application (replacement for Divvy/SizeUp/ShiftIt)

64Distinct people
71Mentions
7Explicit recommenders
7.8KGitHub stars
REPOSITORY AT A GLANCE

What to know before exploring

What it is

A window management application (replacement for Divvy/SizeUp/ShiftIt)

GitHub

Where it is used

No documented product use was verified in the last source check.

What people are saying

Another one is called slate: https://github.com/jigish/slate Very flexible, my favorite feature is that configs can be written in JS, here's mine:…

tnajdek used a recommendation phrase. 7 indexed comments match. This is a phrase match, not a verdict.

No classified warning is attached to this page. Read the discussions before treating silence as approval.

Also in these discussions

Mentioned in the same Hacker News threads. That is not proof they are substitutes.

This week on Hacker News

Nov 8–Nov 15 UTC · Direct repository links and separately labeled related project stories. Indexed through 11/15/2026, 4:00:59 PM UTC.

No direct repository links were found in the indexed HN discussions over the past seven days. Older discussions are available below.

Mentions over time

HN mentions by year71 dated mentions

Observed mentions: 2011-12-20 19:13:10 UTC to 2024-06-11 02:13:22 UTC.

051015202011-01-01 00:00:00 UTC to 2012-01-01 00:00:00 UTC (exclusive): 1 mentions; 0 submissions, 1 comments20112012-01-01 00:00:00 UTC to 2013-01-01 00:00:00 UTC (exclusive): 8 mentions; 2 submissions, 6 comments2013-01-01 00:00:00 UTC to 2014-01-01 00:00:00 UTC (exclusive): 22 mentions; 1 submissions, 21 comments2014-01-01 00:00:00 UTC to 2015-01-01 00:00:00 UTC (exclusive): 17 mentions; 0 submissions, 17 comments2015-01-01 00:00:00 UTC to 2016-01-01 00:00:00 UTC (exclusive): 5 mentions; 0 submissions, 5 comments2016-01-01 00:00:00 UTC to 2017-01-01 00:00:00 UTC (exclusive): 1 mentions; 0 submissions, 1 comments2017-01-01 00:00:00 UTC to 2018-01-01 00:00:00 UTC (exclusive): 6 mentions; 0 submissions, 6 comments20172018-01-01 00:00:00 UTC to 2019-01-01 00:00:00 UTC (exclusive): 4 mentions; 0 submissions, 4 comments2019-01-01 00:00:00 UTC to 2020-01-01 00:00:00 UTC (exclusive): 4 mentions; 0 submissions, 4 comments2020-01-01 00:00:00 UTC to 2021-01-01 00:00:00 UTC (exclusive): 0 mentions; 0 submissions, 0 comments2021-01-01 00:00:00 UTC to 2022-01-01 00:00:00 UTC (exclusive): 0 mentions; 0 submissions, 0 comments2022-01-01 00:00:00 UTC to 2023-01-01 00:00:00 UTC (exclusive): 2 mentions; 0 submissions, 2 comments2023-01-01 00:00:00 UTC to 2024-01-01 00:00:00 UTC (exclusive): 0 mentions; 0 submissions, 0 comments2024-01-01 00:00:00 UTC to 2025-01-01 00:00:00 UTC (exclusive): 1 mentions; 0 submissions, 1 comments2024

Counts come from the repository’s dated source evidence. Index cutoff: 2026-11-02 08:16:59 UTC.

View mention counts and date ranges
UTC ranges include their start and exclude their end. Select a period to filter the source evidence.
PeriodStart (UTC)End (exclusive, UTC)MentionsSubmissionsComments
20112011-01-01 00:00:00 UTC2012-01-01 00:00:00 UTC101
20122012-01-01 00:00:00 UTC2013-01-01 00:00:00 UTC826
20132013-01-01 00:00:00 UTC2014-01-01 00:00:00 UTC22121
20142014-01-01 00:00:00 UTC2015-01-01 00:00:00 UTC17017
20152015-01-01 00:00:00 UTC2016-01-01 00:00:00 UTC505
20162016-01-01 00:00:00 UTC2017-01-01 00:00:00 UTC101
20172017-01-01 00:00:00 UTC2018-01-01 00:00:00 UTC606
20182018-01-01 00:00:00 UTC2019-01-01 00:00:00 UTC404
20192019-01-01 00:00:00 UTC2020-01-01 00:00:00 UTC404
20202020-01-01 00:00:00 UTC2021-01-01 00:00:00 UTC000
20212021-01-01 00:00:00 UTC2022-01-01 00:00:00 UTC000
20222022-01-01 00:00:00 UTC2023-01-01 00:00:00 UTC202
20232023-01-01 00:00:00 UTC2024-01-01 00:00:00 UTC000
20242024-01-01 00:00:00 UTC2025-01-01 00:00:00 UTC101

From the project README

An excerpt from the repository, fetched Nov 13, 2026.

Read the project’s introduction
About Slate Slate is a window management application similar to Divvy and SizeUp (except better and free!). Originally written to replace them due to some limitations in how each work, it attempts to overcome them by simply being extremely configurable. As a result, it may be a bit daunting to get configured, but once it is done, the benefit is huge. Slate currently works on Mac OS X 10.6 and above Summary of Features Highly customizable Bind keystrokes to: move and/or resize windows directionally focus windows activate preset layouts create, delete, and activate snapshots of the current state of windows Set default layouts for different monitor configurations which will activate when that configuration is detected. Window Hints: an intuitive way to change window focus [Beta] A better, more customizable, application switcher. Credits Big thanks to philc for the Window Hints idea (and initial implementation) as well as plenty of other suggestions and improvement ideas. Using Slate Installing Slate NEW Installation Instructions Note: You must turn on the Accessibility API by checking System Preferences > Universal Access > Enable access for assistive devices Direct Download .dmg .tar.gz Terminal Just run this in your terminal: cd /Applications && curl http://www.ninjamonkeysoftware.com/slate/versions/slate-latest.tar.gz | tar -xz Configuring Slate NEW: You may now use a ".slate.js" file to configure slate using JavaScript. This allows for much more complex and dynamic configurations than the normal slate configuration style below. You can check out the documentation for this here. Slate is configured using a ".slate" file in the current user's home directory. Configuration is loaded upon running Slate. You can also re-load the config using the "Load Config" menu option on the status menu (use this at your own risk. It is better to simply restart Slate). Note: If no ".slate" file exists in the current user's home directory, the default config file will be used. Configuration is split into the following directives: config (for global configurations) alias (to create alias variables) layout (to configure layouts) default (to default certain screen configurations to layouts) bind (for key bindings) source (to load configs from another file) Note: # is the comment character. Anything after a # will be ignored. ###Expressions### Some directives allow parameters that can be expressions. The following strings will be replaced with the appropriate values when using expressions: screenOriginX = target screen's top left x coordinate (should not be used in Window Hints configs) screenOriginY = target screen's top left y coordinate (should not be used in Window Hints configs) screenSizeX = target screen's width screenSizeY = target screen's height windowTopLeftX = window's current top left x coordinate (should not be used in Window Hints configs) windowTopLeftY = window's current top left y coordinate (should not be used in Window Hints configs) windowSizeX = window's width windowSizeY = window's height newWindowSizeX = window's new width (after resize, only usable in topLeftX and topLeftY, should not be used in configs) newWindowSizeY = window's new height (after resize, only usable in topLeftX and topLeftY, should not be used in configs) windowHintsWidth = the value of the windowHintsWidth config (only usable in windowHintsTopLeftX and windowHintsTopLeftY) windowHintsHeight = the value of the windowHintsHeight config (only usable in windowHintsTopLeftX and windowHintsTopLeftY) In addition to the variables above, expressions can be used with the following functions and operators: + e.g. 1+1 = 2 - e.g. 1-1 = 0 * e.g. 2*2 = 4 / e.g. 4/2 = 2 ** e.g. 3**2 = 9 sum e.g. sum({1,2,3}) = 6 count e.g. count({4,5,6}) = 3 min e.g. min({1,3,5}) = 1 max e.g. max({1,3,5}) = 5 average e.g. average({1,2,3,4}) = 2.5 median e.g. median({1,2,3,10,15}) = 3 stddev e.g. stddev({1,2,3,4,5}) = 1.4142135623730951 sqrt e.g. sqrt(9) = 3.0 log e.g. log(100) = 2.0 ln e.g. ln(8) = 2.0794415416798357 exp e.g. exp(2) = 7.3890560989306504 (this is "e**parameter") floor e.g. floor(1.9) = 1.0 ceiling e.g. ceiling(1.1) = 2.0 abs e.g. abs(-1) = 1 trunc e.g. trunc(1.1123123123) = 1.0 random e.g. random() = 0.20607629744336009 (random float between 0 and 1) randomn e.g. randomn(10) = 4 (random integer between 0 and parameter-1) Note: When using expressions spaces are not allowed! The config Directive The config directive follows the following format: config name value List of allowed configs Example: config defaultToCurrentScreen true Note: the .slate file is read top-down directives that come before config directives may not have the config applied. As such, it is best to put config directives at the top of your .slate file. The alias Directive The alias directive follows the following format: alias name value When you set an alias, you can refer to it in any directive (sequentially after that alias directive) by referencing like ${name}. Example: alias bot-right-2nd-mon move screenOriginX+2*screenSizeX/3;screenOriginY+screenSizeY/2 screenSizeX/3;screenSizeY/2 1 Will allow you to use ${bot-right-2nd-mon} as a reference to move screenOriginX+2*screenSizeX/3;screenOriginY+screenSizeY/2 screenSizeX/3;screenSizeY/2 1 in any directive following the alias (including other alias directives) The layout Directive The layout directive follows the following format: layout name 'app name':OPTIONS operations Where: name = the name you want to use to reference the layout 'app name' = single-quoted name of the application to add to the layout **or** BEFORE or AFTER OPTIONS = a comma separated list of options for this application (cannot be used with BEFORE or AFTER) operations = a pipe separated list of operations (move, resize, pus
Read the full README on GitHub

What Hacker News says

22 sources
Give Slate [1] a try, it's a little bit of a pain to set up initially, but it lets you easily assign hotkeys to your prefered window locations. Personally I've also got PCKeyboardHack [2] and KeyRemap4Macbook [3] setup to disable capslock and remap it to a 'hyper' key (command+option+control+shift) so that I can assign my own key combos without having to conflict with other software. [1] https://github.com/jigish/slate [2] https://pqrs.org/macosx/keyremap4macbook/pckeyboardhack.html... [3] https://pqrs.org/macosx/keyremap4macbook/index.html.en
In Poll: What OS do you prefer for Web Development?
X-Windows is a dead end (and has been for a long time), and X window managers are as complex and dug into a pit of pointless complexity as the Space Shuttle. There are a lot of good reasons to have a scriptable window manager, with a scripting language tightly integrated with the window system. When I started hacking X10, I wanted to implement pie menus for it. There was a cheezy little library called "XMenu" that was intended for other programs to use to make menus, which I adapted for pie menus, but no programs actually used it, and it was not very configurable (no menu definition language, just an api), plus its model and api was not well suited for pie menus. And once you have menus, you need a way to make selecting their items actually do something! So I adapted the "uwm" window manager to support pie menus, so you could define your
Read the rest
own pie menus and linear menus in your .uwmrc file. Because a window manager could really benefit from pie menus: lots of the commands are spatially oriented and can be arranged in appropriate mnemonic directions, and they have a fixed set of common window management commands that can be thoughtfully arranged into a set of efficient pie menus, as well as a menu definition language to enable users to create custom menus for running apps, connecting with remote hosts, etc. I wanted to experiment with different styles of menu tracking, mouse ahead, display pre-emption, feedback, screen edge handling, rolling between pie menus and linear menus, invoking window management commands, and stuff like that, and uwm's C code was not very flexible in that regard. We also wanted to perform a controlled experiment comparing the selection time and error rate of pie menus and linear menus, so I needed to program the window manager to administer the experiment, define and randomize the menus, prompt the user to select from pie and linear menus, time the menu selections, report the statistics, etc. I had been using Mitch Bradley's "Forthmacs", which was a very nice Forth system for the 68k. (It eventually evolved into the Sun 4 Forth boot ROMS, OpenFirmware, and the OLPC boot ROMs). It was capable of dynamically linking in C code (well not dll's or shared libraries, but it would actually call the linker to relocate the code to the appropriate place in Forth's address space, read in the relocated code, and write Forth wrappers, so you could call C code from Forth, pass parameters, etc -- SunOS 4.2 didn't have relocatable shared libraries or light weight threads back then, so Forth had to do a lot of the heavy lifting to plug in C code. But Forth was a really great way to integrate a library into an interactive extension language, call it from the Forth command line, build on top of C code in Forth, call back and forth between C and Forth, play around with it from the Forth command line, etc). So I refactored UWM a bit so I could plug it into Forth and rewrite the main loop and event tracking code in Forth, and write higher level menu tracking and window management code in Forth, and administer the experiment in Forth. For example, you could pick up a window and throw it, and it would fork off a light weight Forth task to make it bounce around on the screen! See the "fling" code: http://www.donhopkins.com/home/archive/piemenu/uwm1/hacks.f I didn't realize it at the time, but it foreshadowed what I would later do with NeWS and PostScript. It was very nice to have a window manager that I could program in Forth, because that was my scripting language of choice at the time, and I could integrate it with C code and Xlib. But then I learned about SunDew aka NeWS (I read the SunDew article in Methodology of Window Management: http://www.chilton-computing.org.uk/inf/literature/books/wm/... and saw Gosling give a talk about it at SUG). I visited James Gosling, David Rosenthal, Owen Densmore and Mitch Bradley at Sun, who showed me NeWS, and gave me a beta copy to play around with. I learned to program PostScript, and switched from Forth to PostScript for programming windows managers, pie menus and user interfaces. PostScript is a much better language for that than Forth, not only because it has a nice graphics model, but because it's a lot more like Lisp or Smalltalk than Forth, and NeWS extended it with an object oriented programming system that used the dictionary stack to implement inheritance, with which we built user interface toolkits and entire apps, like a visual PostScript programming environment and debugger: http://www.donhopkins.com/drupal/?q=node/97 NeWS was architecturally similar to what is now called AJAX, except that NeWS coherently: + used PostScript code instead of JavaScript for programming. + used PostScript graphics instead of DHTML and CSS for rendering. + used PostScript data instead of XML and JSON for data representation. Some years passed, NeWS was canceled, some other stuff happened, the web came along, the Mac stopped sucking so badly and adopted Unix and NeXT Step, the term AJAX was coined to describe what NeWS was doing all along and what X refused to do for political reasons, and JavaScript took over the world. So back to real-time: I just recently installed and read the source code of a nice Mac tiling window manager called "Slate": https://github.com/jigish/slate . It look very clean and well designed and even simple, and I think it has a lot of potential! You can program it in JavaScript (it makes an invisible web browser and injects a JavaScript API to the application into it, and delivers events to JavaScript when windows move or change state, calling JavaScript handlers that can call back and manipulate the windows to achieve tiling window layout, and so on and so forth), and it exposes some of the Mac's accessibility API to JavaScript, which brings a lot of power to the table. Slate is very powerful and flexible, and I'd like to teach it to support pie menus (and other user interface widgetry, maybe by simply popping a web browser up in a window), so you can define pie menus in JSON for window and application management or whatever you want, and script their behavior in JavaScript, and manipulate windows and apps via the accessibility API from JavaScript. Maybe throw in an http server so your window manager can surface web pages and interactive user interfaces in web browsers (that would be a good way to implement pie menus in JavaScript and html, instead of coding them up in Objective C). I think that Slate takes exactly the right approach with JavaScript, and I hope to get my head around it and do some work with it, like making pie menus for window management, app launching and controlling the accessibility API.
In Facts about Wayland vs X
This is something that confuses even veteran Mac users, but the green button is not for maximization. Every application defines a "standard state." This could be hard-coded or, in the case of Safari, the standard state can be defined dynamically in terms of the content you're viewing. The green button is supposed to toggle between the standard state and the user state (that is, the state you've manually put the window in). If you want to just redefine the meaning of that button to be "maximize," you can use something like Right Zoom: http://www.macupdate.com/app/mac/30591/right-zoom In my case, I just use Slate and have Shift+Cmd+Enter bound to maximize the window. Then I've got Shift+Cmd+(H,J,K,L,Y,U,B,N) bound to what you'd expect based on the vim keybindings. That's just the absolute beginning of what is possible with Slate; I'm sure t
Read the rest
here's vast potential I'm not yet tapping into. Slate: https://github.com/jigish/slate
In Bruce Eckel on why he's moving back to Windows from Mac

Showing the 15 most recent of 22 sources. Enable JavaScript to search and browse every indexed mention.

MAKE YOURSELF AT HOME

A few shortcuts

/
Search the collection
?
Open this guide
Esc
Close dialogs and navigation

Your saved repositories and interests stay in this browser.