
Everything on this site exists because I wanted it to exist and nobody had made it. That is not a business plan, but it is a clear test: if the thing I want already exists and is good, I have no reason to build it.
I have only ever applied that test in one direction. I check before I start. What I had never done is check again, later, once something is already built and shipped and carrying my name on a product page.
SpaceMan came out of a macOS itch that was niggling at me every day. The OS knows where your windows are. It should maintain a memory of open window positions across displays, spaces and sessions. I remember that it used to do this well,1 but it hasn't (for me at least) for a long time. Change displays and it will happily destroy an arrangement you've developed muscle memory for. It irritated the heck out of me.
So I built SpaceMan and it had one idea in it I still think is right. A workspace is not a set of displays. It is a set of displays and the Mission Control space you are looking at. Space 2 and space 3 on the same two monitors are different places, and so are space 2 on my laptop display and space 2 with the lid closed and two externals. I want different layouts on all of them. So SpaceMan keyed every snapshot on the display count, the sorted display UUIDs, and the private identifier macOS uses for the current space, and the menu only ever showed you snapshots that belonged where you were standing.
Nothing I could find did that. The commercial tools that cost real money key on the display configuration alone, or use global named layouts, or auto-restore whether you asked or not.
SpaceMan kinda worked. It also kinda didn't, and I have been carefully not saying so.
Restoring a layout means the app finding every window again, and the ways that goes wrong are endless. An app is not running, so launch it and wait for a window, except some apps open no window on launch. The app has one window and the snapshot has three, so drive its menu bar looking for something called New Window, except plenty of apps have no such item and plenty more call it something else. A window has moved to another space since capture, so the accessibility API reports it happily and then silently ignores every attempt to move it.
Every one of those has a fix, and I wrote a lot of them. What I never got was the feeling that it worked, as opposed to the feeling that it worked this time.
RememberMyWindows, by Netanel Bergman, does the same job. I found it while looking for prior art on something else entirely (funny how life does this).
RMW is better than SpaceMan, in ways I cannot argue with. It tracks your layout continuously instead of waiting to be told, so there is nothing to remember to do. It restores automatically when a display comes back, which is the case SpaceMan never handled at all. It treats full-screen windows properly, where SpaceMan hoped. And it is under development at a rate I cannot match: forty commits and six releases in the four days since I forked it.
I read the source, made a list of everything I could find wrong with it, and offered the list to its author.
There was a licence problem first. The repository had no licence at all, which sounds like a technicality and is not: without one, nobody can legally contribute, fork, or reuse a line of it. I raised it as a question rather than a complaint, and two days later he added one and chose GPLv3. That also settled the direction of travel permanently, because GPLv3 code cannot come back into a Jorvik app — everything I publish is public domain, and public domain cannot absorb a copyleft. So there was never going to be a quiet borrowing of ideas here.
Three of my patches have shipped in his releases and four more are open. They are the unglamorous kind: an event tap that stops working the first time the system decides it is too slow, a save that waits forever on a location fix that never arrives, a hidden desktop that stays hidden through a restart with no way back, a number in a saved file that can crash the app while it is drawing the window you would use to delete it.
None of that is my app. All of it is the thing I actually wanted, which was for my windows to go back where I put them.
RememberMyWindows identifies a workspace by the display hardware alone. It has no Mission Control space dimension at all. I checked the source rather than assuming: the fingerprint is built from display UUIDs, screen numbers and geometry, and there is no reference to spaces anywhere in it.
So the one idea in SpaceMan that I could not find anywhere else, the idea that made me build it rather than buy something, is the idea I am giving up. It also will not spawn extra windows: it will launch an app that is not running, but if your saved layout had three Finder windows and you have one, one is what you get.
I could argue those are worth keeping SpaceMan for. I do not think they are. A tool that gets the unusual case right and the ordinary case unreliably is worse than one that gets the ordinary case right every time, and I know which of those I have been running all week.
I might propose adding spaces to his app eventually. But it would mean putting a private, undocumented Apple API into somebody else's shipping product, which is a significant thing to ask of a maintainer, and I already have one open proposal asking him to reverse a design decision.
Version 2.0.11 went out today and it is the last one. Its only change is that it tells you all of this: there is a notice at the top of the menu, and it says so once on first launch. If you already have SpaceMan, the update will find you.
The repository is archived, which means read-only rather than deleted. The product page stays up with the notice on it. The Homebrew cask is marked deprecated, so brew will warn you and then install it anyway if you insist. Your snapshots are yours and nothing removes them.
Two dozen apps sit on this site, plus the games. Every one of them was, at the time, a thing that did not exist or did not exist in a form matching my requirements, and I have never once gone back to ask whether that is still true. I am not going to pretend I will now audit all of them. But I have one fewer app to maintain and a better tool on my Mac than the one I wrote.
ActiveSpace still gets you to the space, and WindowPin still keeps a window on top. Somebody else's app now manages the arrangement.
Mandela Effect perhaps? ↩