A modern terminal emulator built with Kotlin and Compose Desktop.
BossTerm is a high-performance terminal emulator designed for developers who want a fast, customizable, and feature-rich terminal experience on macOS, Linux, and Windows.
BossTerm delivers industry-leading throughput for developer workflows. Benchmarked against iTerm2, Terminal.app, and Alacritty (December 2025, Latency Mode):
BossTerm ββββββββββββββββββββββββββββββββββββββββββββββββββββ 1,645 MB/s β
Alacritty ββββββββββββββββββββββββββββββββββββββββββββββββββ 1,633 MB/s
iTerm2 βββββββββββββββββββββββββββββββββββββββββββββββββ 1,599 MB/s
Terminal ββββββββββββββββββββββββββββββββββββββββββββββββ 1,491 MB/s
BossTerm ββββββββββββββββββββββββββββββββββββββββββββββββββββ 364 MB/s β
iTerm2 βββββββββββββββββββββββββββββββββββ 255 MB/s
Terminal ββββββββββββββββββββββββββββββββββ 249 MB/s
Alacritty βββββββββββββββββββββββββββββββββ 233 MB/s
BossTerm ββββββββββββββββββββββββββββββββββββββββββββββββββββ 1.01M β
iTerm2 βββββββββββββββββββββββββββββββββββββββββββββββββ 904K
Terminal ββββββββββββββββββββββββββββββββββββββββββββββββ 879K
Alacritty βββββββββββββββββββββββββββββββββββββββββββββ 829K
BossTerm ββββββββββββββββββββββββββββββββββββββββββββββββ 3.09 ms β
Terminal βββββββββββββββββββββββββββββββββββββββββββββββββββββ 3.21 ms
iTerm2 ββββββββββββββββββββββββββββββββββββββββββββββββββββββ 3.55 ms
Alacritty βββββββββββββββββββββββββββββββββββββββββββββββββββββββ 3.72 ms
| Benchmark | BossTerm vs iTerm2 |
|---|---|
| Raw Throughput (1MB) | +43% faster |
| Raw Throughput (5MB) | +24% faster |
| Raw Throughput (50MB) | +3% faster |
| Variation Selectors | +12% faster |
| CJK Characters | +10% faster |
| Powerline | +10% faster |
| htop Simulation | +13% faster |
| Git Diff Simulation | +5% faster |
| Flags Emoji | +3% faster |
Full benchmark details: benchmark/README.md | Detailed Results
brew tap kshivang/bossterm
brew install --cask bosstermDownload the latest DMG from GitHub Releases and drag BossTerm to Applications.
# Download the .deb package from GitHub Releases
sudo dpkg -i bossterm_*_amd64.deb
sudo apt-get install -f # Install dependencies if needed# Download the .rpm package from GitHub Releases
sudo dnf install bossterm-*.x86_64.rpmsudo snap install bossterm --classicOr download the .snap file from GitHub Releases and install manually:
sudo snap install bossterm_*.snap --classic --dangerousRequires Java 17+:
# Download bossterm-*.jar from GitHub Releases
java -jar bossterm-*.jargit clone https://github.com/kshivang/BossTerm.git
cd BossTerm
./gradlew :bossterm-app:run- Native Performance - Built with Kotlin/Compose Desktop for smooth 60fps rendering
- Multiple Windows - Cmd/Ctrl+N opens new window, each with independent tabs
- Multiple Tabs - Ctrl+T new tab, Ctrl+W close, Ctrl+Tab switch
- Split Panes - Horizontal/vertical splits with Cmd+D / Cmd+Shift+D
- Themes - Built-in theme presets (Dracula, Solarized, Nord, etc.) with custom theme support
- Window Transparency - Adjustable opacity with background blur effects
- Background Images - Custom background images with blur and opacity controls
- Xterm Emulation - Full VT100/Xterm compatibility
- True Color - Full 256 color and 24-bit true color support
- Mouse Reporting - Click, scroll, and drag support for terminal apps (vim, tmux, htop, less, fzf)
- Full Unicode - Emoji (π¨βπ©βπ§βπ¦), variation selectors (βοΈ), surrogate pairs, combining characters
- Nerd Fonts - Built-in support for powerline symbols and devicons
- Inline Images - Display images in terminal via iTerm2's imgcat (OSC 1337)
- Progress Bar - Visual progress indicator for long-running commands (OSC 1337)
- Search - Ctrl/Cmd+F to search terminal history with regex support
- Hyperlink Detection - Auto-detect URLs, file paths, emails with Ctrl+Click to open
- Copy/Paste - Standard clipboard + copy-on-select + middle-click paste + OSC 52
- Context Menu - Right-click for Copy, Paste, Clear, Select All
- Drag & Drop - Drop files onto terminal to paste shell-escaped paths (iTerm2 style)
- Auto-Scroll Selection - Drag selection beyond bounds to scroll through history
- IME Support - Full Chinese/Japanese/Korean input method support
- Visual Bell - Configurable visual flash for BEL character
- Command Notifications - System notifications when long commands complete (OSC 133)
- OSC 7 Support - Working directory tracking for new tabs
- Settings UI - Full GUI settings panel with live preview
- Debug Tools - Built-in terminal debugging with Ctrl+Shift+D
- Customizable - JSON-based settings at
~/.bossterm/settings.json
| Shortcut | Action |
|---|---|
| Ctrl/Cmd+N | New window |
| Ctrl/Cmd+T | New tab |
| Ctrl/Cmd+W | Close tab/pane |
| Ctrl+Tab | Next tab |
| Ctrl+Shift+Tab | Previous tab |
| Ctrl/Cmd+1-9 | Jump to tab |
| Ctrl/Cmd+D | Split pane vertically |
| Ctrl/Cmd+Shift+D | Split pane horizontally |
| Ctrl/Cmd+Option+Arrow | Navigate between panes |
| Ctrl/Cmd+, | Open settings |
| Ctrl/Cmd+F | Search |
| Ctrl/Cmd+C | Copy |
| Ctrl/Cmd+V | Paste |
| Ctrl+Space | Toggle IME |
Enable working directory tracking and command completion notifications:
Bash (~/.bashrc):
# OSC 7 (directory tracking) + OSC 133 (command notifications)
__prompt_command() {
local exit_code=$?
echo -ne "\033]133;D;${exit_code}\007" # Command finished
echo -ne "\033]133;A\007" # Prompt starting
echo -ne "\033]7;file://${HOSTNAME}${PWD}\007" # Working directory
}
PROMPT_COMMAND='__prompt_command'
trap 'echo -ne "\033]133;B\007"' DEBUG # Command startingZsh (~/.zshrc):
# OSC 7 (directory tracking) + OSC 133 (command notifications)
precmd() {
local exit_code=$?
print -Pn "\e]133;D;${exit_code}\a" # Command finished
print -Pn "\e]133;A\a" # Prompt starting
print -Pn "\e]7;file://${HOST}${PWD}\a" # Working directory
}
preexec() { print -Pn "\e]133;B\a" } # Command startingThis enables:
- New tabs inherit working directory from active tab
- System notifications when commands > 5 seconds complete while window is unfocused
BossTerm/
βββ bossterm-core-mpp/ # Core terminal emulation library
β βββ src/jvmMain/kotlin/ai/rever/bossterm/
β βββ core/ # Core utilities and types
β βββ terminal/ # Terminal emulator implementation
βββ compose-ui/ # Compose Desktop UI library (embeddable)
β βββ src/desktopMain/kotlin/ai/rever/bossterm/compose/
β βββ ui/ # Main terminal composable (ProperTerminal)
β βββ terminal/ # Terminal data stream handling
β βββ input/ # Mouse/keyboard input handling
β βββ rendering/ # Canvas rendering engine
β βββ tabs/ # Tab management
β βββ window/ # Window management (WindowManager)
β βββ search/ # Search functionality
β βββ debug/ # Debug tools
β βββ settings/ # Settings management
βββ bossterm-app/ # Main BossTerm application
β βββ src/desktopMain/kotlin/ai/rever/bossterm/app/
β βββ Main.kt # Application entry point
βββ embedded-example/ # Example: single terminal embedding
βββ tabbed-example/ # Example: tabbed terminal embedding
βββ .github/workflows/ # CI configuration
Settings are stored in ~/.bossterm/settings.json:
{
"fontSize": 14,
"fontName": "JetBrains Mono",
"copyOnSelect": true,
"pasteOnMiddleClick": true,
"scrollbackLines": 10000,
"cursorBlinkRate": 500,
"enableMouseReporting": true,
"performanceMode": "balanced",
"notifyOnCommandComplete": true,
"notifyMinDurationSeconds": 5
}BossTerm offers configurable performance optimization via Settings > Performance:
| Mode | Best For |
|---|---|
| Balanced (default) | General use - good balance of responsiveness and throughput |
| Latency | SSH, vim, interactive commands - fastest response time |
| Throughput | Build logs, large files - maximum data processing speed |
Note: For
fontName, use a monospace font name installed on your system (e.g., "SF Mono", "Menlo", "JetBrains Mono"). If not set, BossTerm uses the bundled MesloLGS Nerd Font which includes powerline symbols.
BossTerm provides embeddable terminal libraries for Kotlin Multiplatform projects.
Full Documentation: See docs/embedding.md for the complete embedding guide, including custom context menus, focus management, and session persistence.
Maven Central (recommended):
// build.gradle.kts
repositories {
mavenCentral()
}
dependencies {
// Core terminal emulation engine
implementation("com.risaboss:bossterm-core:<version>")
// Compose Desktop UI component
implementation("com.risaboss:bossterm-compose:<version>")
}JitPack (alternative):
// settings.gradle.kts
dependencyResolutionManagement {
repositories {
maven { url = uri("https://jitpack.io") }
}
}
// build.gradle.kts
dependencies {
implementation("com.github.kshivang.BossTerm:bossterm-core-mpp:<version>")
implementation("com.github.kshivang.BossTerm:compose-ui:<version>")
}GitHub Packages (requires authentication):
// settings.gradle.kts
dependencyResolutionManagement {
repositories {
maven {
url = uri("https://maven.pkg.github.com/kshivang/BossTerm")
credentials {
username = System.getenv("GITHUB_ACTOR")
password = System.getenv("GITHUB_TOKEN")
}
}
}
}
// build.gradle.kts
dependencies {
implementation("com.risaboss:bossterm-core:<version>")
implementation("com.risaboss:bossterm-compose:<version>")
}import ai.rever.bossterm.compose.EmbeddableTerminal
import ai.rever.bossterm.compose.rememberEmbeddableTerminalState
@Composable
fun MyApp() {
// Basic usage - uses default settings from ~/.bossterm/settings.json
EmbeddableTerminal()
// With custom settings path
EmbeddableTerminal(settingsPath = "/path/to/settings.json")
// With custom font (via settings)
EmbeddableTerminal(settings = TerminalSettings(fontName = "JetBrains Mono"))
// With callbacks
EmbeddableTerminal(
onOutput = { output -> println(output) },
onTitleChange = { title -> window.title = title },
onExit = { code -> println("Shell exited: $code") },
onReady = { println("Terminal ready!") }
)
// Programmatic control
val state = rememberEmbeddableTerminalState()
Button(onClick = { state.write("ls -la\n") }) {
Text("Run ls")
}
// Send control signals (useful for interrupting processes)
Button(onClick = { state.sendCtrlC() }) {
Text("Stop (Ctrl+C)")
}
EmbeddableTerminal(state = state)
// Session preservation across navigation/visibility changes
val persistentState = rememberEmbeddableTerminalState(autoDispose = false)
if (showTerminal) {
EmbeddableTerminal(state = persistentState)
}
// Terminal process keeps running even when hidden!
// Don't forget to dispose when truly done:
DisposableEffect(Unit) {
onDispose { persistentState.dispose() }
}
}- Kotlin - Modern JVM language
- Compose Desktop - Declarative UI framework
- Pty4J - PTY support for local terminal sessions
- ICU4J - Unicode/grapheme cluster support
- Embedding Guide - Embed a single terminal with custom context menus
- Tabbed Terminal Guide - Full-featured tabbed terminal with splits
- Troubleshooting Guide - Common issues and solutions
- Release Notes - Detailed changelog for each version
Contributions are welcome! Please feel free to submit issues and pull requests.
BossTerm is dual-licensed under:
You may select either license at your option.
BossTerm is a fork of JediTerm by JetBrains, completely rewritten with Kotlin and Compose Desktop.
Inspired by iTerm2, the beloved macOS terminal.
Built by Risa Labs Inc