Skip to content

docs(self-host): agent runner docs, hosting layout, and image reorg - #5301

Merged
mmabrouk merged 7 commits into
big-agentsfrom
docs/selfhost-runner-docs
Jul 14, 2026
Merged

docs(self-host): agent runner docs, hosting layout, and image reorg#5301
mmabrouk merged 7 commits into
big-agentsfrom
docs/selfhost-runner-docs

Conversation

@mmabrouk

Copy link
Copy Markdown
Member

What changed

This is the docs + hosting-layout + image-reorg slice of the runner self-hosting cleanup. Three things, one review:

1. Self-host docs restructured around agent execution

The self-host section now treats agent execution as a first-class area next to deployment and access control. New sidebar:

Self-host
├─ Overview                              (new)
├─ Get started
│  ├─ Quick start
│  └─ Use your own subscription          (new)
├─ Agent execution                       (new group)
│  ├─ How agents run                     (new)
│  ├─ Sandbox isolation and security     (new)
│  ├─ Run agents in a cloud sandbox (Daytona)  (new)
│  ├─ Customize the agent runtime        (new, replaces the old custom-runner-images guide)
│  └─ Runner and sandbox configuration   (new reference)
├─ Deploy to production                  (moved from guides/)
├─ Access control                        (moved: SSO, org restriction, dynamic access controls)
├─ Architecture                          (moved from infrastructure/)
├─ Configuration reference
├─ Upgrade and migrate                   (moved from upgrades/)
└─ FAQ

Every moved page keeps its URL via slug: frontmatter, so no bookmark breaks. The three superseded agent-runner guides (deploy-the-agent-runner, custom-agent-runner-images, agent-daytona-sandboxes) are deleted and redirected to their successors in docusaurus.config.ts and docusaurus.config.dev.ts. Touched pages get the variable-name and worker-list corrections from the cleanup (provider pair replaces AGENTA_SANDBOX_LOCAL_ALLOWED, workerStreams/workerQueues replace the seven per-worker names, SUPERTOKENS_EMAIL_DISABLEDAGENTA_ACCESS_EMAIL_DISABLED, with-tunnel profile name, and so on).

cd docs && pnpm build passes with no broken-link errors.

2. Runner image folders reorganized

Two images, two clearly separated folders:

  • services/runner/docker/services/runner/images/service/ (the runner service image)
  • services/runner/sandbox-images/daytona/services/runner/images/sandbox/daytona/ (the sandbox agents run in)

All references updated: the Railway CI workflow, the build-and-push script, the OSS/EE dev Compose build contexts, and the README cross-references. hosting/README.md is added to map the deployment surfaces (Compose variants per edition/mode, Helm, Railway) and the two-image model. The canonical AGENTA_RUNNER_* variables are documented in the OSS and EE env examples.

3. Sandbox size + snapshot name fixes

  • The Daytona snapshot recipe's Resources(cpu=2, memory=4, disk=8) is now configurable via AGENTA_SANDBOX_CPU, AGENTA_SANDBOX_MEMORY_GB, and AGENTA_SANDBOX_DISK_GB, with the disk default lowered from 8 to 5 GB (the session working directory mounts from the store, so local disk holds the image plus temp files). The "Customize the agent runtime" how-to documents the three variables and the tradeoff. This only takes effect on a snapshot rebuild.
  • The recipe builds a snapshot named agenta-sandbox-pi, but the runner code default was agenta-agent-runner. Aligned everything (recipe, how-to, runner reference, and the DEFAULT_DAYTONA_SNAPSHOT code default) to agenta-sandbox-pi, which is what the recipe actually builds and the deployed/QA snapshot.

Base

Stacked on fix/runner-env-narrowing (PR #5298) so this PR shows only its own 52-file diff. Basing on big-agents directly would include that lane's changes.

https://claude.ai/code/session_01XhENr63WL9npkKrJGnzDc1

@dosubot dosubot Bot added the size:XXL This PR changes 1000+ lines, ignoring generated files. label Jul 14, 2026
@vercel

vercel Bot commented Jul 14, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
agenta-documentation Ready Ready Preview, Comment Jul 14, 2026 12:45pm

Request Review

@dosubot dosubot Bot added the documentation Improvements or additions to documentation label Jul 14, 2026
@coderabbitai

coderabbitai Bot commented Jul 14, 2026

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on base/target branches other than the default branch.

Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 8626bf76-ddb1-49db-99d2-da14d04b7ce0

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch docs/selfhost-runner-docs

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@mmabrouk

Copy link
Copy Markdown
Member Author

🌙 Overnight — ready for review. Restructures the self-host docs + hosting layout for the agent-studio pivot: 7 new agent-execution pages and a holistic self-host sidebar (no agents/ subfolder), 16 pages moved with slug-preserving redirects, guides 07/08/09 deleted+redirected; the runner image folders reorganized (docker/images/service/, sandbox-images/daytona/images/sandbox/daytona/) with all refs updated; sandbox size trimmed to disk=5 and made env-configurable; snapshot name canonicalized to agenta-sandbox-pi (the code default was wrong). pnpm build passes. Stacked on #5298 so this diff is docs-only — retarget to big-agents once #5298 lands. What I need: a docs read-through (structure + sidebar). One open item: the runner-and-store upgrade page uses an estimated version 0.105.0 — confirm the real release number.

@mmabrouk mmabrouk added the needs-review Agent updated; awaiting Mahmoud's review label Jul 14, 2026
@mmabrouk

Copy link
Copy Markdown
Member Author

Pushed 5858c34 completing and reorganizing the runner configuration surface.

Missing variables added (the runner reads all of these; none were in the env examples)

  • Run limits, absent from both the env examples and the reference page: AGENTA_RUNNER_RUN_TOTAL_TIMEOUT_MS (45 min), AGENTA_RUNNER_RUN_IDLE_TIMEOUT_MS (5 min), AGENTA_RUNNER_RUN_TTFB_TIMEOUT_MS (2 min), AGENTA_RUNNER_TOOL_CALL_TIMEOUT_MS (5 min). These are the cost and wedge knobs, so they now get their own section explaining the idle-below-total clamp and the approval-pause exemption.
  • Local session pool, absent from the env examples: AGENTA_RUNNER_SESSION_POOL_MAX (8), AGENTA_RUNNER_SESSION_TTL_MS (60000), AGENTA_RUNNER_SESSION_APPROVAL_TTL_MS (300000), AGENTA_RUNNER_SESSION_KEEPALIVE (on; off disables). The reference page had listed these as internal "do not set"; they are operator knobs and are now documented as such.
  • Documented the previously blank defaults for AGENTA_RUNNER_DAYTONA_SESSION_IDLE_TTL_MS (120000) and AGENTA_RUNNER_DAYTONA_SESSION_MAX_WARM (20), plus the hard constraint that the idle TTL must stay below AGENTA_RUNNER_DAYTONA_AUTOSTOP_MINUTES, or Daytona stops a sandbox the runner still believes is warm.

Consolidation. Runner config was spread across four sections of every env example (Core endpoints, Agenta - Agent, Sandbox (agent runner), daytona). It is now one Agenta - Agent runner section, sub-grouped Service / Routing and auth / Sandbox providers / Daytona / Warm sessions and scale / Run limits. The reference page uses the same six groups in the same order, so the two mirror each other.

The DAYTONA_* footgun. The generic block keeps its own section, re-captioned Sandbox - Daytona (CODE EVALUATOR, not the agent runner). Both the env examples and the docs now spell out the asymmetry: the api key, url, and target may be shared (same Daytona account), but the snapshot may not. The evaluator's snapshot (e.g. daytona-small) has no harness installed, so copying DAYTONA_SNAPSHOT into AGENTA_RUNNER_DAYTONA_SNAPSHOT boots agents into an image that cannot run them.

Resolved questions

  • AGENTA_RUNNER_TIMEOUT_SECONDS is real but caller-side: the SDK reads it (sdks/python/agenta/sdk/agents/utils/ts_runner.py, adapters/sandbox_agent.py), never the runner. Kept, and labeled caller-side wherever it appears, with a note that it must sit above the runner's own idle timeout.
  • AGENTA_API_KEY dropped from the runner surface: with the static fallback gone (fix(runner): narrow the runner environment and drop subscription auto-upload #5298), nothing in the runner reads it. Note the compose files still pass AGENTA_API_KEY: ${AGENTA_API_KEY:-} to the runner service; that is now dead plumbing and worth a follow-up.
  • AGENTA_AGENT_SANDBOX_PI_VERSION dropped everywhere: it is dead: the version is the hardcoded PINNED_PI_VERSION constant in daytona.ts. AGENTA_AGENT_SANDBOX_PI_DIR is still read, but it describes the sandbox image's internal layout rather than the deployment, so it moved out of the env examples into the reference page's Internal settings list.

Snapshot rename to agenta-agent-sandbox-v1, consistently in all three places: SNAPSHOT_NAME in build_snapshot.py, DEFAULT_DAYTONA_SNAPSHOT in runner-config.ts, and every docs mention. Also swept the stale agenta-agent-runner comment in hosting/kubernetes/helm/values.yaml and the agenta-sandbox-pi mentions in hosting/README.md and the sandbox image README.

Verification. Every AGENTA_RUNNER_* the code reads now appears in the reference page (diffed against grep -rhoE "AGENTA_RUNNER_[A-Z_]+" services/runner/src), and nothing is documented that the code does not read except the two caller-side vars, which are marked as such. pnpm test in services/runner: the snapshot-default assertion passes (sandbox-agent-provider + runner-config, 30/30). pnpm build in docs succeeds. No em dashes in the prose.

Heads-up unrelated to this PR: three failures in sandbox-agent-qa-transcript-replay.test.ts come from four QA transcript fixtures under docs/design/agent-workflows/projects/qa/runs/ that are dirty in the shared working tree with passed flipped true -> false. HEAD has true. Not touched here.

@@ -1,5 +1,6 @@
---
title: Configure SSO Authentication
slug: /self-host/guides/configure-sso

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Any reason we are adding slugs here?

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Answered rather than removed: the file moved (guides/05-configure-sso.mdxaccess-control/01-configure-sso.mdx), and the slug pins the public URL /self-host/guides/configure-sso so existing links, bookmarks, and search results keep resolving. Same reason on the other two moved pages. No slug was added to a page that did not move.

I added the rule to write-docs §0 so this is not guesswork next time: a slug exists to preserve a URL, never because other pages have one.


```bash
SUPERTOKENS_EMAIL_DISABLED=true
AGENTA_ACCESS_EMAIL_DISABLED=true

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What is this a fix?

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It is a fix. The page documented SUPERTOKENS_EMAIL_DISABLED, which is the legacy name. api/oss/src/utils/env.py:174 reads AGENTA_ACCESS_EMAIL_DISABLED first and only falls back to SUPERTOKENS_EMAIL_DISABLED, and all four env examples ship the AGENTA_ACCESS_* name. So the docs were pointing readers at the deprecated variable. Kept the change.

@mmabrouk mmabrouk left a comment

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't agree with the organization of the files, at least when I look at them in the UI. I think we need to clarify what is a tutorial, what is a how-to, and what is a concept. Right now, everything is in the same organization. Let's chat about this before making any changes.

@@ -1,5 +1,6 @@
---
title: Restrict Sign-ups and Organization Creation
slug: /self-host/guides/restrict-organization-creation

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ditto slugs

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Same as on the SSO page: this file moved from guides/06-restrict-organization-creation.mdx, and the slug keeps /self-host/guides/restrict-organization-creation working. Not gratuitous.

@@ -1,5 +1,6 @@
---
title: Dynamic Access Controls
slug: /self-host/dynamic-access-controls

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ditto slugs

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Same: this file moved from self-host/04-dynamic-access-controls.mdx, and the slug keeps /self-host/dynamic-access-controls working.

This page answers the first question a self-hosting team asks: is it safe to let users run agents
on my deployment? The short answer is that it depends on which sandbox provider you enable.

## Local runs are not an isolation boundary

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is not clear at all. Please don't use weird sentences as titles.

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Instead, just have call it local runs

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixed. Headings are plain labels now: Daytona, Local runs, and under each: The boundary, What crosses into a Daytona sandbox / What crosses into a local run, What ... runs share with each other, When to use it. No claims or clauses as headings, here or on the other pages.

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Renamed. The section is Local runs.

---

This page answers the first question a self-hosting team asks: is it safe to let users run agents
on my deployment? The short answer is that it depends on which sandbox provider you enable.

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is feedback for the whole page. I think it's easier to do it this way:

  1. There is no need to add descriptions that are meaningless. For example, in this first sentence, it's good to start with the context, but why are you saying it's the first question? That's an assumption you're making. This phase answers the question of whether it's safe to let users run agents on my deployment. The short answer is: it depends on which sandbox provider you enable. For local, it is not safe. Use this only blah blah blah. For Daytona, it is safe, and see the details below. Start with Daytona and explain how it works, and make sure to add a clear warning. With these warning elements that we have in docuservice, you should not use local elsewhere in the documentation. You should only use local brands for your local machines or within your teams. When it's safe, the agent has access to environment variables that are in the book. Will composite really make sure it is not for production? It is just for internal workflows, and here are the things: if you want isolation, use Daytona.
  2. Another warning.
    That's basically it, and then explain things in simple ways.

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The second thing is to start with context. Give the context that you can configure Agenta to work with this, and we're gonna add multiple runners for local deployment. Use this. It's simpler. It works for kind of your internal use cases for something external use sandboxes.

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Rewrote the page on this structure:

  1. Context first. Opens with: Agenta runs agent code in a sandbox; a deployment picks the provider (Daytona cloud sandbox, or local inside the runner container); the choice decides whether it is safe to let other people run agents. Then one sentence saying Daytona isolates every run and local runs do not, with the links to the config page and the Daytona how-to. No "first question teams ask" assumption.
  2. Daytona first, then local runs, with mirrored subsections: The boundaryWhat crosses into ...What ... runs share with each otherWhen to use it.
  3. A real :::warning on the local side ("Local runs are not isolated from each other"), stating the multi-user consequence in concrete terms.
  4. Configuration is one sentence plus a link in the intro, not a section.

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Done. The page now opens with the context (you configure which sandbox provider the deployment runs; local is simpler and runs in the runner container, Daytona isolates each run in the cloud), and points at the runner configuration page for the how.


## Local runs are not an isolation boundary

A local run executes the harness inside the runner container. It shares that container's

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The things to clarify here are:

  1. The local run is executed in a runner container that does not have access to anything in your local system unless you mount it explicitly. It does not have any access to any environment variable or any executable outside of that Docker container, where we see the limitations of that.
  2. However, all agents that are running are running in the same container together with a runner, which means it has access to the files of the other agents. If you mount the Claude thing, it has access to that, and it has access to the environment variables in the runner, which are this and this.
    Overall, it's not safe. It will not make it break your system, right? If you have something outside of the container, it cannot touch it. That's very important to say. However, between agents, they might touch things and obviously use the permissions in the agent to make sure that they can use whatever they are supposed to use.

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Rewrote it with exactly those two facts, split into two subsections:

The boundary — the container is a boundary against the host. Agent code cannot read files, environment variables, or executables outside the runner container unless you mounted them in. Mounting a host directory puts it inside the boundary.

What local runs share with each other — every local run executes in the same container, so an agent can read another agent's working directory, the container's environment (naming AGENTA_RUNNER_DAYTONA_API_KEY and AGENTA_RUNNER_TOKEN), and any mounted credential. That is in a :::warning, phrased as the multi-user consequence.

When to use it closes with tool permissions as the way to constrain what an agent may do inside the container.

filesystem and environment. Agent code in a Daytona run cannot read the runner's process
environment, its files, or its Daytona provisioning credential.

Use Daytona when a deployment is multi-user or exposed.

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Same multi-user, don't match in exposed for the moment.

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Dropped "exposed" everywhere. The condition is stated as: "when more than one person can start runs on the deployment, or when the deployment is reachable by people you do not fully trust". Added the rule to write-docs §0 (use the precise word, not the dramatic one).


Use Daytona when a deployment is multi-user or exposed.

## The enabled-provider list is the posture switch

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This should be a link on how to run a configuration. It should be mentioned above and mentioned as a context. You can decide which thing: here's how you can do it. Kind of one sentence, it's not a section.

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Done. The "enabled-provider list is the posture switch" section is gone. The intro now has one sentence: enable providers with AGENTA_RUNNER_ENABLED_SANDBOX_PROVIDERS, with links to the runner reference for the syntax and to the Daytona how-to for the setup.

Sandbox provider 'local' is not enabled on this deployment (enabled: daytona).
```

## What crosses into a Daytona sandbox

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The organization of this document is so bad. Please rethink it and look at the other documents to organize them.

  1. If you are mentioning what crosses into Daytona Sandbox, make sure that it's nested under Daytona.
  2. If you have a section about this information, which seems to be interesting, then make sure to have a parallel section for the parallel thing, which is local. And please review all other edits using this rule and add it to your memory. Read the skill about how to write docs and update it if it does not mention this. If it mentions this and you did not read it, then read it again and update based on it.

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Reorganized:

  • "What crosses into a Daytona sandbox" is now a subsection under Daytona, and it has its parallel on the local side ("What crosses into a local run"). Both are the same table shape.
  • Every subsection under Daytona has a counterpart under local runs, in the same order, and Daytona leads.
  • Applied the same rule across the other pages in the PR (Customize the agent runtime is now Daytona → Local runs with identical subsections; the Daytona how-to now has its parallel Run agents locally page, which did not exist).
  • The rule is in write-docs §0 ("Parallel things get parallel structure"), and I added the further rules I took from your other comments: concrete examples, precise vocabulary, a pointer is a sentence not a section, slugs preserve URLs.


## 3. Build a snapshot (recommended)

Daytona runs start faster from a prepared snapshot that already contains the harness runtimes.

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Explain what the snapshot is. Have a link to a reference or whatever that says what stuff is within the snapshot. What does this build snapshot do? Mention that you can add other dependencies to the snapshot if you want your agent to have access to these when you use Daytona. Provide some context always.

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Rewrote step 3. It now says what a snapshot is (a prebuilt sandbox image stored in your Daytona account; every sandbox the runner creates starts from one, so whatever it contains is what your agents can run), links the Daytona snapshot docs, and says plainly what the recipe does: it starts from the sandbox base image, which already has Claude Code, Codex, and OpenCode, adds Pi at the version the runner expects plus the FUSE tooling for durable working directories, names the snapshot agenta-agent-sandbox-v1, and sizes each sandbox at 2 vCPU / 4 GB / 5 GB.

It closes by saying you can add your own tools or change the resources, with a link to Customize the agent runtime.

does not build the custom-code evaluator sandbox. To add your own binaries or dependencies to
agent runs, see [Customize the agent runtime](/self-host/agent-execution/customize-the-agent-runtime).

:::warning[Do not reuse the code evaluator's snapshot]

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why are you giving this warning? It is a different environment variable. It is a howto. No need to confuse the user.

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Removed. The code-evaluator warning is gone from the how-to. The fact that the two DAYTONA_* sets are different sandboxes, and that the snapshot is not shareable, is stated once in the reference page and once in the env examples, where it belongs.

session and logs the repair, so runs still work. Building the snapshot avoids that per-sandbox
install cost.

The recipe here builds the runner's sandbox. It does not build the runner service image and it

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why are you saying this? This is very confusing. Don't mention this. Mention the things that are needed. How would even the user think about custom code evaluator sandboxes? It is not their problem. If you want to have some information, have it in the reference, but this is not in a how-to.

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Removed entirely. Nothing about the code evaluator appears in this how-to any more.

`AGENTA_RUNNER_DAYTONA_SNAPSHOT` and `AGENTA_RUNNER_DAYTONA_IMAGE` are mutually exclusive. Set a
snapshot or an image, not both. If you set neither, the runner uses its pinned default artifact.

If a snapshot or image is missing the pinned Pi runtime, the runner installs it before the

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why are we saying, "If it's missing pinit, Pi runtime, whatever"? Just say what the snapshot does: it installs Pi, it installs Claude. You can use it to add other things. Here is how it works: run it as it is. If you want to modify, do this, for example, but no need to provide unclear. Why do I need to know this? It's why I'm gonna install this, create this sandbox with this ticket script that you gave me, so why are you telling me the image will be missing Pi? It won't be missing Pi because I just followed what you said. It's like you're writing the documentation for a developer within the team. You're writing the documentation for an external user that is only reading your documentation and doesn't know anything else. Don't confuse them with other information, and please read the rest of the documentation and add this information. Again, update your memory. If you don't have this, update the skill for writing documentation, and review the whole documentation based on this.

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Removed both the "if the image is missing Pi" warning and the matching troubleshooting entry. The step now just says what the recipe does and how to run it. A reader who followed it does not have a snapshot missing Pi.


## 4. Make the store reachable

Daytona sandboxes run in the cloud and mount durable working directories over the public

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is quite confusing. Here again, you provide the context, and you say, "Depending on the situation, if you are using S3 mounts, if you are using local development, if you are using whatever you need to do this." When you say, "enable the wistunnel profile," how do I do this? Provide me with real steps I can run.
Provide:

  1. Context. This is the problematic situation so that I know whether it is something relevant to me.
  2. Instructions on how to solve this.
  3. Maybe references if I need help to get more information.
    Again, this is a general rule about how to do these things. Always, this thing: what's the context? Think about the reader. The reader needs to understand the context to see if this is relevant to the need to care, and then they need to have clarification whether it's relevant to them. They need to make the decision whether I should do something. Is it actionable for me? They need clear instruction on how to do it, and finally they need some references if it's complicated so that they understand more about the concept or the references or whatever.
    Again, add this to your memory. Update the docs. Obviously, these guidelines make sense when it's complicated. No need to overdo it, and also update the writing docs skills to include this guideline.

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Rewrote step 4 on the four beats:

  1. Context. Agents keep files across turns in a working directory in the durable store. A Daytona sandbox mounts it from the cloud, so it reaches the store over the public internet. If the endpoint is not publicly reachable, working directories become ephemeral and the runner logs a mount-degradation warning.
  2. Is this me. It applies when AGENTA_STORE_ENDPOINT_URL points at a host the internet cannot resolve: a Compose service name like http://seaweedfs:8333 (the default for the bundled store), localhost, or a private IP. Railway and Kubernetes with public ingress: skip the step.
  3. Instructions. Two runnable options: point AGENTA_STORE_ENDPOINT_URL at a public S3 endpoint, or tunnel the bundled store (get an ngrok authtoken, put NGROK_AUTHTOKEN in the env file, start with run.sh which enables the with-tunnel profile by default, or pass --profile with-tunnel to Compose directly), plus the command to verify the tunnel is up.
  4. References. Links to the store reference.

A first run creates a sandbox in your Daytona account. Later turns reuse a warm sandbox until it
stops or is deleted. See [warm sessions and lifecycle](/self-host/agent-execution/runner-configuration).

## Personal subscriptions are not supported on Daytona

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is another section. this is :::info

Here, we don't do value judgment. We just explain that personal subscriptions are done with mounts and local. However, obviously, this is not feasible in Daytona, so we are not uploading the subscription to Daytona. If you want to use your credential, then you need to use it on your local machine. It's for personal use, something of this.

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Now a :::info at the end of the smoke test, with no value judgment: a personal Pi, Claude, or ChatGPT login authenticates a harness through a directory mounted into the runner container; Agenta does not upload it to a Daytona sandbox, so Daytona runs use a model API key; link to Use your own subscription.

sandbox. Use a managed model key for Daytona runs. See
[Use your own subscription](/self-host/use-your-own-subscription).

## Troubleshooting

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

For troubleshooting, please find a pattern. Maybe in other places of documentation we do it, so if we're using collapsible, then use collapsible. Don't reinvent a pattern for each thing.

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Adopted the pattern already used in the docs (for example administration/access-control/02-sso.mdx): ## Troubleshooting, then an ### heading per symptom, then **Cause:** and **Solution:**. Applied the same shape on this page, on the runner reference, and on the new Run agents locally page, so the three read the same.

sidebar_position: 4
---

Agents sometimes need tools that are not in the default runtime: a browser like Chromium, the

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is good. You started with context.

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Kept the opening, and extended it to cover the other two things this page now answers (extra folders, and more CPU/memory/disk).

Agents sometimes need tools that are not in the default runtime: a browser like Chromium, the
`gh` CLI, a custom certificate, or an extra system package.

Where you add them depends on where the agent code runs. This is the part teams get wrong.

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Don't assume something about the reader. This is the part that teams get wrong. This is an assumption. Who the hell are you to assume that the team is getting something wrong? Just be clear: think about the reader.
If the reader is reading this, why do they care that teams get it wrong? What they care about is the context. I need this. This is good, and then they need to understand what it's done. This page explains how to add these tools, and then the thing you need to care about depends on whether you're local or in Daytona. The way we do it will be different.
You provide these two things:

  • They will jump to local directly.
  • They jump to Daytona.
    You also provide context that this is configurable, so you can see: jump to the other page if you miss the information that you need to configure local in Daytona. You have two, in general, very parallel ways of doing it with the same organization, like Daytona, and then subitems, subsections, and local subsections. You try to keep these always in parallel so it's kind of the same information here and there, and you start with Daytona.

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Deleted "This is the part teams get wrong". The intro now states the fact and lets the reader pick their path: Daytona runs execute in a cloud sandbox, so you customize the snapshot; local runs execute in the runner container, so you customize the runner image. It adds the pointer for someone who does not know which one they run ("check AGENTA_RUNNER_ENABLED_SANDBOX_PROVIDERS in the runner reference"), and the page is then two mirrored sections, Daytona first: Add tools and dependencies, Add folders, Sandbox resources / Container resources.


Read [How agents run](/self-host/agent-execution/how-agents-run) if that distinction is new.

## Add dependencies for Daytona runs

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As mentioned above, it's a section for Daytona, and then subsections. Now, context here is how you add the dependencies to Daytona. Maybe provide an example. When you say, "Okay, the dependency," for example, I don't know, you want to add gh or whatever, or Chromium or whatever. You just kind of provide it something that makes sense, and you save this snapshot and name it. Probably don't name it the same name that we use per default Agenta agents and bucks, so that it's clear, and then you point to it, right?

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Done. The Daytona path is now: copy the recipe, give the snapshot its own name (SNAPSHOT_NAME = "my-agent-sandbox-v1", explicitly so it does not collide with the Agenta default), add your dependencies with a worked example (RUN apt-get install -y gh chromium), build it, then point AGENTA_RUNNER_DAYTONA_SNAPSHOT at your snapshot and recreate the runner.

AGENTA_RUNNER_DAYTONA_SNAPSHOT=agenta-agent-sandbox-v1
```

## Sandbox size

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Do we allow editing these environment variables from the outside? If so, why are they not called Agenta Runner Daytona Sandbox CPU? Why are they general? Please update that to have the default at least to the one, obviously these, and then, in explaining these, provide the context. Say we have some defaults. You might need something else. Here's how you can update them.

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

You found a real bug. They are read from the environment by build_snapshot.py, so they are operator-facing, and they were named outside the runner namespace. Renamed:

  • AGENTA_SANDBOX_CPUAGENTA_RUNNER_DAYTONA_SANDBOX_CPU
  • AGENTA_SANDBOX_MEMORY_GBAGENTA_RUNNER_DAYTONA_SANDBOX_MEMORY_GB
  • AGENTA_SANDBOX_DISK_GBAGENTA_RUNNER_DAYTONA_SANDBOX_DISK_GB

in services/runner/images/sandbox/daytona/build_snapshot.py and everywhere they are documented. Grepped the repo: nothing else read the old names.

The section now gives the context (each sandbox gets the CPU, memory, and disk baked into the snapshot), the defaults (2 / 4 / 5), and how to change them.

DAYTONA_API_KEY=<daytona-api-key> DAYTONA_TARGET=eu uv run build_snapshot.py --force
```

A new value takes effect only when you rebuild the snapshot, so it never touches sandboxes that

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is stupid! Again, think about the user: what do I need to know here? Is it that if I updated the sandbox, then I need to update the environment variable in the runner so that I allow this? You explain it this way: first, update the sandbox and rebuild it. After you rebuild it, you need to update the environment variable for the runner so that they fit. You stop there. You don't give "keep CPU and memory generous." That's your advice. That is obvious. It's not the problem, and it's not your problem. Don't mention sandboxes are running or whatever if you want to have some warning or some info. use :::warning

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Rewritten to exactly that: set the values, rebuild the snapshot, then point the runner at the rebuilt snapshot and recreate it so the two match. Full stop. The "keep CPU and memory generous" advice is gone, and the fact that running sandboxes keep the old values is a :::warning.

`5` GB leaves a few GB of working headroom on top of the built image. Keep the CPU and memory
generous, since agents spike during builds and an out-of-memory kill mid-run is a poor experience.

## Add dependencies for local runs

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Use the same structure and organizations for these sections and subsections. If you have a local run, you do it like you try to parallelize the same thing as Daytona, and then you have using Docker compose and using Helm, for example, or you do an m4 using Helm, right?

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Done. Local runs now mirrors Daytona subsection for subsection: Add tools and dependencies, Add folders, Container resources. Each step names the Compose path and the Helm path, so the two deployment surfaces are covered in the same place rather than in separate sections.


For Helm, set the runner image in your values file under `agentRunner`.

## Add project folders for local runs

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Clearly, subtraction here. Clearly, something that is not for Daytona. Maybe you add an info that it's just for this, for local, not for Daytona. Probably you can also change the information or the data about CPU memory here so that it becomes parallel to Daytona by changing the local compose, and you just can say that you can limit the memory.

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Both parts done. The mount section is local-only and now says so in a :::warning (every local run sees every folder you mount, and a :rw mount is writable by any of them), and I made resources parallel: Daytona gets Sandbox resources (snapshot build variables) and local gets Container resources (CPU and memory limits on the runner service in a Compose override, plus the Helm equivalent).


## Add project folders for local runs

To make extra folders available inside local agent runs, mount them into the runner container

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Provide an example, for example, giving access to a GitHub repository work tree or some global context in the machine. Mention read and write.

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Added. The example is a repository checkout on the host mounted into the runner (/srv/repos/my-service:/agenta/workspaces/my-service:rw), with :rw explained (agents commit to the worktree) against :ro (read only). The parallel on the Daytona side says a cloud sandbox cannot mount a host directory, so files are copied into the snapshot instead.

sidebar_position: 5
---

Every operator-facing runner variable, its default, and where it is set. The runner parses all of

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please start with context: what is this? If I read this, what is this? Description is not shown here, so on this page we describe the configuration for blah blah blah, for example.

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Done. The page opens with what it is: the reference for the agent runner, the service that executes agent code either inside its own container (local) or in a Daytona cloud sandbox, listing every operator-facing variable, its default, its Helm path, and the errors an invalid value produces.

Comment thread docs/docs/self-host/00-overview.mdx Outdated
sidebar_position: 0
---

Agenta is an agent studio. When you self-host, you run the studio and the services that let you

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

No need to say this. If somebody is reading this, the first thing they know is what Agenta is. If it's an overview, the thing I need to care about as a user is: how do I navigate this? Where should I start?
I don't think I care if there is very important information. You can put it in the overview, but other than that, I just want to understand it. It's like:

  • Agenta can be self-hosted as Docker Compose.
  • It can be self-hosted as Kubernetes.
  • You can self-host it so that you use it locally with a local thing, and that allows you to do subscription.
  • You can use it in Daytona so that the agent runs in Daytona, and then you provide information.
  • Here's where you start, blah blah blah.
  • There is an enterprise version.
  • Here is the difference.
  • You link, obviously.
    We write this whole thing. We have regular people, but it should be some sort of very high-level index, not the same as a sidebar with some meta information that allows me to get the general information and the thing I care about. What do I care about?
    You can self-host Agenta. It has all the features that are in the cloud, minus the governance feature, and here's the link. I know I can surface it when it's self-hosted to Docker Compose. It requires X memory, X CPU, whatever, if you want to know where to start. Here's the quick start to self-host it. If you want to use your Claude Code subscription, blah blah blah, here's how you do it. If you want to use Daytona, here's how you do it.
    Kind of the high level is usually where the general user will go: "Okay, I want to say, first, locally, I want to use my Claude Code subscription, etc." Then you go to a little bit more stuff, but then that's it, right? You keep it short, and you allow the user to reach the other point. You don't tell them, "It's a studio and core, and this page applies to blah blah blah."

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Rewritten as an index. It is now: one line on what a self-hosted deployment is and that it has every cloud feature except governance; Start here (quick start, remote server, Kubernetes, Railway with the community-maintained caveat); Where agents run (Daytona for multi-user, local runs otherwise, and that local is the only way to use your own Claude/Pi/ChatGPT subscription); Editions (OSS/EE and what EE adds); Operate a deployment (configuration, runner configuration, architecture, networking, upgrading). No product introduction, no "this page applies to" meta.

# The provider a run gets when it does not choose. Must be one of the enabled ids.
AGENTA_RUNNER_DEFAULT_SANDBOX_PROVIDER=local

# --- Daytona (the AGENT RUNNER's own sandbox; NOT the code evaluator) ---

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why are you saying not the code evaluator?

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Because there are two Daytona configurations in the file and copying one into the other breaks agent runs. But you are right that it was said three times. It is now said once, briefly, in the Sandbox - Daytona (code evaluator) section where the bare names live: "the code evaluator's sandbox, not the agent runner (which has its own AGENTA_RUNNER_DAYTONA_* set above). It may use the same Daytona account, but not the same snapshot: this image has no agent harness installed." The runner section no longer mentions the evaluator at all.

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

These examples and file are extremely verbose. It's good to have some information there, maybe sometimes about default, sometimes about what this does, but don't be verbose and write this for a developer or another agent. It's written for a human, so if it's not obvious, tell me, but if it's obvious, I don't know. A gentle on a concurrency limit is obviously the maximum concurrency runs. You can do it so that everything has a comment, but this is too verbose. The other environment variable, like your comments, are extremely verbose. Please limit them.

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cut. The runner block in all four env examples is now roughly half the lines, and comments only carry what a human cannot infer from the name: defaults, units, secrets, and hard constraints. AGENTA_RUNNER_CONCURRENCY_LIMIT, AGENTA_RUNNER_PORT, AGENTA_RUNNER_LOG_LEVEL, and their kind have no comment at all. What survives is, for example, "Milliseconds. Must stay below AGENTA_RUNNER_DAYTONA_AUTOSTOP_MINUTES, or Daytona stops a sandbox the runner still holds", the SECRET. markers, and "45 min." on the timeouts. The long explanations live on the runner reference page, which the section header links to.

@mmabrouk
mmabrouk force-pushed the docs/selfhost-runner-docs branch from 5858c34 to 07324f4 Compare July 14, 2026 11:27
@mmabrouk

Copy link
Copy Markdown
Member Author

Review pass: rewritten for the reader

Commit 07324f4468. Every one of the 31 inline comments has a threaded reply saying what changed. Summary by theme:

Structure and context. Every page now opens with what it is and who it is for. Sandbox isolation and security was rewritten on your outline: context (a deployment picks the sandbox provider) → Daytonalocal runs, with mirrored subsections (The boundary, What crosses into ..., What ... runs share with each other, When to use it) and a real :::warning on the local side. Customize the agent runtime is the same shape, Daytona first. Runner and sandbox configuration and Overview open with what they are; the overview is now an index (start here / where agents run / editions / operate), not an essay.

Assumptions and opinions, deleted. "The first question a self-hosting team asks", "this is the part teams get wrong", "keep CPU and memory generous", "a poor experience" are gone. Constraints that are real are stated as constraints (the idle TTL must stay below autostop).

Not the reader's problem, deleted. The code evaluator is gone from the Daytona how-to entirely, and so is the "if the image is missing Pi" warning. The DAYTONA_* vs AGENTA_RUNNER_DAYTONA_* distinction is stated once, in reference and in the env examples.

Four beats where it was missing. The store/tunnel section now gives the situation, how to tell if it applies to you, two runnable fixes (public store endpoint, or NGROK_AUTHTOKEN + the with-tunnel profile via run.sh), and a verification command. Instructions carry concrete examples (adding gh and Chromium; mounting a repo checkout :rw vs :ro).

Patterns reused, not invented. Troubleshooting follows the existing docs pattern (### symptom + **Cause:** / **Solution:**, as in the SSO admin page) on all three pages that have one. Admonitions are :::info / :::warning.

A real bug you caught. The sandbox resource variables were outside the runner namespace. Renamed to AGENTA_RUNNER_DAYTONA_SANDBOX_CPU / _MEMORY_GB / _DISK_GB in build_snapshot.py and in the docs. Nothing else read the old names.

Env examples. The runner block in all four is roughly half the lines. Comments carry defaults, units, secrets, and hard constraints only.

New page. Run agents locally did not exist, so the Daytona how-to had no parallel. It does now, and Use your own subscription states up front that subscriptions work only on local runs.

Slugs. They exist because those three files moved (guides/access-control/); the slug preserves the public URL. Kept, and the rule is now in the write-docs skill.

pnpm build in docs/ passes.

@mmabrouk

Copy link
Copy Markdown
Member Author

Field findings from a real self-host deployment

Folded in the notes from an actual server deployment, after verifying each one against the current compose, chart, and code. Commit 3d1991c320. Six pages touched, pnpm build green.

Documented (verified):

Finding Where
Postgres is published on 0.0.0.0:5432 with fallback creds username/password; AGENTA_AUTH_KEY/AGENTA_CRYPT_KEY ship as replace-me Deploy remotely, new "Step 3: Secure the Deployment" with a :::warning (the creds only apply on first volume init)
Docker daemon access, not file access, is the real prerequisite; docker group is root-equivalent Quick start, prerequisites
The runner runs as uid 1000, so a 0600 login owned by a different host uid is unreadable in the mount (Permission denied) Use your own subscription, new step 2 (id -u, then a copy chowned to 1000)
A self-managed run inherits provider keys from the runner env, so ANTHROPIC_API_KEY on the runner overrides the login Use your own subscription, :::warning
Unset AGENTA_RUNNER_INTERNAL_URL makes the SDK fall back to spawning a CLI the services image does not ship Runner configuration, troubleshooting (with the real path, /app/runner/src/cli.ts)
A host without /dev/fuse cannot even start the runner container (Docker refuses the device) Run agents locally, troubleshooting (the existing entry only covered mount degradation)
The store is optional: with no AGENTA_STORE_*, mounts are disabled and every run gets an ephemeral cwd How agents run
Behind a TLS-terminating proxy, gunicorn trusts forwarded headers only from 127.0.0.1,::1, so redirects come back as http:// Deploy remotely, troubleshooting (FORWARDED_ALLOW_IPS + Traefik forwardedHeaders.insecure)
The web container reads AGENTA_WEB_URL/AGENTA_API_URL at start and writes them into the page, so a URL change needs a recreate, not a rebuild Deploy remotely, step 2

Dropped as stale:

  • The Traefik dashboard is not exposed. TRAEFIK_UI_PORT publishes 8080, but the Traefik command sets --api.dashboard=true without --api.insecure=true, so nothing listens on 8080 inside the container (verified: connection refused). No hardening advice needed, and telling readers otherwise would document a threat that does not exist.
  • The /api strip trap is fixed upstream. ApiPrefixStripMiddleware accepts both shapes, so only the forwarded-header half of the proxy problem remains. That is what got documented.

Not documented (deliberate): run.sh --gh --local --build, env-file path resolution, and COMPOSE_PROJECT_NAME overrides. Those are contributor workflow, not self-hosting, and hosting/README.md already covers them.

Worth a code fix, not a doc

hosting/docker-compose/{oss,ee}/docker-compose.gh.yml publish Postgres as "${POSTGRES_PORT:-5432}:5432", which binds 0.0.0.0. Combined with the username/password fallback in the same file, a reader who follows the quick start on a public IP puts their database on the internet. The docs now say to set POSTGRES_PORT=127.0.0.1:5432, but the safe value belongs in the default: nothing inside the stack needs the published port (containers reach the DB as postgres:5432 over the Compose network). Not changed here, since this is a docs lane.

@mmabrouk

Copy link
Copy Markdown
Member Author

Structure pass: reorganized the self-host sidebar

Commit cc577a8 reorganizes the sidebar into the owner-approved structure: how-tos before concepts, and one configuration reference instead of two. Content is unchanged except where the merge and moved links required it. The docs build passes (onBrokenLinks: "throw"), so every slug, cross-link, and anchor resolves.

Before

Self-host
├─ Overview
├─ Get started
│  ├─ Quick start
│  └─ Use your own subscription
├─ Agent execution
│  ├─ How agents run              (explanation)
│  ├─ Sandbox isolation and security  (explanation)
│  ├─ Cloud sandbox (Daytona)
│  ├─ Local runs
│  ├─ Customize the agent runtime
│  └─ Runner and sandbox configuration  (2nd config reference)
├─ Deploy to production
├─ Access control
├─ Architecture
│  ├─ Architecture
│  └─ Networking
├─ Configuration                  (1st config reference)
├─ Upgrade and migrate
└─ FAQ

After

Self-host
├─ Overview
├─ Quick start
├─ Agents
│  ├─ Use your own subscription
│  ├─ Run agents in a cloud sandbox (Daytona)
│  ├─ Run agents locally
│  └─ Customize the agent runtime
├─ Deploy
│  ├─ Deploy on a remote server
│  ├─ Set up SSL
│  ├─ Deploy on Kubernetes
│  └─ Deploy on Railway
├─ Access control
│  ├─ Configure SSO
│  ├─ Restrict organization creation
│  └─ Dynamic access controls
├─ Concepts
│  ├─ Architecture
│  ├─ How agents run
│  └─ Sandbox isolation and security
├─ Reference
│  ├─ Configuration               (single reference, runner section merged in)
│  └─ Networking
├─ Upgrade and migrate
└─ FAQ

What changed

  • Every public URL is preserved. All pages already carried absolute slug: frontmatter, so moving files across directories (via git mv) does not change any URL. Existing redirects that target the old agent-execution/* and infrastructure/* slugs still resolve.
  • Two config references merged into one. agent-execution/06-runner-configuration.mdx was folded into reference/01-configuration.mdx as a nested ## Agent runner section (its subsections demoted to ###/####). The old page's URL now redirects to /self-host/configuration (added to both docusaurus.config.ts and docusaurus.config.dev.ts).
  • Anchors fixed. The em-dash headings on the config page (## Agenta — core, etc.) became plain headings. The page's existing code-evaluator ## daytona was renamed to ## daytona (code evaluator) with an explicit {#daytona-code-evaluator} id to avoid colliding with the merged runner ### Daytona (#daytona); in-page links updated. All external links to runner-configuration#warm-sessions-and-scale etc. were repointed to /self-host/configuration#....
  • No em dashes remain in the merged config page.
  • The two explanation pages (how-agents-run, sandbox-isolation-and-security) moved out of Agents into Concepts, alongside Architecture.

27 files, all under docs/docs/self-host/** plus the two Docusaurus configs.

https://claude.ai/code/session_01XhENr63WL9npkKrJGnzDc1

mmabrouk added 7 commits July 14, 2026 14:42
…mage folders

Rebuild the self-host docs section around agent execution as a first-class area:
new Overview, How agents run, Sandbox isolation and security, Daytona how-to,
Customize the agent runtime, and a runner-and-sandbox configuration reference. Move
the existing guides/infrastructure/upgrades pages into get-started, deploy-to-production,
access-control, architecture, and upgrade-and-migrate groups while preserving every URL
via slug frontmatter, and redirect the three deleted agent-runner guides.

Reorganize the runner image folders: services/runner/docker -> images/service and
services/runner/sandbox-images/daytona -> images/sandbox/daytona, updating the Railway
CI workflow, the build-and-push script, the dev Compose build contexts, and the README
cross-references. Add hosting/README.md mapping the deployment surfaces and the two-image
model, and document the canonical AGENTA_RUNNER_* vars in the OSS and EE env examples.

Make the Daytona snapshot resources configurable (AGENTA_SANDBOX_CPU/MEMORY_GB/DISK_GB,
disk default lowered 8 -> 5) and align the snapshot name to the one the recipe actually
builds, agenta-sandbox-pi, including the runner code default.

Claude-Session: https://claude.ai/code/session_01XhENr63WL9npkKrJGnzDc1
…ale category files

Delete guides/07-deploy-the-agent-runner, guides/08-custom-agent-runner-images, and
guides/09-agent-daytona-sandboxes (superseded by the Agent execution pages and redirected),
plus the now-empty guides/ and infrastructure/ _category_.json files.

Claude-Session: https://claude.ai/code/session_01XhENr63WL9npkKrJGnzDc1
@mmabrouk
mmabrouk force-pushed the fix/runner-env-narrowing branch from 325ef16 to 07cffc7 Compare July 14, 2026 12:43
@mmabrouk
mmabrouk force-pushed the docs/selfhost-runner-docs branch from cc577a8 to b5b06d1 Compare July 14, 2026 12:44
@mmabrouk
mmabrouk changed the base branch from fix/runner-env-narrowing to big-agents July 14, 2026 12:44
@mmabrouk
mmabrouk merged commit 85c84e5 into big-agents Jul 14, 2026
28 of 29 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentation Improvements or additions to documentation needs-review Agent updated; awaiting Mahmoud's review size:XXL This PR changes 1000+ lines, ignoring generated files.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant