Open-source dashboard for self-hosted E2B infrastructure. Manage and monitor sandboxes and templates with a team API key — no user accounts, no external auth provider.
Built with Next.js 16, React 19, and TypeScript. The dashboard talks to two APIs from your E2B infrastructure deployment:
- infra-api (
https://api.<your-domain>) — sandboxes, templates, builds - dashboard-api (
https://dashboard-api.<your-domain>) — template & build metadata
Authentication is a single team API key:
- Visiting
/shows a form to enter the key. It is validated against infra-api and stored in an httpOnlye2b_api_keycookie. All upstream calls happen server-side with theX-API-Keyheader — the key never reaches client JavaScript. - Alternatively, set the
E2B_API_KEYenvironment variable to pre-authenticate the whole deployment (single-user mode; the key form and sign-out are hidden).
| Variable | Read | Purpose |
|---|---|---|
PUBLIC_E2B_DOMAIN |
runtime | Required E2B cluster domain; used by the SDK and to derive https://api.<domain> and https://dashboard-api.<domain> |
PUBLIC_SANDBOX_URL |
per request | Optional sandbox traffic base URL, reachable from both the browser and server |
E2B_INFRA_API_URL / E2B_DASHBOARD_API_URL |
server start | Optional server-side API URLs; override domain-derived URLs |
DASHBOARD_COOKIE_SECURE |
server start | false only for a plain-http install; the API key cookie then travels unencrypted. Defaults to secure in production builds |
Set PUBLIC_E2B_DOMAIN when starting the container. Next does not give
PUBLIC_ any special behavior: the server explicitly reads these values at
runtime. Restart the container and reload open pages after changing its
configuration. Missing or blank domains stop startup.
Legacy variables no longer act as fallbacks. Rename them before upgrading; validation reports the replacement for each deprecated variable that is still set, even if the new name is also present.
| Deprecated variable | Replacement |
|---|---|
NEXT_PUBLIC_E2B_DOMAIN |
PUBLIC_E2B_DOMAIN |
NEXT_PUBLIC_INFRA_API_URL |
E2B_INFRA_API_URL |
NEXT_PUBLIC_DASHBOARD_API_URL |
E2B_DASHBOARD_API_URL |
NEXT_PUBLIC_E2B_SANDBOX_URL / E2B_SANDBOX_URL |
PUBLIC_SANDBOX_URL |
API URL overrides remain optional; without them the domain determines both
API URLs. An absent or blank PUBLIC_SANDBOX_URL lets the SDK use domain
routing.
Every API or sandbox URL must include http:// or https://. The schema in
src/lib/env.ts validates configuration for development, builds, and
server startup, even when telemetry is disabled. Invalid values stop startup
and name the variable. The cookie flag accepts true or false (case-insensitive, with
surrounding whitespace ignored); an empty value keeps the default.
The dashboard's Server Component layout resolves only the domain and
sandbox URL and passes them as props to a client ClientConfigProvider.
The terminal and filesystem inspector read this provider on their first
render, without a separate config request. API endpoints and team credentials
stay on the server. Both public settings are visible to browser users and
must contain no secrets.
For a local sandbox proxy, explicitly set PUBLIC_SANDBOX_URL, for example
http://127.0.0.1:3002 when the browser and server run on the same machine.
Use an address reachable from both the browser and server. When a sandbox
URL is unset, the SDK uses domain-based routing, including when
E2B_INFRA_API_URL is set.
Server-side sandbox calls, such as terminal PTY cleanup, use the same domain
and sandbox URL resolution. Host, X-Forwarded-Host, and
X-Forwarded-Proto never determine sandbox destinations.
- Sandboxes: paginated live list, per-sandbox monitoring (CPU/memory/disk), logs, filesystem inspector, and an in-browser terminal
- Templates: list, visibility management, tags, build history with streaming build logs
You need a running E2B infrastructure deployment first.
- Bun 1.2+
- A team API key from your E2B deployment (
e2b_...)
- Clone the repository
git clone https://github.com/e2b-dev/dashboard.git
cd dashboard- Install dependencies
bun install- Set up environment variables
cp .env.example .env
# set PUBLIC_E2B_DOMAIN (and optionally E2B_INFRA_API_URL /
# E2B_DASHBOARD_API_URL) to point at your infrastructure- Start the development server
bun run dev- Open http://localhost:3000 and enter your team API key.
bun run build
bun run startThe repository builds a self-contained image: Bun resolves the dependencies, Node runs the Next build, and Node serves the standalone output; the runtime stage carries no dev dependencies.
docker build -t e2b-dashboard .
docker run --rm -p 3001:3001 \
-e PUBLIC_E2B_DOMAIN=your-domain.com \
e2b-dashboardPORT(default3001) andHOSTNAME(default0.0.0.0) are read by the server at start. The default keeps the dashboard clear of port 3000, which an E2B API already uses when both share a host network.PUBLIC_E2B_DOMAINconfigures the cluster at container start, so the same image can serve different installations. UsePUBLIC_SANDBOX_URLwhen the default SDK routing does not fit your deployment.- The image builds without installation settings. Its temporary build domain
is not carried into the runtime image, so a container started without
PUBLIC_E2B_DOMAINfails validation. - The build needs outbound HTTPS for the three Google Fonts families in
src/app/fonts.ts; an air-gapped build fails there. GET /api/healthreports dashboard-api's health and answers 503 while dashboard-api is unreachable, so useGET /as the container liveness check.scripts/container-smoke.shbuilds the image and asserts those responses.
| Command | Description |
|---|---|
bun run dev |
Start the development server |
bun run build |
Production build |
bun run test:unit |
Unit tests |
bun run test:integration |
Integration tests |
bun run lint / bun run format |
Biome lint / format |
bun run generate:infra |
Regenerate infra-api contract types from spec/ |
bun run generate:dashboard-api |
Regenerate dashboard-api contract types from spec/ |
Versions are managed by release-please:
merging the open release PR updates CHANGELOG.md and package.json and tags
the release as vX.Y.Z.
That tag publishes a container image to
us-docker.pkg.dev/e2b-artifacts/dashboard/dashboard:vX.Y.Z (linux/amd64 and
linux/arm64, anonymous pulls):
docker run --rm -p 3001:3001 us-docker.pkg.dev/e2b-artifacts/dashboard/dashboard:vX.Y.ZA published image has no deployment baked in; it reaches an E2B deployment only once you give it the runtime URL variables.
Image tags are immutable — a publish never moves an existing tag. The Publish
workflow can also be run by hand (ref, tag, and a dry_run that builds
without pushing).
Apache 2.0 — see LICENSE.
