Pixir is a minimal Elixir/OTP coding-agent harness inspired by Pi: local-first, terminal-first, OpenAI/Codex-first, and intentionally small.
It uses the OpenAI Responses API through either ChatGPT subscription login or an
OPENAI_API_KEY, keeps append-only local logs, and exposes both a CLI and ACP over
stdio for clients that want to drive it as an agent runtime.
Pixir is early WIP. The first public shape is a developer preview for operators who want the CLI and ACP runtime; package distribution does not imply a stable Elixir library API.
Pixir is for power users doing hard engineering work: local Log as truth, explicit tools, cache-aware OpenAI transport, and composable Skills/Subagents/Workflows without turning any UI into the runtime.
What Pixir Includes
- Local conversation runtime:
Session -> Turn -> Provider -> Tools. - OpenAI Responses provider with ChatGPT subscription OAuth or API-key fallback.
- Durable event logs under
.pixir/sessions/. - Durable Provider usage events for token/cache evidence, including prompt-cache and WebSocket transport observability.
- Permissioned file, shell, and patch/edit tools.
- Agent Skills with progressive disclosure.
- BEAM-native Subagents as supervised child Sessions.
- Structural Workflows over Subagents, including Workflow Templates and checkpoint bundles.
- Session Resources for attachments. The initial slice supports Image Attachments and
explicit
resource_viewrehydration. - Provider-hosted Web Search as an opt-in OpenAI Responses hosted tool, with bounded source evidence recorded as Provider usage.
- ACP over stdio for UI/client experiments.
What Pixir Is Not Yet
- Not a stable public Elixir library API.
- Not an MCP server.
- Not a packaged T3Code provider.
- Not a production/SLA-backed agent service.
T3Code integration exists as local dogfood through a separate adapter/patch workflow. It is useful for validating ACP behavior, but it is not the primary public install path yet.
Quickstart
Install the escript from Hex when available:
mix escript.install hex pixir
pixir help
pixir doctor
Or install from source:
git clone https://github.com/ranvier2d2/pixir-harness.git
cd pixir-harness
mix deps.get
mix escript.build
./pixir help
./pixir doctor
Sign in with your ChatGPT subscription:
./pixir login
As a fallback, set OPENAI_API_KEY in your shell.
Run Pixir inside another repository:
cd /path/to/your/project
/path/to/pixir-harness/pixir --read-only "inspect this repo and summarize the architecture"
Ask before writes and unsafe shell commands:
/path/to/pixir-harness/pixir --ask "make a small safe improvement and run tests"
Resume a session:
/path/to/pixir-harness/pixir resume <session-id> "continue from there"
Diagnostics
doctor is local-only and no-network:
./pixir doctor --json
It checks the runtime version, source-install binary, workspace/session-log writability, local credential presence, config shape, and ACP command availability. It does not prove that the provider accepts your selected model; use a smoke task for networked checks.
ACP Clients
Build the escript first, then point an ACP client at:
./pixir acp
Pixir executes tools internally and reports tool lifecycle through ACP updates.
Subagents And Workflows
Pixir supports Subagents and Workflows, but the honest beta contract is:
- completed Subagents and Workflow steps may produce useful checkpoint bundles;
- partial Workflow outcomes are not success;
- timed-out, failed, cancelled, or detached children must be reported honestly;
- long-running non-blocking Subagent status/result retrieval is still experimental UX.
Development
Run the local gate:
mix deps.get
mix check
mix check currently runs formatting, warnings-as-errors compilation, tests, escript
build, ./pixir doctor --json, a no-network Workflow smoke, and docs generation.
Targeted checks:
mix pixir.smoke.skills
mix pixir.smoke.subagents
mix pixir.smoke.workflows --dry-run --json
mix pixir.smoke.prompt_cache --dry-run --json
mix pixir.smoke.websocket --dry-run --json
mix pixir.smoke.web_search --dry-run --json
Networked smoke tasks are manual/opt-in. pixir.smoke.prompt_cache verifies
cached_tokens accounting; pixir.smoke.websocket verifies the Responses WebSocket
continuation shape that Pixir intends to use as the WebSocket-first default transport
with HTTP/SSE fallback; pixir.smoke.web_search verifies hosted Web Search request
shape and evidence parsing.
Local Session Inspection
Pixir can project a read-only Session/Subagent tree from local Logs without calling the model or the network:
./pixir tree <session-id>
./pixir tree <session-id> --json
This is a Presenter-facing projection over .pixir/sessions/, not a second message
store. Missing child Session Logs are reported honestly so detached or moved Subagents do
not disappear as generic not_found runtime state.
When a Session grows large, Pixir can append a durable compaction checkpoint without rewriting or deleting the original Log:
./pixir compact <session-id> --dry-run --json
./pixir compact <session-id> --tail-events 80
Provider replay uses the latest history_compaction checkpoint plus the recent
uncompressed tail. The full NDJSON Log remains authoritative for audit and repair.
Documentation
- Newcomer path:
docs/open-beta-quickstart.md - Release note:
docs/release-notes/open-beta-developer-preview.md - Architecture vocabulary:
CONTEXT.md - Decisions:
docs/adr/ - Open beta scope:
docs/adr/0016-open-beta-scope.md - Harness boundary:
docs/adr/0017-minimal-harness-core-and-interactive-boundary.md - Compaction/replay repair:
docs/adr/0018-durable-history-compaction-and-replay-repair.md - Provider usage and prompt-cache observability:
docs/adr/0019-provider-usage-and-prompt-cache.md - Prompt contract and compaction triggers:
docs/adr/0020-versioned-prompt-contract-cache-family-and-compaction-triggers.md - Session Resources and Image Attachments:
docs/adr/0021-session-resources-and-image-attachments.md - Provider-hosted Web Search:
docs/adr/0022-provider-hosted-web-search.md - Skill Context Hydration design:
docs/adr/0023-skill-context-hydration.md - Session fork and branch summaries:
docs/adr/0024-session-fork-and-branch-summaries.md - Hex package scope:
docs/adr/0025-hex-package-scope.md
Generate local HexDocs-style documentation:
mix docs
License
MIT. See LICENSE.