Changelog
The latest releases and updates from our team. We ship often and keep things lean.
Wizhut.tech now has a games arm, and its first title is finished and heading to the App Store. Whokoban is Sokoban with one rule changed, and the change is the whole game: pushing every crate onto its goal does not complete the level, it unlocks the exit. Whoko then has to walk to the door through a warehouse he has 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 on the wrong side of the room. Everything else follows from taking that seriously. Each of the 5,000 levels was generated from a seed and then put through an exhaustive breadth-first solver, so the "best possible" the game quotes is the true minimum number of moves including the walk to the door, not an estimate; twice that number is the move cap, and reaching it without getting out loses the level. Ten tiers run from three crates to twelve, 500 levels each, and the game remembers which ones it has dealt you — a level only comes round again after the other 499 on its tier have been played. From tier 4 a monster shares the floor and from tier 8 there are two, but they cannot kill you: there is no timer and no death, only something in your way that you shove aside for free, or squeeze past when it has nowhere left to retreat. Finish inside 10% of the best possible and you rise a tier immediately, otherwise ten clears do it; clear tier 10 and Whoko gets out of the warehouse for good. There are 48 achievements, including one for the mistake this game invents — every crate parked and no moves left to reach the door. It is a one-time US$2.99 with no ads, no in-app purchases and no account, and it collects nothing: there is no network code in it at all, and every level is rebuilt on the phone from its seed, so it works with no signal.
Every shell script eventually needs the same small thing: take what came out of a command and remove the whitespace clinging to either end of it. The usual answers are a sed expression nobody remembers, an awk one-liner, or a $(...) that silently eats the trailing newline and works until the day the input has two. trimmer is that job as a single static binary — it reads stdin and writes stdout, so it drops into a pipeline like any other stage. By default the whole input is one value, so only the very start and the very end go; inner blank lines and indentation are left exactly as they were. Pass --lines and each line is trimmed on its own, with the line count preserved so blank lines stay blank rather than collapsing. The details are where a tool like this earns its place. Whitespace means what Unicode says it means, so CRLF endings, non-breaking spaces and line separators come off, not just spaces and tabs. --no-newline drops the final terminator, which is what makes VERSION=$(cat VERSION | trimmer -n) give back the exact value instead of one with a newline hidden in it. --left and --right restrict the trim to one side, for stripping indentation without touching alignment or the other way round. In --lines mode the input is streamed as it arrives, so a file bigger than memory is fine and a single multi-megabyte line survives intact — there is no 64 KiB line cap waiting to truncate your data, and a test holds that guarantee in place. And running it with nothing piped in prints the help instead of sitting there looking frozen. Six pre-built binaries, MIT licensed, no runtime and no telemetry.
Practical UV already told you which dependencies were old. It now tells you which ones are known to be vulnerable. Declared dependencies are checked against OSV — the PyPA Advisory Database and GitHub Security Advisories — and each finding arrives with the CVE, its severity, and the version that fixes it: as a diagnostic in its own uv-security collection (kept apart from uv-pypi so you can filter the two in the Problems panel), in the package hover, as an "Upgrade … (fixes CVE-…)" quick fix, and in a new Security column in the dependency dashboard, every entry linking out to the advisory. What makes the findings worth acting on is that they are resolved rather than assumed: when a uv.lock sits next to your pyproject.toml, each declared range is pinned to the version you actually install, so a finding means you are affected rather than your constraint permits it — and an == pin resolves the same way without a lockfile. Only top-level dependencies are checked; the lock's transitive tree is used for version resolution and never queried, so nothing is reported that you cannot fix in the file in front of you. The feature is off by default, because enabling it is the first thing in the extension that sends anything about your project anywhere other than PyPI: with uv.security.enabled on, package names and versions go to api.osv.dev. A one-off UV: Check Dependencies for Security Advisories command, and a per-package check on ⌘. for a single dependency, both work without turning the setting on at all. The reporting is deliberately precise about what it did not establish: a dependency with neither a lockfile entry nor an exact pin says so, and tells you how many advisories its declared range permits, instead of implying a clean bill of health. This entry also covers 0.1.10, a documentation-only release that shipped the changelog the registries had never seen.
A new Mac usually means remembering, one at a time, every tool you have installed on the last one. Personas replaces that with 27 curated bundles that install together — 17 for languages and runtimes and 10 for the roles that cut across them, from Terminal Foundation and Backend through DevOps, Security, Data & ML and Embedded. The idea is borrowed from Omarchy, whose install menu is organised by language and whose scripts install a runtime along with its package manager, framework CLI and language server rather than a bare compiler; each persona here works the same way. Pick Go and the language server, linter and debugger come with it. Pick Zig and zls comes too. Pick DevOps and you get kubectl, Helm, k9s, OpenTofu and a container runtime that actually has a client. Every package carries a one-line reason it belongs in that particular bundle instead of repeating what the package is; the essential ones are ticked for you, the rest are offered unticked, and anything already on your Mac is shown but never reinstalled. Installing a bundle uses the queue Upgrade All already had — the full list up front, per-package progress, elapsed time, and a Cancel button that leaves Homebrew intact. The catalogue behind it was checked package by package against Homebrew itself, which is how it knows Terraform has left homebrew-core and reaches for OpenTofu instead. This release also fixes a bug Spanish speakers have been living with quietly: the Spanish translation shipped inside the app but was never registered in the release build, so Spanish-language Macs fell back to English in every previous version.
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. It looked like a failure to repaint; nothing failed to repaint. Clicking the container activates Contain, macOS puts an active app's windows in front of every background app's, and the container was simply being drawn over the window it was meant to be framing — which is also why the re-raise after each drag could never fix it, since AXRaise will not lift a background window in front of the active app's. Contain now orders itself below the window it contains, so the pair arrives at the front together and in the right order, measured at 14 ms from the click. Two neighbouring fixes come with it: containing one window of an app no longer disturbs its others — hiding is an app-level operation in macOS, so Contain now only hides an app when it holds all of it, and one with a window still out on the desktop stays put — and selecting a tab no longer buries the container behind the app it just brought forward. This entry also covers 0.3.5, which made moving and resizing the container track properly (writes rate-limited to one per display frame, 3.55 s of blocked main thread over a 60-event drag down to 0.95 s, and a window that follows the container back down after a zoom instead of keeping its widest size), and 0.3.4, which brought the "where macOS draws the line" list into the app itself — a Limitations pane in Settings and a ? beside the version, both built from one list so they cannot drift apart. The preview deadline is unchanged at 20 August 2026.
Long installs and upgrades stop being a one-way trip. Every install, update, removal and reinstall can now be cancelled, and cancelling interrupts Homebrew the way Ctrl-C does in a terminal — it unwinds and releases its lock rather than being killed mid-step. Stopping an Upgrade All finishes cleanly on the package it interrupted and leaves the rest queued, so starting it again picks up where you left off. The progress view also stopped depending on where you launched the action: an install started from a package row, the right-click menu or the batch bar used to get nothing but a one-line stripe at the bottom of the window, and now gets the same card as everywhere else, with the action's icon, the package name and rotating brewing verbs. Upgrade All moved out of the Updates pane into its own view over the window, so the queue stays visible from any section. Alongside that, the Updates page gained a Check for Updates button that re-runs brew update, the installed and outdated scans, and the vulnerability check in one go — and section actions across the app moved out of the window toolbar, where they read as chrome, into a consistent action bar on each page. This entry also covers 2.4.1, which added the New sidebar section listing formulae and casks Homebrew has published recently, kept current between releases without a server.
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 contained 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. macOS has no public API for embedding another process's window, so Contain does what tiling window managers do and drives the Accessibility API, re-pinning any window that drifts within a second. The picker is a grid of tiles rather than a list, because a menu of "App — Window title" lines is fine at three entries and unreadable at thirty. Contain records where every window was before it adopted it and puts it back exactly there on release or quit, so containing a window leaves no trace once you stop. This first public build ships as a notarized, Developer ID-signed disk image and updates itself from here on — which matters more than usual for this app, since macOS ties the Accessibility grant to the code signature, so a stable signature is what lets an update land without you re-granting access. It is a time-limited beta: the build stops working on 20 August 2026, restoring every window it was holding as it quits.
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, with the app and its menu-bar agent both shipping as universal binaries. Nothing was cut to get there: browsing and searching the catalogue, installing and upgrading, categories, services, taps, Brew Doctor, and CVE checks all work the same, and Discover's semantic search still ranks results on-device. The Apple Intelligence extras — the Discover recommendation, automatic categorisation, logo detection, Doctor explanations, and tap summaries — still need macOS 26 (Tahoe), but they now switch off cleanly on older systems instead of being unavailable at all, and Settings → Intelligence tells you which applies to your Mac. The releases since 2.2.1 also brought the menu-bar agent a status row, a version readout with a restart button, and unattended auto-upgrades within a time window you choose; a refreshed catalogue of 16,196 packages; clearer handling when macOS App Management blocks a cask upgrade; and three Discover fixes, including exact package-name matches finally ranking first.
Practical UV is now published on both the VS Code Marketplace (as wizhut-tech.wiz-practical-uv) and the Open VSX Registry, 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 a housekeeping release rather than a feature one: the build toolchain moved forward and clears 11 advisories (7 high, 4 moderate), and there are no runtime dependency changes — the extension still ships only @iarna/toml, which was unaffected. One thing to check before updating: the minimum supported VS Code is now 1.125, raised from 1.118. Editors on 1.118–1.124 keep the version they already have and stop receiving updates. From this release on, changes are tracked in CHANGELOG.md.
EasyHomebrew left beta on June 12 and the 2.x series has been moving fast since. It ships as a one-time €10 purchase — no subscription, lifetime updates within the major version — unlocked with a license key powered by Dodo Payments that the menu-bar agent honours too. As of v2.2.1 the app updates itself: it checks for new versions at launch and once a day and installs them in place, so this is the last version you'll ever download by hand. Along the way the 2.x releases added a right-click context menu on every package row, an Upgrade All that shows its whole queue with per-package status, an Updates list that finally includes outdated dependencies, a services quick-info popover with a built-in configuration viewer, Brew Doctor warnings turned into grouped one-click fixes, instant catalog filtering, a smarter Discover with an Apple Intelligence "Best pick", full localization in six languages, and a new brewing-tank app icon.
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, requirements-*.txt, and any *.txt under requirements/. Comments, pip directives (-r, -e, -c, --index-url), direct URL specs (pkg @ https://…), and PEP 508 environment markers are all parsed correctly. Open a requirements.txt and a "↑ Convert to uv" action appears in the status bar — one click runs uv init (if needed) and uv add -r in the integrated terminal, and your project is on uv. Saving a pyproject.toml with changed versions now politely offers to run uv sync for you. Already on Open VSX as version 0.1.8.
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, now rolled up into v1.5.3. The headline work landed in v1.5.2: a Reinstall button for misbehaving packages, a new EasyHomebrew status panel in the bottom-left showing app version, packages scanned and affected, and the disk space the app itself uses. Vulnerability scanning runs automatically alongside update checks, and the Updates list now shows only the apps and tools you installed yourself — internal dependencies no longer appear as separately upgradable, which prevents breakage from mismatched versions. v1.5.1 brought stability and performance polish across package browsing, services, and Discover. v1.5.3 adds opt-in anonymous usage analytics — aggregate events only, never package names or search queries, and fully opt-out from Settings → Privacy. Free to download, same install path as 1.5.
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 exactly how the seven quality dimensions perform against Google's IFEval (541 expert-written prompts) and MePO (2,000 prompt pairs before and after optimization). Key findings: zero expert prompts scored "Excellent," Constraint Verifiability is the hardest dimension to improve, and Information Completeness delivers the single biggest gain at +9.6%. Alongside it, the new Prompting Guide is a hands-on walkthrough with real before-and-after examples for every dimension, actionable checklists, and concrete techniques to level up your prompts 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.
The revamped Cloudproc website is live, and you can now express your interest to join the beta program. Cloudproc is an non-opinionated, application-level management and observability platform that gives you real-time, full-stack visibility into your infrastructure. Monitor, analyze, and optimize your applications from a single dashboard — with real-time metrics, traces, intelligent alerting that cuts through noise, and seamless integration with your existing tech stack.
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.