shim README

The project's README from github.com/Balanov/shim. As one markdown file: README.md.

Shim — Any model. Any tool. Just type.

A tiny, local-first AI harness for people who prefer a terminal.
One static binary. Zero dependencies. No TUI. No telemetry. MIT.

CI MIT license Platforms

Why Shim?

Model-agnostic coding agents are everywhere. Setting them up is still too hard: provider IDs, API endpoints, MCP JSON, skills directories, and a new interface for every tool.

Shim is the small adapter between you and all of that.

Measured on the maintainer's Windows machine for v0.1.0: 7.29 MiB stripped binary and 9.96 ms median process startup for shim --version over 30 runs. This is a local measurement, not a cross-platform performance guarantee.

Install

Download

Get a static binary for Windows, macOS, or Linux from Releases, put it on your PATH, then run:

shim setup
shim

On PowerShell, use .\shim.exe when running the binary from the current directory.

With Go

Go 1.25+:

go install github.com/Balanov/shim/cmd/[email protected]
shim setup

From source

git clone https://github.com/Balanov/shim.git
cd shim
go test ./...
go build -trimpath -ldflags="-s -w" -o shim ./cmd/shim
./shim setup

Windows also has scripts/build.ps1; Unix has scripts/build.sh.

Two ways to use it

Just talk

you › найди локальные модели
↳ /discover --add
Run this command? [y/N] y

you › show my tools
↳ /tools

you › fix the failing tests in this repository

Shim has deterministic offline phrases for common English and Russian management commands. For other languages, assign a local model as the router:

shim router use ollama/qwen3:4b

The router sees non-command chat text so it can distinguish configuration requests from agent tasks. Use a loopback model if you want that step to stay on your machine. No model weights are bundled or silently downloaded; that would defeat the tiny-binary goal. Your primary model handles ordinary conversation in whatever language it supports.

Use the complete CLI

# Local models: discover and configure all running servers
shim model discover --add

# Hosted models
shim model add openrouter anthropic/claude-sonnet-4.5 --name claude --use
shim model add openai gpt-5 --name gpt --use
shim model add huggingface org/model --name hf --use

# Any OpenAI-compatible endpoint
shim model add custom my-model --name mine \
  --base-url http://127.0.0.1:8000/v1 --use

# One-shot agent run
shim run --read-only "explain this repository"
shim run --yes --verbose "fix the tests and verify the result"

# Interactive terminal
shim

Run shim help for the full command surface.

Model providers

Preset Adapter Credential environment variable
ollama OpenAI-compatible None
lmstudio OpenAI-compatible None
llamacpp OpenAI-compatible None
openai OpenAI-compatible OPENAI_API_KEY
openrouter OpenAI-compatible OPENROUTER_API_KEY
anthropic Anthropic Messages ANTHROPIC_API_KEY
gemini Gemini OpenAI-compatible endpoint GEMINI_API_KEY
github GitHub Models GITHUB_TOKEN
huggingface Hugging Face router HF_TOKEN
custom OpenAI-compatible or Anthropic Optional, configurable

“Any model” means any model exposed through a supported HTTP API. GGUF and other local weights run through Ollama, LM Studio, llama.cpp, or another compatible inference server; Shim is the harness, not an inference engine.

PowerShell example:

$env:OPENROUTER_API_KEY = "..."
shim model add openrouter your/model --name main --use
shim model test main

For persistent environment variables, use your OS or shell's standard secret/configuration mechanism. Do not put keys in the project config.

Skills

Shim discovers SKILL.md in:

Only names and descriptions enter the system prompt. Full instructions load on demand through load_skill.

shim skill add owner/repository
shim skill add https://github.com/owner/repository
shim skill add ./local/skill-or-collection
shim skill list
shim skill show name
shim skill remove name

Skills are untrusted instructions. Review them before use, especially when they request shell or network access.

MCP

# Stdio server
shim mcp add filesystem npx -y @modelcontextprotocol/server-filesystem .
shim mcp tools filesystem
shim mcp call filesystem list_allowed_directories '{}'

# Streamable HTTP server
shim mcp add internal https://mcp.example.com/mcp

shim mcp list
shim mcp remove filesystem

MCP tools are namespaced as mcp_<server>_<tool> and require confirmation in the default ask mode. HTTP headers and stdio environment variables can be added to the JSON config. Values support ${ENV_VAR} expansion, so secrets can stay in the environment rather than in files.

Permissions and safety

Default mode is ask:

shim permissions read-only  # no writes, shell, or MCP
shim permissions ask        # confirm consequential actions
shim permissions auto       # allow the agent to act without prompts

For one run, prefer --read-only or --yes over changing the global default.

Shim is not an OS sandbox. Shell commands and MCP servers run with your user's permissions. Workspace path checks do not contain a malicious process. Use a container, VM, or OS sandbox for untrusted workloads. Treat model output, repository text, skills, and MCP responses as untrusted data.

Sessions and configuration

shim session list
shim session new
shim run --resume SESSION_ID "continue"
shim status
shim doctor
shim config path
shim config show

Config is at the OS user-config location in shim/config.json; override it with SHIM_CONFIG or --config. Sessions are append-only JSONL next to it. Network traffic occurs only for explicit model calls, skill downloads, local discovery, and the MCP servers you configure.

What Shim deliberately is not

Project Strength Shim's different bet
OpenCode Full-featured provider-agnostic terminal workspace No TUI/server surface; conversational setup and a tiny static binary
Pi Minimal, extensible coding-agent toolkit Zero runtime dependencies and an allowlisted natural-language control layer
Goose Broad MCP-powered automation ecosystem A smaller local-first control plane with no daemon or desktop app
Aider Git-native pair programming General agent harness with MCP, lazy skills, and conversational management

Shim does not try to beat foundation-model vendors at their own agent UI. It makes heterogeneous models and tools easy to wire together and easy to fork.

Development

go test ./...
go vet ./...
go fmt ./...

The codebase uses only the Go standard library. See Architecture, Contributing, and Security. Русское введение: README_RU.md.

Roadmap

License

MIT. Fork it, modify it, embed it, ship it.

shim (Balanov/shim)

Searching Database…

431 ·GitHub
What is this?A tiny, local-first AI harness for people who prefer a terminal. It ships as one static binary with zero dependencies, has no TUI and no telemetry, and lets you wire any model, MCP servers and Agent Skills together through a natural-language CLI.
Is it a model, or something that connects to models?It's a harness, not a model or an inference engine. It connects to any model exposed through a supported HTTP API, while GGUF weights run through Ollama, LM Studio, llama.cpp or another compatible server.
What's the quickest way to install it?Download the static binary for Windows, macOS or Linux from Releases and put it on your PATH, or build it from source with Go 1.25+ or the provided scripts. Then run shim help for the full command list.
Is it safe to let it run shell commands and MCP servers?Not by itself. Shell commands and MCP servers run with your user's permissions, so use a container or VM for untrusted workloads. The default ask mode requires confirmation for writes, shell commands and MCP calls.
Does it phone home or send my sessions anywhere?No telemetry. Network traffic happens only for the model calls, skill downloads, local discovery and MCP servers you set up, and sessions stay on disk as JSONL next to the config.
Can I fork it and ship it in my own product?Yes. It's free and MIT-licensed, so you can fork it, modify it, embed it and ship it.
How do skills get loaded into a session?Only names and descriptions go into the system prompt. Full SKILL.md instructions load on demand through loadskill from .shim/skills, .agents/skills, .claude/skills or a global skills folder.
How is it different from OpenCode, Goose or Aider?Unlike OpenCode it has no TUI or server. Unlike Goose it has no daemon or desktop app. Unlike Aider it adds MCP, lazy skills and conversational management.
What is still on the roadmap?Streaming token output and cancellation, OS-level sandbox profiles, OAuth helpers for remote MCP, context compaction, richer session export, and more language packs and provider tests.
What are similar projects?crush, uncut, tau, Baize, claw-code, OpenHarness, Axl, headroom
Creator
Balanov
Size
0.1 MB
Stars
431
Age
1d
Commits · 90 Days