Pebble is a rust based agentic coding harness
It supports:
- Nano-GPT
- Synthetic
- OpenAI Codex / ChatGPT plans
- OpenCode Go
Pebble is designed around an interactive REPL, local tools, managed sessions, MCP servers, and a user-controlled permission model. Web retrieval is provider-agnostic and always runs through Exa.
Check the Changelog for update/patch notes
Pebble can prompt you for credentials interactively:
pebble loginYou can also target a specific service directly:
pebble login synthetic
pebble login openai-codex
pebble login opencode-go
pebble login nanogptFor API-key services, you can also pass the key inline:
pebble login opencode-go --api-key "$OPENCODE_GO_API_KEY"openai-codex uses ChatGPT device-code auth instead of an API key.
Inside the REPL, the equivalent commands are:
/login
/auth
/login openai-codex
/login opencode-go
/auth synthetic
/logout openai-codex
If you run /login or /auth without a service, Pebble opens a picker with:
nanogptsyntheticopenai-codexopencode-goexa
Pebble uses Exa for all web search and scrape functionality.
Save it with:
pebble login exaOr from inside the REPL:
/login exa
/auth exa
You can also provide it inline:
pebble login exa --api-key "$EXA_API_KEY"Or export it in your shell:
export EXA_API_KEY=...Launch the REPL:
pebbleUseful first commands:
/help
/status
/model
/login
/logout
/sessions
Basic prompt flow:
> summarize this project
> inspect Cargo.toml and explain the workspace layout
> find the session restore logic
For a single command without entering the REPL:
pebble prompt "Summarize this repository"Or:
pebble "Inspect the current Rust workspace and explain the top-level crates"pebble --allowedTools read,glob "Summarize Cargo.toml"Common commands:
/help/help auth/help sessions/help extensions/help web/status/model/login/logout/provider/permissions/bypass/proxy/mcp/skills/plugins/sessions/resume/resume last/session switch <id>
Notes:
/provideronly applies to NanoGPT-backed models.Shift+EnterandCtrl+Jinsert a newline in the input editor.
Pebble stores user config under:
~/.pebble/
Credentials are stored in:
~/.pebble/credentials.json
Possible stored keys:
nanogpt_api_keysynthetic_api_keyopenai_codex_authopencode_go_api_keyexa_api_key
Environment variables still take precedence over saved credentials.
Useful environment variables:
NANOGPT_API_KEYSYNTHETIC_API_KEYOPENAI_CODEX_ACCESS_TOKENOPENAI_CODEX_REFRESH_TOKENOPENAI_CODEX_ACCOUNT_IDOPENAI_CODEX_EXPIRES_ATOPENCODE_GO_API_KEYEXA_API_KEYNANOGPT_BASE_URLSYNTHETIC_BASE_URLOPENAI_CODEX_BASE_URLOPENCODE_GO_BASE_URLEXA_BASE_URLPEBBLE_CONFIG_HOME
EXA_BASE_URL defaults to https://api.exa.ai.
OPENAI_CODEX_BASE_URL defaults to https://chatgpt.com/backend-api/codex.
Pebble keeps managed sessions under:
.pebble/sessions/
Useful flows:
/sessionslists recent sessions/resumeopens the picker/resume lastrestores the most recently modified session/session switch <session-id>switches inside the REPLpebble resume [SESSION_ID_OR_PATH]resumes from the CLI
Session restore includes more than just transcript history. Pebble persists and restores:
- active model
- permission mode
- thinking toggle
- proxy tool-call toggle
- allowed tool set
That makes restored sessions behave much closer to the original live session.
Pebble supports:
read-onlyworkspace-writedanger-full-access
Examples:
/permissions
/permissions workspace-write
/bypass
/bypass is a shortcut for danger-full-access in the current session.
Pebble keeps the tool names WebSearch and WebScrape, but both use Exa.
- uses Exa
POST /search - defaults to Exa search type
auto - promotes to
deepfor deeper or more structured requests - maps allowed and blocked domains into Exa domain filters
- uses Exa
POST /contents - supports one or more URLs
- validates URLs before sending requests
- returns normalized previews in the TUI
Run:
/status
Pebble reports Exa readiness separately from the active model backend.
Pebble has three main extension surfaces:
- skills
- MCP servers
- plugins
Create a project-local skill:
/skills init my-skill
This creates:
.pebble/skills/my-skill/SKILL.md
Useful commands:
/skills
/skills help
Create a starter MCP server entry:
/mcp add my-server
This updates:
.pebble/settings.json
Inspect what is configured:
/mcp
/mcp tools
/mcp reload
Enable or disable a configured server locally:
/mcp disable context7
/mcp enable context7
These local toggles are written to:
.pebble/settings.local.json
That lets you keep a shared project MCP config while turning specific servers on or off per machine.
Useful commands:
/plugins
/plugins help
/plugins install ./plugins/my-plugin
/plugins enable my-plugin-id
Pebble expects plugins to expose:
.pebble-plugin/plugin.json
Pebble can run in XML proxy tool-call mode:
/proxy status
/proxy on
/proxy off
When proxy mode is enabled, tool use is expected through XML <tool_call> blocks rather than native tool schemas.
- run
/status - confirm you saved credentials with
pebble login - or export the matching
*_API_KEY - verify the active model with
/model
- run
pebble login exa - or export
EXA_API_KEY - check
/statusfor Exa readiness
- run
/mcp - run
/mcp tools - run
/mcp reload - check
.pebble/settings.json - check
.pebble/settings.local.json - if the server is marked
disabled, run/mcp enable <name>
- inspect
/status - use
/resume lastor/session switch <id> - verify the session was saved after changing model, permissions, proxy, or thinking state
- run
/plugins help - confirm the plugin root contains
.pebble-plugin/plugin.json
cargo build --release -p pebbleBinary output:
./target/release/pebbleOn Windows, the binary output is target\\release\\pebble.exe. Pebble resolves config and
credentials from PEBBLE_CONFIG_HOME first, then %USERPROFILE%\\.pebble when HOME is not set.
cargo run -p pebble --cargo test --workspace -- --test-threads=1Common project-local files:
PEBBLE.md.pebble/settings.json.pebble/settings.local.json.pebble/skills/.pebble/sessions/
Pebble’s self-update flow targets the GitHub releases for:
nanogpt-community/pebble