
How AxiOwl Stays Lightweight
AxiOwl stays lightweight by keeping the core product shape narrow. It is not trying to become a replacement AI provider, a general automation platform, or a hidden always-on cloud service. The current implementation is a native C++ coordinator with a CLI, an MCP stdio server, a durable local registry, JSONL evidence logs, and explicit provider delivery edges.
That design choice matters because agent-to-agent messaging can grow complicated quickly. AxiOwl still has to resolve sender identity, find a target session, build the final visible message, dispatch to the correct provider surface, and record what happened. It does that through small, inspectable layers instead of one opaque runtime.
Sources read
C:\Users\kjhgf\OneDrive\Documents\postfourth\axiowl-cplus\README.mdC:\Users\kjhgf\OneDrive\Documents\postfourth\axiowl-cplus\apps\windows-desktop\README.mdC:\Users\kjhgf\OneDrive\Documents\postfourth\axiowl-cplus\apps\windows-desktop\CMakeLists.txtC:\Users\kjhgf\OneDrive\Documents\postfourth\axiowl-cplus\apps\windows-desktop\src\main.cppC:\Users\kjhgf\OneDrive\Documents\postfourth\axiowl-cplus\apps\windows-desktop\src\cli.cppC:\Users\kjhgf\OneDrive\Documents\postfourth\axiowl-cplus\apps\windows-desktop\src\mcp_server.cppC:\Users\kjhgf\OneDrive\Documents\postfourth\axiowl-cplus\apps\windows-desktop\src\message_pipeline.cppC:\Users\kjhgf\OneDrive\Documents\postfourth\axiowl-cplus\apps\windows-desktop\src\delivery_worker.cppC:\Users\kjhgf\OneDrive\Documents\postfourth\axiowl-cplus\apps\windows-desktop\src\provider_edges.cppC:\Users\kjhgf\OneDrive\Documents\postfourth\axiowl-cplus\apps\windows-desktop\src\registry.cppC:\Users\kjhgf\OneDrive\Documents\postfourth\axiowl-cplus\apps\windows-desktop\src\evidence_log.cppC:\Users\kjhgf\OneDrive\Documents\postfourth\axiowl-cplus\apps\windows-desktop\src\app_paths.cppC:\Users\kjhgf\OneDrive\Documents\postfourth\axiowl-cplus\apps\windows-desktop\src\service_config.hppC:\Users\kjhgf\OneDrive\Documents\postfourth\axiowl-cplus\apps\windows-desktop\src\remote_relay.cppC:\Users\kjhgf\OneDrive\Documents\postfourth\axiowl-cplus\apps\windows-desktop\src\provider_remote.cppC:\Users\kjhgf\OneDrive\Documents\postfourth\axiowl-cplus\apps\windows-desktop\tests\core_tests.cppC:\Users\kjhgf\OneDrive\Documents\postfourth\axiowl-cplus\apps\windows-desktop\tests\mcp_conformance.ps1C:\Users\kjhgf\OneDrive\Documents\postfourth\axiowl-cplus\docs\developer\README.mdC:\Users\kjhgf\OneDrive\Documents\postfourth\axiowl-cplus\docs\user\README.mdC:\Users\kjhgf\OneDrive\Documents\postfourth\axiowl-cplus\docs\reference\architecture-overview.mdC:\Users\kjhgf\OneDrive\Documents\postfourth\axiowl-cplus\docs\reference\installer-behavior-matrix.mdC:\Users\kjhgf\OneDrive\Documents\postfourth\axiowl-cplus\docs\installer\README.mdC:\Users\kjhgf\OneDrive\Documents\postfourth\axiowl-cplus\release\axiowl-activation-build-preflight.json
One Native Runtime, Several Entry Points
The simplest sign of AxiOwl's footprint is the executable model. The Windows desktop build compiles a native C++ runtime, and the user-facing command surface is centered on axiowl.exe. The main.cpp file does very little by itself: it collects command-line arguments and hands them to axiowl::run_cli.
From there, the same runtime can act in several modes:
axiowl send --to <agent> --body <message>
axiowl send --to <agent> --stdin
axiowl create --provider <provider> --name <agent>
axiowl discover <provider-or-all>
axiowl list agents
axiowl status
axiowl mcp-server
axiowl delivery-worker --request <request-json-file>
axiowl relay-session --stdio
Those modes do not require a separate API server for normal use. The MCP server is also started from the same binary:
axiowl mcp-server [--host <host>] [--provider <provider>]
That is important for the "lightweight" claim. AxiOwl is not adding an HTTP gateway just to let an MCP-capable provider call a tool. The native MCP server reads stdio, handles JSON-RPC methods such as initialize, tools/list, and tools/call, and then calls the same local command logic that the CLI uses.
The MCP implementation is still careful, not bare-bones. The conformance test verifies line-delimited messages, framed Content-Length messages, required tools such as axiowl_send_message and axiowl_create_agent, and rejection of an oversized MCP frame. Lightweight here means fewer moving parts, not loose protocol handling.
The Direct Pipeline Is Small and Explicit
The developer docs describe the current message flow as:
MCP tool or CLI command
-> CLI/MCP handler
-> MessagePipeline
-> validate target/body/sender
-> resolve sender identity
-> resolve target registry row
-> targeted discovery repair when needed
-> build final visible body
-> provider_edges dispatch
-> provider module
-> delivery proof/log
The code follows that shape. run_send builds a MessageRequest, fills it from flags or stdin, and passes it to MessagePipeline::send. The pipeline validates the target and body, resolves sender identity, looks up the target in the registry, runs one targeted discovery repair if needed, and rejects the send if the target is known but not sendable.
Only after those checks does AxiOwl mark the request as accepted by AxiOwl. The core test suite verifies that this receipt is deliberately local: the state is accepted_by_axiowl, the log records the receipt boundary as after target resolution and before provider work, and the send path does not wait for a provider reply before returning.
That boundary keeps the runtime lean and honest. AxiOwl can acknowledge that it accepted and routed a request without pretending the target provider displayed it. Provider acceptance and end-to-end reply proof remain separate evidence.
File-Backed State Instead of a Heavy Database Service
AxiOwl's durable local state is stored under a predictable state root. On Windows, app_paths.cpp resolves that to:
%LOCALAPPDATA%\AxiOwl
Inside that root, the current runtime uses simple file-backed state:
registry\agents.tsv
registry\nodes.tsv
logs\events.jsonl
logs\delivery.jsonl
logs\create-lifecycle.jsonl
runtime\
license\activation.json
The agent registry is TSV, not a separate database daemon. A row stores the display name, aliases, provider, provider session ID, node ID, enabled and sendable flags, source, timestamps, and the last error. The node registry uses the same plain-file approach for node ID, host, SSH user, key path, timestamps, and last error.
The evidence log is JSONL. EvidenceLog::append writes one event object per line and creates the parent directory if needed. Log rotation is implemented locally in app_paths.cpp when a log grows past the configured cap. That makes the operational evidence inspectable with ordinary file tools, while avoiding a background database service just to track message receipts.
Provider Edges Are Plugged In, Not Blended Together
The provider dispatch layer is another lightweight boundary. provider_edges.cpp is an explicit table of provider routes. Delivery goes to functions such as:
deliver_codex_providerdeliver_codex_cli_providerdeliver_vscode_native_providerdeliver_vscode_copilot_providerdeliver_antigravity_providerdeliver_cursor_providerdeliver_claude_code_cli_providerdeliver_copilot_cli_providerdeliver_opencode_cli_provider
Unknown providers return an unknown_provider result instead of falling through to an accidental behavior. The remote provider is also explicit: in the current local-provider remediation scope, provider_edges.cpp returns a remote-out-of-scope result for delivery. The separate provider_remote.cpp file contains SSH relay logic for the Windows side, while the Linux branch states that remote chaining is not supported by the Linux remote app and that Linux remote AxiOwl intentionally supports Codex CLI delivery only.
This is a practical form of lightness. Each provider surface has a named edge and its own failure mode. A local provider bug does not need to become a hidden fallback through some unrelated provider path.
The Delivery Worker Is a Mode, Not a Permanent Service
The delivery worker also uses the same binary. message_pipeline.cpp builds a ProviderRequest, then hands it off through handoff_provider_request_through_delivery_worker. In delivery_worker.cpp, AxiOwl writes a temporary JSON request file and starts:
axiowl delivery-worker --request <request-json-file>
The worker reads the request, validates it, dispatches to deliver_to_provider, writes a structured result, records evidence, and removes the request file when delivery finishes.
That shape lets AxiOwl return a local receipt quickly without requiring a permanent daemon for every send. It is still observable: the request file path, provider, state, method, evidence, and errors are all logged.
Current Service Status Is Explicit
AxiOwl has a reserved local service endpoint:
127.0.0.1:37661
The code exposes that through service_config.hpp, and the core tests assert that the endpoint remains stable. But the current status output is clear about what exists today: local service is "not implemented yet" and the CLI is running the direct local pipeline skeleton.
That distinction belongs in any honest explanation of AxiOwl's footprint. AxiOwl has a reserved service shape for future work, but current CLI and MCP operation do not depend on a local always-running service.
Install Footprint Is Selected, Not All-Or-Nothing
The Windows installer docs say the core install places AxiOwl under %LOCALAPPDATA%\AxiOwl, including bin\axiowl.exe, a manifest/provenance file, runtime directories, registry directories, logs, and selected provider integration files.
Provider integrations are feature-scoped. The installer behavior matrix says provider checkboxes should be selected from discovery, and unchecked provider features should not be installed, patched, closed, restarted, or uninstalled as collateral damage. The MSI can install provider pieces such as MCP config, VS Code or Cursor bridge extensions, patches, CLI config, discovery records, and AxiOwl-owned wrapper/config files, but those are selected units rather than one broad mutation of every provider on the machine.
The current release preflight proof supports modest artifact-size claims without inventing runtime performance numbers. In the build proof read for this article, the MSI artifact is 1,895,154 bytes. The payload manifest lists payload/axiowl.exe at 1,716,736 bytes, along with small provider payloads such as VSIX files, extension JavaScript files, Codex plugin files, and installer helpers. Those numbers are build-artifact facts, not a promise about memory use, startup time, or provider latency.
Remote Work Uses Stdio Relay
AxiOwl's remote path also keeps to simple process boundaries. The CLI exposes:
axiowl relay-session --stdio
remote_relay.cpp reads newline JSON frames from stdin, emits a hello frame, handles deliver frames, and returns structured deliver_result or error frames. When a frame includes direct target provider details, the relay can build a ProviderRequest and send it through the delivery worker. Otherwise it can pass the target and body through the normal MessagePipeline.
The Windows remote provider delegates over SSH by running axiowl relay-session --stdio on the remote node. The remote installer script installs the Linux binary to /usr/local/bin/axiowl, installs the Codex plugin payload, writes an MCP config that launches /usr/local/bin/axiowl mcp-server --host codex --provider codex, and probes the MCP server for axiowl_send_message.
Again, the pattern is small and inspectable: SSH, stdin/stdout frames, local files, and the same native runtime.
What Lightweight Does Not Mean
Lightweight does not mean AxiOwl skips safety checks. The source is full of deliberate refusal points:
- A send with no target is rejected.
- A send with an empty body is rejected.
- A final visible relay body requires resolved sender identity.
- A known target that is not sendable is rejected.
- Missing MCP session metadata fails loudly.
- Unknown providers return explicit unsupported results.
- Remote local-provider fallback is not used silently.
It also does not mean every provider integration is equally simple. VS Code and Cursor integrations can require bridge extensions or patches. CLI providers may need MCP metadata support before they meet the final support bar. The provider support matrix defines support by full path behavior: discovery, install/config, send, provider receive, MCP reply, and correct sender identity.
The lightweight part is that these concerns are separated. Registry state is in registry files. Evidence is in JSONL logs. MCP is stdio. Delivery routing is in provider edges. Installer features are selected units. The service endpoint is reserved but not claimed as an implemented daemon.
Closing
AxiOwl stays lightweight by keeping the coordinator small and the boundaries visible. A send enters through CLI or MCP, passes through one message pipeline, resolves durable local registry state, logs evidence to ordinary files, and dispatches through a named provider edge. The current runtime does not need a permanent service to do that work, and the installer does not need to touch every provider surface unless that feature is selected.
That is the real product value: not a vague promise that AxiOwl is fast, but an architecture where operators can see what is installed, what state exists, what was accepted, what provider edge ran, and where the evidence was written.
Image prompt:
Create a polished graphic image related to: how AxiOwl stays lightweight.
Subject: a compact native desktop runtime module connected to three slim rails distinguished only by abstract shapes, with small file drawers representing registry and logs and plug-in edge ports for provider connectors; no readable text or logos.
Style: halfway between a clean symbolic icon and a realistic product/technical illustration; professional SaaS/technical marketing style; crisp edges; high detail; no text; no logos.
Background: solid #00ff00 chroma key green screen background covering the full canvas edge to edge.
Restrictions: no owl, no axolotl, no birds, no animals, no mascot, no text, no watermark.