Last year I wrote about my simple set up for running mods CLI in a loop and turning it into a little windowed program I can invoke quickly for interacting with LLMs. I vastly prefer this to going to a website to interact with LLM chatbots. Having it instantly available with a simple keybinding (Super+g in my case) makes all the difference — I use it all day, every day.

I’ve applied a few tweaks to it since then to add some clipboard integration — the final version of the script is in my dotfiles:

But over time I started wanting features that a bash wrapper couldn’t provide:

  • Dynamic width adjustment. I frequently resize the window, toggle between full-screen and floating, while the LLM is generating output. Vanilla mods didn’t handle this — changing the terminal width mid-stream, or even at the end, would garble the output. I wanted it to detect size changes and re-render to fit the available width.
  • Proper copy/paste. The script already copied prompts to clipboard (handy for reusing them in other LLMs), but I also needed to copy from the output. I was doing this by mouse-highlighting, which introduced whitespace and line break artefacts. I wanted a native way to send individual prompts or completions to the clipboard cleanly.
  • Conversation switching. I wanted to browse a list of recent conversations and jump into any of them to continue the chat.
  • Voice input. I wanted ASR integration, similar to Claude Code’s /voice command.

Forking mods

I could use Claude Code or OpenCode or similar tools in the terminal and get all these features — and I do, for actual agentic coding. But I still reach for this simple mods integration dozens of times a day. It’s super fast, minimal, and has basically replaced search engines for me to a large extent.

Mods itself has been sunset by Charm in favour of Crush, their new agentic coding tool. But mods isn’t exactly a complicated program, and I think I can maintain a fork with relatively little effort. I’ve been slowly working on my own fork and it’s now in a usable state.

The main addition is an interactive mode (enabled with -i/--interactive) that turns mods into a proper chat interface. It supports:

  • 🔄 Continuous conversations without needing the bash loop wrapper — mods handles the prompt input and conversation flow itself. It also handles window size changes dynamically.
  • 📋 Selection mode. Pressing Esc enters a selection mode where you can navigate between prompts and completions with j/k. Pressing y copies the selected block to the clipboard, with a brief highlight flash to confirm the copy — similar to neovim’s vim.highlight.on_yank() feature.
  • 🗃️ Conversation history. Ctrl-R opens a history view where you can browse recent conversations and switch to a different one.
  • 🎙️ Voice input. Pressing and holding ] activates speech-to-text. This requires setting transcription-api-base-url in the mods config and works with any OpenAI-compatible ASR API. I’m self-hosting a CPU-optimised variant of NVIDIA’s excellent parakeet-tdt-0.6b-v3 model — I’m impressed by how well the INT8 quantisation works for this.

If you’d like to try it:

go install github.com/mil-ad/mods@latest