A stupidly simple web-based terminal emulator, with common tools and Starship enabled! π
- Access your terminal from any device with a web browser
- Execute commands just like in a native terminal
- Starship prompt provides a beautiful terminal experience with git status, command duration, etc.
- PIN protection (recommended) prevents unauthorized access
- Use the data directory to persist files between container restarts
- Demo mode available for testing and demonstrations - simulated terminal (set DEMO_MODE=true)
- Build with docker: To create a sandboxed environment for testing scripts, code, applications, emulate a VPS, showcase examples and more. All without having to install dependencies on your local machine!
- Build locally: To access your client's cli/terminal through your browser instead!
- Self-hosting: Put behind a reverse proxy, auth provider (like authentik, authelia, etc), Cloudflare tunnels with application access rules, etc for secure external access.
- Another alternative to web terminals such as ttyd, shellinabox, etc
- Features
- Quick Start
- Configuration
- Keyboard Shortcuts
- Security
- Technical Details
- Links
- Contributing
- Check Us Out
- Future Features
- π₯οΈ Web-based terminal access from anywhere
- π Dark mode support
- π± Responsive design for mobile and desktop
- π³ Docker support (Debian-based container)
- π§ Pre-installed utilities: starship, nerdfonts, apt-utils, curl, wget, ssh, git, vim, nano, htop, net-tools, iputils-ping, traceroute, fontconfig, unzip, locales.
- π Optional PIN protection (numeric)
- β¨ Starship prompt integration for beautiful terminal experience
- π Terminal search functionality (
ctrl+f
orcmd+f
) - π Custom volume mappings
- π In-terminal hyperlinks
- β¨οΈ Keyboard shortcuts for common actions
- π Tab Management:
- Drag and drop reordering of tabs
- Double-click to rename tabs
- Direct tab selection with shortcuts
- Terminal history persistence across sessions
- π± PWA Support for mobile and desktop
- β‘ XTerm.js for fast terminal rendering
- Docker (recommended)
- Node.js >=20.0.0 (for local development)
- Windows-specific: WSL or Node.js v16 - Option 3: Running Locally
- Docker method uses a pre-installed Debian Bullseye-based container/environment.
# Pull and run with one command
docker run -p 3000:3000 \
-v ./data:/root/data \
-v ./config:/root/.config \
-e DUMBTERM_PIN=1234 \
-e SITE_TITLE=DumbTerm \
-e BASE_URL=http://localhost:3000 \
-e ALLOWED_ORIGINS=http://localhost:3000 \
-e ENABLE_STARSHIP=true \
-e TZ=America/Los_Angeles \
-e LOCKOUT_TIME=15 \
-e MAX_SESSION_AGE=24 \
dumbwareio/dumbterm:latest
- Go to http://localhost:3000
- Enter your PIN if configured
- Enjoy your web-based terminal!
Create a docker-compose.yml
file or use the provided one:
services:
dumbterm:
image: dumbwareio/dumbterm:latest
container_name: dumbterm
restart: unless-stopped
ports:
- ${DUMBTERM_PORT:-3000}:3000
volumes:
- ${DUMBTERM_CONFIG:-./config}:/root/.config
- ${DUMBTERM_DATA_DIR:-./data}:/root/data
environment:
# Container timezone
TZ: ${DUMBTERM_TZ:-America/Los_Angeles}
# The title shown in the web interface
SITE_TITLE: ${DUMBTERM_SITE_TITLE:-DumbTerm}
# Recommended PIN protection (leave empty to disable)
DUMBTERM_PIN: ${DUMBTERM_PIN:-1234}
# The base URL for the application
BASE_URL: ${DUMBTERM_BASE_URL:-http://localhost:3000}
ENABLE_STARSHIP: ${ENABLE_STARSHIP:-true}
LOCKOUT_TIME: ${DUMBTERM_LOCKOUT_TIME:-15} # Minutes
# Session duration in hours before requiring re-authentication
MAX_SESSION_AGE: ${DUMBTERM_MAX_SESSION_AGE:-24} # Hours
# (OPTIONAL) - List of allowed origins for CORS
# ALLOWED_ORIGINS: ${DUMBTERM_ALLOWED_ORIGINS:-http://localhost:3000}
Then run:
docker compose up -d
- Local method will use your local terminal environment (Windows: Powershell, Mac / Linux: bash).
- Install dependencies:
npm install
Tip
- If you encounter issues with
node-pty
you can try using Windows Subsystem for Linux (WSL) or may need to install: Node.js v16
(Look into nvm for windows for multi node version support):winget install CoreyButler.NVMforWindows
- with nvm installed use:
nvm install 16 && nvm use 16
windows-build-tools
through Visual Studio InstallerMSVC v142 - VS 2019 C++ {arch} Build Tools
- Contact us or View the official Microsoft documentation for more details
cp .env.example .env
> Set environment variables in.env
:
PORT=3000 # Port to run the server on
DUMBTERM_PIN=1234 # Optional PIN protection
SITE_TITLE=DumbTerm # Custom site title
BASE_URL=http://localhost:3000 # Base URL for the application
- Start the server:
npm start
Variable | Description | Default | Required |
---|---|---|---|
PORT | Server port | 3000 | No |
BASE_URL | Base URL for the application | http://localhost:PORT | No |
DUMBTERM_PIN | PIN protection (numeric) | None | No |
SITE_TITLE | Site title displayed in header | DumbTerm | No |
TZ | Container timezone | America/Los_Angeles | No |
ENABLE_STARSHIP | Enable Starship prompt (docker only) | true | No |
NODE_ENV | Node environment mode (development or production) | production | No |
ALLOWED_ORIGINS | Allowed CORS origins (comma-separated list) | * (all origins) | No |
DEBUG | Enable debug logging | FALSE | No |
LOCKOUT_TIME | Custom Pin Lockout Time (in minutes) | 15 | No |
MAX_SESSION_AGE | Duration of authenticated session (in hours) | 24 | No |
DEMO_MODE | Enable demo mode with simulated terminal | false | No |
- Starship is a cross-shell prompt that provides a beautiful terminal experience.
- It is enabled by default in the Docker image and is the recommended method.
- To disable it, set
ENABLE_STARSHIP
tofalse
in your environment variables. - You can customize the Starship prompt by using one of the following steps:
Tip
copy and paste one of the starship preset commands below into DumbTerm and that's it!
Warning
Note: If running locally or mapped volume to your actual starship.toml
config, the preset commands will overwrite your existing starship.toml
file. Make sure to back it up as needed.
View All Starship Presets:
- You can also view the available presets by running
starship preset -l
in DumbTerm.
For more details, visit the Starship Presets page.
- The default configuration is located in
/root/.config/starship.toml
. - You can also mount a custom
starship.toml
file to the container using Docker volumes. - Update or add your custom configurations to starship.toml.
- Visit Starship Configuration for more information on customizing the prompt.
- If you are running DumbTerm locally, DumbTerm will inherit your current styles.
- Meaning if you already have starship enabled locally, you should be able to see your current styles accordingly.
- You must install Starship on your local machine if you wish to use DumbTerm with starship locally.
- To install Starship, follow the instructions on the Starship installation page.
DumbTerm provides a comprehensive set of keyboard shortcuts for efficient terminal management. The modifier keys vary by operating system:
- Windows/Linux:
Ctrl+Alt+{key}
- macOS:
Ctrl+Cmd+{key}
Action | Windows/Linux | macOS |
---|---|---|
New Terminal | Ctrl+Alt+T |
Ctrl+Cmd+T |
Close Terminal | Ctrl+Alt+W |
Ctrl+Cmd+W |
Rename Terminal | Ctrl+Alt+R |
Ctrl+Cmd+R |
Search in Terminal | Ctrl+F |
Cmd+F |
Next Terminal | Ctrl+Alt+> or Ctrl+Alt+. |
Ctrl+Cmd+> or Ctrl+Cmd+. |
Previous Terminal | Ctrl+Alt+< or Ctrl+Alt+, |
Ctrl+Cmd+< or Ctrl+Cmd+, |
Switch to Terminal 1-9 | Ctrl+Alt+[1-9] |
Ctrl+Cmd+[1-9] |
- Press
Ctrl+F
(Windows/Linux) orCmd+F
(macOS) to open the search bar - Use Up/Down arrow buttons or Enter/Shift+Enter to cycle through matches
- Press Escape or the close button to exit search mode
- Drag and Drop: Click and drag tabs to reorder them
- Rename: Double-click a tab or use the keyboard shortcut to rename it
- History: Terminal content is automatically preserved across browser refreshes and restarts
- Direct Selection: Use number shortcuts (1-9) to quickly switch between the first 9 terminals
It is highly recommended to set a strong PIN, use HTTPS, use ALLOWED_ORIGINS, and integrate with an auth provider (i.e. Authentik / Authelia / tinyauth, etc).
We're dumb, but not stupid. Use a full-featured auth provider for production use.
- https://github.com/goauthentik/authentik (More difficult to set up, but production ready)
- https://github.com/authelia/authelia
- https://github.com/steveiliop56/tinyauth (Easy with docker compose integration)
- Variable-length PIN support (numeric)
- Constant-time PIN comparison
- Brute force protection:
- 5 attempts maximum
- 15-minute lockout after failed attempts
- IP-based tracking
- Secure cookie handling
- Session-based authentication
- CORS support for origin restrictions (optional)
- HTTPS support (when configured with proper BASE_URL)
- Backend: Node.js (>=20.0.0) with Express
- Frontend: XTerm.js for terminal emulation
- Container: Docker with Debian Bullseye base
- Terminal: node-pty for process spawning
- Communication: WebSockets for real-time terminal I/O
- Security: cors for cross-origin requests
- express: Web framework
- node-pty: Terminal process spawning
- xterm: Terminal frontend
- ws: WebSocket server
- cookie-parser: Cookie handling
- express-session: Session management
- cors: security for cross-origin requests
DumbTerm includes the following XTerm.js addons to enhance your terminal experience:
Addon | Description |
---|---|
@xterm/addon-attach | Attaches a terminal session to a websocket |
@xterm/addon-canvas | Renderer that uses canvas to draw terminal content (used as fallback after webgl) |
@xterm/addon-clipboard | Clipboard integration for copy/paste support |
@xterm/addon-fit | Automatically resize terminal to fit its container |
@xterm/addon-image | Display images inline in the terminal |
@xterm/addon-ligatures | Font ligatures support |
@xterm/addon-search | Search text in the terminal buffer |
@xterm/addon-serialize | Serialize terminal output to string or HTML |
@xterm/addon-unicode11 | Additional Unicode 11 character width support |
@xterm/addon-web-links | Automatically hyperlink URLs in terminal |
@xterm/addon-webgl | Renderer that uses WebGL for better performance (default render method) |
- GitHub: github.com/dumbwareio/dumbterm
- Docker Hub: hub.docker.com/r/dumbwareio/dumbterm
- Fork the repository
- Create your feature branch (
git checkout -b feature/amazing-feature
) - Commit your changes using conventional commits
- Push to the branch (
git push origin feature/amazing-feature
) - Open a Pull Request
See Development Guide for local setup and guidelines.
Made with β€οΈ by DumbWareio & gitmotion
- Website: dumbware.io
- Buy Us a Coffee: buymeacoffee.com/dumbware β
- Join the Chaos: Discord π¬
- Additional authentication methods
Got an idea? Open an issue or submit a PR