InsiPilot
Your Code. Your Models. Your Control.
InsiPilot is a self-hosted AI coding assistant for Visual Studio Code. It runs against your own
Ollama server, locally or on a remote GPU machine. Your code is never sent to a third-party service.
What it can do
Ask about the project you have open, or ask for a change. InsiPilot works the way a developer does, one step at a
time, and each step appears as a card in the chat:
| You ask |
InsiPilot |
About the code ("what does totalWithDiscount do?") |
finds the code you named (or picks the relevant files), reads it, answers from it |
| For bugs ("any bugs in src/?") |
reads the code in scope, runs the tests as evidence, lists bugs with file:line |
| For a change ("fix…", "add…", "rename…") |
finds and reads the code, runs the tests, makes the change, runs the tests again and fixes what the change broke |
| To make the tests pass |
runs them, fixes the failures, runs them again (up to three rounds) |
The model is asked only for the part of each step that needs it, with the tools that step needs. Small local models
lose their way when they must plan everything themselves; one job at a time they do much better. The status line
shows the current step. Set insipilot.workflow to agent to let the model drive every step itself instead.
A code map (the functions and classes of each source file, with line numbers) is part of what InsiPilot knows about
the project from the start. The tools:
| Tool |
What it does |
list_files |
Shows the project layout, skipping node_modules, dist, .git and similar folders. |
read_file |
Reads a file (up to 400 lines per call), including unsaved changes in open editors. |
search_code |
Searches file contents with ripgrep and respects .gitignore. |
git_diff |
Shows git status and your unstaged or staged changes. |
get_diagnostics |
Shows the errors and warnings VS Code reports. |
edit_file |
Changes part of a file (replaces one exact piece of text, or appends to the end). |
write_file |
Creates a new file. It never overwrites an existing one. |
run_command |
Runs a command in the project, such as the tests, and reads the output. Asks first. |
update_plan |
Keeps a checklist for multi-step tasks. Only for models of 14B or more (see insipilot.planning). |
Reviewing changes: every edit appears above the input box as a colored diff with Accept and Reject
(and Open diff for VS Code's diff editor). Nothing is written until you accept. Changes go through the editor,
so Cmd+Z works and a file with unsaved edits stays unsaved. Under each reply that changed files, Undo puts all
of them back as they were before that reply. Set insipilot.autoApproveEdits to skip the review.
Running commands: before a command runs, it appears above the input box with Run, Always allow and
Reject. Always allow remembers that exact command for the current workspace; insipilot.allowedCommands allows
commands everywhere. A command allowed this way may add plain arguments (npm test -- cart) but never chain another
command. Commands run in the workspace folder, stop after 2 minutes (or when you press Stop), and some are refused
outright (sudo, deleting the root or home folder, formatting disks, shutting down). InsiPilot finds the usual test
command (npm test, pytest, python3 -m unittest, go test, cargo test) and runs it to check its changes.
InsiPilot never writes inside .git or node_modules.
Project instructions: put your conventions in AGENTS.md (shared with other coding agents) or
.insipilot/INSTRUCTIONS.md (InsiPilot only); both are read at the start of each chat.
History: every chat is saved in .insipilot/sessions/ of the workspace (in VS Code's storage when no folder is
open). Open or delete earlier chats with the history button in the view's title bar. A .insipilot/.gitignore keeps
the sessions out of git; HANDOFF.md can still be committed.
Long chats: the context window starts small and grows as the chat needs it (up to the model's maximum). When a
chat fills most of it, older turns are summarized by the model, keeping the last two exchanges word for word.
Commands: type / at the start of the input box.
| Command |
What it does |
/handoff |
Writes a checkpoint of this session to .insipilot/HANDOFF.md in the workspace: goal, completed and in-progress work, decisions, findings and next steps. The repository state section and timestamp come from git, not from the model. The file is overwritten each time; nothing is committed. |
/standup |
Reads .insipilot/HANDOFF.md and the current git state, reports where things stand (previous work, current state, pending, blockers, next task) and waits. The report stays in the conversation as context. Add a language, e.g. /standup tiếng Việt. |
/clear |
Clears the conversation, like New Chat. |
A typical day: /standup when you start, work, /handoff before you stop or clear the chat.
Context: the file in your active editor is sent with your message. If you selected code, the selection is sent;
click its chip in the input box to leave it out. To attach more files, type @ (or click +) and pick a file
from the list.
Model: pick the model from the menu at the bottom of the input box. Its dot shows whether Ollama is reachable,
and the ring next to the send button shows how full the context window is.
Safety: tools can only reach files inside the open workspace folders, symlinks included. Files that often hold
secrets (.env, private keys, .ssh, .npmrc, ...) are excluded from search, and reading one asks for your approval.
Without an open folder, InsiPilot works as plain chat.
Requirements
- Install Ollama first. InsiPilot does not install it for you. You need Ollama 0.9.0 or newer,
running locally (
http://localhost:11434) or on a server you control. If Ollama is missing on this machine, the InsiPilot
sidebar shows a Download Ollama button.
- The model
qwen2.5-coder:7b. InsiPilot checks for it on startup and keeps chat disabled until it is installed.
Click Install in the InsiPilot sidebar to download it (several GB).
Settings
| Setting |
Default |
Description |
insipilot.endpoint |
http://localhost:11434 |
Ollama endpoint. Use a remote server for GPU inference. |
insipilot.model |
qwen2.5-coder:7b |
Chat model. Must support tool calling. |
insipilot.requiredModels |
["qwen2.5-coder:7b"] |
Models that must be installed before chat is enabled. |
insipilot.contextLength |
0 (auto) |
Context window (num_ctx). 0 starts at 8192 and grows on demand up to the model's maximum, capped at 32768 (32768 for qwen2.5-coder:7b). A number fixes the window. See Using less memory. |
insipilot.autoApproveEdits |
false |
Write changes without asking. Undo still works per reply. |
insipilot.allowedCommands |
[] |
Commands that run without asking, in every workspace, e.g. npm test. |
insipilot.keepAlive |
empty (5 min) |
How long Ollama keeps the model in memory after a reply, e.g. 1m or 0. |
insipilot.workflow |
guided |
guided: step by step as above. agent: the model decides every step. |
insipilot.planning |
auto |
Plan multi-step tasks as a checklist; auto means models of 14B or more. |
insipilot.think |
false |
Let reasoning models such as qwen3 think before answering. |
Using less memory
With qwen2.5-coder:7b, the model weights take about 4.7 GB. On top of that Ollama keeps a cache for the context
window; measured on an M2 Pro at a 32768-token window:
| Ollama settings |
Context cache |
| Default |
about 1.9 GB |
OLLAMA_FLASH_ATTENTION=1, OLLAMA_KV_CACHE_TYPE=q8_0, OLLAMA_NUM_PARALLEL=1 |
about 1.1 GB |
Generation speed was the same in both cases. Set all three: with flash attention and q8_0 alone, Ollama chose two
parallel slots and the cache grew back to about 2 GB. (ollama ps shows a larger figure, 10.9 GB at 32768; that is
Ollama's own estimate, not the memory it uses.)
These are settings of the Ollama server, not of InsiPilot. On macOS, set them for Ollama and restart it:
launchctl setenv OLLAMA_FLASH_ATTENTION 1
launchctl setenv OLLAMA_KV_CACHE_TYPE q8_0
launchctl setenv OLLAMA_NUM_PARALLEL 1
brew services restart ollama # or quit and reopen the Ollama app
launchctl setenv lasts until you log out or restart. Other ways to save memory: a smaller fixed
insipilot.contextLength (for example 16384), and a short insipilot.keepAlive (for example 1m) so the model
leaves memory soon after you stop chatting.
Remote Ollama
Ollama has no authentication, so do not expose its port to untrusted networks. Use an SSH tunnel:
ssh -N -L 11435:localhost:11434 user@gpu-server
and set insipilot.endpoint to http://localhost:11435. Models you install from InsiPilot are then downloaded on the server.