Skip to content

docs: restructure custom sandbox images into landing page with sub-pages - #840

Open
jpshackelford wants to merge 5 commits into
mainfrom
docs/custom-sandbox-images-restructure
Open

jpshackelford wants to merge 5 commits into
mainfrom
docs/custom-sandbox-images-restructure

Conversation

@jpshackelford

Copy link
Copy Markdown
Member

Why

The existing single-page enterprise/custom-sandbox-image.mdx (merged in #776) had two structural problems:

  1. Broken script links. Both links to warm-runtime-configs.sh pointed to OpenHands/runtime-api, which is a private repository. Every customer following Step 2 hit a 404 on the GitHub link and a failed curl on the raw download URL.

  2. A single page doing too much. Building images, single-image (deprecated) configuration, multi-image warm pool setup, and user-facing image selection were all crammed together. The result was a page that was hard to navigate and made it unclear which path applied to which reader.

This PR replaces it with a five-page structure:

File Purpose
enterprise/custom-sandbox-images/index.mdx Landing page — warm pool concept, prerequisites, choose-your-path
enterprise/custom-sandbox-images/building-custom-images.mdx Dockerfile, versioning, what to bake in, private registries
enterprise/custom-sandbox-images/multiple-images-warm-pools.mdx Full setup guide — tabbed VM/Helm, inline scripts, config format, troubleshooting, API ref
enterprise/custom-sandbox-images/single-image-admin-console.mdx Deprecated approach — prominent warning at the top, Admin Console steps
enterprise/custom-sandbox-images/using-custom-images.mdx User-facing — per-user selection, per-conversation API, warm claim behavior

Content sources: This PR draws on both #776 (merged) and #609 (open), taking the more accurate or complete content from each based on cross-referencing the runtime-api source code, the utils/constants.py defaults, warm_runtimes.py overlay logic, and OpenHands-Cloud PRs #1181–#1183. See PR #609 comments for the full analysis.

Scripts are now inlined. Because OpenHands/runtime-api is private, the VM Install tab embeds the full script (calls https://runtime-api.<domain> directly, confirmed by .pr/ test results on #609). The Helm tab embeds the kubectl exec variant. Both are derived from #609's tested scripts.

Navigation and redirect: docs.json replaces the flat enterprise/custom-sandbox-image entry with a nav group and adds a redirect from the old URL.

Validation

  • Content accuracy verified against utils/constants.py, warm_runtimes.py, management_fastapi.py, and OpenHands-Cloud PRs #1181, #1182, #1183
  • .pr/test-results.md on docs: Multiple custom sandbox images with warm runtime pools #609 used as authoritative for runtime behaviour (KOTS password generation, overlay semantics, VM ingress exposure)
  • Navigation replacement confirmed by script: old flat entry removed, new group with five pages inserted in same position
  • Redirects confirmed: /enterprise/custom-sandbox-image → landing page; old anchor deep-link → warm pools page
  • Old custom-sandbox-image.mdx deleted via git rm

This PR was created by an AI agent (OpenHands) on behalf of @jpshackelford.

@jpshackelford can click here to continue refining the PR

- Replace single enterprise/custom-sandbox-image.mdx with a five-page
  structure under enterprise/custom-sandbox-images/
- Landing page: warm runtime concept, prerequisites, choose-your-path cards
- building-custom-images: Dockerfile, versioning, what to bake, private registries
- multiple-images-warm-pools: full step-by-step guide (VM + Helm tabbed),
  inline scripts for both install types, config format, troubleshooting, API ref
- single-image-admin-console: deprecated notice at top, Admin Console steps
- using-custom-images: per-user selection, per-conversation API, warm claim behavior
- docs.json: replace flat nav entry with group; add redirects from old URL

Co-authored-by: openhands <openhands@all-hands.dev>
@mintlify

mintlify Bot commented Sep 25, 2026 •

Copy link
Copy Markdown

Preview deployment for your docs. Learn more about Mintlify Previews.

Project Status Preview Updated
all-hands-ai 🟢 Ready View Preview Sep 25, 2026, 1:29 PM

💡 Tip: Enable Automations to automatically generate PRs for you.

Copy link
Copy Markdown
Member Author

Agent judgment calls — please review

Two decisions were made without being able to fully verify from source. Both are low-risk but worth a human eye.

1. UI cache duration in the troubleshooting table

The troubleshooting entry for "saved a config but the dropdown does not show it" says:

The app server caches the config list for 60 seconds; the UI may cache it for up to 5 minutes.

The 60-second server cache is confirmed in warm_runtimes.py. The 5-minute UI cache comes from PR #609's test-validated content but was not independently confirmed from the frontend code.

Alternative: Use the conservative "wait a minute and reload" wording from the live doc (#776), dropping the 5-minute claim. A quick check of the frontend cache settings would resolve this either way.


2. VM Install script approach

The VM Install tab in Step 2 uses an inline script that calls https://runtime-api.<your-base-domain> directly (no kubectl exec), with a credential-export block so subsequent runs need no cluster access. This is based on PR #609's Sep 16 commit and is confirmed by the .pr/test-results.md test run against replicated-test-03.

The maintained script in OpenHands/runtime-api/scripts/warm-runtime-configs.sh uses kubectl exec for all operations, including on VM installs.

Alternative: Use the kubectl exec approach for both VM and Helm tabs (consistent with the maintained script). The tradeoff is that VM admins would then need cluster shell access for every operation rather than just on first run.

The current choice (direct HTTPS for VM, kubectl exec for Helm) is operationally better for VM admins but diverges from the maintained script. If the maintained script is ever moved to a public repo, the VM tab could be updated to link there instead.


Posted by an AI agent (OpenHands) on behalf of @jpshackelford.

@jpshackelford jpshackelford 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.

Two nits from preview review.

Comment thread enterprise/custom-sandbox-images/index.mdx Outdated
Comment thread enterprise/custom-sandbox-images/index.mdx Outdated
- Rename 'How Warm Runtime Pools Work' to 'How Sandbox Pools Work' and
  introduce 'warm runtime pools' as the internal term, grounding the
  concept in user-facing language first
- Split kubectl prerequisite by install type: VM needs kubectl once to
  export credentials, Helm needs it for every operation

Co-authored-by: openhands <openhands@all-hands.dev>
Co-authored-by: openhands <openhands@all-hands.dev>
- Replace tabbed technical overview (overlay mode, ConfigMap semantics,
  env var names) with a plain three-step UX summary: set admin password,
  register images via API, users pick their environment
- Remove 'Replicated' and 'Kubernetes' from tab labels throughout
- Helm takeover behavior remains where it is actionable: Step 3

Co-authored-by: openhands <openhands@all-hands.dev>
- Step 3: fetch default template via script list command (API) instead
  of kubectl ConfigMap read — works for VM installs with no cluster access
- Step 4: replace kubectl pod inspection with script list + Settings UI
  verification; kubectl diagnostic commands moved to troubleshooting table
- Helm takeover warning stays in Step 3 where it is actionable

Co-authored-by: openhands <openhands@all-hands.dev>
jpshackelford pushed a commit to OpenHands/ohe-tools that referenced this pull request Sep 25, 2026
Docs PR OpenHands/docs#840 dropped kubectl from the sandbox-image workflow: the
default template is now fetched from the Runtime API ('list' + jq) instead of
the warm-runtimes-config ConfigMap, and verification is just 'list'.

Mirror that here by adding 'ohe images save --from <name>', which fetches an
existing configuration (typically the installer default v1_current), strips
name/source, applies --image/--count, and saves — collapsing the documented
list|jq|save template dance into one API-only command. --file/stdin stays as
the alternative for edited bodies; exactly one of --from/--file is required.
README updated to the API-only flow.

Co-authored-by: openhands <openhands@all-hands.dev>
@jpshackelford
jpshackelford marked this pull request as ready for review September 25, 2026 13:53

This branch was successfully deployed

1 active deployment
staging — 6ea8f572 Deployed Sep 25, 2026 by mintlify[bot]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants