#tui #multiplexer #retro #terminal #terminal-multiplexer

app term39

A modern, retro-styled terminal multiplexer with a classic MS-DOS aesthetic

38 releases (17 breaking)

Uses new Rust 2024

new 0.18.0 Dec 5, 2025
0.16.7 Dec 3, 2025
0.15.0 Nov 29, 2025

#52 in Command line utilities

Download history 4/week @ 2025-11-04 32/week @ 2025-11-11 35/week @ 2025-11-18 73/week @ 2025-11-25

144 downloads per month

MIT license

1MB
23K SLoC

TERM39

CI Release License: MIT Rust Version

A modern terminal multiplexer with classic MS-DOS aesthetic, built with Rust. Full-screen interface with window management and complete terminal emulation. ( Linux / Windows / MacOS / Android-Termux )

TERM39 Logo

Screenshots

TERM39 Main Interface



TERM39 Screenshot 2 TERM39 Screenshot 3
TERM39 Screenshot 4 TERM39 Screenshot 5

Click on any image to view full size

Features

General

  • Retro DOS Aesthetic: Classic blue-and-white color scheme with box-drawing characters, ~60fps rendering
  • Multiple Terminal Windows: Create, drag, resize, minimize, and maximize windows with mouse or keyboard
  • Window Management: Automatic tiling, snap to corners, focus management with ALT+TAB
  • Session Persistence: Auto-save/restore of window layouts and terminal content between sessions
  • Command Launcher: Quick command palette with Ctrl+Space
  • Clipboard Support: System clipboard integration with drag-to-select, Ctrl+Shift+C/V, right-click menu
  • Lockscreen: System-authenticated lockscreen with Shift+Q, supports PAM (Linux), Directory Services (macOS), and Windows Security
  • Customizable Themes: Classic (default), Dark, Monochrome, Green Phosphor, Amber, Dracu, NDD, QBasic, TurboP, NCC, XT, WP, dB, System (via --theme flag)
  • Battery Indicator: Real-time battery status display in the top bar
  • Cross-Platform: Linux, macOS, Windows with full VT100/ANSI support and true color
  • ASCII Compatibility: --ascii flag for maximum terminal compatibility

Linux Only

  • Framebuffer Mode: Direct /dev/fb0 rendering with DOS text modes (40x25, 80x25, ... , 320x200)
  • Console Mouse: Native mouse support on Linux TTY via raw /dev/input devices

Installation

# Standard installation
cargo install term39

# Linux with framebuffer support
cargo install term39 --features framebuffer-backend

Requires Rust (Install)

Linux Packages

Homebrew:

brew tap alejandroqh/term39
brew install term39

Or download from Releases:

  • Fedora/RHEL:
    sudo rpm -i term39-*-1.x86_64.rpm
    # or: sudo dnf install term39-*-1.x86_64.rpm
    
  • Arch (AUR): yay -S term39-bin or yay -S term39
  • Tarball:
    tar xzf term39-v*-linux-x86_64.tar.gz
    sudo mv term39 /usr/local/bin/
    

macOS

Homebrew (Recommended):

brew tap alejandroqh/term39
brew install term39

Or download from Releases:

Option 1: PKG Installer

  • Intel: term39-v*-macos-intel.pkg
  • Apple Silicon: term39-v*-macos-apple-silicon.pkg

Right-click the PKG file and select "Open" to install (macOS will show a security warning for unsigned apps). The binary will be automatically placed in /usr/local/bin/.

Option 2: DMG Installer

  • Intel: term39-v*-macos-intel.dmg
  • Apple Silicon: term39-v*-macos-apple-silicon.dmg

Right-click the DMG file and select "Open", then drag the app into the Applications folder.

Option 3: Manual Installation

# Intel (x86_64)
tar xzf term39-v*-macos-64bit-x86-binary.tar.gz
sudo mv term39 /usr/local/bin/

# Apple Silicon (ARM64)
tar xzf term39-v*-macos-64bit-arm-binary.tar.gz
sudo mv term39 /usr/local/bin/

Windows

Download from Releases:

# Option 1: Run the installer (x86_64)
.\term39-v*-windows-x86_64-pc-windows-msvc-installer.exe

# Option 2: Portable - Extract ZIP
Expand-Archive term39-v*-windows-x86_64.zip
# Add to PATH (optional)
$env:Path += ";$PWD\term39-v*-windows-x86_64"

Runtime Requirement: If you see errors about MSVCP140.dll or VCRUNTIME140.dll, install the Microsoft Visual C++ Redistributable (x86 version for 32-bit systems).

From Source

git clone https://github.com/alejandroqh/term39.git
cd term39
# Add --features framebuffer-backend for Linux framebuffer
cargo build --release
./target/release/term39

Android/Termux

For Android/Termux, install or build without the clipboard feature:

# Install Rust in Termux
pkg install rust

# Option 1: Install from crates.io (disable clipboard for Android compatibility)
cargo install term39 --no-default-features

# Option 2: Build from source
git clone https://github.com/alejandroqh/term39.git
cd term39
cargo build --release --no-default-features
./target/release/term39

Note: The --no-default-features flag disables system clipboard integration (which is not supported on Android). Copy/paste will still work within the app using an internal buffer.

Usage

./term39                 # Run with Unicode (recommended)
./term39 --ascii         # ASCII mode for compatibility
./term39 --theme dark    # Themes: classic, dark, monochrome,
                         #         green_phosphor, amber, dracu,
                         #         ndd, qbasic, turbo, nc, xt,
                         #         wp, db, system

Keyboard Shortcuts

General

Key Action Key Action
t / T New window / Maximized window q / ESC Exit (desktop)
F1 / ? / h Show help s Settings
l License c Calendar
Ctrl+Space Command launcher Shift+Q / F12 Lock screen

Window & Session

Key Action Key Action
F2 / ALT+TAB Switch windows Ctrl+S / F3 Save session
F4 / Ctrl+L Clear terminal ` / F8 Window Mode

Copy & Paste

Key Action Key Action
F6 / Ctrl+Shift+C Copy selection F7 / Ctrl+Shift+V Paste
Cmd+C (macOS) Copy selection Cmd+V (macOS) Paste

Dialog Controls

Key Action Key Action
TAB / Arrow keys Navigate buttons ENTER Activate button
ESC Close dialog

Mouse Controls

  • Title bar: Drag to move | Ctrl+Drag: Move without snap | ╬ handle: Resize
  • [X]/[+]/[_]: Close/Maximize/Minimize | Click window: Focus
  • Bottom bar: Switch windows | Drag text: Select | Right-click: Context menu

Keyboard-Only Mode (Window Mode)

Press ` (backtick) or F8 to enter Window Mode for full keyboard control of windows. Press again to exit.

Navigation

Key Action
h / Focus window to left
j / Focus window below
k / Focus window above
l / Focus window to right
Tab Cycle to next window
Shift+Tab Cycle to previous window

Snap to Half Screen

Key Action
H (Shift+h) Snap to left half
J (Shift+j) Snap to bottom half
K (Shift+k) Snap to top half
L (Shift+l) Snap to right half

Numpad-Style Snap Positions (1-9)

7 Top-Left     8 Top-Center     9 Top-Right
4 Middle-Left  5 Center         6 Middle-Right
1 Bottom-Left  2 Bottom-Center  3 Bottom-Right

Window Actions

Key Action
m Enter Move mode
r Enter Resize mode
z / + / Space Toggle maximize
- / _ Toggle minimize
x / q Close focused window
? Show help overlay

Move Mode (press m to enter)

Key Action
h/j/k/l or arrows Move window (adaptive speed)
Shift+H/J/K/L Snap window to edge
Enter / Esc / m Exit Move mode

Resize Mode (press r to enter)

Key Action
h / l Shrink / Grow width
k / j Shrink / Grow height
Shift + key Invert resize direction
Enter / Esc / r Exit Resize mode

Tip: Double-press ` quickly to send a literal backtick to the terminal.

Command-Line Options

General Options

Option Description
--ascii Use ASCII-compatible characters (+-|#) instead of Unicode box-drawing
--single-line Use single-line Unicode box characters (┌─┐│└┘) instead of double-line
--theme <THEME> Set color theme (see Themes section)
--tint-terminal Apply theme-based color tinting to terminal content
--no-restore Don't restore previous session on startup
--no-save Don't save session (disables auto-save and manual save)
--no-exit Disable exit functionality (for use as a window manager)
--shell <SHELL> Specify custom shell for terminal windows (e.g., --shell /bin/zsh)
--lock Lock a running term39 instance and exit (Unix only, see Lockscreen)

Linux Console Options

Option Description
-f, --framebuffer Enable framebuffer mode (requires /dev/fb0 access)
--fb-mode <MODE> Text mode: 40x25, 80x25, 80x43, 80x50, 160x50, 160x100, 320x100, 320x200
--fb-scale <SCALE> Pixel scale factor (1, 2, 3, 4, or auto)
--fb-font <FONT> Console font name (e.g., Unifont-APL8x16)
--fb-list-fonts List available console fonts and exit
--fb-setup Launch interactive framebuffer setup wizard
--mouse-device <DEVICE> Mouse input device (e.g., /dev/input/event2)
--mouse-sensitivity <VALUE> Mouse sensitivity for TTY mode (0.1-5.0, default: auto)
--swap-mouse-buttons Swap left/right mouse buttons
--invert-mouse-x Invert mouse X-axis movement
--invert-mouse-y Invert mouse Y-axis movement

Note: Linux console options require --features framebuffer-backend at compile time and running on a physical console (TTY1-6), not in terminal emulators or SSH.

Themes

NDD Theme
NDD
Qbasic Theme
Qbasic
TurboP Theme
TurboP
NCC Theme
NCC
Dracu Theme
Dracu
Dark Theme
Dark
XT Theme
XT
WP Theme
WP
dB Theme
dB

Lockscreen

System-authenticated lockscreen using PAM (Linux), Directory Services (macOS), or Windows Security.

Trigger Command
Keyboard Shift+Q
CLI (Unix) term39 --lock
Signal (Unix) kill -USR1 $(pgrep term39)

Features: Opaque background, progressive lockout (5s→120s after 3+ failures), auto-fill username.

Note: Disabled with warning if authentication system unavailable.

Architecture

Core: Double-buffered video system, window manager (Z-order/focus), VT100/ANSI parser (VTE), PTY integration (portable-pty) Rendering: Front/back buffers with dirty tracking, save/restore regions, shadow system for depth

Development

Prerequisites: Rust 1.70+ (Install)

cargo build --release                     # Build optimized binary
cargo run -- --ascii                      # Run in ASCII mode
cargo test && cargo clippy && cargo fmt   # Test, lint, format

Configuration

Configuration files are stored in ~/.config/term39/:

File Description
session.toml Saved session (window layouts, terminal content)
fb.toml Framebuffer settings (Linux only)

Available themes: classic (default), dark, monochrome, green_phosphor, amber, dracu, ndd, qbasic, turbo, nc, xt, wp, db, system

Contributing

See CONTRIBUTING.md for guidelines on how to contribute to this project.

Dependencies

Core: crossterm (terminal I/O), chrono (clock), portable-pty (PTY), vte (ANSI parser), clap (CLI args), serde/toml (config)

Optional: arboard (clipboard, default), framebuffer (Linux FB mode)

Cargo Features

clipboard (Default: ON)

System clipboard integration with Ctrl+Shift+C/V.

  • Enable: Desktop usage, copy/paste between apps
  • Disable: Android/Termux, headless servers → --no-default-features

framebuffer-backend (Default: ON for Linux)

Direct Linux framebuffer rendering with DOS text modes (40x25, 80x25, ... , 320x200).

  • Modes: 40x25, 80x25, 80x43, 80x50, 160x50, 160x100, 320x100, 320x200
  • Platform: Linux only (automatically disabled on macOS/Windows)
  • Disable: To opt-out on Linux → --no-default-features --features clipboard
  • Requires: /dev/fb0 access (root or 'video' group), physical console only
# Build/Install
# Standard (includes framebuffer on Linux)
cargo build --release

# Without framebuffer
cargo build --release --no-default-features --features clipboard

## Minimal (no clipboard, no framebuffer)
cargo build --release --no-default-features

# Standard (includes framebuffer on Linux)
cargo install term39

# Without framebuffer
cargo install term39 --no-default-features --features clipboard

# Run framebuffer
sudo ./target/release/term39 -f --fb-mode=80x25

License

MIT License - see LICENSE file.

Support

Issues | Discussions | Wiki

Dependencies

~10–30MB
~421K SLoC