Neutree Agent Platform

Close your laptop.
Your agents keep working.

The open-source agent platform to build, distribute, and optimize AI agents, on infrastructure you own.

Native UI
web · UI SDK
Channels
Slack GitHub Jira
API
your own app
ON NAP 1 replica running
support-triage
Claude Code Codex Goose 1 vCPU · 2 GiB 0 9 * * 1-5
promptv2 skills MCP files memory
PLATFORM MIDDLEWARE
code sandbox remote browser cross-agent filesystem memory store
SESSIONS · LAST 30 DAYS
THE AGENT PROPOSED THIS FROM ITS OWN TRANSCRIPTS
- ask the user when context is missing
+ check the memory store first, then ask
you decide
ON YOUR MACHINE
Claude Code Codex Goose + yours
st support-triage running codex 2 vCPU · 4 GiB · 3 replicas Search or jump to…⌘K st
Session History 41 today
#4821 refund not receivedslack · #support now
#4819 SSO login loopweb 6m
#4812 API 429s since 14:00webhook · pagerduty 22m
Backlog roundupschedule · 0 9 * * 1-5 9:00
#4807 export stuck at 90%slack · #support 1h
#4802 invoice PDF blankweb 2h
#4799 seats not updatingapi · billing-bot 3h
#4788 webhook retries exhaustedwebhook · gitlab 5h
Files agent filesystem
/ workspace / triage
NameModifiedSize
4821-refund.mdwriting…2.1 KB
4819-sso.md6m ago3.4 KB
4812-api-429.md22m ago5.0 KB
4807-export.md1h ago1.8 KB
4802-invoice.md2h ago2.6 KB
4799-seats.md3h ago1.4 KB
4788-webhooks.md5h ago4.2 KB
backlog-2026-07.md9:0012.6 KB
escalations.csv9:0031.0 KB
playbooksyesterday6 items
exportsMon2 items
Chat working
#4807 is the export worker running out of memory on files over 200 MB. I linked it to the open engineering issue and replied with the workaround.
Triage #4821 and draft the reply. Use the refunds playbook.
Readplaybooks/refunds.md0.4s
Memorysearch "duplicate charge"1.2s
Paid twice on 12 Jul. The second charge was refunded on 15 Jul, but the confirmation bounced: the address on file has a typo. Drafting a reply with the refund reference and asking them to confirm the address.
Writetriage/4821-refund.md
Message the agent…
Chat Session History Files Terminal Browser Skill Studio Automation Memory Connectors Settings
A workspace: where an agent runs, and where you set it up and work with it.

Whichever core you already run

Claude Code, Codex and Goose run here the way they run on your machine. Switch between them later and the agent stays as it is.

  • Claude Code
  • Codex
  • Goose
  • Others
01 / Build

An agent is a prompt, its skills and its tools, on a frontier core.

Tune it once, and the team has it

Those three pieces live in a shared library with scopes and versions. Point a workspace at one and it follows every update, instead of five copies drifting apart.

Library 6 workspaces reference these
Prompts
Skills
MCP
Commands
Templates
support-triage team v5
refund-reply team v2
escalation-rules private v1
tone-of-voice public v7
New prompt Import from workspace

Agent middleware: the hard parts already run here

Middleware is the layer beneath the agent: capabilities the platform runs, so every workspace has them from minute one.

AGENT
render the promo cut
ffmpeg
check the signup flow
playwright
summarise last week
pandas
none of these live in the agent’s own container
jrottenberg/ffmpeg
$ffmpeg -i raw.mov promo.mp4
done, and thrown away
mcr.microsoft.com/playwright
$npx playwright test signup
python:3.12-bookworm
$python tickets.py --week
AGENT
sign in and export
browser
$agent-browser open
$agent-browser snapshot -i
$agent-browser click
app.example.com/reports
this bit needs a person
you take the keyboard, same session
@agent/researcher compare the two vendors
coordinator
search · docs
search · news
search · pricing
check · claims
check · numbers
check · sources
writer
promptfind pricing, docs and recent news
result14 sources, 3 of them conflict
promptverify the three conflicts
result2 of 9 claims dropped
WORKSPACE A
draft the notes
read_write
WORKSPACE B
add the pricing
read_write
WORKSPACE C
summarise both
read_only
/mnt/afs/notes
drafts
vendor-a.md
2.1 KB
pricing.csv
12.6 KB
WORKSPACE
note what we settled
another workspace
read_write
read_only
notes
/mnt/memory/k3f9x2ab/
policies
/mnt/memory/7dq2m4xz/
FUSE
store_id
path
updated
k3f9x2ab
/MEMORY.md
2d ago
k3f9x2ab
/project/q3.md
5d ago
just now
7dq2m4xz
/refunds.md
1w ago
AGENT
url/_cp/mcp/…
no token in here
CONTROL PLANE
attaches your token
Bearer ••••••••
UPSTREAM
arrives signed

Or let it build itself

Every piece above is a field you can fill in yourself. Builder mode is the other way round: you describe the goal, and the agent configures its own core, prompt, skills and schedule.

02 / Distribute

Every entrance leads to the same agent.

Slack threads, HTTP calls, CI webhooks and its own schedule all open one workspace, with the same prompt, the same skills and the same memory behind them.

  • Native UI the console the platform ships
  • Chat channels the thread becomes the session
  • HTTP API stream it, or hand off the turn
  • Webhook filters run before a session exists
  • Schedule each firing is its own session
Workspace
Sessions
  • ui walk me through last night's failures
  • chat the deploy is red, what happened?
  • api Triage the failing build, open an issue.
  • webhook Build api-e2e failed on main, read the log.
  • schedule Summarize yesterday's failed builds.

The same workspace, served two ways

Static

1 replica

4 vCPU · 8 GiB, held at all times

Up whether or not anything is asking. It answers the moment a turn arrives, and holds its machine in between.

Auto-scalingPreview

0 to 5 replicas

1 vCPU · 2 GiB per replica, held while it runs

Replicas follow the traffic: up at once, down once they drain, none at all while it is idle. Files sit on a shared volume, so the next turn wakes it with them intact.

Both sizes are an example. CPU and memory are set per workspace.

03 / Optimize

The agent proposes. You approve.

Ask it to read its own sessions and it comes back with a change to itself. You approve the change, and the platform applies the copy you approved.

Agent · builder mode
list_sessions 1,240 sessions in this workspace
get_session_export_urls 12 transcripts, read in full
workspace_prompt_propose req_8f2c41 · the id, not the change
workspace_prompt_apply applied
agent_requests pending
- Reply in the language of the ticket
+ Reply in the language of the customer's last message
the change is held here, not by the agent
Approve Reject the owner decides
propose
re-reads what you approved
Workspace · system prompt updated
Deployment

One control plane, as many clusters as you need.

Control plane
  • The cluster you install on

    Workspaces run beside the control plane.

  • one outbound connection

    A cluster behind NAT

    Its runner dials the control plane and keeps the line open.

  • A customer site

    Their cluster, their network, your workspaces.

One installer, one node or a cluster

The same install targets a single k3s host or a Kubernetes cluster you already run. It can also install with no internet at all, from a bundled image set and a registry it brings up itself.

Environments dial out

A runner inside the cluster opens one connection to the control plane and works over it. There is no inbound route to open, and no kubeconfig to hand over.

Get started

One command on one machine

$curl -sfL https://docs.neutree.ai/nap/get.sh | sudo sh -

One Linux machine · 8 vCPU / 32 GB / 200 GB · around ten workspaces

Set up a provider and run your first agent · Production deployment

Open source

Apache 2.0, developed in the open.