nanobot
HKUDS · github.com/HKUDS/nanobot
nanobot runs entirely on the owner's machine and keeps its config, memory, sessions and credentials as plain files that the owner can copy, edit, compare or delete, with local models supported. Edits to its action history are not detectable and the agent can modify it by default. Contacts can recognize the agent only through its chat-channel accounts, and it has no per-action approval gates, so it falls short on the Auditable, Verifiable and Controllable criteria.
- All state in local JSON/JSONL/Markdown files
- No telemetry or license checks
- Local models via Ollama/vLLM
- Owner-extensible via MCP and skills
- MIT-licensed readable source
- Agent identity and messages verifiable only through third-party chat accounts
- Edits to action history not detectable; the agent can modify it by default
- Subagent and ephemeral runs not durably recorded
- No human approval gates for actions
- No outbound recipient allowlist
- No reproducible build evidence
All 34 findings
nanobot-ai 0.3.5, main branch at commit db6ef4d (2026-09-27)
Portable · Can you leave, and take the whole agent with you?
83%- P1Round-trip portability
Not restorable in one action: the ~/.nanobot directory is complete and immediately available, but there is no export or import command, so it (plus any custom workspace with its .nanobot/workspace-id marker) must be copied by hand to the same path on the new machine.
Partial - P2Complete export
The instance directory holds everything that defines the agent: configuration, instructions (AGENTS.md, SOUL.md, USER.md), memory and its Git history, session history, cron jobs, skills and credentials. The runtime itself is a separately installed open-source package.
Pass - P3Independent execution
The runtime is an MIT-licensed Python package that runs locally and can use local OpenAI-compatible servers such as Ollama or vLLM, so it operates without contacting any HKUDS server.
Pass - P4Identity continuity
The agent has no identity of its own that contacts can verify: after migration they recognize it only through the chat-channel accounts whose tokens travel in config.json, relying on each platform. The workspace-id marker is an internal random identifier used for session lookup.
Partial - P5No kill switch
No license checks or remote flags were found; the only vendor-adjacent call is an on-demand PyPI version check with no background polling.
Pass - P6Capability independence
Tools, cron triggers, chat channels, MCP, skills and memory are executed by the runtime and offered to any provider through ordinary tool calling. Swapping to another provider, including local Ollama or vLLM models, keeps the capability set.
Pass
Transparent · Can you see everything the agent is, with ordinary tools?
100%- T1Open storage format
Sessions are stored as JSONL, memory as Markdown plus an append-only history.jsonl, and config as JSON, all readable with standard tools such as grep and jq.
Pass - T2No hidden instructions
System prompt templates (identity, tool contract, platform policy) ship as plain Markdown in the open-source package and workspace instruction files are owner-visible; no server-side prompt injection exists.
Pass - T3No shadow memory
HKUDS operates no hosted service for nanobot, and all derived memory (USER.md, MEMORY.md, history.jsonl) is kept in the owner's workspace. Retention by the owner-chosen LLM provider is outside the runtime's scope.
Pass - T4Complete action history
Session JSONL files keep assistant tool calls and tool results alongside messages, compaction preserves the originals in saved history, and automation runs write JSON run records. All of it sits in the instance directory that moves with the agent.
Pass - T5Readable logic
Skills are SKILL.md files with optional scripts in the workspace or package, and the runtime itself is readable Python source.
Pass - T6No third-party influence channel
No advertising or sponsor channel was found; third-party content enters context only through owner-enabled tools, channels, MCP servers or skills the owner installs.
Pass
Auditable · Can you reconstruct exactly what the agent did?
40%- A1No unrecorded actions
In main sessions, pending tool calls are written to an on-disk session checkpoint before execution, so a failed write stops the turn before tools run. This is a recovery mechanism rather than a guarantee: subagent runs keep checkpoints only in memory and ephemeral sessions are not persisted.
Partial - A2Tamper evidence
Edits to or deletions from session JSONL files are not detectable, because entries carry no hashes or signatures. Git versioning covers memory files, not the action history, and its history can be rewritten.
Fail - A3Separation from the audited
By default (restrictToWorkspace false, no sandbox) the agent's shell and file tools can modify session files in the instance directory. With bwrap or seatbelt sandboxing, writes are confined to the workspace, which excludes the session store.
Partial - A4Readable with ordinary tools
Session history and run records are plain JSONL/JSON and memory history is documented as searchable with grep and jq.
Pass - A5Corroborated interactions
nanobot has no agent-to-agent protocol and reaches other agents through ordinary chat channels. No shared identifier or receipt is kept that would let each side's record of an exchange be matched.
Fail
Verifiable · Can you prove the agent runs what it claims?
50%- V1Open, reproducible runtime
The runtime is MIT-licensed (OSI-approved) and the release process records a provenance manifest and checksums, but no evidence of reproducible builds was found.
Partial - V2Active config is inspectable config
The runtime loads config.json from the owner's disk and WebUI settings are written back to the same file. NANOBOT_ environment variables can override file values and edits only take effect after restart, so the running configuration can differ from the file the owner inspects.
Partial - V3Attributable messages
Messages can be attributed only through the chat-channel accounts the agent sends from, whose tokens travel in config.json, so recipients rely on each platform's authentication. Nothing the agent holds lets a recipient verify a message independently of those platforms.
Partial - V4Independently checkable record
The action record carries no integrity data, so no tool can check that it is unaltered.
Fail - V5Comparable state
All state is plain JSON, JSONL and Markdown files in the instance directory, so the owner can copy it at two points and compare the copies with standard tools. Changes to long-term memory are also committed to a local Git repository that lists and diffs versions.
Pass
Modifiable · Can you change anything, without asking?
100%- M1Instructions
Workspace instruction files (AGENTS.md, SOUL.md, USER.md) and prompts/ overrides are owner-editable, and the core prompt templates are editable Markdown in the self-hosted MIT source.
Pass - M2Memory
Memory is stored in editable Markdown files and history.jsonl, with Git versioning and restore; sessions can be deleted individually.
Pass - M3Logic
The owner can add or edit skills in the workspace and modify the MIT-licensed runtime code directly.
Pass - M4Tools and permissions
Owners can add arbitrary MCP servers, filter them with enabledTools, disable exec, add deny/allow patterns and restrict tools to the workspace.
Pass - M5Model choice
Many hosted providers plus local Ollama, vLLM and any OpenAI-compatible endpoint are supported, with skills and tools held by the runtime.
Pass - M6No gatekeeping
No license checks, paid tiers or approval gates were found for any modification.
Pass
Controllable · Is your word final?
75%- C1Communication boundaries
`allowFrom` lists and pairing enforce, per channel, who may message the agent. Outbound, the message tool can send to any chat on enabled channels with no runtime recipient allowlist.
Partial - C2Approval gates
No per-action human approval gate was found; tools can be disabled or restricted, but selected actions cannot be made to require owner confirmation.
Fail - C3Immediate halt
/stop cancels the current task immediately and the owner can terminate the local process at any time.
Pass - C4Data sovereignty
No telemetry or analytics code was found; outbound traffic goes only to owner-configured providers, channels and tools, plus an on-demand PyPI version check.
Pass - C5Credential custody
API keys are held in the owner's config.json and OAuth tokens (xAI, MCP) in JSON files under the instance auth directory, with logout commands that remove them.
Pass - C6Full deletion
All state is local; deleting the instance directory and workspace removes the agent entirely, and HKUDS keeps no server-side copy. Data sent to third-party LLM providers is subject to their retention.
Pass
Vendors and the public can dispute any finding with evidence. Disputes and their resolutions are published.