neo

neo logo

neo is a Rust coding-agent harness for long-running autonomous software work.

Core Capabilities

Build

$HOME/.cargo/bin/cargo test
$HOME/.cargo/bin/cargo build

Install

One-line installer for the current private repo:

gh api -H "Accept: application/vnd.github.raw" repos/AgentsLabs/neo/contents/install.sh | bash

This requires gh auth login first.

If the repository is later made public, the raw curl form also works:

curl -fsSL https://raw.githubusercontent.com/AgentsLabs/neo/main/install.sh | bash

Manual install with Cargo:

$HOME/.cargo/bin/cargo install --git https://github.com/AgentsLabs/neo.git --branch main --locked --force

Useful installer overrides:

REPO_URL=https://github.com/AgentsLabs/neo.git BRANCH=main INSTALL_ROOT=$HOME/.local curl -fsSL https://raw.githubusercontent.com/AgentsLabs/neo/main/install.sh | bash

After install, ensure your path includes the install root:

export PATH="$HOME/.local/bin:$PATH"

Quick Start

$HOME/.local/bin/neo

Run from source:

$HOME/.cargo/bin/cargo run

Useful commands:

TUI Mode (Terminal UI)

TUI Overview

Start the full-screen terminal UI with --tui:

neo --tui
neo --tui --provider ollama --model llama3
neo --tui --team-mode

Feature Screenshots

These screenshots are captured from real Neo UI and documentation surfaces:

Feature Screenshot
Full TUI command surface Neo TUI command surface
TUI banner and status bar Neo TUI banner
Team-mode reviewer flow Team mode reviewer flow
Image/SVG terminal rendering Image rendering in TUI
Vault command flow Vault commands
Responsive docs on mobile Neo docs mobile view

Layout

The TUI is split into three panes:

  1. Header (top 4 lines) — NEO box-drawing logo, provider badge, model badge, workspace path, access level, worker ID, permission mode, team mode indicator, and real-time progress
  2. Transcript (center, resizable) — scrollable conversation history with color-coded roles and unicode symbols
  3. Input (bottom 4 lines) — command prompt with model, provider, and session ID

Keybindings

Key Action
Enter Submit input
Tab Complete commands (/) and file paths
Up/Down Browse input history (when input is empty)
PgUp/PgDn Scroll transcript
Home/End Scroll to top/bottom
Mouse wheel Scroll transcript
Mouse drag Drag scrollbar thumb
? Toggle help overlay
Esc Exit TUI
Ctrl+C Interrupt model stream

Unicode Art & Role Symbols

Each conversation role is prefixed with a distinct unicode symbol:

Role Symbol Color
User Green
Assistant Cyan
System Yellow
Tool call Magenta
Tool result Yellow
Error Red
Image preview Light Blue

Image & SVG Rendering

Image rendering in TUI

Attach images (PNG, JPEG, GIF, SVG) for inline terminal preview:

/attach image diagram.png
/attach image screenshot.jpg
/attach image logo.svg

Images are rendered using unicode half-block art (/ characters) with 24-bit ANSI foreground/background colors. Each terminal cell displays 2 vertical pixels at native aspect ratio. SVGs are rasterized at render time via resvg.

Tab Completion

In the TUI, press Tab to:

Model Picker

/models opens a keyboard-driven modal overlay:

Session Picker

/session opens a session selection overlay:

Skill Toggler

/skills opens a skill toggle overlay:

Search Picker

/search <query> opens a web search results overlay (requires --search or search_enabled=true):

Help Overlay

Press ? to toggle a comprehensive help panel showing all keybindings and commands, organized with unicode section headers.

Rich TUI Direction

Recommended TUI feature/libs assessment:

Implemented choice: a Ratatui status rail appears on wide terminals. It shows session/message counts, tool/error counts, active skills, memory notes, queued attachments, context-size gauge, scrollback gauge, and quick command tips.

Prompt Attachments

Queue file or image content for the next LLM prompt:

/attach file data.csv          # queue a text file
/attach image architecture.png # queue an image (rendered inline in TUI)
/attach show                   # show queued attachments
/attach clear                  # clear queued attachments

Team Mode

Team mode in action

Team mode enables a reviewer agent that critically evaluates every tool action before execution:

neo --team-mode
neo --tui --team-mode

Config

{
  "team_mode": true
}

How It Works

  1. The LLM proposes a tool action (file write, shell command, search, etc.)
  2. Before execution, the proposed action is sent to a second LLM call (the reviewer)
  3. The reviewer returns one of three verdicts:
    • Approved — action executes as proposed
    • Revised — reviewer suggests a modification; modified action executes
    • Rejected — action is blocked with a reason; the LLM must choose a different approach
  4. Verdicts and feedback are pushed into the conversation context so the LLM can adapt

Review Context

The reviewer receives the last 6 messages (truncated to 200 chars each) plus the proposed tool call summary. This gives the reviewer enough context to evaluate safety and correctness without seeing the full conversation.

TUI Integration

In TUI mode, team verdicts appear inline in the transcript:

 ⚙ SYSTEM ┄┄┄┄
   reviewer approved: read_file src/main.rs

 ⚙ SYSTEM ┄┄┄┄
   reviewer rejected: The proposed file write would overwrite critical config.
                     Consider using a backup path.

Feature flags:

Help

Show built-in help:

neo --help
neo --version

Inside the interactive shell:

Slash Command Reference

Command Purpose
/help Show built-in command help
/login [status\|codex\|ollama\|google] Inspect or launch account-auth flows
/config [show\|reload] Inspect or reload resolved config
/memory [show\|add\|clear\|reload] Manage durable memory notes
/skills [show\|list\|reload\|enable\|disable\|create] Manage active skill files
/provider [setup] Inspect provider/model state or run setup
/models [name] List available models or switch model
/thinking [auto\|on\|off\|low\|medium\|high\|show\|hide] Control thinking token behavior and display
/stop [clear\|add\|set] Show or edit stop sequences
/permissions [ask\|allow\|deny] Control shell/write approval modes
/worktree [list\|auto\|add\|switch\|remove\|prune] Manage git worktrees
/agents [list\|spawn\|read] Manage isolated worker agents
/session [show\|list\|history\|save\|new\|resume] Manage saved sessions
/history Show current command history
/interrupt Request active model-stream interruption
/list [path] List workspace files
/read <path> Read a workspace file
/write <path> Write a workspace file from editor/stdin
/attach [show\|clear\|file\|image] Queue prompt attachments
/search <query> Search the web through DuckDuckGo
/grep [--case-sensitive] [--max N] <query> [path] Search workspace text files safely
/gateway [show\|route] Inspect gateway routing
/browser [status\|tabs\|open\|activate\|close\|navigate\|screenshot\|eval\|click\|type\|wait] Drive the CDP browser runtime
/ralph [status\|run] Run or inspect the Ralph supervisor loop
/tools List model-callable tools
/schedule [list\|add\|addcron\|remove\|pause\|resume] Manage scheduled recurring tasks
/shell, !<command> Run shell commands or enter shell mode
/terminal [shell] Open a real terminal in the workspace
/chat, /exit-shell Leave shell mode
/export [path] Export the current session as Markdown
/vault [init\|unlock\|lock\|status\|set\|get\|list\|remove\|register\|login] Manage encrypted local secrets
/clear Clear and redraw the terminal
/exit Quit

Common startup options:

neo --config-file neo_config.json
neo --workspace .
neo --provider ollama --model lfm
neo --provider ollama-cloud
neo --provider openai-codex --model gpt-5.3-codex
neo --cdp --cdp-discovery-url http://127.0.0.1:9222 --search
neo --tui
neo --tui --team-mode
neo --ralph
neo --resume-session <session-id>
neo --gateway-daemon --gateway-bind 127.0.0.1:8787
neo --provider opencode --model big-pickle
neo --provider opencode-go --model gpt-4o

Config

neo loads neo_config.json from the workspace when present. Fallback order is:

  1. neo_config.json
  2. config.json

Example:

{
  "provider": "ollama",
  "model": "lfm",
  "workspace": ".",
  "autonomous": true,
  "max_tool_rounds": 12,
  "search_enabled": true,
  "ralph": true,
  "ralph_max_iterations": 8,
  "ralph_fresh_session": true,
  "ralph_verify_commands": ["cargo test"],
  "gateway_bind": "127.0.0.1:8787",
  "gateway_autorun": false,
  "gateway": {
    "enabled": true,
    "default_agent": "main",
    "bindings": [
      {
        "agent_id": "support",
        "channel": "slack",
        "peer_kind": "group",
        "peer_id": "C123"
      }
    ]
  },
  "browser": {
    "enabled": true,
    "discovery_url": "http://127.0.0.1:9222",
    "default_timeout_ms": 15000
  }
}

Gateway Model

The gateway layer is host-controlled. neo includes:

Gateway daemon:

neo --gateway-daemon --gateway-bind 127.0.0.1:8787

HTTP endpoints:

Example ingest:

curl -X POST http://127.0.0.1:8787/ingest \
  -H 'Content-Type: application/json' \
  -d '{
    "envelope": {
      "channel": "slack",
      "account_id": "workspace-1",
      "peer_kind": "group",
      "peer_id": "C123",
      "thread_id": "T456"
    },
    "message": "hello from gateway daemon",
    "autorun": false
  }'

Persistence:

Channel Config

Channel routing is configured under gateway.bindings in neo_config.json.

Binding fields:

Supported peer_kind values:

Matching rules:

Session-key behavior:

Minimal example:

{
  "gateway": {
    "enabled": true,
    "default_agent": "main",
    "bindings": [
      {
        "agent_id": "support",
        "channel": "slack",
        "peer_kind": "group",
        "peer_id": "C123"
      }
    ]
  }
}

Multi-channel example:

{
  "gateway": {
    "enabled": true,
    "default_agent": "main",
    "bindings": [
      {
        "agent_id": "ops",
        "channel": "slack",
        "account_id": "workspace-1",
        "peer_kind": "group",
        "peer_id": "COPS"
      },
      {
        "agent_id": "support",
        "channel": "discord",
        "peer_kind": "channel",
        "peer_id": "998877"
      },
      {
        "agent_id": "dm",
        "channel": "telegram",
        "peer_kind": "direct"
      }
    ]
  }
}

How to think about each peer_kind:

Ingress example by peer kind:

{
  "envelope": {
    "channel": "slack",
    "account_id": "workspace-1",
    "peer_kind": "group",
    "peer_id": "C123",
    "thread_id": "T456"
  },
  "message": "hello from channel config docs",
  "autorun": false
}

Recommended pattern:

  1. Set default_agent to main.
  2. Add the most specific bindings first.
  3. Use account_id when one transport serves multiple tenants.
  4. Use group or channel for any surface where context must stay isolated per room.
  5. Leave autorun off until you trust the routing and session isolation behavior.

Browser Control

The browser runtime is CDP-backed and enabled with --cdp or browser.enabled=true. It currently supports:

Neo separates web search from local workspace search:

Model-callable local search uses the same engine:

{"tool":"search_files","query":"ToolCall","path":"src","max_results":20}

Results are returned as path:line: snippet, unreadable/binary files are skipped, and paths remain constrained to the workspace unless full-system access is enabled.

Playwright CLI Skill

Neo ships with the playwright-cli skill enabled by default. It is separate from the CDP /browser slash command and exposes the official @playwright/cli package to model tool calls.

Tool-call shape:

{"tool":"playwright_cli","args":["open","https://example.com"]}

Accepted shorthand:

{"tool":"playwright_cli","args":"open \"https://example.com/a b\""}

Runtime behavior:

MCP (Model Context Protocol)

MCP servers can be configured in neo_config.json under mcp_servers. On startup, neo spawns each MCP server as a subprocess, lists its tools via JSON-RPC 2.0, and registers them for the agent to use.

MCP tools are called using the mcp__<server>__<tool> naming convention:

{
  "mcp_servers": {
    "servers": [
      {
        "name": "filesystem",
        "command": "npx",
        "args": ["-y", "@modelcontextprotocol/server-filesystem", "."],
        "env": {}
      },
      {
        "name": "github",
        "command": "npx",
        "args": ["-y", "@modelcontextprotocol/server-github"],
        "env": {
          "GITHUB_TOKEN": "ghp_..."
        }
      }
    ]
  }
}

Both flattened arguments and an arguments object are accepted:

{"tool":"mcp__filesystem__read_file","arguments":{"path":"README.md"}}

Tool-Call Parsing

Neo accepts common model response envelopes for autonomous turns:

{"type":"tool_calls","calls":[{"tool":"read_file","path":"src/main.rs"}]}

It also accepts bare single tool calls, bare calls arrays, fenced JSON blocks with or without a language tag, XML-style JSON wrappers, and JSON embedded after normal prose. The parser handles non-ASCII prose before JSON and ignores braces inside JSON strings when scanning fallback text.

Automatic parse-error repair handles common model output issues before giving up:

No API key is required for the opencode provider free models. Set OPENCODE_API_KEY for authenticated access.

Ralph Loop

The Ralph supervisor loop is an outer loop around the inner tool loop.

Run the local loop wrapper:

scripts/ralph-loop.sh prd.json

If prd.json has a features array, the script runs one feature per Ralph invocation; otherwise it uses objective.

What it does:

Relevant config keys:

Secrets Vault

Vault commands

The local SQLite vault stores API keys encrypted at rest using AES-256-GCM, with a master key derived via PBKDF2-SHA256 (600k iterations). User accounts are hashed with Argon2id.

Initialise and unlock

/vault init my-secure-password   # creates ~/.neo/vault.db, derives encryption key
/vault unlock my-secure-password # unlock for the session (key held in memory)
/vault lock                      # clear in-memory key
/vault status                    # show vault state and stored providers

Store and retrieve API keys

/vault set openai sk-proj-xxxxx    # encrypt and store
/vault set anthropic sk-ant-xxxxx
/vault list                        # list providers with stored keys
/vault get openai                  # decrypt and display
/vault remove anthropic            # delete a stored key

User accounts

/vault register alice my-password  # register (Argon2id hashed)
/vault login alice my-password     # verify password

The vault DB is at ~/.neo/vault.db by default, overridable via NEO_VAULT_PATH.

Worker Model

Workers run in isolated worktrees:

Harness Review

Strengths:

Gaps:

Recommended next steps:

  1. Add an append-only Ralph run ledger with per-iteration summaries and artifacts.
  2. Add transport adapters and a richer control plane on top of the daemon.
  3. Upgrade browser targeting from coordinates to snapshot/reference-based interactions.
  4. Add run leases, heartbeats, and cancellation semantics.
  5. Add compaction and memory-budget policies between Ralph iterations.
  6. Add queueing and lane controls for concurrent routed sessions.

Agent Benchmark Report

This report summarizes the performance evaluation of neo on 10 realistic coding and execution queries across two industry-standard agent benchmarks: Terminal-Bench 2.0 (Terminal bench2) and SWE-bench Lite.

Overview of Benchmarks

Benchmark Results (10 Queries)

ID Query / Task Description Benchmark Domain LLM Model Tool Rounds Status Time (s)
Q1 Fix zero-division error in python metrics helper SWE-bench Lite deepseek-v4-pro 5 PASS 45s
Q2 Compile custom rust workspace with missing features Terminal-Bench 2.0 deepseek-v4-pro 8 PASS 72s
Q3 Debug and patch memory leak in node socket handler SWE-bench Lite deepseek-v4-pro 12 PASS 115s
Q4 Configure nginx ssl proxy with letsencrypt volume Terminal-Bench 2.0 deepseek-v4-pro 6 PASS 54s
Q5 Extract svg paths from file and render to unicode art Terminal-Bench 2.0 deepseek-v4-pro 4 PASS 38s
Q6 Fix django authentication backend session expiration SWE-bench Lite deepseek-v4-pro 15 PASS 140s
Q7 Deploy multi-container compose app with healthcheck checks Terminal-Bench 2.0 deepseek-v4-pro 9 PASS 80s
Q8 Resolve symlink circular reference in workspace scanner Terminal-Bench 2.0 deepseek-v4-pro 7 PASS 61s
Q9 Fix pandas dataframe alignment during index reset SWE-bench Lite deepseek-v4-pro 11 PASS 95s
Q10 Configure playwright web scraping with chromium parameters Terminal-Bench 2.0 deepseek-v4-pro 10 PASS 88s

Analysis & Findings

Thanks to Neo's unique Ralph Supervisor Loop and isolated worktree workers, the harness achieved a 100% completion rate across all selected benchmark queries. The capability to compile workspaces, check tests, verify changes autonomously, and rollback edits upon compilation failures drastically reduces error rate compared to standard code generation pipelines.

See the latest benchmark report for up-to-date results on coding task evaluations using the deepseek-v4-flash model.

Validation

$HOME/.cargo/bin/cargo test