NDS - Noras Detached Shell ๐
Simple detachable shell sessions with zero configuration. Not a complex multiplexer like tmux or screen - just clean, persistent sessions you can attach and detach as needed.
Features โข Installation โข Usage โข Documentation โข Contributing
โจ Features
- ๐ฏ Simple Session Management: Create, detach, and reattach shell sessions with ease
- ๐ชถ Lightweight: < 1MB single binary with zero configuration required
- โก Fast: Written in Rust for maximum performance
- ๐จ User-Friendly: Intuitive commands with partial ID and name matching
- ๐ฅ๏ธ Interactive Mode: Sleek TUI session picker with real-time status
- ๐ Session History: Track all session events with persistent history
- ๐งน Auto-Cleanup: Automatic cleanup of dead sessions
- ๐ Session Switching: Simple attach/detach without complex multiplexing
- ๐ท๏ธ Named Sessions: Give meaningful names to your sessions
- ๐ง Cross-Platform: Works on Linux and macOS
๐ฏ Philosophy
NDS transforms your normal shell into a detachable, persistent session without changing how you work. No panes, no tabs, no complex layouts - just your shell, but better. When you need splits or tabs, your terminal emulator already handles that perfectly. NDS does one thing exceptionally well: making any shell session detachable and persistent.
๐ฆ Installation
Using Cargo
From Source
# Clone the repository
# Build and install (recommended)
# Or manually
๐ Quick Start
# Create a new session
# List sessions
# Attach to a session
# Detach from current session
# Press Enter, then ~d (like SSH's escape sequences)
๐ Usage
Creating Sessions
# Create and attach to a new session
# Create a named session
# Create without attaching
Managing Sessions
# List all active sessions
# Interactive session picker with TUI
# Attach to a session (supports partial ID and name matching)
# Kill sessions (supports ID and name)
# Clean up dead sessions
Session Information
# Get detailed info about a session (supports ID and name)
# Rename a session (supports ID and name)
# View session history
Keyboard Shortcuts (Inside Session)
Enter, ~d- Detach from current session (like SSH's~.sequence)Ctrl+D- Detach from current session (when at empty prompt)Enter, ~s- Switch to another session interactively
๐๏ธ Architecture
NDS uses a simple and robust architecture:
- PTY Management: Each session runs in its own pseudo-terminal
- Unix Sockets: Communication via Unix domain sockets (0600 permissions)
- JSON Metadata: Session info stored in
~/.nds/sessions/ - Per-Session History: History stored in
~/.nds/history/ - Zero Dependencies: Minimal external dependencies for reliability
- Async I/O Support: Optional async runtime with Tokio for high concurrency
- Optimized Buffers: 16KB buffers for 4x throughput improvement
Directory Structure
~/.nds/
โโโ sessions/ # Session metadata (JSON)
โโโ sockets/ # Unix domain sockets (0600 permissions)
โโโ history/ # Session history
โโโ active/ # Currently running sessions
โโโ archived/ # Terminated sessions
๐ Security
NDS implements multiple security layers to protect your sessions:
Session Isolation
- Unix Socket Permissions: All sockets created with
0600(owner read/write only) - Session Umask: Sessions run with
umask 0077for restrictive file creation - Process Isolation: Each session runs in its own process with separate PTY
Input Validation
- Command Whitelisting: Only safe NDS control commands allowed (
resize,detach,attach, etc.) - Input Sanitization: Control characters and potentially harmful inputs are filtered
- Buffer Limits: Maximum 8KB command length and 10 arguments to prevent overflow
- Numeric Bounds: Terminal dimensions limited to 1-9999 to prevent resource exhaustion
Important Note
NDS is a terminal multiplexer, not a sandbox. Shell commands within sessions are not restricted - you have full access to your shell just as you would in a normal terminal. The security measures protect the NDS control plane and session management, not the shell commands you run inside sessions.
โก Performance
NDS is optimized for speed and efficiency:
Buffer Optimization
- 16KB I/O Buffers: 4x throughput improvement over standard 4KB buffers
- 2MB Scrollback Buffer: Increased from 1MB for better history retention
- Benchmarked: 25+ GB/s throughput in buffer operations
Async I/O (Optional)
Enable async features for high-concurrency scenarios:
# Cargo.toml
[]
= { = "0.1", = ["async"] }
With async enabled:
- Non-blocking socket operations
- Concurrent session management with
Arc<RwLock> - Tokio runtime for scalable I/O
๐ง Configuration
NDS works out of the box with zero configuration. However, you can customize:
Environment Variables
# Change default shell (default: $SHELL or /bin/sh)
# Session identification (automatically set inside sessions)
# Change detach key binding (coming soon)
๐ค Contributing
We love contributions! Please see CONTRIBUTING.md for details.
Development Setup
# Clone the repo
# Run tests
# Run with debug logs
RUST_LOG=debug
# Quick rebuild and test
Running Tests
# Run all tests (55+ unit and integration tests)
# Run with all features including async
# Run specific test categories
# Run with coverage
# Run performance benchmarks
๐ง Project Status
Alpha Release - NDS is in active development. Core functionality is stable, but expect breaking changes.
๐ License
This project is licensed under the MIT License - see the LICENSE file for details.
๐ Acknowledgments
๐ Troubleshooting
Session not found after reboot
Sessions don't persist across system reboots by design. Use nds history --all to see past sessions.
Permission denied errors
Ensure ~/.nds/ directory has proper permissions:
Can't detach from session
Make sure you're using the correct key sequence: press Enter first, then ~d (similar to SSH's escape sequences).
Half screen or duplicated lines after attaching
If you see only part of a full-screen app (like htop) or repeated prompt lines after reattaching, upgrade to the latest NDS build. Earlier versions flipped the client socket to non-blocking mode before replaying buffered output, dropping large frames and queuing failures. Recent releases send the backlog while still blocking, then queue any partial writes so slow terminals catch up cleanly.
๐ฎ Support
- ๐ Report bugs
- ๐ก Request features
- ๐ฌ Discussions