Install

On macOS and Linux, the install script downloads the latest release and puts jcode on your PATH.

curl -fsSL https://jcode.sh/install | bash

On Windows 11 (PowerShell 5.1 or newer):

irm https://jcode.sh/install.ps1 | iex

On macOS you can use Homebrew instead:

brew tap 1jehuang/jcode
brew install jcode

To build from source:

git clone https://github.com/1jehuang/jcode.git
cd jcode
cargo build --release
scripts/install_release.sh

On Termux, install glibc and patchelf with pkg install before running the install script.

Uninstall

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 -- --yes

Add --purge to also delete config, auth, sessions, logs, and memory. Add --dry-run to preview what would be removed.


First run

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 connect

Project 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.


Providers and login

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 server

Named 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.

Any OpenAI-compatible endpoint

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.

Headless and remote logins

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.


Configuration

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:

SectionControls
[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

Other files jcode reads

FilePurpose
AGENTS.mdPer-repo agent instructions, loaded from the working directory
~/AGENTS.mdGlobal agent instructions, loaded in every session
~/.jcode/mcp.jsonGlobal MCP servers
.jcode/mcp.jsonProject-local MCP servers
~/.jcode/swarm-prompt.mdModel routing and structure policy for spawned swarm agents
.jcode/swarm-prompt.mdPer-project swarm policy, overrides the global file
~/.jcode/skills/Installed skills, one directory per skill with a SKILL.md
~/.config/jcode/*.envPer-provider API keys and endpoint overrides

MCP servers

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.


Slash commands

Type / in the TUI to get fuzzy-matched command suggestions. /help lists everything. The ones you will reach for most:

CommandDoes
/modelList or switch models
/effortShow or change reasoning effort
/login / /accountLog in to a provider, switch between accounts
/resumeOpen the session picker
/forkFork the session into a new window
/transferCompact context into a fresh handoff session
/compact / /clear / /rewindCompact, clear, or rewind the conversation
/todosShow the session todo list as a card in the chat
/commit / /commit-pushMake logical commits from current changes, optionally push
/review / /testLaunch a one-shot review session, verify a claim with layered tests
/diffCycle the diff display mode
/memory / /swarmToggle the memory and swarm features
/skillsShow loaded skills and endorsed recommendations
/usage / /infoProvider usage limits, session info and token counts
/configShow or edit configuration
/hotkeys / /keysList hotkeys, show keybinding conflicts with your terminal and OS
/update / /selfdevBackground update and reload, open a self-dev session
/quitExit jcode

Skills

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.


Keybindings

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.

ActionKeymacOS
Send input immediately (interleaved with the working agent)Enter
Queue input until the agent finishes its turnShift+Enter
Scroll the transcript one stepCtrl+Shift+K / Ctrl+Shift+J
Scroll the transcript one pageAlt+U / Alt+D
Jump to the previous / next user promptCtrl+K / Ctrl+J
Toggle the scroll bookmarkCtrl+G
Switch to the next / previous modelCtrl+Tab / Ctrl+Shift+Tab
Accept the post-error fallback offer and resendCtrl+Y
Increase / decrease reasoning effortAlt+Right / Alt+LeftCmd+Right / Cmd+Left
Toggle centered layoutAlt+C
Move between workspacesAlt+H / Alt+J / Alt+K / Alt+L
Toggle the side panelAlt+M
Toggle copy / selection modeAlt+Y
Toggle the diagram paneAlt+T
Toggle typing scroll lockAlt+S
Cycle the diff display modeAlt+G
Toggle the info widgetAlt+I
Show / dismiss the todo cardAlt+X
Focus the inline swarm panelAlt+N
Open the /resume session pickerAlt+RCmd+B
Spawn a new session in a new terminal windowAlt+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.

curl -fsSL https://jcode.sh/install | bash