Skip to main content
The web terminal opens interactive shells inside running instances of an application’s web process or background worker, from the dashboard. Use it to inspect files and environment variables, run a one-off script or a database migration, copy files in and out, or run an agent CLI such as Claude Code. It’s the closest thing to SSH on Sevalla: there’s no SSH access to instances.

Before you begin

  • The process must have a running, ready instance. A process with 0 instances, a crashing process or a suspended application has nothing to connect to.
  • Cron jobs and jobs can’t be opened: they only run on their schedule or around deployments.
Anyone who can view the application can open a web terminal in it, and the shell has the same access as the process, including its environment variables. Copying files needs permission to update the application. Give access to the application with care.

Open a terminal

1

Open the Web terminal tab

In the sidebar, click Applications, then click the application. Click the Web terminal tab.
2

Run commands

The first time, the terminal opens a tab with sh in the web process (or the first background worker when there’s no web process). When the status in the toolbar reads Live, type in the terminal.
To open a shell in another process or with another shell, open a new tab: see Open more shells. The Web terminal button on a process in the application’s Overview tab opens a tab in that process.
The web terminal with one tab in the web process, a Live status in the toolbar and a bash sessionThe web terminal with one tab in the web process, a Live status in the toolbar and a bash session
How the session works:
  • Which instance. The terminal connects to one ready instance of the process. With more than one instance, you can’t pick which one.
  • Shells. sh is always available. bash and zsh work only if the image contains them; otherwise the pane says “bash” isn’t available in this process. Open a tab with sh, which every image has.
  • Size. The terminal fills the window, and the shell’s size follows it, so tmux, vim and other full-screen programs use every row and column.
  • Environment. The shell sees the process’s runtime environment variables; run printenv to list them. It starts with TERM=xterm-256color, COLORTERM=truecolor and, when the image sets no locale, LANG=C.UTF-8. For images built with Buildpacks, the shell starts through the buildpack launcher, so the language runtimes are on the PATH.
  • Output. What you run in the terminal doesn’t appear in the runtime logs.

Open more shells

Each tab and each pane is its own shell. You can have up to 8 tabs per application.
  • New tab. Click New tab (+) in the toolbar, pick the Process and the Shell (sh, bash or zsh), then click Open tab.
  • Split. Click Split, then Split right or Split down. The new pane opens a new shell in the same process with the same shell. Each pane needs at least 20 columns and 5 rows; when there’s no room, the menu says so.
  • Resize. Drag the divider between two panes, or focus it and press the arrow keys (one column at a time, ten with Shift).
  • Close. Click the × on a tab or a pane, or click Split > Close pane. Closing ends the shell. If a program is still running in it, the dashboard asks first.
Each tab is named after the program’s title, for example app@web: /app. Your browser remembers the tabs and panes of each application. In the same browser tab, every pane reattaches to its shell when you come back within 15 minutes.
Two terminal tabs, the first split into a shell and a pane following a log with tail -fTwo terminal tabs, the first split into a shell and a pane following a log with tail -f

Keep a session through dropped connections

A shell keeps running for 15 minutes after its connection drops, so a network change, a laptop that slept, a page reload or a visit to another tab of the application doesn’t end it. The terminal reconnects by itself, replays the output it missed, and marks the place with a Session restored · 14:32 line. The status reads Reconnecting…, then Restored.
  • What you type while the terminal reconnects (up to 1 KB) is sent once it’s back.
  • Sevalla keeps the last 256 KB of output of each session. When a program printed more while you were away, the replay starts from the oldest output Sevalla kept.
  • After 30 seconds of reconnecting, the pane says Still reconnecting. Your session is kept for 15 minutes. Click Try now to retry at once.
  • A shell is shown in one place at a time. Opening it in another browser tab or window takes it over, and the first one shows Session opened elsewhere with an Open it here button.
A session ends when you close its tab or pane, when the shell exits, after 15 minutes without a connection, after 8 hours without input or output, or when the instance restarts. Sevalla keeps up to 20 disconnected sessions per user and 10 per process; past that, the oldest one ends.
A terminal with a Restored status and a Session restored line above the promptA terminal with a Restored status and a Session restored line above the prompt

Keep long tasks running with tmux

When the image has tmux, the Session ended and Session not restored messages offer Start in tmux. The new shell runs inside a tmux session that only you can attach to, and if the terminal service restarts, the pane lands back in it with everything that runs there. tmux runs in the instance, so it still ends when the instance restarts or the application is deployed again. To add tmux, install it in your image, for example RUN apk add --no-cache tmux on Alpine.

What persists

The terminal runs inside the instance’s container, so it changes only that instance:
  • Files you create or change are lost when the instance restarts or the application is deployed again, unless they’re on a disk.
  • Other instances of the process don’t see the change.
  • When a session ends, Sevalla hangs up its shell, and the processes you started from it stop. Processes started with nohup, or inside tmux, keep running until the instance restarts.
Make lasting changes in your repository or environment variables, and deploy.

Copy files to and from a process

The Files menu uploads files into the instance and downloads files and folders from it, up to 100 MB per upload or download. You need permission to update the application; with view access, the menu’s items are off and say why. Files go straight between your browser and the container; Sevalla keeps no copy.

Upload files

1

Choose the files

Drag files or folders onto a pane, or click Files > Upload files… and choose them.
2

Check the destination

The Destination is the shell’s current directory when the shell reports it, otherwise the container’s working directory. Change it to any absolute path, such as /app/uploads. Select Replace files that already exist to overwrite files with the same name.
3

Upload

Click Upload. The Transfers panel shows each file’s progress; click × on a row to cancel it.
When a file is done, its row reads Uploaded; run ls in the destination to see it. A dropped folder keeps its structure, and Sevalla creates its subfolders. A destination you type must already exist. Each file is written to a hidden temporary file and renamed when all of it has arrived, so a cut upload never leaves a partial file. Files belong to the container’s user, so pick a folder that user can write to.
The Upload 3 files dialog with the file list, a Destination field set to /app/public and a Replace files that already exist optionThe Upload 3 files dialog with the file list, a Destination field set to /app/public and a Replace files that already exist option

Download a file or folder

1

Open the download dialog

Click Files > Download….
2

Enter the path

In Path, enter the absolute path of a file or folder, such as /app/logs/app.log, then click Download.
Your browser saves the file. A folder downloads as a .tar.gz archive (.tar when the image has tar but no gzip), and needs tar in the image. A folder whose archive grows past 100 MB is cut off, and the download fails.
The Download from Web server dialog with a Path field set to /app/logs/app.logThe Download from Web server dialog with a Path field set to /app/logs/app.log

When a copy fails

The error shows in a toast and on the transfer’s row. A copy stops when nothing moves for 2 minutes.

Settings and shortcuts

Click Settings in the toolbar to change how the terminal looks and behaves. Settings are saved in your browser and apply to every pane; Reset restores the defaults. Keys work as in a local terminal. While a pane has focus, no dashboard shortcut takes a key from it, and Shift+Enter adds a line to the prompt of an agent CLI such as Claude Code instead of sending it. Browsers keep Ctrl+Tab and Ctrl+Shift+Tab, and on Windows and Linux also Ctrl+Shift+T and Ctrl+Shift+W, except in full screen in Chrome, Edge and other Chromium-based browsers. Right-click a pane for Copy, Paste, Select all, Find and Clear.
The Terminal settings popover with font size, theme, cursor, scrollback, Option as Meta, copy on select, right-click, notifications and local echoThe Terminal settings popover with font size, theme, cursor, scrollback, Option as Meta, copy on select, right-click, notifications and local echo

Get notified when a terminal needs you

When a program rings the terminal bell or sends a notification (OSC 9 or OSC 777), for example an agent waiting for approval or a build that finished, while you’re looking at another pane, tab or window:
  • the pane and its tab get a dot, and the browser tab’s title starts with ● until you look at the pane;
  • with Notifications on and your browser’s permission, a desktop notification names the application and the process, at most one every 10 seconds per pane.
The first time a terminal needs you, a strip asks Get a notification when this terminal needs you, such as an agent waiting for approval. Click Turn on to let the browser ask for permission, or Not now.
A split terminal where one pane rang its bell, with a dot on the tab and the pane, and the offer to turn on notificationsA split terminal where one pane rang its bell, with a dot on the tab and the pane, and the offer to turn on notifications

Check the connection

The status in the toolbar shows the active pane’s connection and its round trip, for example Live · 18 ms. Click the status for the connection’s details: Status, Round trip (with its recent history), Region, Connected since, Reconnects, Local echo and, after a close, Last close with the close code.
The Connection popover with status Live, an 18 ms round trip, the region Frankfurt, Germany, the connection time and 0 reconnectsThe Connection popover with status Live, an 18 ms round trip, the region Frankfurt, Germany, the connection time and 0 reconnects

Use the terminal on a phone or tablet

On a touch screen, a key bar sits above the on-screen keyboard while a pane has focus, with Esc, Tab, Ctrl, Alt, the arrow keys and |, ~, /, -. Tap Ctrl or Alt once to apply it to the next key, or twice to lock it. On a phone, the tabs become a menu, and Files, Find, Settings and full screen are in the More actions menu.

Find language tools in a Nixpacks image

In images built with Nixpacks, language tools live under /nix/var/nix/profiles/default/bin/ (for example /nix/var/nix/profiles/default/bin/node), and Python packages are installed in a virtual environment in /opt/venv. To run Django or other Python commands, activate it first:

Troubleshoot a session

When a shell can’t open, the pane shows Couldn’t open a shell in and the process name, with a reason and a Try again button. When a session ends, it shows Session ended with the reason and a Start a new shell button (or press Enter). An instance that restarts ends every session open in it.

Run a command without a terminal

To run one command from a script or an AI agent, use the Run a command in a process API operation. It runs a single command in a running instance and returns its output and exit code:
  • The command is an argument list (["ls", "-la", "/app"]) run without a shell, so pipes, redirects and && don’t work. Wrap it as ["sh", "-c", "…"] when you need them.
  • It waits up to 15 seconds by default and 60 seconds at most.
  • An API key with read access can run only read-only commands such as ls, cat, env, ps and grep; a key with write access can run any command.
For an interactive session from your own tools, connect to the Open terminal session (WebSocket) operation. Unlike the dashboard’s terminal, it needs an API key with permission to update the application. It also accepts the dash, ksh, csh and tcsh shells. It doesn’t reattach to a shell after a dropped connection, and it doesn’t copy files.