Docs
Install jcode, connect a model provider, and configure the harness.
Install jcode, connect a model provider, and configure the harness.
On macOS and Linux, the install script downloads the latest release and puts jcode on your PATH.
curl -fsSL https://jcode.sh/install | bashOn Windows 11 (PowerShell 5.1 or newer):
irm https://jcode.sh/install.ps1 | iexOn macOS you can use Homebrew instead:
brew tap 1jehuang/jcode
brew install jcodeTo build from source:
git clone https://github.com/1jehuang/jcode.git
cd jcode
cargo build --release
scripts/install_release.shOn Termux, install glibc and patchelf with pkg install before running the install script.
This removes the binaries but keeps your config, auth, and sessions, so a reinstall picks up where you left off:
curl -fsSL https://raw.githubusercontent.com/1jehuang/jcode/master/scripts/uninstall.sh | bash -s -- --yesAdd --purge to also delete config, auth, sessions, logs, and memory. Add --dry-run to preview what would be removed.
Launch jcode in a terminal. On first use, connect a provider with jcode login, which lists every available login flow. Then the common entry points are:
# Launch the TUI
jcode
# Run a single prompt non-interactively
jcode run "say hello"
# Resume a previous session by memorable name
jcode --resume fox
# Run a persistent background server, then attach clients
jcode serve
jcode connectProject instructions live in AGENTS.md at the repo root, and machine-wide instructions in ~/AGENTS.md. Both are loaded into every session that runs in that scope.
jcode works with subscription OAuth flows and direct API providers, so you can use the models you already pay for. Built-in login flows:
jcode login --provider claude # Claude subscription
jcode login --provider openai # OpenAI / ChatGPT / Codex
jcode login --provider gemini # Google Gemini
jcode login --provider copilot # GitHub Copilot
jcode login --provider azure # Azure OpenAI
jcode login --provider ollama # local Ollama server
jcode login --provider lmstudio # local LM Studio serverNamed profiles exist for popular OpenAI-compatible services, including openrouter, deepseek, moonshotai, huggingface, and nebius. Each profile fills in the base URL and key variable. Pick the model with /model or --model.
For self-hosted or unlisted endpoints, jcode provider add writes a named profile to ~/.jcode/config.toml without putting the key in shell history:
printf '%s' "$MY_API_KEY" | jcode provider add my-api \
--base-url https://llm.example.com/v1 \
--model my-model-id \
--api-key-stdin \
--set-default
# Smoke test, then use it
jcode --provider-profile my-api auth-test
jcode --provider-profile my-api run 'hello'Local servers without auth work too: pass --no-api-key and a localhost base URL.
On SSH or headless machines, jcode login --provider <provider> --no-browser prints the auth URL instead of opening a browser. The claude, openai, gemini, and copilot flows also support a two-step pattern: --print-auth-url now, then --callback-url or --auth-code later.
Verify whatever is configured with jcode auth-test --all-configured. Inside the TUI, /account switches between multiple accounts on the same provider.
Config lives at ~/.jcode/config.toml (or $JCODE_HOME/config.toml). Everything has a default, so the file can start empty and grow as you override things. The main sections:
| Section | Controls |
|---|---|
[provider] | Default provider and model, reasoning effort, failover behavior |
[providers.<name>] | Named provider profiles: base URL, key source, models, context windows |
[display] | Theme, centered layout, diff mode, diagram rendering, animations |
[features] | Toggles for memory, swarm, mermaid rendering, update channel |
[keybindings] | Every binding in the table below |
[agents] | Swarm model routing, spawn mode, concurrency cap, memory sidecar |
[hooks] | Shell commands to run at turn, session, and tool boundaries |
[notifications] | Turn-complete notifications and sounds |
[ambient] | Background ambient mode: schedule, budget, work branches |
A small example:
[provider]
default_provider = "openai"
[display]
centered = true
[keybindings]
side_panel_toggle = "alt+m"
new_terminal = "alt+enter"
[features]
memory = true
swarm = true| File | Purpose |
|---|---|
AGENTS.md | Per-repo agent instructions, loaded from the working directory |
~/AGENTS.md | Global agent instructions, loaded in every session |
~/.jcode/mcp.json | Global MCP servers |
.jcode/mcp.json | Project-local MCP servers |
~/.jcode/swarm-prompt.md | Model routing and structure policy for spawned swarm agents |
.jcode/swarm-prompt.md | Per-project swarm policy, overrides the global file |
~/.jcode/skills/ | Installed skills, one directory per skill with a SKILL.md |
~/.config/jcode/*.env | Per-provider API keys and endpoint overrides |
MCP config is separate from config.toml: ~/.jcode/mcp.json for global servers and .jcode/mcp.json for project-local ones. jcode also reads Claude Code's configs (~/.claude.json and .mcp.json at the repo root), and imports servers from Claude Code and Codex configs on first run.
{
"mcpServers": {
"filesystem": {
"command": "/path/to/mcp-server",
"args": ["--root", "/workspace"],
"env": {}
}
}
}Only stdio (command-based) servers are supported today. HTTP and SSE entries are recognized and skipped. Configured MCP tools are advertised the moment a session starts, from an on-disk schema cache, so a slow server handshake never blocks startup or invalidates the prompt cache.
Type / in the TUI to get fuzzy-matched command suggestions. /help lists everything. The ones you will reach for most:
| Command | Does |
|---|---|
/model | List or switch models |
/effort | Show or change reasoning effort |
/login / /account | Log in to a provider, switch between accounts |
/resume | Open the session picker |
/fork | Fork the session into a new window |
/transfer | Compact context into a fresh handoff session |
/compact / /clear / /rewind | Compact, clear, or rewind the conversation |
/todos | Show the session todo list as a card in the chat |
/commit / /commit-push | Make logical commits from current changes, optionally push |
/review / /test | Launch a one-shot review session, verify a claim with layered tests |
/diff | Cycle the diff display mode |
/memory / /swarm | Toggle the memory and swarm features |
/skills | Show loaded skills and endorsed recommendations |
/usage / /info | Provider usage limits, session info and token counts |
/config | Show or edit configuration |
/hotkeys / /keys | List hotkeys, show keybinding conflicts with your terminal and OS |
/update / /selfdev | Background update and reload, open a self-dev session |
/quit | Exit jcode |
Skills are markdown instruction packs, one directory per skill with a SKILL.md, installed under ~/.jcode/skills/. jcode also loads skills from Claude Code plugin directories, so existing skill collections work unchanged.
Skills are not all loaded on startup. The conversation is embedded as a semantic vector, and a skill is injected automatically when the conversation matches it, the same mechanism memory recall uses. You can also activate a skill directly: type its slash command (/skillname), or ask the agent to load it. /skills shows what is loaded and what jcode endorses.
Defaults on Windows and Linux, with macOS differences noted. Apart from Enter and Shift+Enter, every binding is configurable under [keybindings] in config.toml, using values like "alt+m". Set a binding to "" to disable it.
| Action | Key | macOS |
|---|---|---|
| Send input immediately (interleaved with the working agent) | Enter | |
| Queue input until the agent finishes its turn | Shift+Enter | |
| Scroll the transcript one step | Ctrl+Shift+K / Ctrl+Shift+J | |
| Scroll the transcript one page | Alt+U / Alt+D | |
| Jump to the previous / next user prompt | Ctrl+K / Ctrl+J | |
| Toggle the scroll bookmark | Ctrl+G | |
| Switch to the next / previous model | Ctrl+Tab / Ctrl+Shift+Tab | |
| Accept the post-error fallback offer and resend | Ctrl+Y | |
| Increase / decrease reasoning effort | Alt+Right / Alt+Left | Cmd+Right / Cmd+Left |
| Toggle centered layout | Alt+C | |
| Move between workspaces | Alt+H / Alt+J / Alt+K / Alt+L | |
| Toggle the side panel | Alt+M | |
| Toggle copy / selection mode | Alt+Y | |
| Toggle the diagram pane | Alt+T | |
| Toggle typing scroll lock | Alt+S | |
| Cycle the diff display mode | Alt+G | |
| Toggle the info widget | Alt+I | |
| Show / dismiss the todo card | Alt+X | |
| Focus the inline swarm panel | Alt+N | |
| Open the /resume session picker | Alt+R | Cmd+B |
| Spawn a new session in a new terminal window | Alt+Shift+; | Cmd+Shift+; |
macOS terminals encode some modifier combinations differently, so jcode keeps separate default lists per platform and also accepts the Option-inserted characters macOS produces for Alt chords.