From 10f0cd8cfc2e9a9240f729ea490d8a0b2d1231e4 Mon Sep 17 00:00:00 2001 From: Tomas Beran Date: Tue, 3 Feb 2026 17:44:44 -0800 Subject: [PATCH 1/3] Improve template example documentation - Use Sandbox.create() consistently in both JS and Python - Rename 'sbx' variable to 'sandbox' for clarity - Use timeout parameter instead of explicit kill() calls - Personalize section headers per template - Add descriptive prose for each section --- docs/template/examples/claude-code.mdx | 46 ++++++++++-------------- docs/template/examples/desktop.mdx | 48 +++++++++++++++++-------- docs/template/examples/expo.mdx | 50 ++++++++++++++++++++------ docs/template/examples/nextjs-bun.mdx | 38 +++++++++++++++++--- docs/template/examples/nextjs.mdx | 38 +++++++++++++++++--- 5 files changed, 158 insertions(+), 62 deletions(-) diff --git a/docs/template/examples/claude-code.mdx b/docs/template/examples/claude-code.mdx index efb97ffc..dd242e2f 100644 --- a/docs/template/examples/claude-code.mdx +++ b/docs/template/examples/claude-code.mdx @@ -3,6 +3,11 @@ title: "Claude Code" description: "Claude Code Agent available in a sandbox" --- +Run Claude Code in a sandbox to execute AI-generated code safely. + +## Install Claude Code + +Set up Node.js with Claude Code and the tools it needs: curl for fetching, git for repos, and ripgrep for fast code search. @@ -13,7 +18,6 @@ import { Template } from 'e2b' export const template = Template() .fromNodeImage('24') .aptInstall(['curl', 'git', 'ripgrep']) - // Claude Code will be available globally as "claude" .npmInstall('@anthropic-ai/claude-code@latest', { g: true }) ``` @@ -26,13 +30,15 @@ template = ( Template() .from_node_image("24") .apt_install(["curl", "git", "ripgrep"]) - # Claude Code will be available globally as "claude" .npm_install("@anthropic-ai/claude-code@latest", g=True) ) ``` +## Build and publish + +Build the template. Claude Code itself is lightweight, so minimal resources work fine. @@ -41,7 +47,7 @@ template = ( import { Template, defaultBuildLogger } from 'e2b' import { template as claudeCodeTemplate } from './template' -Template.build(claudeCodeTemplate, 'claude-code', { +await Template.build(claudeCodeTemplate, 'claude-code', { cpuCount: 1, memoryMB: 1024, onBuildLogs: defaultBuildLogger(), @@ -62,59 +68,45 @@ Template.build(claudeCodeTemplate, 'claude-code', +## Run AI prompts + +Create a sandbox with your Anthropic API key and pipe prompts to Claude. It can write files, run commands, and build whatever you describe. + ```typescript JavaScript & TypeScript -// sandbox.ts import { Sandbox } from 'e2b' -const sbx = await Sandbox.create('claude-code', { +const sandbox = await Sandbox.create('claude-code', { + timeoutMs: 60_000, envs: { ANTHROPIC_API_KEY: '', }, }) -console.log('Sandbox created', sbx.sandboxId) - -// Print help for Claude Code -// const result = await sbx.commands.run('claude --help') -// console.log(result.stdout) - -// Run a prompt with Claude Code -const result = await sbx.commands.run( +const result = await sandbox.commands.run( `echo 'Create a hello world index.html' | claude -p --dangerously-skip-permissions`, { timeoutMs: 0 } ) - console.log(result.stdout) - -sbx.kill() ``` ```python Python -# sandbox.py from e2b import Sandbox -sbx = Sandbox( +sandbox = Sandbox.create( 'claude-code', + timeout=60, envs={ 'ANTHROPIC_API_KEY': '', }, ) -print("Sandbox created", sbx.sandbox_id) -# Print help for Claude Code -# result = sbx.commands.run('claude --help') -# print(result.stdout) - -# Run a prompt with Claude Code -result = sbx.commands.run( +result = sandbox.commands.run( "echo 'Create a hello world index.html' | claude -p --dangerously-skip-permissions", timeout=0, ) print(result.stdout) - -sbx.kill() ``` diff --git a/docs/template/examples/desktop.mdx b/docs/template/examples/desktop.mdx index 2be2e915..76a6e71e 100644 --- a/docs/template/examples/desktop.mdx +++ b/docs/template/examples/desktop.mdx @@ -3,6 +3,11 @@ title: "Desktop" description: "Sandbox with Ubuntu Desktop and VNC access" --- +Ubuntu Desktop with XFCE, accessible via noVNC on port 6080. + +## Set up the desktop environment + +Install XFCE with all the essentials: file manager, text editor, LibreOffice, and more. noVNC provides browser-based access without a native VNC client. @@ -12,7 +17,6 @@ import { Template, waitForPort } from 'e2b' export const template = Template() .fromUbuntuImage('22.04') - // Desktop environment and system utilities .runCmd([ 'yes | unminimize', 'apt-get update', @@ -48,13 +52,11 @@ export const template = Template() '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' ) @@ -71,8 +73,6 @@ from e2b import Template, wait_for_port template = ( Template() .from_image("ubuntu:22.04") - # Initial system setup and packages - # We are not using .apt_install() here because some packages have interactive prompts (keyboard layout setup, etc.) .run_cmd( [ "yes | unminimize", @@ -109,7 +109,6 @@ template = ( "rm -rf /var/lib/apt/lists/*", ] ) - # Setup NoVNC and websockify .run_cmd( [ "git clone --branch e2b-desktop https://github.com/e2b-dev/noVNC.git /opt/noVNC", @@ -117,14 +116,11 @@ template = ( "git clone --branch v0.12.0 https://github.com/novnc/websockify /opt/noVNC/utils/websockify", ] ) - # Set default terminal .run_cmd( "ln -sf /usr/bin/xfce4-terminal.wrapper /etc/alternatives/x-terminal-emulator" ) - # Copy the start command .copy("start_command.sh", "/start_command.sh") .run_cmd("chmod +x /start_command.sh") - # Set start command to launch the desktop environment .set_start_cmd("/start_command.sh", wait_for_port(6080)) ) ``` @@ -135,27 +131,25 @@ template = ( ```bash 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 ``` +## Build and publish + +Build the template. The desktop environment needs more resources than typical sandboxes. @@ -184,3 +178,29 @@ Template.build(desktopTemplate, 'desktop', ``` + +## Connect to the desktop + +Create a sandbox and open the URL in your browser. You'll see a full Ubuntu desktop running in your sandbox. + + + +```typescript JavaScript & TypeScript +import { Sandbox } from 'e2b' + +const sandbox = await Sandbox.create('desktop', { timeoutMs: 60_000 }) + +const url = sandbox.getHost(6080) +console.log('Desktop available at:', url) +``` + +```python Python +from e2b import Sandbox + +sandbox = Sandbox.create('desktop', timeout=60) + +url = sandbox.get_host(6080) +print('Desktop available at:', url) +``` + + diff --git a/docs/template/examples/expo.mdx b/docs/template/examples/expo.mdx index c60b6314..ee54811e 100644 --- a/docs/template/examples/expo.mdx +++ b/docs/template/examples/expo.mdx @@ -3,24 +3,24 @@ title: "Expo App" description: "Expo web app running in the sandbox using Node.js" --- -Basic Expo app. +Expo app with the dev server running on port 8081. - - The development server runs on port 8081 as soon as the sandbox is ready. - +## Create the Expo project + +Scaffold a fresh Expo app. The dev server starts automatically when the sandbox boots. ```typescript JavaScript & TypeScript // template.ts -import { defaultBuildLogger, waitForURL } from "e2b"; +import { Template, waitForURL } from 'e2b' export const template = Template() .fromNodeImage() - .setWorkdir("/home/user/expo-app") - .runCmd("npx create-expo-app@latest . --yes") - .runCmd("mv /home/user/expo-app/* /home/user/ && rm -rf /home/user/expo-app") - .setWorkdir("/home/user") - .setStartCmd("npx expo start", waitForURL("http://localhost:8081")); + .setWorkdir('/home/user/expo-app') + .runCmd('npx create-expo-app@latest . --yes') + .runCmd('mv /home/user/expo-app/* /home/user/ && rm -rf /home/user/expo-app') + .setWorkdir('/home/user') + .setStartCmd('npx expo start', waitForURL('http://localhost:8081')) ``` ```python Python @@ -39,13 +39,17 @@ template = ( ``` +## Build and publish + +Build the template with enough memory for the Expo bundler. + ```typescript JavaScript & TypeScript // build.ts import { Template, defaultBuildLogger } from 'e2b' import { template as expoTemplate } from './template' -Template.build(expoTemplate, 'expo-app', { +await Template.build(expoTemplate, 'expo-app', { cpuCount: 4, memoryMB: 8192, onBuildLogs: defaultBuildLogger(), @@ -64,3 +68,27 @@ Template.build(expoTemplate, 'expo-app', ) ``` + +## Access the dev server + +Create a sandbox and get the URL. Open it in your browser to see the Expo web preview on port 8081. + + +```typescript JavaScript & TypeScript +import { Sandbox } from 'e2b' + +const sandbox = await Sandbox.create('expo-app', { timeoutMs: 60_000 }) + +const url = sandbox.getHost(8081) +console.log('Expo app running at:', url) +``` + +```python Python +from e2b import Sandbox + +sandbox = Sandbox.create('expo-app', timeout=60) + +url = sandbox.get_host(8081) +print('Expo app running at:', url) +``` + diff --git a/docs/template/examples/nextjs-bun.mdx b/docs/template/examples/nextjs-bun.mdx index 36ea65a8..2b2fe810 100644 --- a/docs/template/examples/nextjs-bun.mdx +++ b/docs/template/examples/nextjs-bun.mdx @@ -3,11 +3,11 @@ title: "Next.js App (Bun)" description: "Next.js web app running in the sandbox using Bun" --- -Basic Next.js app with Tailwind and shadcn UI using Bun. +Next.js app with Tailwind and shadcn UI using Bun. The dev server starts automatically on port 3000. - - The development server runs on port 3000 as soon as the sandbox is ready. - +## Set up Next.js with Bun + +Use Bun for faster installs and hot reloads. This template includes TypeScript, Tailwind, and all shadcn components. ```typescript JavaScript & TypeScript @@ -47,13 +47,17 @@ template = ( ``` +## Build and publish + +Build the template. Bun makes the initial setup noticeably faster than npm. + ```typescript JavaScript & TypeScript // build.ts import { Template, defaultBuildLogger } from 'e2b' import { template as nextJSTemplate } from './template' -Template.build(nextJSTemplate, 'nextjs-app-bun', { +await Template.build(nextJSTemplate, 'nextjs-app-bun', { cpuCount: 4, memoryMB: 4096, onBuildLogs: defaultBuildLogger(), @@ -72,3 +76,27 @@ Template.build(nextjsTemplate, 'nextjs-app-bun', ) ``` + +## Access your app + +Create a sandbox and grab the URL. The dev server with Turbopack is already running on port 3000. + + +```typescript JavaScript & TypeScript +import { Sandbox } from 'e2b' + +const sandbox = await Sandbox.create('nextjs-app-bun', { timeoutMs: 60_000 }) + +const url = sandbox.getHost(3000) +console.log('Next.js app running at:', url) +``` + +```python Python +from e2b import Sandbox + +sandbox = Sandbox.create('nextjs-app-bun', timeout=60) + +url = sandbox.get_host(3000) +print('Next.js app running at:', url) +``` + diff --git a/docs/template/examples/nextjs.mdx b/docs/template/examples/nextjs.mdx index eb175bb7..682e8697 100644 --- a/docs/template/examples/nextjs.mdx +++ b/docs/template/examples/nextjs.mdx @@ -3,11 +3,11 @@ title: "Next.js App" description: "Next.js web app running in the sandbox using Node.js" --- -Basic Next.js app with Tailwind and shadcn UI +Next.js app with Tailwind and shadcn UI. The dev server starts automatically on port 3000. - - The development server runs on port 3000 as soon as the sandbox is ready. - +## Set up Next.js with shadcn + +Scaffold a Next.js project with TypeScript, Tailwind CSS, and every shadcn component ready to use. ```typescript JavaScript & TypeScript @@ -49,13 +49,17 @@ template = ( ``` +## Build and publish + +Build the template. The first build takes a few minutes since it installs all shadcn components. + ```typescript JavaScript & TypeScript // build.ts import { Template, defaultBuildLogger } from 'e2b' import { template as nextJSTemplate } from './template' -Template.build(nextJSTemplate, 'nextjs-app', { +await Template.build(nextJSTemplate, 'nextjs-app', { cpuCount: 4, memoryMB: 4096, onBuildLogs: defaultBuildLogger(), @@ -74,3 +78,27 @@ Template.build(nextjsTemplate, 'nextjs-app', ) ``` + +## Access your app + +Create a sandbox and grab the URL. The dev server with Turbopack is already running on port 3000. + + +```typescript JavaScript & TypeScript +import { Sandbox } from 'e2b' + +const sandbox = await Sandbox.create('nextjs-app', { timeoutMs: 60_000 }) + +const url = sandbox.getHost(3000) +console.log('Next.js app running at:', url) +``` + +```python Python +from e2b import Sandbox + +sandbox = Sandbox.create('nextjs-app', timeout=60) + +url = sandbox.get_host(3000) +print('Next.js app running at:', url) +``` + From a467120dfecb48958c0673f27082a98dbae1d68c Mon Sep 17 00:00:00 2001 From: Tomas Beran Date: Wed, 4 Feb 2026 15:22:52 -0800 Subject: [PATCH 2/3] Add explanations and links to template examples - claude-code: Explain -p flag, --dangerously-skip-permissions, timeout=0, add Anthropic Console link - desktop: Add noVNC link and explanation, add prose before bash script, justify resource requirements - expo: Add Expo link and description, add code comment for directory move - nextjs-bun: Add Bun and shadcn/ui links, cross-reference to npm version - nextjs: Add shadcn/ui link, explain version pinning --- docs/template/examples/claude-code.mdx | 6 +++++- docs/template/examples/desktop.mdx | 19 +++++++++++++++++-- docs/template/examples/expo.mdx | 4 +++- docs/template/examples/nextjs-bun.mdx | 6 +++++- docs/template/examples/nextjs.mdx | 4 ++-- 5 files changed, 32 insertions(+), 7 deletions(-) diff --git a/docs/template/examples/claude-code.mdx b/docs/template/examples/claude-code.mdx index dd242e2f..03174d22 100644 --- a/docs/template/examples/claude-code.mdx +++ b/docs/template/examples/claude-code.mdx @@ -18,6 +18,7 @@ import { Template } from 'e2b' export const template = Template() .fromNodeImage('24') .aptInstall(['curl', 'git', 'ripgrep']) + // Claude Code will be available globally as "claude" .npmInstall('@anthropic-ai/claude-code@latest', { g: true }) ``` @@ -30,6 +31,7 @@ template = ( Template() .from_node_image("24") .apt_install(["curl", "git", "ripgrep"]) + # Claude Code will be available globally as "claude" .npm_install("@anthropic-ai/claude-code@latest", g=True) ) ``` @@ -70,7 +72,9 @@ Template.build(claudeCodeTemplate, 'claude-code', ## Run AI prompts -Create a sandbox with your Anthropic API key and pipe prompts to Claude. It can write files, run commands, and build whatever you describe. +Create a sandbox with your Anthropic API key and pipe prompts to Claude. It can write files, run commands, and build whatever you describe. Get your API key from the [Anthropic Console](https://console.anthropic.com/). + +The `-p` flag runs Claude in non-interactive pipe mode. The `--dangerously-skip-permissions` flag allows Claude to execute file and command operations without confirmation prompts—this is safe since the sandbox is isolated. Setting `timeout=0` disables the command timeout, letting Claude run as long as needed. diff --git a/docs/template/examples/desktop.mdx b/docs/template/examples/desktop.mdx index 76a6e71e..703e751f 100644 --- a/docs/template/examples/desktop.mdx +++ b/docs/template/examples/desktop.mdx @@ -3,7 +3,7 @@ title: "Desktop" description: "Sandbox with Ubuntu Desktop and VNC access" --- -Ubuntu Desktop with XFCE, accessible via noVNC on port 6080. +Ubuntu Desktop with XFCE, accessible via [noVNC](https://novnc.com/) on port 6080. noVNC provides browser-based access to the desktop through VNC over WebSocket—you can view and interact with the desktop directly in your browser without installing a VNC client. ## Set up the desktop environment @@ -17,6 +17,7 @@ import { Template, waitForPort } from 'e2b' export const template = Template() .fromUbuntuImage('22.04') + // Desktop environment and system utilities .runCmd([ 'yes | unminimize', 'apt-get update', @@ -52,11 +53,13 @@ export const template = Template() 'apt-get clean', 'rm -rf /var/lib/apt/lists/*', ]) + // noVNC and websockify for browser-based VNC access .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' ) @@ -73,6 +76,8 @@ from e2b import Template, wait_for_port template = ( Template() .from_image("ubuntu:22.04") + # Initial system setup and packages + # We are not using .apt_install() here because some packages have interactive prompts (keyboard layout setup, etc.) .run_cmd( [ "yes | unminimize", @@ -109,6 +114,7 @@ template = ( "rm -rf /var/lib/apt/lists/*", ] ) + # noVNC and websockify for browser-based VNC access .run_cmd( [ "git clone --branch e2b-desktop https://github.com/e2b-dev/noVNC.git /opt/noVNC", @@ -116,40 +122,49 @@ template = ( "git clone --branch v0.12.0 https://github.com/novnc/websockify /opt/noVNC/utils/websockify", ] ) + # Set default terminal .run_cmd( "ln -sf /usr/bin/xfce4-terminal.wrapper /etc/alternatives/x-terminal-emulator" ) + # Copy the start command .copy("start_command.sh", "/start_command.sh") .run_cmd("chmod +x /start_command.sh") + # Set start command to launch the desktop environment .set_start_cmd("/start_command.sh", wait_for_port(6080)) ) ``` +The startup script initializes the display server, desktop environment, and VNC stack. It starts Xvfb (a virtual framebuffer), launches the XFCE session, runs x11vnc to share the display, and starts noVNC to bridge VNC to WebSocket for browser access. ```bash 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 ``` ## Build and publish -Build the template. The desktop environment needs more resources than typical sandboxes. +Build the template. The desktop environment needs 8 CPUs and 8GB RAM for smooth rendering, window compositing, and running desktop applications like LibreOffice. diff --git a/docs/template/examples/expo.mdx b/docs/template/examples/expo.mdx index ee54811e..29908cc9 100644 --- a/docs/template/examples/expo.mdx +++ b/docs/template/examples/expo.mdx @@ -3,7 +3,7 @@ title: "Expo App" description: "Expo web app running in the sandbox using Node.js" --- -Expo app with the dev server running on port 8081. +[Expo](https://expo.dev/) app with the dev server running on port 8081. Expo is a React Native framework that simplifies mobile and web app development. ## Create the Expo project @@ -18,6 +18,7 @@ export const template = Template() .fromNodeImage() .setWorkdir('/home/user/expo-app') .runCmd('npx create-expo-app@latest . --yes') + // Move project files to /home/user for a cleaner working directory .runCmd('mv /home/user/expo-app/* /home/user/ && rm -rf /home/user/expo-app') .setWorkdir('/home/user') .setStartCmd('npx expo start', waitForURL('http://localhost:8081')) @@ -32,6 +33,7 @@ template = ( .from_node_image() .set_workdir("/home/user/expo-app") .run_cmd("npx create-expo-app@latest . --yes") + # Move project files to /home/user for a cleaner working directory .run_cmd("mv /home/user/expo-app/* /home/user/ && rm -rf /home/user/expo-app") .set_workdir("/home/user") .set_start_cmd("npx expo start", wait_for_url('http://localhost:8081')) diff --git a/docs/template/examples/nextjs-bun.mdx b/docs/template/examples/nextjs-bun.mdx index 2b2fe810..c33a65a0 100644 --- a/docs/template/examples/nextjs-bun.mdx +++ b/docs/template/examples/nextjs-bun.mdx @@ -3,7 +3,11 @@ title: "Next.js App (Bun)" description: "Next.js web app running in the sandbox using Bun" --- -Next.js app with Tailwind and shadcn UI using Bun. The dev server starts automatically on port 3000. +Next.js app with Tailwind and [shadcn/ui](https://ui.shadcn.com/) using [Bun](https://bun.sh/), a fast JavaScript runtime and package manager. The dev server starts automatically on port 3000. + + +For an npm-based version, see [Next.js App](/template/examples/nextjs). + ## Set up Next.js with Bun diff --git a/docs/template/examples/nextjs.mdx b/docs/template/examples/nextjs.mdx index 682e8697..924d341f 100644 --- a/docs/template/examples/nextjs.mdx +++ b/docs/template/examples/nextjs.mdx @@ -3,11 +3,11 @@ title: "Next.js App" description: "Next.js web app running in the sandbox using Node.js" --- -Next.js app with Tailwind and shadcn UI. The dev server starts automatically on port 3000. +Next.js app with Tailwind and [shadcn/ui](https://ui.shadcn.com/). The dev server starts automatically on port 3000. ## Set up Next.js with shadcn -Scaffold a Next.js project with TypeScript, Tailwind CSS, and every shadcn component ready to use. +Scaffold a Next.js project with TypeScript, Tailwind CSS, and every shadcn component ready to use. We pin specific versions to ensure reproducible builds. ```typescript JavaScript & TypeScript From 49c6e412b1df8b97021c364cb65d0a1a501e1741 Mon Sep 17 00:00:00 2001 From: Tomas Beran Date: Wed, 4 Feb 2026 15:27:33 -0800 Subject: [PATCH 3/3] Fix internal link path in nextjs-bun example --- docs/template/examples/nextjs-bun.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/template/examples/nextjs-bun.mdx b/docs/template/examples/nextjs-bun.mdx index c33a65a0..4e62f445 100644 --- a/docs/template/examples/nextjs-bun.mdx +++ b/docs/template/examples/nextjs-bun.mdx @@ -6,7 +6,7 @@ description: "Next.js web app running in the sandbox using Bun" Next.js app with Tailwind and [shadcn/ui](https://ui.shadcn.com/) using [Bun](https://bun.sh/), a fast JavaScript runtime and package manager. The dev server starts automatically on port 3000. -For an npm-based version, see [Next.js App](/template/examples/nextjs). +For an npm-based version, see [Next.js App](/docs/template/examples/nextjs). ## Set up Next.js with Bun