The Part of lac-cli Nobody Talks About Enough
Every post on this blog about lac-cli has ended up being about lac agent. Understandably — it writes files, tracks tasks, runs HTTP requests, debates itself in /multi. It's a lot.
But the thing I actually open first every morning, before any of that, is lac shell. It's the AI-powered interactive shell, and it's the reason I've barely touched a man page in months.
What lac shell Actually Is
Run it with:
lac shell
That's it. You're now in an interactive shell where you can type plain English instead of remembering exact flags and syntax. Type what you're trying to do, and the shell translates it into a real command. You see the command before anything runs. Confirm it, and it executes. Reject it, and nothing happens.
That last part matters a lot. There's a confirm step. You're never one Enter keypress away from something irreversible.
Ghost Text Autocomplete
This is the feature that actually changed how I type in the terminal day to day. As you type — whether in English or actual shell syntax — lac shell shows ghost text suggestions inline, faded out to the right of your cursor. Hit Tab to accept. Keep typing to ignore.
It's the same interaction as GitHub Copilot in your editor, but in your terminal. Muscle memory transfers immediately.
The suggestions aren't random. They're context-aware. If you just ran a git clone, the next ghost text will lean toward cd-ing into the cloned directory or running something inside it. If you're mid-way through a docker command, it completes the flags based on what you're probably trying to do.
I used to keep a sticky note on my second monitor with the flags for rsync and ffmpeg. That sticky note is gone.
Real Examples from This Week
Here's the kind of thing I actually typed into lac shell this week, verbatim:
- "find all js files modified in the last 3 days" →
find . -name "*.js" -mtime -3 - "compress this folder into a tar.gz" →
tar -czvf archive.tar.gz ./foldername - "show me what's listening on port 3000" →
lsof -i :3000 - "kill whatever is on port 8080" →
kill -9 $(lsof -t -i:8080) - "list docker containers sorted by memory" →
docker stats --no-stream --format "table {{.Name}}\t{{.MemUsage}}" | sort -k2 -h
That last one I genuinely would have had to look up. I know the rough shape of docker stats but the format string and sort combination? No chance I'm typing that from memory at 9am.
You Can Still Use It as a Normal Shell
This trips people up when they first hear about it. lac shell is not a separate environment with its own quirks. It's a layer on top of your existing shell. You can still type ls, cd, git status, pipe things, chain commands — everything works exactly as before. The AI layer only activates when it detects you're typing something that looks like English rather than shell syntax.
So there's no adjustment period. You don't have to commit to a new way of working. You just get the AI assist available when you want it.
Offline Mode
If you're on a plane or working without internet (we covered this in the offline Ollama post), you can start the shell in offline mode:
lac shell --offline
This routes everything through your local Ollama model instead of a cloud provider. The ghost text gets slightly slower depending on your machine, but it works. For basic command translation it's more than fast enough.
First-Time Setup
If you've never run lac-cli before, install it with:
pip install lac-cli
Or use the one-liner:
curl -fsSL https://lacai.io/install.sh | bash
On Windows:
iwr -useb https://lacai.io/install.ps1 | iex
First time you run lac shell it'll walk you through a provider setup — pick Claude, GPT, Ollama, or a custom OpenAI-compatible endpoint. Takes about 90 seconds. If you ever want to redo it:
lac shell --setup
Your config lives at ~/.lac/config.json so you can edit it directly if you prefer.
How It Fits with the Rest of lac-cli
I think of lac shell as the shell you're in all day, and lac agent as the thing you invoke when a task needs reading and writing files over multiple steps. They're complementary, not overlapping.
When I'm moving files around, grepping logs, managing processes, or chaining shell commands — lac shell. When I'm building a feature, refactoring a module, or running an HTTP test suite — lac agent.
The split is pretty natural once you've used both for a week.
One Practical Tip
Set lac shell as your default shell profile in your terminal emulator. In iTerm2 or Warp, just point the "login shell" at the lac shell binary. Now it's the thing that opens every time you hit Cmd+T for a new tab. You don't have to remember to launch it — it's just there.
That single change made it go from "a cool tool I use sometimes" to "the shell I live in." The ghost text starts feeling invisible after a few days, in the best way — you just expect the terminal to know what you're trying to do.