Forking mods to add interactive mode
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
/voicecommand.
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
Escenters a selection mode where you can navigate between prompts and completions withj/k. Pressingycopies the selected block to the clipboard, with a brief highlight flash to confirm the copy — similar to neovim’svim.highlight.on_yank()feature. - 🗃️ Conversation history.
Ctrl-Ropens 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 settingtranscription-api-base-urlin 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