
Shipkit Blog
Shipkit is a starter template made with Next.js, React, and Tailwind CSS. Subscribe to our newsletter to get the latest updates or follow us on twitter.

Shipkit is a starter template made with Next.js, React, and Tailwind CSS. Subscribe to our newsletter to get the latest updates or follow us on twitter.
The v1.8.20 release of Lacy Shell tightens up the ZSH/Bash plugin that routes natural language to AI directly from your terminal.
Shipping v1.8.20 of Lacy Shell today. If you haven't run into the project before, it's a ZSH/Bash plugin that lets you type natural language directly into your terminal and routes it to an AI model without breaking your shell flow. No subcommand prefix gymnastics, no jumping to a browser tab, no copy-pasting output back into your terminal. You just type what you want and the shell figures out whether it's a command or a question.
This release is a maintenance cut focused on stabilizing the routing layer that decides what gets sent to a model versus what gets executed as a normal shell command. That decision boundary is the heart of the plugin, and every release I spend more time making it less surprising.
The headline change in v1.8.20 is the release itself, which sounds circular until you've maintained a shell plugin that hooks into command preprocessing on two different shells with their own quirks. Cutting a release means I've verified the plugin still loads cleanly on a fresh ZSH install with Oh My Zsh, a stock Bash 5.x setup, and the more exotic combos like Bash on macOS that's actually 3.2 by default. Each of those targets has bitten me at least once.
If you were on v1.8.19, the upgrade path is a single git pull or a re-source of your shell rc file depending on how you installed it. There's no migration step, no config rewrite, no new environment variables to wire up. That's intentional. Lacy Shell tries hard to never break your existing setup between point releases, and v1.8.20 holds that line.
The version bump itself signals that the plugin has crossed enough small fixes and internal cleanups to warrant a tagged checkpoint. If you pin to specific versions in your dotfiles, this is the one you want for the late-May cycle. If you track main, you've already been running most of this code for a couple of weeks.
I keep getting the question of why this lives in the shell at all when you could just open a chat tab. The answer is friction. Every context switch between your terminal and another window is a tax on your attention, and that tax compounds across a day of real work. When you're three directories deep debugging a flaky test, the difference between typing why is this jest test hanging directly into your prompt versus alt-tabbing to a browser, pasting context, and alt-tabbing back is the difference between staying in flow and losing the thread.
Lacy Shell solves that by making the AI a first-class peer to your existing commands. The plugin watches what you type, and if it looks like a natural language query rather than a shell command, it routes it through your configured model and prints the response inline. If it looks like a normal command, it gets out of the way and lets your shell handle it like nothing's installed. That routing decision is what every release iterates on.
The v1.8.20 cycle didn't add new model providers or new shell integrations, but it did continue to sand down edge cases in that detection logic. Things like commands that start with a verb that could be either a CLI tool or an English imperative, or pipelines where the first segment looks like prose but the rest is clearly Bash. Those are the kinds of cases where a naive heuristic gets it wrong in a way that's actively annoying, and where the plugin has to be a little smarter than a regex.
The way most people end up using Lacy Shell after a week is interesting and not what I originally expected. The big query like explain this error message is the obvious use case and it's fine, but the more common pattern is tiny micro-queries woven into normal shell work. Stuff like asking what the right tar flags are without leaving the terminal, or describing a one-liner you want and getting the actual command back to run.
That second pattern is the one v1.8.20 supports best. You type a description of what you want in plain English, the plugin routes it to the model with a system prompt that biases toward returning a single executable command, and the response shows up ready for you to inspect and run. You stay in your shell, your history captures both the question and the resulting command, and your muscle memory doesn't have to change.
The other thing that's stabilized over the v1.8.x line is the way the plugin behaves in scripts and non-interactive shells. If you source the plugin in a CI environment or a script, it now correctly detects that there's no interactive terminal attached and disables itself rather than trying to render output to a pipe. That used to be a footgun in earlier minor versions and it's a footgun no longer.
Lacy Shell stays provider-agnostic on purpose. You bring your own API key for whichever model service you want to route through, set the relevant environment variable in your shell rc file, and the plugin handles the rest. v1.8.20 doesn't change the configuration surface, which is the whole point of calling it a point release. Whatever was working in v1.8.0 still works in v1.8.20 with the same env vars and the same defaults.
If you're setting it up fresh, the install is still the standard pattern of cloning the repo into your plugins directory, adding the plugin name to your shell's plugin list, and dropping your provider API key into a file that gets sourced before the plugin loads. The README walks through the specific paths for ZSH with Oh My Zsh, plain ZSH, and Bash. Total setup time is under five minutes if you already have a key handy.
One thing worth calling out for anyone running Lacy Shell on a shared box: the plugin reads your API key from your environment, so the usual rules about not committing your rc file to a public repo apply. The plugin itself doesn't store credentials, doesn't phone home, and doesn't log your queries anywhere outside your normal shell history. That's a design commitment, not just a feature of this release.
v1.8.20 is probably the last patch in the v1.8 line before a minor bump. The next cycle is going to focus on multi-turn context, which is the biggest gap in the current plugin. Right now every query is one-shot, which is fine for the micro-query pattern but limiting when you want to actually have a back-and-forth without leaving the terminal. Threading that through a shell plugin without making the UX weird is the interesting design problem for the next release.
If you're already running Lacy Shell, upgrade to v1.8.20, restart your shell, and you're done. If you've never tried it, this is a good baseline to start from because everything in the v1.8 line should now feel solid. The plugin gets out of your way until you want it, and then it shows up exactly where your hands already are.
Read with AI
Summarize this article: Lacy Shell v1.8.20: Natural Language Routing Gets Sharper