Local LLM CLI: Crush

Published: Jun 2, 2026 by Isaac Johnson

Today we’ll take a look at Charm Crush. I love OS AI CLI’s and this one even Open Sources it’s providers. I’ll try some Cloud options but really focus on local Ollama hosted models.

I’ll also take a moment to bid farewell to Google Code Assist (GCA) and Gemini CLI. I loved these tools and they’ll go offline June 18th this year in just a couple of weeks.

Crush

Installing

$ nvm use lts/jod
Now using node v22.22.0 (npm v10.9.4)
$ npm install -g @charmland/crush

added 47 packages in 5s

I can now launch with crush

/content/images/2026/06/crush-01.png

But I noticed after launch it did some setup and attempted to use Anthropic by way of AWS Bedrock

/content/images/2026/06/crush-02.png

I’ll try Gemini 3.5 Flash

/content/images/2026/06/crush-03.png

Because Google has changed the rules and the “AI Pro” account I have can no longer be used with non-Google owned tools - and they are killing Gemini CLI, which is Open-Source, I must (legally) use my Gemini API key

/content/images/2026/06/crush-04.png

Which, once entered, changes to let me know our model has been swapped

/content/images/2026/06/crush-05.png

While the UI doesn’t let us easily add MCP servers, we can follow the docs and add one in a crush.json file

builder@DESKTOP-QADGF36:~/Workspaces/mytest2$ cat .crush.json
{
  "$schema": "https://charm.land/crush.json",
  "mcp": {
    "offenquelle": {
      "type": "http",
      "url": "https://mcp.offenquelle.tech/mcp"
    }
  }
}

I can now see my private MCP server when i fire it up along with all the discovered tools

/content/images/2026/06/crush-06.png

I can now add some Ollama local models as well

$ cat .crush.json
{
  "$schema": "https://charm.land/crush.json",
  "mcp": {
    "offenquelle": {
      "type": "http",
      "url": "https://mcp.offenquelle.tech/mcp"
    }
  },
  "providers": {
    "ollama": {
      "name": "Ollama",
      "base_url": "http://192.168.1.220:11434/v1/",
      "type": "openai",
      "models": [
        {
          "name": "Gemma4 e4b",
          "id": "gemma4:e4b",
          "context_window": 256000,
          "default_max_tokens": 20000
        },
        {
          "name": "Qwen3.6 27b",
          "id": "qwen3.6:27b",
          "context_window": 256000,
          "default_max_tokens": 20000
        }
      ]
    }
  }
}

/content/images/2026/06/crush-07.png

I tried but couldn’t get Gemma4 to check out the files in the local workspace

/content/images/2026/06/crush-08.png

It took a couple tries with granite4.1, but I did manage to get that model to list files

/content/images/2026/06/crush-09.png

I kept thinking that maybe it was my Crush setup preventing file creation. I tried Gemini 3.5 flash again to build a full todo app, which it did

/content/images/2026/06/crush-10.png

It claimed that cost US$1.07 but when I checked my bill the next day, it was less than half of that, $0.443

/content/images/2026/06/crush-11.png

Filesystem MCP

Let’s add the Filesystem MCP server

  "mcp": {
    "offenquelle": {
      "type": "http",
      "url": "https://mcp.offenquelle.tech/mcp"
    },
    "filesystem": {
      "type": "stdio",
      "command": "npx",
      "args": [
        "-y",
        "@modelcontextprotocol/server-filesystem",
        "/home/builder/Workspaces",
        "/tmp"
      ],
      "timeout": 120,
      "disabled": false
    }
  },

I thought perhaps using with a larger model like Qwen3.6 27B might work, but it seems to just stop after the find command each time.

/content/images/2026/06/crush-12.png

I then tried Qwen3:14b. It asked to use the tool which was a good sign

/content/images/2026/06/crush-13.png

It seems to create To-Do lists then not do them. Though “Run steps” got me closest

/content/images/2026/06/crush-14.png

I saw this newstack post that hinted that perhaps I need to be more explicit with Crush permissions in the JSON file:

  "permissions": {
    "allowed_tools": [
        "view",
        "ls",
        "grep",
        "edit",
        "find",
        "sed",
        "cat"
    ]
  },

But again, these damn To-Dos, even in Yolo mode:

I find this so frustrating that it creates a plan but there is no command or obvious way to execute it. I even hit up Gemini Pro to ask it and tried it’s suggestions

/content/images/2026/06/crush-16.png

I tried devstral-small-2 with no context or window limits to see if that might work (didn’t)

/content/images/2026/06/crush-17.png

Perhaps the fact this is WSL on Copilot OS is causing issues

/content/images/2026/06/crush-18.png

But still it fails even if I’m explicit on pathing

/content/images/2026/06/crush-19.png

Using a local model in Ollama in Windows didn’t create any better results

/content/images/2026/06/crush-20.png

Ubuntu / Linux

Enough with WSL. Let’s do this on Linux. I’ll use the latest LTS, lts/krypton (24.*)

builder@bosgamerz9:~/Workspaces/fjtui$ nvm use lts/krypton
Now using node v24.16.0 (npm v11.13.0)
builder@bosgamerz9:~/Workspaces/fjtui$ npm install -g @charmland/crush

added 47 packages in 3s

I tried a local model running in Ollama but it seemed to forget what codebase meant.

/content/images/2026/06/crush-25.png

I kept trying different ways to phrase it.

/content/images/2026/06/crush-26.png

I finally got it to list files but then it forgot what it was asked to do!

/content/images/2026/06/crush-27.png

Using IBM Granite on a different laptop, it still just refuses to write files, though it finally reads them

/content/images/2026/06/crush-28.png

I tried running just using the command line and no TUI

builder@bosgamerz9:~/Workspaces/fjtui$ crush run "Create a README.md" --cwd /home/builder/Workspaces/fjtui/ | tee README.md
Let me first explore the project to understand what it does.

<tool_calls><tool_use>
<parameter>name>bash</parameter>
<parameter>arguments>
<parameter>command</parameter>
<parameter>cd /home/builder/Workspaces/fjtui/ && find . -type f | head -50
</parameter>
<parameter>description</parameter>
<parameter>List all files in the project
</parameter>
</tool_use>
<parameter>name>bash</parameter>
<parameter>command</parameter>
<parameter>cd /home/builder/Workspaces/fjtui/ && cat go.mod 2>/dev/null || cat package.json 2>/dev/null || cat Cargo.toml 2>/dev/null || cat pyproject.toml 2>/dev/null || echo "No known config found"
</parameter>
<parameter>description</parameter>
<parameter>Check the project config to determine language/framework
</parameter>
</tool_use>
<parameter>name>bash</parameter>
<parameter>command
</parameter>
<parameter>cd /home/builder/Workspaces/fjtui/ && head -60 main.go 2>/dev/null || head -60 main.py 2>/dev/null || head -60 main.rs 2>/dev/null || echo "No main file found"
</parameter>
<parameter>description</parameter>
<parameter>Check main entry point
</parameter>
</tool_use>
</tool_calls>
builder@bosgamerz9:~/Workspaces/fjtui$ 
builder@bosgamerz9:~/Workspaces/fjtui$ cat README.md 
Let me first explore the project to understand what it does.

<tool_calls><tool_use>
<parameter>name>bash</parameter>
<parameter>arguments>
<parameter>command</parameter>
<parameter>cd /home/builder/Workspaces/fjtui/ && find . -type f | head -50
</parameter>
<parameter>description</parameter>
<parameter>List all files in the project
</parameter>
</tool_use>
<parameter>name>bash</parameter>
<parameter>command</parameter>
<parameter>cd /home/builder/Workspaces/fjtui/ && cat go.mod 2>/dev/null || cat package.json 2>/dev/null || cat Cargo.toml 2>/dev/null || cat pyproject.toml 2>/dev/null || echo "No known config found"
</parameter>
<parameter>description</parameter>
<parameter>Check the project config to determine language/framework
</parameter>
</tool_use>
<parameter>name>bash</parameter>
<parameter>command</parameter>
<parameter>cd /home/builder/Workspaces/fjtui/ && head -60 main.go 2>/dev/null || head -60 main.py 2>/dev/null || head -60 main.rs 2>/dev/null || echo "No main file found"
</parameter>
<parameter>description</parameter>
<parameter>Check main entry point
</parameter>
</tool_use>
</tool_calls>
builder@bosgamerz9:~/Workspaces/fjtui$ 

I switched to a faster granite4.1:8b model

builder@bosgamerz9:~/Workspaces/fjtui$ crush run "Create a README.md" --cwd /home/builder/Workspaces/fjtui/ | tee READMEOUT.md
I’m unable to perform that action because the requested file or directory is located outside of the permitted workspace paths (/home/builder/Workspaces and /tmp). Please provide a path within those allowed directories, and I’ll be happy to assist you.
builder@bosgamerz9:~/Workspaces/fjtui$ crush run "Create /home/builder/Workspaces/fjtui/README.md" --cwd /home/builder/Workspaces/fjtui/ | tee READMEOUT.md
It looks like there wasn't a matching response for your query. Could you please provide more details or clarify what information you're looking for? I'm here to help with any text, file operations, searches, or other tasks within the capabilities of the tools available. Let me know how I can assist!
builder@bosgamerz9:~/Workspaces/fjtui$ crush run "Create /home/builder/Workspaces/fjtui/README.md with README contents" --cwd /home/builder/Workspaces/fjtui/ | tee READMEOUT.md

However, once I removed the errant tool output README.md and tried again, it worked just fine (i replaced backticks with dashes as this blog is in markdown)

builder@bosgamerz9:~/Workspaces/fjtui$ crush run "Create /home/builder/Workspaces/fjtui/README.md with README contents" --cwd /home/builder/Workspaces/fjtui/ | tee READMEOUT.md
The file at **/home/builder/Workspaces/fjtui/README.md** has been created (or overwritten) with the requested content. Let me know if there's anything else you need!
builder@bosgamerz9:~/Workspaces/fjtui$ cat README.md 
# fjtui
A lightweight UI toolkit for building cross-platform desktop applications.

## Features
- **Cross‑platform**: Works on Linux, macOS, and Windows with a single codebase.
- **Modern API**: Fluent builder pattern for fast UI construction.
- **Lightweight**: Minimal dependencies, small binary size.
- **Easily Extensible**: Custom widgets can be added without modifying core library.

## Getting Started
---bash
# Install via npm or yarn
npm install fjtui
# Or using Yarn
yarn add fjtui
---

### Hello World Example
---javascript
import { Window, Button } from 'fjtui';

const app = new Window({ title: 'Hello, fjtui!' });
app.body.append(new Button({ text: 'Click Me' }));
app.run();
---

## Documentation
Full documentation is available at https://github.com/yourorg/fjtui/blob/main/docs/index.md.

## Contributing
See the [CONTRIBUTING.md](https://github.com/yourorg/fjtui/blob/main/CONTRIBUTING.md) file for guidelines on contributing to this project.

---
*This README is generated by a tool and may require manual updates.*

However a simple ask like a system diagram had it fall down again

builder@bosgamerz9:~/Workspaces/fjtui$ crush run "Update /home/builder/Workspaces/fjtui/README.md with a system diagram" --cwd /home/builder/Workspaces/fjtui/
The requested operation **`mcp 'systemdiagram'`** is not recognized or supported by the current set of tools and functions provided. There is no tool named `systemdiagram`, nor does the list include a function that matches that identifier.

If you meant to request something else—such as generating a diagram from another source, reading files related to a system diagram, or using a different MCP resource—please clarify your request, and I’ll be happy to assist with an appropriate tool.

builder@bosgamerz9:~/Workspaces/fjtui$ crush run "Update /home/builder/Workspaces/fjtui/README.md with a system diagram" --cwd /home/builder/Workspaces/fjtui/
I’m sorry—I cannot access that directory (`/home/builder/Workspaces`) because it isn’t part of the allowed file system locations for this environment. If you can provide a path within the permitted workspace (e.g., `~/my‑project/config.yaml` or another location shown as available), I’d be happy to read or modify the file for you. Let me know how you’d like to proceed!
builder@bosgamerz9:~/Workspaces/fjtui$ crush run "Update /home/builder/Workspaces/fjtui/README.md with a system diagram" --cwd /home/builder/Workspaces/fjtui/
I’m sorry, but the MCP server named **`fjtui`** isn’t listed among the available servers in this environment, so I’m unable to retrieve or interact with it as requested. If you have another server name or a different request, please let me know!

Though, I tried with Cline a few times just to have a comparison and it too just hates to write files

/content/images/2026/06/crush-29.png

GCA one more time

Gemini Code Assist, GCA, the first offering by Google after Github Copilot will die an untimely death in the next couple weeks on June 18th.

I wanted to revisit why I liked it and will be saddened by it’s loss.

First, launching vs code from WSL on Windows let’s use fire up GCA with ease:

/content/images/2026/06/gca-01.png

Here you can see it easily handle a TUI Readme that Crush was having such troubles with:

And perhaps it’s not really going away for everyone. To be clear, the offering i had with AI Pro, a paid plan, is just being taken away from us.

/content/images/2026/06/gca-03.png

I can supposedly keep it with Gemini Code Assist for Enterprise, or Gemini CLI if I use it with a paid Vertex AI key

/content/images/2026/06/gca-04.png

part of the reason I so enjoyed GCA, even if it wasn’t as polished as other tools, was it was a way I could leverage my AI Pro accounts in Coder

/content/images/2026/06/gca-05.png

As it stands, going forward, there will be no official VS Code extension I can use and will only be able to use Gemini models via things like Cline and Continue.dev plugins - which is pay as you go, not leveraging the AI Pro subscription.

It would seem the only supported path to using AI Pro in Coder would be via agy CLI in the terminal which would work, but seems a “lesser” option.

You might say, use AI Studio - that’s an officially supported web interface.

But it seems really basic - like comparing KidPix to Photoshop. I mean i get “enjoy these tips while you wait” animated slides - who does that?

/content/images/2026/06/aistudio-01.png

So for example, I asked for a TUI animation for a TUI I’m working on and after 5+ minutes it made a webapp

/content/images/2026/06/aistudio-02.png

I can download that as a zip file or publish to Antigravity in Windows

/content/images/2026/06/aistudio-03.png

Or send to Github

/content/images/2026/06/aistudio-04.png

As of today, that is the only choice. Github or nothing at all. Don’t get the wrong idea, I don’t hate Github, but I do have issues with a lack of choice.

With Coder, I can can use Gitea for instance

/content/images/2026/06/gca-06.png

or Forgejo in code-server

/content/images/2026/06/gca-07.png

then I can use GCA to update the code in my private repos

/content/images/2026/06/gca-08.png

Summary

Charm Crush is a pretty nice CLI. It certainly is one of the better looking. It worked fine with Cloud AI providers, but I really struggled getting it to work with local Ollama ones. I tried with Linux, Windows and GPU and CPU hosted instances. I tried small 2b models through 27b, the largest my hardware can run. My biggest frustration was the “To-Do” list that would just die out.

I won’t give up - if I can get better hardware, I’ll circle back on this. But for now, I’ll just keep it in my back pocket.

The other footnote on this article is saying goodbye to GCA and Gemini CLI. Gemini CLI was (and is) one of my favourites. I enjoyed the extensions, and OTel support. I enjoyed the benefits of an insider track to converse with the creator on a nearly weekly basis for a while.

I do not have the same warm and fuzzy feeling towards Antigravity CLI. I might use it, albeit begrudgingly, as it’s a closed-source tool that at launch, at least, had a lot of issues. I also just tend to avoid any tool that requires a raw ‘deb’ to install. Seems a bit shady to me. Give me npx, uv, brew or even choco any day.

GenAI crush GCA Geminicli Ollama

Have something to add? Feedback? You can use the feedback form

Isaac Johnson

Isaac Johnson

Cloud Solutions Architect

Isaac is a CSA and DevOps engineer who focuses on cloud migrations and devops processes. He also is a dad to three wonderful daughters (hence the references to Princess King sprinkled throughout the blog).

Theme built by C.S. Rhymes