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"Validate a suite without calling a model:
pebble eval --check evals/smoke.jsonRun a suite and fail the process if any case fails:
pebble eval --fail-on-failures evals/smoke.jsonShow recent eval trends:
pebble eval history
pebble eval history --suite smoke --model zai-org/glm-5.1Eval history is rebuilt from .pebble/evals/*.json and persisted to
.pebble/evals/index.json after each run.
Replay failed eval cases from a saved report:
pebble eval replay .pebble/evals/<report>.json
pebble eval replay .pebble/evals/<report>.json --case handles-denied-writeEval replay loads each case's saved trace and shows assertion failures, failure categories, final answer preview, artifacts, and the trace timeline.
Trace, replay, eval history, eval compare, and eval replay support --json for
machine-readable diagnostics:
pebble trace .pebble/runs/<trace>.json --json
pebble eval replay .pebble/evals/<report>.json --jsonPromote a saved trace into a regression eval:
pebble eval capture .pebble/runs/<trace>.json --suite evals/regressions.json --name "handles denied write"Captured cases use the trace input preview as the prompt and generate
assertions for required tools, tool order, permission outcomes, API/tool call
limits, and successful tool usage when present. Existing case IDs are protected
unless --force is passed.
Inspect a saved turn trace:
pebble trace .pebble/runs/<trace>.jsonReplay a saved trace timeline without calling the model or tools:
pebble replay .pebble/runs/<trace>.jsonGolden trace regressions protect the trace/replay renderers, JSON reports, context-window percentage display, compact tool previews, and MCP tool spec projection:
cargo test -p pebble golden
PEBBLE_UPDATE_GOLDENS=1 cargo test -p pebble goldenUse PEBBLE_UPDATE_GOLDENS=1 only when the output change is intentional.
Trace previews are redacted before persistence and again when loading older
trace files. Common API keys, bearer tokens, passwords, private keys, and
credential-bearing URLs are replaced with [REDACTED] markers.
Trace and eval report JSON files include a schema_version field. Files
written before schema versioning are treated as version 1 when loaded; newly
written files use the current schema version.
Prune generated trace and eval artifacts:
pebble gc --dry-run
pebble gcRetention defaults keep trace JSON files for 30 days or the newest 1000 files,
eval reports for 90 days or the newest 200 reports, and CI check reports for 30
days or the newest 100 reports. Override them in .pebble/settings.json:
{
"retention": {
"traceDays": 14,
"maxTraceFiles": 500,
"evalDays": 60,
"maxEvalReports": 100,
"ciDays": 14,
"maxCiReports": 50
}
}Validate settings without starting a REPL:
pebble config check
pebble config check --jsonConfig checks report malformed JSON, non-object settings files, bad field types, unsupported option values, and the settings file/field path responsible when Pebble can infer it.
Collect a redacted local support snapshot:
pebble doctor bundleThe diagnostics bundle is written under .pebble/diagnostics/ and includes
offline doctor checks, config validation, local system metadata, session
metadata, recent trace/eval summaries, and MCP discovery status. It excludes
API keys, credentials, raw config contents, full prompts, assistant responses,
tool inputs, tool outputs, and live API/network probes.
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=1CI also runs the agent-harness safety checks that protect user-visible diagnostics and regression tooling:
cargo run -p pebble -- ci check
cargo run -p pebble -- ci check --json
cargo run -p pebble -- ci check --json --save-report
cargo run -p pebble -- ci history
cargo run -p pebble -- ci history --json --limit 20
cargo run -p pebble -- release check
cargo run -p pebble -- release check --json --save-reportThat shared entrypoint runs golden trace regressions, config schema validation,
eval suite validation, and a diagnostics bundle redaction-contract check.
--json emits step status, durations, and the diagnostics bundle path for
tooling. --save-report writes the final JSON report under .pebble/ci/ and
includes the report path in the output. ci history summarizes saved reports
without rerunning the checks. Captured CI failures include a per-step artifact
path with stdout/stderr logs when available.
release check is the ship-readiness rollup. It summarizes the current git
branch/commit/dirty state, Pebble version, latest saved CI report, latest eval
history entry, config validation status, golden trace regression status,
diagnostics redaction status, and paths to saved reports/bundles/artifacts.
Use --save-report to write the JSON rollup under .pebble/release/.
Common 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