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).
๐ฎ Support
- ๐ Report bugs
- ๐ก Request features
- ๐ฌ Discussions