Skip to main content
This template creates a sandbox with a full Ubuntu 22.04 desktop environment, including the XFCE desktop, common applications, and VNC streaming for remote access. It’s ideal for building AI agents that need to interact with graphical user interfaces. The template includes:
  • Ubuntu 22.04 with XFCE desktop environment
  • VNC streaming via noVNC for browser-based access
  • Pre-installed applications: LibreOffice, text editors, file manager, and common utilities
  • Automation tools: xdotool and scrot for programmatic desktop control

Template Definition

The template installs the desktop environment, sets up VNC streaming via x11vnc and noVNC, and configures a startup script.
// template.ts
import { Template, waitForPort } from 'e2b'

export const template = Template()
  .fromUbuntuImage('22.04')
  // Desktop environment and system utilities
  .runCmd([
    'yes | unminimize',
    'apt-get update',
    'apt-get install -y \
      xserver-xorg \
      xorg \
      x11-xserver-utils \
      xvfb \
      x11-utils \
      xauth \
      xfce4 \
      xfce4-goodies \
      util-linux \
      sudo \
      curl \
      git \
      wget \
      python3-pip \
      xdotool \
      scrot \
      ffmpeg \
      x11vnc \
      net-tools \
      netcat \
      x11-apps \
      libreoffice \
      xpdf \
      gedit \
      xpaint \
      tint2 \
      galculator \
      pcmanfm',
    'apt-get clean',
    'rm -rf /var/lib/apt/lists/*',
  ])
  // Streaming server setup
  .runCmd([
    'git clone --branch e2b-desktop https://github.com/e2b-dev/noVNC.git /opt/noVNC',
    'ln -s /opt/noVNC/vnc.html /opt/noVNC/index.html',
    'git clone --branch v0.12.0 https://github.com/novnc/websockify /opt/noVNC/utils/websockify',
  ])
  // Set default terminal
  .runCmd(
    'ln -sf /usr/bin/xfce4-terminal.wrapper /etc/alternatives/x-terminal-emulator'
  )
  .copy('start_command.sh', '/start_command.sh')
  .runCmd('chmod +x /start_command.sh')
  .setStartCmd('/start_command.sh', waitForPort(6080))

Startup Script

The startup script initializes the virtual display using Xvfb (X Virtual Framebuffer), launches the XFCE desktop session, starts the VNC server, and exposes the desktop via noVNC on port 6080. This script runs automatically when the sandbox starts.
start_command.sh
#!/bin/bash

# Set display
export DISPLAY=${DISPLAY:-:0}

# Start Xvfb
Xvfb $DISPLAY -ac -screen 0 1024x768x24 -nolisten tcp &
sleep 2

# Start XFCE session
startxfce4 &
sleep 5

# Start VNC server
x11vnc -bg -display $DISPLAY -forever -wait 50 -shared -rfbport 5900 -nopw \
    -noxdamage -noxfixes -nowf -noscr -ping 1 -repeat -speeds lan &
sleep 2

# Start noVNC server
cd /opt/noVNC/utils && ./novnc_proxy --vnc localhost:5900 --listen 6080 --web /opt/noVNC --heartbeat 30 &
sleep 2

Building the Template

Build the template with increased CPU and memory allocation to handle the desktop environment installation. The build process may take several minutes due to the size of the packages being installed.
// build.ts
import { Template, defaultBuildLogger } from 'e2b'
import { template as desktopTemplate } from './template'

await Template.build(desktopTemplate, 'desktop', {
  cpuCount: 8,
  memoryMB: 8192,
  onBuildLogs: defaultBuildLogger(),
})