Skip to content

alejandroqh/term39

Repository files navigation

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 / FreeBSD / NetBSD / OpenBSD / 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
  • Control Center: Centralized panel with WiFi status, time/date, clipboard, and settings access
  • 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, FreeBSD, NetBSD, OpenBSD 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

From crates.io (Recommended)

# 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.

FreeBSD (Experimental)

Note: BSD support is experimental. Please report any issues on GitHub.

Download from Releases:

tar xzf term39-*-freebsd-64bit-x86-binary.tar.gz
sudo mv term39 /usr/local/bin/

Or build from source:

# FreeBSD with PAM lockscreen
cargo build --release --no-default-features --features bsd

# FreeBSD without lockscreen
cargo build --release --no-default-features --features bsd-minimal

NetBSD / OpenBSD (Experimental)

Note: BSD support is experimental. Please report any issues on GitHub.

Build from source (no pre-built binaries available):

# NetBSD with PAM lockscreen
cargo build --release --no-default-features --features bsd

# OpenBSD (no PAM, use PIN authentication)
cargo build --release --no-default-features --features bsd-minimal

Note: On OpenBSD, PAM is not available. Use bsd-minimal feature which enables PIN-based lockscreen authentication instead.

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, FreeBSD, NetBSD), Directory Services (macOS), or Windows Security. OpenBSD uses PIN authentication.

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

bsd Feature Profile (Experimental)

Full BSD support with PAM lockscreen (FreeBSD, NetBSD). BSD support is experimental.

cargo build --release --no-default-features --features bsd

bsd-minimal Feature Profile (Experimental)

BSD support without PAM (OpenBSD, or when PAM is unavailable). BSD support is experimental.

cargo build --release --no-default-features --features bsd-minimal

Related Projects

TermOS

TermOS is a lightweight Linux distribution designed to run term39 as the primary desktop environment. It provides a complete DOS-like computing experience directly from boot, with term39 serving as the window manager and shell interface.

License

MIT License - see LICENSE file.

Support

Issues | Discussions | Wiki

About

A modern, retro-styled terminal multiplexer built with Rust.

Topics

Resources

License

Contributing

Stars

Watchers

Forks

Sponsor this project

Packages

No packages published