A powerful and intuitive terminal utility for interacting with both local and cloud LLMs.
A tool for those who appreciate keyboard driven apps and terminal workflows (mouse works too btw)
- π¦ Single binary - lightweight, zero dependencies, use anywhere without any requirements
- π€ Support for OpenAI compatible APIs (ChatGPT, Mistral, Ollama, LMStudio, llama-cpp and more)
- π Support for Gemini API
- π Support for OpenRouter API
- πΌοΈ Images support
- π Web search tool [BETA]
- π¬ Chat sessions management and quick chats
- βοΈ Settings presets (configure different personas with unique settings)
- βοΈ Convenient text selection tool (vim-like line selection)
- π Crossplatform - support for MacOS, Windows and Linux
- π¨ Multiple themes
Ensure API keys are set before proceeding to installtion
A good terminal with GPU acceleration is recommended (the app is mostly tested on Ghostty)
brew tap BalanceBalls/BalanceBalls
brew install nekot --caskchoco install nekotRequires curl and tar.
For updating the app, just run the script again
Basic install:
- Requires
sudo, and installs to/usr/local/bin/
curl -fsSL https://raw.githubusercontent.com/BalanceBalls/nekot/main/install.sh | sudo shInstall to path:
- Use
-pflag to specify install path. - Make sure the specified directory is in the
$PATH. - May require
sudodepending on the path specified.
bash -c "$(curl -fsSL https://raw.githubusercontent.com/BalanceBalls/nekot/main/install.sh)" -- -p ~/.local/bin- Go to latest release
- Download and extract the archive
- Place the binary/executable in some directory
- Add that directory to
$PATH
To use the app, you will need to set OPENAI_API_KEY or/and GEMINI_API_KEY, OPENROUTER_API_KEY env variables depending on your needs
API keys guide
Set up your openai api key:
- ChatGPT: how to get an api key
- Mistral: how to get an api key
export OPENAI_API_KEY="some-key" # you would want to export this in your .zshrc or .bashrcSet up your api key - how to get an api key
export GEMINI_API_KEY="some-key" # you would want to export this in your .zshrc or .bashrcSet up your api key - how to get an api key
export OPENROUTER_API_KEY="some-key" # you would want to export this in your .zshrc or .bashrcYou can pipe input into the app and do things like this:
cat PROMPT.md | nekot -p openai -u http://localhost:11434 -m gpt-oss:latest -nWeb search feature uses tool calling for web search reqests exectution.
This feature can be toggled using Ctrl+w.
- Uses the DuckDuckGo and Brave search engines and requires no configuration
- Results are scored using bm25 for better accuracy
- Using web search can significantly increase token usage
We provide a config.json file within your directory for easy access to essential settings.
- On MacOS & Linux, the path is
~/.nekot/config.json. - On Windows, the path is
C:\Users\%UserName%\.nekot\config.jsonor%HOMEPATH%\.nekot\config.json
{
"providerBaseUrl": "https://api.openai.com", // Or http://localhost:11434, or any other OpenAi compatible API
"systemMessage": "",
"defaultModel": "",
"colorScheme": "groove", // pink, blue, groove
"provider": "openai", // openai, gemini, openrouter
"maxAttachmentSizeMb": 3,
"includeReasoningTokensInContext": true,
"sessionExportDir": "/must/be/absolute/path/to/exports"
}providerBaseUrl: The url can be anything that follows OpenAI API standard ( ollama, lmstudio, etc)chatGPTApiUrl[obsolete]: same asproviderBaseUrlsystemMessagefield is available for customizing system prompt messages. Better to set it from the appdefaultModelfield sets the default model. Better to set it from the appmaxAttachmentSizeMbfield sets maximum allowed image sizeincludeReasoningTokensInContextfield sets whether to include reasoning tokens in the next request or not.sessionExportDirallows to specify directory for session exports. If not set, exports are saved to current directory. The path must be an absolute path
You can change API provider using the provider field.
Available providers:
openaidefaultgeminiopenrouter
To use GeminiAPI, just set "provider": "gemini" (make sure to set GEMINI_API_KEY env variable).
When using the gemini or openrouter providers, providerBaseUrl param is not used.
You can change colorscheme using the colorScheme field.
Available themes:
groovedefaultpinkblue
If you need your settings and chats on other machine - simply copy chat.db and config.json from the .nekot/ directory
and paste to the same directory on other machine.
Models list is cached for 14 days upon loading. If you need to invalidate cache use --purge-cache flag:
nekot --purge-cacheTo switch between openai and gemini APIs you can use -p flag:
nekot -p openai
nekot -p gemini
nekot -p openrouterTo specify provier url use -u flag(works with the openai provider only):
nekot -u http://localhost:11434To specify color scheme use -t flag:
nekot -t blueTo specify a model use -m flag:
nekot -m "qwen3:4b"To create a new session on start use -n flag:
nekot -nTab: Change focus between panes. The currently focused pane will be highlighted1-4pane jumps:1prompt pane,2, chat pane,3settings pane,4sessions paneCtrl+borCtrl+s: Interrupt inferenceCtrl+o: Toggles zen modeCtrl+c: Exit the programCtrl+n: Create new sessionCtrl+w: Toggles web search (preset level setting)Ctrl+h: Hide/show reasoning tokens (preset level setting)Ctrl+q: Start quick chatCtrl+x: Save quick chat to session
-
i: Enters insert mode (you can now safely paste messages into the tui) -
Ctrl+e: Open/Close prompt editor -
Ctrl+r: Clear prompt -
Ctrl+v: Paste text from buffer -
Ctrl+s: Paste text from buffer as a code block (only in editor mode)- if current line contains text, that text will be used as a language for the code block
- Example: if a line contains
gothe result ofCtrl+swill be:
```go
{bufferContent}
``` -
esc: Exit insert mode for the prompt- When in 'Prompt editor' mode, pressing
escsecond time will close editor
- When in 'Prompt editor' mode, pressing
-
Ctrl+a: open file picker for attaching images. You can also attach images by typing: [img=/path/to/image]
y: Copies the last message into your clipboard.Shift+y: Copies all messages from current session into your clipboard.v,Shift+vorspace: Enters navigation mode when chat pane is focused (allows to move accross the chat content lines)
-
Left mouse buttonto enter line selection mode. Clickleftmouse button to enter selection mode, then holdleftmouse button to select lines -
Right mouse buttonto enter character selection mode (within a line). Clickrightmouse button to enter selection mode, then holdrightmouse button to select text
Selection mode allows to navigate the chat pane and select lines to copy. Supports basic vim-motions.
Navigation
j,k- go down and up a lined,u,Ctrl+d,Ctrl+u- go up or down half pageg- go to topShift+g- go to bottom
Selection
d,u,Ctrl+d,Ctrl+u- go up or down half pagej,k- go down and up a line- Multiline jumps like
3j(3 lines down),99k(99 lines up) are also supported
- Multiline jumps like
v,Shift+vorspaceto enter or quit line selection modeyto copy selected text (with formatting from the app)r,cto copy selected text as raw LLM outputEscto quit selection or navigation modes
[and]: switch between presets and settings tabs
m: Opens a model picker to change the model. (use/to set filter)f: Change the frequency valuet: Change the maximum number of tokens per messagee: Change the temperature valuep: Change the top_p value (nucleus sampling)s: Opens a text editor to edit system promptCtrl+r: resets current settings preset to default valuesCtrl+p: creates new preset with a specified name from the current preset
d: remove preset (default and current selected presets cannot be removed)enter: select preset as the current one/: filter presets
Ctrl+n: Creates a new session.Shift+X: Exports session to a markdown file.d: Deletes the currently selected session from the list.e: Edit session nameEnter: Switches to the session that is currently selected./: filter sessions
Information pane displays processing state of inference (IDLE, PROCESSING) as well as token stats for the current session:
IN: shows the total amount of input tokens LLM consumed per sessionOUT: shows the total amount of output tokens LLM produced per session
Please refer to this guide as you navigate the TUI. Happy exploring!
The SQL db is stored in you your/home/directory/.nekot, as well as the debug log. To enable debug mode, export DEBUG=1 before running the program.
To get access to the release candidates, install command:
brew install rc-nekot
rc-nekot- Go
- bubbletea: A Go framework for terminal user interfaces. It's a great framework that makes it easy to create TUIs in Go.
- openai: OpenAI's REST Api
- sqlite: CGO-free sqlite lib
- lipgloss: Style definitions for nice terminal layouts!
- bubbles: Some general use components for Bubble Tea apps!
- operouter-sdk openrouter api sdk
BalanceBalls π π» |
Taranveer (Taran) Bains π π§ π π» |
TJ Miller π π» |

