Changelog
The latest releases and updates from our team. We ship often and keep things lean.
Open EasyHomebrew on a Mac that has no Homebrew yet and it offers to install it for you. It has made that offer since the first version; what 3.1.0 changes is that the offer is kept. Install Homebrew runs the official installer from inside the app and asks for your administrator password the way macOS does, in a system dialog — before, the installer had no way to ask and gave up on the spot. Install in Terminal opens a Terminal window with the installer in it, so you can follow along and answer its prompts, and the app picks up on its own the moment it finishes — before, in the released app, that button did nothing at all. Either way your packages load as soon as Homebrew is in place, with no relaunch, Intel Macs included (they used to need one). If you would rather install Homebrew yourself, in your own Terminal, the app notices when you switch back to it. And the “Couldn't refresh packages” message that used to land on top of the setup card, reporting a failure the card had already explained, is gone.
Whokoban has a guest. Herbie — FlyCraft's hero, who would rather build a flying machine than fly — arrives as a free board theme for everyone: his blue drawing board for a floor, a paper-cutout forest for walls, his cardboard boxes for crates, the launch gate with a padlock on it, and Herbie himself in Whoko's place, blinking. He brings his own music, three tunes from FlyCraft's world, and his yell opens every run in place of the gong. The speaker on the title screen now opens a sound sheet, where music and sound effects mute separately and every tune the game owns can be heard by name. One rule changed: shoving a monster aside now costs a move, like a step, so a monster in the wrong place finally costs something. Thirteen themes and 66 achievements in all.
Whokoban gains a second way to play. Pick Hardcore when you start a run and the safety net is gone: no undo, no restart, and one lost level — a crate stranded, or the move cap reached — ends the whole run. The board wears a flame so you never forget which game you are in, and losing gets its own screen. Four board themes belong to Hardcore alone, one each for a clear on tier 1, 4, 7 and 10: Ember, Noir, Circuit Board and Gilded. This is also the first release since 1.0.2, so it carries everything since — eight themes earned by climbing, a game that calls a lost level the moment no way to finish remains, undo cut to exactly the last move, and a gong at the start of every run. Twelve themes and 65 achievements in all.
Everything about Contain used to live on a single page you scrolled for a very long time, with the release notes and the legal documents in small grey text near the bottom of it. It is now seven pages that link to each other from a row under every heading, so whatever you came for is one click away rather than a scroll. The overview keeps the parts you want before deciding — what it does, what it costs, two screenshots of the real thing and the download — and the detail moved out to pages of its own: the full list of what Contain does, what it needs from your Mac and how it installs, and the handful of behaviours macOS forces on any app that moves windows. The release notes are now a proper page too, laid out release by release with what was added, changed and fixed in each, instead of a plain text file that opened unformatted in a browser tab. The privacy policy and the terms of use are unchanged, and now sit in the same row as everything else.
Two things Contain could not previously do. The green button now fills the entire display: the title bar goes, the container takes the whole screen, and every window you have contained is resized to match. It is not macOS's own full screen, and it cannot be — macOS gives a full-screen app a desktop of its own and lets no other app's window follow it there, so the window you contained would be left behind on the old desktop. Filling the ordinary desktop is the only version of full screen that keeps what you contained on screen, which does mean the menu bar stays, showing the menus of whatever app you are working in. Press Esc, ⌃⌘F, or the ⤡ button in the tab bar and everything returns to the size it was. The picker, meanwhile, now shows every window on the Mac rather than only the ones on the desktop in front of you. Windows parked on another desktop or another display used to be invisible to Contain, because macOS only lets an app enumerate the desktops currently showing; they are listed now, and picking one makes Contain hop over — through the app's own Window menu, the way you would — collect the window and bring you straight back. Minimized windows are pickable too, and come out of the Dock as they are contained. Where a window arrives but stays on its old desktop, Contain notices and fetches it properly rather than leaving you with a tab pointing at nothing.
Picking a full-screen window used to look like nothing happening. macOS puts a full-screen window alone on a desktop of its own and makes its position read-only while it is there, so Contain could resize it and then had no way to move it — the tab appeared, the window stayed where it was. Contain now takes the window out of full screen first, waits for macOS to finish rather than guessing at a delay, and then pins it in the container. Release it, or quit Contain, and it goes straight back to full screen exactly as it was: containing a window still leaves no trace once you stop. Separately, and more quietly: every release of Contain has been notarized by Apple, but the ticket was attached to the disk image rather than to the app inside it. macOS covered for that by checking with Apple over the network, so the app opened normally on any Mac with a connection — and could refuse to open on one without. The ticket now travels with the app itself, and the release script mounts the finished image and checks that it does, so it cannot quietly come undone again. Settings → Limitations also grew two entries: 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.
Contain used to send six anonymous counters: that it launched, that a window was contained or released, that an action was blocked for want of Accessibility access, and the two halves of the activation flow. They were bare counts, they never carried the name of an app you contained, and Settings had a switch that stopped them. They are now gone from the app entirely — the analytics library, every event, and the code that sent them. We removed it rather than leaving it behind the opt-out, because a disabled sender is still a sender, and “we collect nothing” should describe the app you install rather than a default someone could change later. This is the same decision EasyHomebrew made yesterday, applied to the app with the most reason to earn your trust: Contain can see every window you have open. Settings → Privacy is now shorter and stronger — it says nothing is collected, and then keeps being precise about the one thing that does leave your Mac, the licence check that tells the app it has been bought.
A background service tells you three things: what it is, how launchd was told to run it, and what it has been printing. EasyHomebrew used to put all three behind one “i” button, in one window, three tabs deep — the same window for a six-line summary and a live log stream. Each is now its own window with its own button on the service row. The configuration window is the one that changed most: it used to show you the plist as XML, which answers “what is in this file” and none of the questions you opened it with. It now shows the command that actually runs with each argument on its own line, whether the service starts at load and restarts if it exits, a schedule written as “Every 5 minutes” or “Daily at 03:30” instead of a seconds count, and where its output goes — with every remaining key still listed, and the raw XML one click away. Logs got the same treatment. Services written in Go — colima, containerd, most of what you run — emit lines like time=… level=info msg="…", which is forty characters of machinery in front of four words of message. EasyHomebrew now recognises that format and lays it out as a record: timestamp in its own column, level as a colour-coded badge you can scan down the window, message where your eye already is. Lines in any other shape are left exactly as they were written. Security changed shape too — a scanned machine used to be a screenful of green rows with the packages that need attention pushed below the fold, and it is now a grid of cards with the vulnerable ones up top.
Kyori shipped five algorithms that each spoke a slightly different dialect: some had distance(), some had similarity(), and swapping one for another meant rewriting the code around it. 0.3.0 ends that. Every method — Levenshtein, Damerau-Levenshtein, Hamming, Jaro-Winkler, and Kyori itself — now exposes the same three functions: distance() where lower is better, similarity() where higher is better, and rank(), which takes a query and a list of candidates and hands back every one of them scored and ordered. Change which metric you import and nothing else has to move. The ranking itself got sharper too. Typing a prefix no longer penalises the part of the suggestion you have not read yet, so “chore li” lands cleanly on “chore list for wall”, and one mistyped character in what you did type costs one, not the length of the rest. The same words in a different order — “hotel bel-air” against “bel-air hotel” — is now a flat 1 rather than a positional pile-up. One breaking change comes with it: kyori.similarity used to be the ranking cost, and that behaviour now lives on kyori.distance; similarity() returns token overlap, where higher is better. KyoriIndex is unaffected and now runs on kyori.rank().
EasyHomebrew used to send anonymous usage events: which features you opened, whether an install succeeded, roughly how many packages you had. It was aggregate, it named no packages, and you could switch it off. It is now gone entirely — the analytics library, every event, and the code that sent them, from both the main app and the menu-bar agent. We removed it rather than leaving it behind the opt-out because a disabled sender is still a sender, and “we don't track you” should describe the binary rather than a default someone could change later. There is no telemetry, no crash reporting, and no installation identifier left in the app. Settings → Privacy now says exactly that, and then does the harder thing: it lists every server the app connects to and why — the Homebrew catalogue, the vulnerability database, release notes, icon lookups, your license check, the update feed. No analytics does not mean no network, and a privacy page that hid the CVE scan would be its own kind of dishonesty. The privacy policy has been rewritten to match.
Both of our open-source JavaScript libraries shipped today. Kyori 0.2.0 rebuilds ranking around one promise — type three letters, get the right suggestion: matching now folds case, Latin accents and hyphens, prefers hits at the start of a word, and falls back to Damerau-Levenshtein when the query holds a typo. The new KyoriIndex wraps the whole loop — load your terms once, and search() returns them scored and sorted, best match first. The library also dropped its last third-party algorithm packages, so every metric is implemented in-repo. WizJS 0.1.7 answers a different itch: the Python standard library you keep reaching for in JavaScript. itertools grew to 19 lazy generators, functools covers partial, compose, once, memoize and reduce, and a new collections namespace brings Counter and DefaultDict — joined by the object helpers pick, omit and get. All of it with zero runtime dependencies.
Settings had quietly become the junk drawer, so 2.8.1 tidies it. Backing up your setup and moving apps off Rosetta were never really preferences — they are things you do — so both now live in the sidebar next to Updates and Doctor, where the Backup page shows what an export would contain right now. The Settings window itself was rebuilt as a sidebar of panes, which also fixes a real bug: with eleven tabs, the ones that did not fit fell into an overflow menu that could not be clicked, leaving Language, About and Legal unreachable. And the statistics block at the bottom of the sidebar is now a drawer — closed by default, one click when you want the numbers.
A fast follow-up to 2.7.0. Opening Settings could crash the app the moment the window showed the Backup or Apple Silicon tab — the two tabs 2.7.0 itself introduced. 2.8.0 fixes that and changes nothing else. The update is already live: the app offers it on its next check for updates, or grab it from the download page.
Whokoban now speaks ten languages — English, Japanese, German, French, Italian, Spanish, Simplified and Traditional Chinese, Korean, and Brazilian Portuguese — and its App Store listing is written natively in each of them rather than translated. Pick yours with the globe on the title screen and the game changes on the spot: no relaunch, and a run in progress carries on. The update also adds swipe controls — one swipe is one move, so a drag can never eat into your move cap — an audio engine that repairs itself after phone calls and AirPods switching, and a launch screen that opens the way the game means to go on: black, with the Wizhut Gaming mark.
Promptivo's scoring engine got its biggest upgrade yet. Scores are now calibrated against 22,500 LLM-judge evaluations of public benchmark prompts, then frozen — so verdicts track how a frontier model judges prompt quality while staying instant, identical on every run, and private: no model call ever sees your prompt. The scale finally behaves the way you'd expect — an empty ask lands at Poor, keyword tricks stop earning points, and a genuinely well-specified prompt can reach Excellent. The rebuilt Benchmarks page shows the full evidence, including a second, fully independent judge.
EasyHomebrew can now save everything you have installed to a single file and restore it on another Mac, adding only what is missing so nothing you already have is touched. Updates became something you decide about rather than something that arrives: read a package's release notes before you install them, pin a package to hold the version you have, or snooze an update for a week. A new health score in the sidebar sums up what actually needs attention, and a scan finds the apps still running through Rosetta so you can move them to Apple Silicon builds.
Promptivo's site has a new face. The product has always been a measuring instrument — deterministic scoring, no LLM in the loop — and now it looks like one: warm paper surfaces, ink-black serif headlines, monospace numerals for every score and statistic, and a single amber signal color. That amber is not new; it has been in Promptivo's favicon from day one, and the site finally matches its own mark. Nothing about scoring changed — the same prompt still gets the same score, now presented the way a precision tool deserves.
Whokoban is out. Wizhut Gaming's first title is on the App Store for iPhone, a one-time US$2.99 with no subscription, no ads, no in-app purchases and no account. It is Sokoban with one rule changed: parking every crate does not finish the level, it unlocks the exit — Whoko still has to walk to the door through the warehouse he just rearranged, so a level can be lost by solving it perfectly and stranding yourself. All 5,000 levels are rebuilt on the phone from a seed rather than downloaded, so the whole game works with no signal.
Contain is out of beta and now costs €6, once. One key unlocks it on up to three of your own Macs, with every 1.x update included — no subscription and no account to create. Your key is checked when Contain launches and never while you work, and if the licence server can't be reached, Contain keeps running for fourteen days, so a flight or an outage never costs you the app you paid for. Settings gains a License pane where you can re-check your key or move it to a new Mac.
Search for "java" and you now get the JDK, even though the package is actually called openjdk — EasyHomebrew searches Homebrew's alternate names alongside the real ones, so "postgres", "npm" and "golang" all find the right package too. Whole sentences work, and where several packages fit, the one most people install comes first. After an install, any follow-up step Homebrew mentions now appears as a card, with one click to add a PATH line to your shell or run a suggested command.
Wizhut.tech now has a games arm, and Whokoban is its first title. It is Sokoban with one rule changed: parking every crate does not finish the level, it unlocks the exit. Whoko still has to walk to the door through the warehouse he just rearranged, where the crates he carefully parked are the walls now in his way — so a level can be lost by solving it perfectly and stranding yourself. 5,000 levels, ten tiers, no timer and no death. A one-time US$2.99 that works with no signal.
Every shell script eventually needs the same small thing: strip the whitespace clinging to either end of what a command returned. The usual answers are a sed expression nobody remembers, or a $(...) that silently eats the trailing newline and works until the day there are two. trimmer is that one job as a single static binary — it reads stdin and writes stdout, so it drops into a pipeline like any other stage. Trim the whole input or each line on its own, one side or both, with or without the final newline.
Practical UV already told you which dependencies were old. It now tells you which ones are known to be vulnerable, checking them against the OSV advisory database. Each finding carries the CVE, its severity and the version that fixes it, and shows up as a diagnostic, in the package hover, as an "Upgrade … (fixes CVE-…)" quick fix, and in a new Security column in the dashboard. It is off by default, because turning it on is what sends your package names to OSV.
A new Mac usually means remembering, one at a time, every tool you had on the last one. Personas replaces that with 27 curated bundles that install together — 17 for languages and runtimes, 10 for roles like DevOps, Security and Data & ML. Each one is a whole working setup rather than a bare compiler: pick Go and the language server, linter and debugger come with it. Essential packages are ticked for you, the rest are optional, and anything you already have is left alone.
Grab the container's title bar and the window it was holding vanished behind the container's own empty content area, and stayed there until you clicked a tab. Contain now orders itself below the window it contains, so the two arrive at the front together and in the right order. Two neighbouring fixes come with it: containing one window of an app no longer disturbs that app's others, and selecting a tab no longer buries the container. Also covers 0.3.5 and 0.3.4.
Long installs and upgrades stop being a one-way trip. Every install, update, removal and reinstall can now be cancelled, and cancelling interrupts Homebrew cleanly rather than killing it mid-step. Stopping an Upgrade All leaves the rest queued for next time. Actions started from a package row or the right-click menu now get the same progress card as everywhere else, and Upgrade All runs in its own view so the queue stays visible from any section. Also covers 2.4.1 and its New sidebar section.
Contain is a small macOS app that holds your other windows. Open one resizable container, pick any window you already have open, and Contain pins it inside — each window getting its own tab, so three TextEdit documents are three tabs rather than one "TextEdit". The window stays the real, fully interactive app window: no screen capture, no proxy view. Contain remembers where every window was before it adopted it and puts it back exactly there when you release it or quit. This is a time-limited beta that stops working on 20 August 2026.
EasyHomebrew's minimum macOS drops from 26 all the way to 14 (Sonoma) — and since Sonoma still runs on Intel, those Macs are supported again. Nothing was cut to get there: browsing, installing, upgrading, categories, services, taps, Brew Doctor and CVE checks all work the same. The Apple Intelligence extras still need macOS 26 (Tahoe), but they now switch off cleanly on older systems instead of being unavailable at all. This entry also rolls up everything since 2.2.1.
Practical UV is now published on the VS Code Marketplace as well as Open VSX, built from the same source — so it installs wherever your editor looks, whether that's VS Code, VSCodium, or Cursor. v0.1.9 itself is housekeeping rather than features: the build toolchain moved forward and clears 11 advisories, with no runtime dependency changes. One thing to check before updating — the minimum supported VS Code is now 1.125, raised from 1.118.
EasyHomebrew left beta on June 12 and ships as a one-time €10 purchase — no subscription, lifetime updates within the major version. As of v2.2.1 the app updates itself, checking at launch and once a day, so this is the last version you'll ever download by hand. The 2.x releases also brought right-click actions on every package row, an Upgrade All that shows its whole queue, outdated dependencies in the Updates list, one-click fixes for Brew Doctor warnings, a smarter Discover, and full localization in six languages.
The biggest update since launch: Practical UV now treats requirements.txt as a first-class citizen. Outdated detection, hover info, code actions and the dependency dashboard all light up automatically on requirements.txt and its variants, with comments, pip directives, URL specs and environment markers parsed correctly. Open one and a "↑ Convert to uv" action appears in the status bar — one click and your project is on uv. Saving a pyproject.toml with changed versions now offers to run uv sync for you.
The Updates page gets a long-overdue makeover with a prominent Upgrade All button, a one-click Update on every outdated row, and a clean Upgrade Selected action for batch mode — extending across Installed, All Packages, Categories, and Search Results. Casks that need root install end-to-end through a friendly authorisation flow (no more cryptic sudo failures), and a live background-activity panel in Settings shows every async job in flight. Plus a rebuilt categories database that recovers ~1,100 cask classifications, font casks that categorise correctly the first time, and a calmer macOS App Store-blue treatment for update badges.
Every package now opens an App Store-style page with everything you need to make a decision in one place. A clean stat strip shows the essentials. An AI-written description tells you what the package actually does — no more squinting at one-liners. A screenshot gallery with a native carousel and arrow-key navigation lets you preview apps before you install. Install trends for the last 30, 90, and 365 days reveal what's genuinely popular. Variants of the same app appear as click-through mini-cards. And a brand-new Games category gives 117 titles a proper home.
Browse your packages your way: a new toolbar toggle switches every list between a compact row view and a visual card grid, and your choice sticks across launches. Variants of the same app — think Firefox, Firefox ESR, Firefox Developer Edition — now collapse into a single tidy entry with a +N expander, so your lists feel curated rather than crowded. The grouping is smart enough to keep unrelated projects apart, even when they share a host. Plus a definitive fix for the rare "Homebrew is busy" warning that was getting in the way of upgrades.
The Doctor tab is no longer a wall of warnings — it's a list of one-click fixes. Every diagnostic shows up as its own card with a "Run fix" button: deprecated casks and formulae, unlinked kegs, missing dependencies, stray files, PATH issues, and more. Spot something unfamiliar? Apple Intelligence explains it in plain English on macOS 26. Errors across the app are friendlier too — clear titles, readable messages, and details tucked away until you need them. And if something fails in a batch, just tap the row to see why.
Three quick follow-ups to the public beta, rolled up into v1.5.3. The headline work landed in v1.5.2: a Reinstall button for misbehaving packages, and a new status panel in the bottom-left showing app version, packages scanned and affected, and the disk space the app uses. Vulnerability scanning now runs automatically alongside update checks, and the Updates list shows only the apps and tools you installed yourself. v1.5.3 adds opt-in anonymous usage analytics, off from Settings → Privacy.
EasyHomebrew has entered public beta. v1.5 is available as a free download — no App Store, no waitlist. It includes all core features: package and cask management, CVE vulnerability scanning, services management, Brew Doctor with Apple Intelligence diagnostics on macOS 26, batch operations, and the new Discover feature powered by on-device semantic search. Give it a try and send us your feedback.
Our latest blog post breaks down why most AI prompts produce underwhelming results — and it's not the model's fault. Language models are precise instruments: vague inputs reliably produce vague outputs. The article introduces seven measurable dimensions for evaluating prompt quality — clarity, precision, chain-of-thought reasoning, information completeness, constraint verifiability, structural compliance, and informational integrity — each targeting a specific failure mode. These aren't abstract rules but practical principles drawn from state-of-the-art research that fundamentally change how you write prompts.
We're building EasyHomebrew — a native macOS app that brings a clean, intuitive GUI to Homebrew. Browse, install, upgrade, and uninstall formulae and casks without touching the terminal. It also includes built-in CVE vulnerability scanning powered by the OSV database, services management, disk usage stats, and full-text search across all available packages. EasyHomebrew is coming soon.
Two major additions to the Promptivo universe. The new Benchmarks page opens the hood on our scoring engine, showing how the seven quality dimensions perform against Google's IFEval and MePO. Among the findings: zero expert prompts scored "Excellent," and Information Completeness delivers the single biggest gain at +9.6%. Alongside it, the new Prompting Guide is a hands-on walkthrough with before-and-after examples for every dimension, plus checklists and techniques you can use immediately.
Our latest blog post dives into the research behind prompt quality and why it matters more than ever. Learn how Promptivo uses deterministic linguistic analysis — grounded in peer-reviewed studies of over 5,000 prompt pairs — to score your prompts across seven quality dimensions. Discover why clarity beats chain-of-thought scaffolding, how a few lines of structure outperform paragraphs of description, and what makes a prompt work consistently across models of all sizes.
We just shipped Promptivo — a prompt scoring tool that analyzes your AI prompts across seven quality dimensions and gives you clear, actionable advice to improve them. No AI calls, no latency, no cost per evaluation — scoring uses deterministic linguistic analysis and returns results in milliseconds. Inspired by peer-reviewed research on prompt quality, Promptivo helps you write better prompts and get better results. We would love your feedback.
Our new VS Code extension brings the power of UV — the blazing-fast Python package manager by Astral — right into your editor. No more context switching to the terminal for dependency management. Get TOML syntax highlighting, automatic outdated dependency detection via PyPI, quick-fix upgrades, and run common UV commands straight from the command palette.