Contain
Newest first, and written for the people who use Contain rather than the ones who build it. Every 1.x update is included in the one-time licence, and the app installs them itself.
The green button now fills the screen properly. Click it (or press ⌃⌘F) and Contain drops its title bar and covers the entire display, with every contained window resized to match — edge to edge, over the Dock. Leave with the ⤡ button in the tab bar, ⌃⌘F, or Esc, and the window returns exactly where it was. The menu bar stays put: macOS gives a full-screen app a desktop of its own and lets no other app's window follow it there, so a contained window would be stranded — filling the ordinary desktop is the only version of full screen that keeps what you contained on screen.
The picker now lists every window, on every desktop and display. Windows on other Spaces — including apps sitting in full screen somewhere — used to be invisible to Contain, because macOS only shows an app the desktops you are currently looking at. They now appear in the picker; pick one and Contain hops over using the app's own Window menu, collects the window, and brings you straight back. With Screen Recording granted each is listed by name with a preview; without it, an app's far-away windows share a single tile, because untitled windows cannot honestly be told apart.
Minimized windows can now be contained. A window sitting in the Dock was missing from the picker altogether, and would not come back properly even if you reached it another way. Minimized windows are listed now, and Contain brings one back out of the Dock as it takes it.
Containing a full-screen window no longer occasionally claims the app "won't leave full screen". macOS sometimes says the exit failed while it is in fact happening; Contain now waits to see what the window does rather than taking that at face value.
Contain now launches on a Mac that is offline the first time. Every release has been approved by Apple, but until now macOS had to confirm that over the internet the first time you opened the app — so Contain started normally on any Mac with a connection, and could refuse to start on one without. Apple's approval now travels inside the app, and a first launch works with no connection at all.
Full-screen windows can now be contained. Picking a window that was in full screen used to appear to do nothing: macOS does not let anything move a window while it is in full screen, so Contain resized it and then could not place it. Contain now takes the window out of full screen first, waits for macOS to finish, and then pins it in the container. Release it — or quit Contain — and it goes back to full screen exactly as it was.
Settings → Limitations now covers two cases that used to surprise people: what happens to a full-screen window when you contain it, and why an app whose windows are all on another desktop does not appear in the picker. The second one is a limit of macOS: the picker can only see windows on the desktop you are currently looking at.
Nothing in this one for you: same licence, same updates, same behaviour as 1.2.0.
Contain no longer collects anything. The anonymous usage statistics and the analytics SDK behind them are gone from the app entirely — no counters, no events, nothing sent. The opt-out switch in Settings → Privacy has gone with them, because there is nothing left to switch off, and the pane now simply says so. The licence check is unchanged: it is how the app knows it has been bought, and Settings → Privacy still spells out exactly what it sends.
Contain is now a paid app — €6 once, for three Macs. One license key, bought through Dodo Payments, unlocks Contain on up to three of your Macs. No subscription, no account to create, and every version in the 1.x series is included. Launching without a key shows an activation window with the key field, the price and a link to the checkout — Contain does not run in a reduced mode.
Settings → License. Shows the status of this Mac, the account the key belongs to, when it was activated, and the key itself masked down to something you can quote in a support email. Two buttons: *Re-check Now*, and *Deactivate This Mac*, which frees the slot so the key can move to a different machine.
A fourteen-day offline grace window. Your key is checked once at each launch and never while you work. If the license server can't be reached, Contain keeps running for fourteen days, so a flight or a dead connection does not cost you the app you paid for. Only a definitive answer — refunded, disabled, or deactivated elsewhere — locks it, and every contained window is handed back to the desktop first.
Settings → Privacy now covers the license too. It says what activating sends (your key and this Mac's name, and nothing else), where the key and your purchase details are kept on your Mac, that deactivating deletes them, and that Wizhut never sees your card. The two new anonymous counters are listed beside the other four, and the opt-out switch covers them as well.
Contain no longer expires. Every build until now was a time-limited preview that stopped working on 20 August 2026. The deadline existed so an early copy couldn't quietly become someone's permanent install. That is what 1.0 is for, so the whole thing is gone — no expiry date, no countdown, no alert. This build keeps working.
The BETA pill is gone from the tab bar. The version beside the ? now reads v1.0.0 on its own.
The window inside stays inside while you move the container. Grabbing the container's title bar made the window it held vanish behind the container's own empty content area until you clicked a tab. The two now come forward together, in the right order, so the window stays visible while you drag.
Containing one window of an app no longer disturbs its others. Contain one of three TextEdit documents and the other two came and went with the tab bar. An app is now only hidden when Contain holds all of it; one with a window still out on the desktop stays put. Contain also no longer unhides an app that *you* hid before it ever saw it.
Selecting a tab no longer buries the container. Choosing the tab for an app with other windows open left the container — tab bar and all — behind them.
This build keeps the preview deadline of 20 August 2026 rather than extending it. Settings → General counts down to it.
A contained window follows the container back down again. Zoom the container and zoom back, or drag it smaller than the window inside it will go, and that window stopped tracking the container's size — it kept whatever size it had when the container was big and never recovered.
Resizing the container no longer overruns the app inside it. Dragging an edge quickly left the window inside trailing seconds behind, looking as though it had stopped drawing altogether. It keeps up now, and windows from the same app stacked behind the selected one follow along too.
A window no longer gets stuck at a size it can go below. Resizing quickly could leave Contain treating a window as though it had a minimum size it does not have, and it stayed that way until you quit.
Contain now explains its own edges, in the app. The behaviours macOS forces on it — the green button zooming rather than going full screen, a window that refuses to shrink, same-app windows stacked behind the selected one — read as bugs if you meet them without an explanation. There are two ways to that explanation now: a Limitations pane in Settings, and a ? beside the version in the tab bar that pops the same list open where you hit the behaviour.
This build keeps 0.3.3's preview deadline of 20 August 2026 rather than extending it. Settings → General counts down to it.
The container stays the size you drag it to. Resizing it snapped straight back to its previous size — a regression in 0.3.2. Contain now grows the container only once, when a window that won't shrink is first adopted; after that the size is yours, and a window too big for it is centred so the overflow is symmetric.
Windows that won't shrink now fit anyway. Some apps refuse to resize below a size of their own — System Settings is one — and simply overflowed the container. Contain now grows the container to swallow that minimum where the screen allows, and centres the window when it can't.
Much less flickering when you move the container. Moving it now writes as little as possible, skips the write entirely when nothing has changed, raises the window without stealing focus, and stops retrying a resize it has learned cannot succeed.
The green button maximizes instead of breaking. Native full screen put the container in its own Space, where macOS does not allow another app's window to follow — so the container went full screen and left everything it contained behind. It now fills the screen on the normal desktop, which contained windows follow correctly.
Contained windows are put back where they came from. Contain now records each window's position, size and display before adopting it, and restores it on release or quit. Previously, quitting left every window it had touched stacked in the container's footprint.
Contain updates itself. New versions are picked up in the background and installed with a click. Contain → Check for Updates… runs the check on demand. Every update is signed, and Contain refuses to install one that isn't.
The window picker is a grid, not a menu. Every open window gets a tile with a recognisable app icon, the app name and the window title, four to a row — because a list of App — Window title lines is fine at three entries and unreadable at thirty. Tiles can show a live thumbnail, but only if you grant Screen Recording; Contain never asks on its own and works perfectly well on icons if you decline.
The + button explains itself. Hovering it slides "Contain a new app" out to its right, instead of a tooltip that only appeared after a pause.
The version is always visible, on the right of the tab bar, with a BETA pill for as long as this is a preview. Hover it for the expiry date.
A Settings window (Contain → Settings…, ⌘,). *General* shows the installed version, when Contain last looked for an update, and the current Accessibility grant. *Privacy* names every signal Contain collects, with the reason it exists, and the switch that turns it off. *About* says who publishes the app, with links to the site and the release notes.
Anonymous usage statistics, counted in the EU and covered by GDPR. Four counters — launches, adoptions, releases, and the times Contain was blocked for want of Accessibility access — so the parts of the app that quietly fail can be found without asking anyone to file a report. The apps and windows you contain are never sent, not even their names. Settings → Privacy spells out every counter and the off switch takes effect the moment you click it. *(All of this was removed in 1.2.0 — Contain now collects nothing at all.)*
Releases now ship as a notarized disk image, signed with the same Developer ID every time. That matters more here than for most apps: macOS ties the Accessibility grant to an app's code signature, so a stable signature is what lets an update land without you granting access again.
This release is a time-limited preview. It stops working on 20 August 2026, after which Contain explains that the preview has ended, points at the current release and quits. Settings → General counts down to it. Nothing you contained is left hidden when it quits.
The Settings window no longer clips its own content. Every pane was cut off on the right — version numbers, the Accessibility status and the ends of sentences all sat outside the window.
An About panel worth opening. It shows the app icon, name, version and build number, a short description and the copyright — and, more usefully, whether Accessibility access is currently granted, with a button straight through to the settings pane when it isn't. That grant is what the whole app depends on, and it fails silently when missing.
Contain individual windows, not whole apps. The picker used to list running apps and adopt each app's first window, so three open TextEdit documents could not be told apart. It now lists every open window in its own right ("TextEdit — alpha.txt"), and each adopted window gets its own tab that follows the document when it is renamed.
The ↗ button and ⌘W release a window instead of quitting its app. The tab goes away and the window carries on free-standing, nudged clear of the container so it reads as detached. Contain never terminates an app — quitting Contain leaves everything it contained running.
Only the selected tab's window is on screen. Apps that own no selected window are hidden, and unhidden again when one of their tabs comes forward.
Window pinning works at all. On macOS 26 Contain could not move the windows it had adopted, even with Accessibility granted: an app built to Mac App Store rules is not allowed to. That is why Contain is published directly rather than through the store, and why it can move windows at all.
A hidden app is still pickable. Hidden apps expose no windows, which would have made an app Contain itself hid impossible to pick again. It now shows up as a single "show windows…" entry that unhides it first.
First version: one container window that adopts an already-open window and keeps it pinned over the container's content area, with a tab bar to switch between contained windows.
These are the notes the app itself links to from Settings, published as a plain text file beside the download — CHANGELOG.md.
€6 once · 3 Macs
Contain is at v1.2.4 — one price, no subscription, no account. Every 1.x update is included, and the app keeps itself up to date once it is installed.