Desktop or hosted? The desktop app is the best way to try HALO end to end for free and keep your traces fully local. For continuous production observability across a team (always-on ingest, multiple users, scheduled HALO runs, Signals, and alerts), the hosted version is the better fit. You can start local and move to hosted later without changing your instrumentation; it is the same Catalyst tracing under the hood. See Self-hosting and production.
Before you start
You need:- The HALO desktop app (installed in Step 1). HALO v1 ships for Apple Silicon Macs and Ubuntu/Debian Linux (x64). Intel Macs, other Linux distributions, and Windows are not supported yet.
- A model provider key for running HALO. The desktop app supports OpenAI-compatible and Anthropic-compatible endpoints (OpenAI, Anthropic, OpenRouter, Inference, or your own endpoint), and you bring your own key. The app stores it locally and it never leaves your machine.
- A coding agent for the last step: Claude Code, Cursor, or Codex. The report opens in any of them with one click, and there is a copy-paste path for everything else.
What “no account” means. The desktop app, the local trace timeline, and the HALO engine all run with no Inference account and no sign-in. The one thing that always needs a key is a model provider, because HALO calls an LLM to do the analysis. That key can be any provider you already have.
Step 1: Install the desktop app
Install with the one-line installer:-Setup.tar.gz on Ubuntu/Debian x64. You can also grab a build directly from the releases page.
HALO v1 supports Apple Silicon Macs and Ubuntu/Debian Linux (x64) only. The installer stops with a clear message on Intel Macs, other Linux distributions, and Windows. On a clean Ubuntu/Debian box you may also need a few system libraries first:
sudo apt-get install -y libgtk-3-0 libwebkit2gtk-4.1-0 libayatana-appindicator3-1.Step 2: Load the demo traces
Launch the app. After a short welcome, onboarding lands on the Import Demo Traces screen. This is the front door for getting data into HALO: import history from Langfuse or Phoenix, upload a JSONL trace export, connect a local agent, or load a demo dataset.
inference-net/SearchAgentDemoTraces dataset on Hugging Face, caches it beside your local app data, and queues the normal JSONL importer. No arbitrary remote URLs are accepted.


Step 3: Add a model provider
HALO analysis runs against a model you choose, with your own key. Open Settings and click Add Provider under Model providers.
- OpenAI sets
https://api.openai.com/v1. - Anthropic sets
https://api.anthropic.com/v1. - Custom OpenAI-compatible lets you point at OpenRouter, Inference (
https://api.inference.net/v1), or any other compatible endpoint.

git, uv, Python 3.12).
Step 4: Find your way around
The app has four main pages, all in the left sidebar:- Data is the trace timeline: every trace and session in your local workspace, with search, filters, and summary stats.
- Analysis is where HALO runs live: start new runs, watch them stream, and revisit every completed report.
- Imports tracks trace history brought in from other tools, with per-import status and counts.
- Settings holds model providers, the local database details, and the HALO engine install.

Step 5: Open a trace
The demo traces all come from one agent, Traceable Search Agent: a compact web-search agent that plans in a scratchpad, searches the web through Tavily, extracts pages, scores sources, and writes a final answer. It ships with deliberate, documented flaws (a heuristic source-quality score, an unstructured scratchpad, no enforced answer schema), which is exactly what makes this dataset a good HALO sandbox. The code lives incontext-labs/SearchAgentDemo (Python) and context-labs/SearchAgentDemoTS (TypeScript); you will clone one in Step 7.
Click any row on the Data page to open the trace viewer. The Timeline view is a waterfall of every span in the run: the agent loop at the top, then each LLM call, tool call, and retriever call laid out against the clock. It makes the shape of a run obvious at a glance, including what ran serially that could have been parallel, and where the time actually went. Use the Cost heatmap toggle to shade spans by spend, and zoom with the controls or by double-clicking a span.


Step 6: Run HALO
Click Run Analysis in the top right of the Data page (or start from the Analysis page). The dialog is where you scope the run:- Session group or Trace group picks the unit of analysis.
- The filters (search, window, status, source, service, agent, observed model, scope) narrow which telemetry HALO reads. For the demo dataset, set the window to All time and leave the rest open. The live counts at the bottom confirm what the run will cover, about 1,000 traces here.
- Provider and model select the provider you saved in Step 3 and which of its models does the analysis.
- Title and prompt name the run and tell HALO what to look for.



- A deterministic tool-argument failure. The model passes
topic="health"ortopic="sports"to the Tavily search tool, which only acceptsgeneral,news, orfinance, so those searches fail every single time. The fix is to encode the constraint as an enum in the tool schema. - Error-prone search and extraction that triggers rework loops. Failed searches and extractions send the agent back through extra LLM deliberation and retries, burning latency and tokens.
- Latency dominated by sequential LLM calls. The slowest runs stack around six back-to-back chat completions plus serial searches that could run concurrently.
- Confusing telemetry. The tool wrapper span and the underlying provider span both report ERROR for the same root cause, and the wrapper span is missing its real inputs, which makes debugging and error counts misleading.

Step 7: Hand the report to a coding agent
The report is a ranked, cited to-do list for the agent’s codebase, and the desktop app hands it off directly. The Act on this report panel next to every completed run has one-click buttons for Open in Cursor, Open in Claude Code, and Open in Codex, plus Copy prompt for any other tool. No MCP server, no wiring.
tools.py / tools.ts), the agent loop (agent.py / agent.ts), and the tracing setup. The report’s citations mean the coding agent is not guessing: every recommendation traces back to specific runs you can open in the viewer.
Step 8: Close the loop
A fix is not done until new traces from the changed code confirm it. This is where the desktop app’s live mode comes in: the same agent repo can stream traces straight into your local timeline while it runs, with nothing crossing the network beyond the agent’s own model calls.-
In the app, open Import Data → Connect Local Agent. It shows the local ingest endpoint. Copy the repo’s env file and point the agent at it:
INFERENCE_API_KEYis what the agent uses to call its model; point it at any provider by also settingINFERENCE_BASE_URL(it defaults to Inference’s OpenAI-compatible endpoint). TheCATALYST_OTLP_ENDPOINToverride is the whole trick: instead of shipping spans to the cloud, the agent posts them to the desktop app listening on127.0.0.1:8799. -
Run a batch from the repo’s bundled query dataset against your patched code. The query set is fixed, so the only variable between before and after is your fix:
Watch the traces land in the Data page as each run finishes.
- Run HALO again, scoped to the new traces (a recent time window or the new session IDs), and compare the two reports. The findings you fixed should be gone or diminished; pick up the next one.
Bring your own traces
You do not have to use the demo dataset. The same Import Agent Traces options from Step 2 work on your real data, which makes the desktop app a low-commitment way to try HALO on the agent you actually run:- Import from Langfuse. Paste a Langfuse project’s API URL and key pair (public and secret). HALO pulls your trace history over the Langfuse public API and stores it locally. If you would rather keep your existing pipeline and try HALO without importing, you can instead point the Langfuse SDK at Catalyst with an env-var switch.
- Import from Phoenix. Bring historical traces from an Arize Phoenix project into the local timeline the same way.
- Import JSONL. Any JSONL trace export with one span per line works, including OpenTelemetry and Catalyst exports.
- Connect Local Agent. Stream traces live from any Catalyst- or OpenTelemetry-instrumented agent by pointing its OTLP endpoint at
http://127.0.0.1:8799/v1/traces, as in Step 8.
Self-hosting and production
A common question: can you run this in production? Two answers, depending on what you mean.- The desktop app is a single-user, local-first tool. It is ideal for exploring, debugging, and iterating on an agent on your own machine. It is not designed to be a shared, always-on production service.
- The HALO engine is open source and MIT licensed (
context-labs/halo,halo-engineon PyPI). You can self-host it: install the CLI, point it at exported traces, and run it anywhere, including in CI against a fresh trace export on every deploy. That is the self-hosted production path for the analysis step itself.
Where to go next
Try the hosted version
The same loop on the hosted Catalyst dashboard, with scheduled runs, Signals, and the MCP server.
Do this on your own agent
Run the trace, analyze, fix loop against your real app from instrumentation onward.
Bring your Langfuse traces
Point the Langfuse SDK at Catalyst with an env-var switch, no code changes.
HALO on GitHub
The open-source HALO desktop app, engine, and methodology. MIT licensed.