Skip to content

Repository files navigation

TeleMux

Bidirectional Telegram integration for tmux sessions - Monitor commands, interact with agents, and stay connected to your terminal from anywhere.

Features

  • One-way notifications: Send alerts to Telegram when commands complete
  • Bidirectional communication: Interact with tmux sessions via Telegram
  • Agent support: Create interactive agents that can receive replies
  • Session routing: Messages automatically delivered to the correct tmux session
  • Daemon-based: Runs as a background service in tmux
  • Shell integration: Simple shell functions for easy use
  • Secure: Configuration files are automatically protected (chmod 600)

Installation

Via pip (Recommended)

# Install the package
pip install telemux
# Run the interactive installer
telemux install
# Start the listener daemon
telemux start

From source

# Clone the repository
git clone https://github.com/malmazan/telemux.git
cd telemux
# Install in development mode
pip install -e .# Run the installer
telemux install

Quick Start

1. Create a Telegram Bot

  1. Open Telegram and search for @BotFather
  2. Send /newbot and follow the prompts
  3. Save the bot token provided

2. Install TeleMux

# Install via pip
pip install telemux
# Run the interactive installer
telemux install

The installer will:

  • Check prerequisites (tmux, python3, curl)
  • Validate your bot token
  • Auto-detect available chats (with retry logic)
  • Create configuration files
  • Install shell functions
  • Test the connection

3. Start the Listener

# Start the daemon
telemux start
# Check status
telemux status
# View logs
telemux logs

4. Use Shell Functions

# Send a simple notification
tg_alert "Build complete!"# Send a message and receive replies (auto-detects tmux session name)
tg_agent "Ready to deploy to production?"# Reply via Telegram: "session-name: yes"# The reply appears directly in your terminal# Get notified when a command completes
npm run build && tg_done

Commands

Control Commands

telemux start # Start the listener daemon
telemux stop # Stop the listener daemon
telemux restart # Restart the listener daemon
telemux status # Check daemon status
telemux logs # View listener logs (tail -f)
telemux attach # Attach to the listener tmux session
telemux cleanup # Rotate and clean up log files
telemux doctor # Run health check and diagnose issues
telemux install # Run interactive installer

Shortcuts

For convenience, all commands have tg- shortcuts:

tg-start # Same as: telemux start
tg-stop # Same as: telemux stop
tg-status # Same as: telemux status
tg-logs # Same as: telemux logs

Shell Functions

After installation, these functions are available in your shell:

tg_alert

Send one-way notifications to Telegram:

tg_alert "Message text"

Examples:

# Simple notification
tg_alert "Server is ready"# Notify when command completes
npm install && tg_alert "Dependencies installed"# Multiline messages
tg_alert "Deploy complete- 50 files updated- 0 errors"

tg_agent

Send messages and receive replies via Telegram (automatically uses your tmux session name):

tg_agent "Message text"

Examples:

# Ask a question (inside a tmux session named "deploy")
tg_agent "Ready to deploy to production?"# Wait for user response via Telegram# User replies: "deploy: yes, proceed"# Reply appears in your terminal# Use in scripts (inside a tmux session named "approval")
tg_agent "Approve release v2.0?"# Returns the session name, user responds via Telegram# Check incoming message for approval

tg_done

Automatically notify when the previous command completes:

npm run build && tg_done

This sends a notification with:

  • Command that ran
  • Exit code (success/failure)
  • Timestamp

Bidirectional Communication

TeleMux uses session-based routing for bidirectional communication:

Sending Messages from Terminal

# In tmux session named "deploy"
tg_agent "Should I proceed with deployment?"

This sends a message to Telegram with instructions on how to reply. The session name is automatically detected.

Replying from Telegram

Reply with the format: session-name: your message

deploy: yes, proceed with deployment

The reply is automatically routed to the correct tmux session and appears in your terminal.

Telegram Commands

Send these commands directly to your Telegram bot:

  • capture - Capture and send back the last 100 lines of your active session
  • capture on - Enable auto-capture (waits 5 seconds after each message, then sends output)
  • capture off - Disable auto-capture
  • capture status - Check if auto-capture is enabled

Security

  • Messages are routed only to existing tmux sessions
  • User input is sanitized to prevent command injection
  • Session names are validated before routing
  • No session names are revealed in error messages

Bypass Sanitization (Advanced):

By default, all messages are sanitized using shlex.quote() to prevent command injection. If you need to send raw commands with special characters, prefix your message with !:

# Normal (sanitized) - safe for user input
session-name: echo"Hello World"# Bypass sanitization - execute command directly and get output
session-name: !ls -la
session-name: !echo "Current directory: $(pwd)"
session-name: !git status

When using the ! prefix, TeleMux will:

  1. Execute the command directly without sanitization
  2. Wait 2 seconds for the command to complete
  3. Capture the last 100 lines of terminal output
  4. Send the output back to you via Telegram

WARNING: The ! prefix disables all security sanitization. Only use this when you control the input and understand the security implications. Malicious use could execute arbitrary commands.

Configuration

Configuration is stored in ~/.telemux/:

~/.telemux/
├── telegram_config # Bot token and chat ID (chmod 600)
├── telegram_listener.log # Listener daemon logs
├── telegram_errors.log # Error logs
├── message_queue/ # Message routing data
│ ├── outgoing.log # Sent messages
│ ├── incoming.log # Received messages
│ └── archive/ # Rotated logs
└── shell_functions.sh # Shell integration functions

Environment Variables

You can override configuration with environment variables:

export TELEMUX_TG_BOT_TOKEN="your-bot-token"export TELEMUX_TG_CHAT_ID="your-chat-id"export TELEMUX_TG_USER_ID="your-user-id"# Optional: restrict control to specific userexport TELEMUX_LOG_LEVEL="DEBUG"# DEBUG, INFO, WARNING, ERROR

Log Management

Logs are automatically rotated when they exceed 10MB:

# Manual log rotation
telemux cleanup
# Install automatic monthly cleanup
telemux cleanup --install-cron

Archives are stored in ~/.telemux/message_queue/archive/ and compressed with gzip.

Troubleshooting

Run Health Check

telemux doctor

This checks:

  • Prerequisites (tmux, python3)
  • Configuration files
  • Telegram bot connection
  • Listener daemon status
  • Log files

Common Issues

Listener won't start:

# Check if it's already running
telemux status
# View logs for errors
telemux logs
# Restart the listener
telemux restart

Messages not being received:

# Check listener status
telemux status
# Verify configuration
cat ~/.telemux/telegram_config
# Test bot connection
telemux doctor

Shell functions not available:

# Reload your shell configurationsource~/.zshrc # or ~/.bashrc# Verify functions are sourcedtype tg_alert

Examples

Long-Running Build Notification

#!/bin/bash# Build script with notificationecho"Starting build..."
tg_alert "Build started for project-x"
npm run build
if [ $?-eq 0 ];then
tg_alert "Build succeeded!"else
tg_alert "Build failed! Check logs."fi

Interactive Deployment Agent

#!/bin/bash# Deployment with approval (run in tmux session named "deploy")
tg_agent "Ready to deploy v2.0 to production?"# User responds via Telegram: "deploy: yes"# Response appears in terminalread -p "Proceed with deployment? " response
if [[ "$response"==*"yes"* ]];then
./deploy.sh
tg_alert "Deployment complete!"fi

Multi-Step Workflow

#!/bin/bash# Complex workflow with multiple checkpoints (run in tmux session named "migration")
tg_alert "Starting migration workflow..."# Step 1: Backup
tg_agent "Backup database before migration?"# Wait for approval...# Step 2: Migration
./run-migration.sh && tg_done
# Step 3: Verification
tg_agent "Verify migration results?"# Wait for verification...
tg_alert "Migration workflow complete!"

Development

Running Tests

# Install development dependencies
pip install -e ".[dev]"# Run tests
pytest
# Run with coverage
pytest --cov=telemux --cov-report=term-missing

Project Structure

telemux/
├── telemux/
│ ├── __init__.py # Package initialization
│ ├── cli.py # Main CLI entry point
│ ├── control.py # Daemon control (start, stop, status)
│ ├── listener.py # Telegram listener daemon
│ ├── installer.py # Interactive installer
│ ├── cleanup.py # Log rotation and cleanup
│ ├── config.py # Configuration management
│ └── shell_functions.sh # Shell integration
├── examples/ # Example scripts
├── tests/ # Test suite
├── pyproject.toml # Package metadata and dependencies
├── MANIFEST.in # Package file manifest
└── README.md # This file

Requirements

  • Python 3.7+
  • tmux
  • curl
  • requests library (automatically installed)

License

MIT License - see LICENSE file for details

Contributing

Contributions are welcome! Please:

  1. Fork the repository
  2. Create a feature branch
  3. Make your changes
  4. Add tests if applicable
  5. Submit a pull request

Changelog

See CHANGELOG.md for version history.

Support

Credits

Created by Marco Almazan

Related Projects

About

Bidirectional Telegram bridge for tmux sessions running LLM CLI tools (Claude Code, Codex, Gemini). Send alerts and receive replies directly in your terminal.

Resources

Contributing

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
GitHub - maarco/telemux: Bidirectional Telegram bridge for tmux sessions running LLM CLI tools (Claude Code, Codex, Gemini). Send alerts and receive replies directly in your terminal. · GitHub
Skip to content

Repository files navigation

TeleMux

Bidirectional Telegram integration for tmux sessions - Monitor commands, interact with agents, and stay connected to your terminal from anywhere.

Features

  • One-way notifications: Send alerts to Telegram when commands complete
  • Bidirectional communication: Interact with tmux sessions via Telegram
  • Agent support: Create interactive agents that can receive replies
  • Session routing: Messages automatically delivered to the correct tmux session
  • Daemon-based: Runs as a background service in tmux
  • Shell integration: Simple shell functions for easy use
  • Secure: Configuration files are automatically protected (chmod 600)

Installation

Via pip (Recommended)

# Install the package
pip install telemux
# Run the interactive installer
telemux install
# Start the listener daemon
telemux start

From source

# Clone the repository
git clone https://github.com/malmazan/telemux.git
cd telemux
# Install in development mode
pip install -e .# Run the installer
telemux install

Quick Start

1. Create a Telegram Bot

  1. Open Telegram and search for @BotFather
  2. Send /newbot and follow the prompts
  3. Save the bot token provided

2. Install TeleMux

# Install via pip
pip install telemux
# Run the interactive installer
telemux install

The installer will:

  • Check prerequisites (tmux, python3, curl)
  • Validate your bot token
  • Auto-detect available chats (with retry logic)
  • Create configuration files
  • Install shell functions
  • Test the connection

3. Start the Listener

# Start the daemon
telemux start
# Check status
telemux status
# View logs
telemux logs

4. Use Shell Functions

# Send a simple notification
tg_alert "Build complete!"# Send a message and receive replies (auto-detects tmux session name)
tg_agent "Ready to deploy to production?"# Reply via Telegram: "session-name: yes"# The reply appears directly in your terminal# Get notified when a command completes
npm run build && tg_done

Commands

Control Commands

telemux start # Start the listener daemon
telemux stop # Stop the listener daemon
telemux restart # Restart the listener daemon
telemux status # Check daemon status
telemux logs # View listener logs (tail -f)
telemux attach # Attach to the listener tmux session
telemux cleanup # Rotate and clean up log files
telemux doctor # Run health check and diagnose issues
telemux install # Run interactive installer

Shortcuts

For convenience, all commands have tg- shortcuts:

tg-start # Same as: telemux start
tg-stop # Same as: telemux stop
tg-status # Same as: telemux status
tg-logs # Same as: telemux logs

Shell Functions

After installation, these functions are available in your shell:

tg_alert

Send one-way notifications to Telegram:

tg_alert "Message text"

Examples:

# Simple notification
tg_alert "Server is ready"# Notify when command completes
npm install && tg_alert "Dependencies installed"# Multiline messages
tg_alert "Deploy complete- 50 files updated- 0 errors"

tg_agent

Send messages and receive replies via Telegram (automatically uses your tmux session name):

tg_agent "Message text"

Examples:

# Ask a question (inside a tmux session named "deploy")
tg_agent "Ready to deploy to production?"# Wait for user response via Telegram# User replies: "deploy: yes, proceed"# Reply appears in your terminal# Use in scripts (inside a tmux session named "approval")
tg_agent "Approve release v2.0?"# Returns the session name, user responds via Telegram# Check incoming message for approval

tg_done

Automatically notify when the previous command completes:

npm run build && tg_done

This sends a notification with:

  • Command that ran
  • Exit code (success/failure)
  • Timestamp

Bidirectional Communication

TeleMux uses session-based routing for bidirectional communication:

Sending Messages from Terminal

# In tmux session named "deploy"
tg_agent "Should I proceed with deployment?"

This sends a message to Telegram with instructions on how to reply. The session name is automatically detected.

Replying from Telegram

Reply with the format: session-name: your message

deploy: yes, proceed with deployment

The reply is automatically routed to the correct tmux session and appears in your terminal.

Telegram Commands

Send these commands directly to your Telegram bot:

  • capture - Capture and send back the last 100 lines of your active session
  • capture on - Enable auto-capture (waits 5 seconds after each message, then sends output)
  • capture off - Disable auto-capture
  • capture status - Check if auto-capture is enabled

Security

  • Messages are routed only to existing tmux sessions
  • User input is sanitized to prevent command injection
  • Session names are validated before routing
  • No session names are revealed in error messages

Bypass Sanitization (Advanced):

By default, all messages are sanitized using shlex.quote() to prevent command injection. If you need to send raw commands with special characters, prefix your message with !:

# Normal (sanitized) - safe for user input
session-name: echo"Hello World"# Bypass sanitization - execute command directly and get output
session-name: !ls -la
session-name: !echo "Current directory: $(pwd)"
session-name: !git status

When using the ! prefix, TeleMux will:

  1. Execute the command directly without sanitization
  2. Wait 2 seconds for the command to complete
  3. Capture the last 100 lines of terminal output
  4. Send the output back to you via Telegram

WARNING: The ! prefix disables all security sanitization. Only use this when you control the input and understand the security implications. Malicious use could execute arbitrary commands.

Configuration

Configuration is stored in ~/.telemux/:

~/.telemux/
├── telegram_config # Bot token and chat ID (chmod 600)
├── telegram_listener.log # Listener daemon logs
├── telegram_errors.log # Error logs
├── message_queue/ # Message routing data
│ ├── outgoing.log # Sent messages
│ ├── incoming.log # Received messages
│ └── archive/ # Rotated logs
└── shell_functions.sh # Shell integration functions

Environment Variables

You can override configuration with environment variables:

export TELEMUX_TG_BOT_TOKEN="your-bot-token"export TELEMUX_TG_CHAT_ID="your-chat-id"export TELEMUX_TG_USER_ID="your-user-id"# Optional: restrict control to specific userexport TELEMUX_LOG_LEVEL="DEBUG"# DEBUG, INFO, WARNING, ERROR

Log Management

Logs are automatically rotated when they exceed 10MB:

# Manual log rotation
telemux cleanup
# Install automatic monthly cleanup
telemux cleanup --install-cron

Archives are stored in ~/.telemux/message_queue/archive/ and compressed with gzip.

Troubleshooting

Run Health Check

telemux doctor

This checks:

  • Prerequisites (tmux, python3)
  • Configuration files
  • Telegram bot connection
  • Listener daemon status
  • Log files

Common Issues

Listener won't start:

# Check if it's already running
telemux status
# View logs for errors
telemux logs
# Restart the listener
telemux restart

Messages not being received:

# Check listener status
telemux status
# Verify configuration
cat ~/.telemux/telegram_config
# Test bot connection
telemux doctor

Shell functions not available:

# Reload your shell configurationsource~/.zshrc # or ~/.bashrc# Verify functions are sourcedtype tg_alert

Examples

Long-Running Build Notification

#!/bin/bash# Build script with notificationecho"Starting build..."
tg_alert "Build started for project-x"
npm run build
if [ $?-eq 0 ];then
tg_alert "Build succeeded!"else
tg_alert "Build failed! Check logs."fi

Interactive Deployment Agent

#!/bin/bash# Deployment with approval (run in tmux session named "deploy")
tg_agent "Ready to deploy v2.0 to production?"# User responds via Telegram: "deploy: yes"# Response appears in terminalread -p "Proceed with deployment? " response
if [[ "$response"==*"yes"* ]];then
./deploy.sh
tg_alert "Deployment complete!"fi

Multi-Step Workflow

#!/bin/bash# Complex workflow with multiple checkpoints (run in tmux session named "migration")
tg_alert "Starting migration workflow..."# Step 1: Backup
tg_agent "Backup database before migration?"# Wait for approval...# Step 2: Migration
./run-migration.sh && tg_done
# Step 3: Verification
tg_agent "Verify migration results?"# Wait for verification...
tg_alert "Migration workflow complete!"

Development

Running Tests

# Install development dependencies
pip install -e ".[dev]"# Run tests
pytest
# Run with coverage
pytest --cov=telemux --cov-report=term-missing

Project Structure

telemux/
├── telemux/
│ ├── __init__.py # Package initialization
│ ├── cli.py # Main CLI entry point
│ ├── control.py # Daemon control (start, stop, status)
│ ├── listener.py # Telegram listener daemon
│ ├── installer.py # Interactive installer
│ ├── cleanup.py # Log rotation and cleanup
│ ├── config.py # Configuration management
│ └── shell_functions.sh # Shell integration
├── examples/ # Example scripts
├── tests/ # Test suite
├── pyproject.toml # Package metadata and dependencies
├── MANIFEST.in # Package file manifest
└── README.md # This file

Requirements

  • Python 3.7+
  • tmux
  • curl
  • requests library (automatically installed)

License

MIT License - see LICENSE file for details

Contributing

Contributions are welcome! Please:

  1. Fork the repository
  2. Create a feature branch
  3. Make your changes
  4. Add tests if applicable
  5. Submit a pull request

Changelog

See CHANGELOG.md for version history.

Support

Credits

Created by Marco Almazan

Related Projects

About

Bidirectional Telegram bridge for tmux sessions running LLM CLI tools (Claude Code, Codex, Gemini). Send alerts and receive replies directly in your terminal.

Resources

Contributing

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - maarco/telemux: Bidirectional Telegram bridge for tmux sessions running LLM CLI tools (Claude Code, Codex, Gemini). Send alerts and receive replies directly in your terminal. · GitHub
Skip to content

Repository files navigation

TeleMux

Bidirectional Telegram integration for tmux sessions - Monitor commands, interact with agents, and stay connected to your terminal from anywhere.

Features

  • One-way notifications: Send alerts to Telegram when commands complete
  • Bidirectional communication: Interact with tmux sessions via Telegram
  • Agent support: Create interactive agents that can receive replies
  • Session routing: Messages automatically delivered to the correct tmux session
  • Daemon-based: Runs as a background service in tmux
  • Shell integration: Simple shell functions for easy use
  • Secure: Configuration files are automatically protected (chmod 600)

Installation

Via pip (Recommended)

# Install the package
pip install telemux
# Run the interactive installer
telemux install
# Start the listener daemon
telemux start

From source

# Clone the repository
git clone https://github.com/malmazan/telemux.git
cd telemux
# Install in development mode
pip install -e .# Run the installer
telemux install

Quick Start

1. Create a Telegram Bot

  1. Open Telegram and search for @BotFather
  2. Send /newbot and follow the prompts
  3. Save the bot token provided

2. Install TeleMux

# Install via pip
pip install telemux
# Run the interactive installer
telemux install

The installer will:

  • Check prerequisites (tmux, python3, curl)
  • Validate your bot token
  • Auto-detect available chats (with retry logic)
  • Create configuration files
  • Install shell functions
  • Test the connection

3. Start the Listener

# Start the daemon
telemux start
# Check status
telemux status
# View logs
telemux logs

4. Use Shell Functions

# Send a simple notification
tg_alert "Build complete!"# Send a message and receive replies (auto-detects tmux session name)
tg_agent "Ready to deploy to production?"# Reply via Telegram: "session-name: yes"# The reply appears directly in your terminal# Get notified when a command completes
npm run build && tg_done

Commands

Control Commands

telemux start # Start the listener daemon
telemux stop # Stop the listener daemon
telemux restart # Restart the listener daemon
telemux status # Check daemon status
telemux logs # View listener logs (tail -f)
telemux attach # Attach to the listener tmux session
telemux cleanup # Rotate and clean up log files
telemux doctor # Run health check and diagnose issues
telemux install # Run interactive installer

Shortcuts

For convenience, all commands have tg- shortcuts:

tg-start # Same as: telemux start
tg-stop # Same as: telemux stop
tg-status # Same as: telemux status
tg-logs # Same as: telemux logs

Shell Functions

After installation, these functions are available in your shell:

tg_alert

Send one-way notifications to Telegram:

tg_alert "Message text"

Examples:

# Simple notification
tg_alert "Server is ready"# Notify when command completes
npm install && tg_alert "Dependencies installed"# Multiline messages
tg_alert "Deploy complete- 50 files updated- 0 errors"

tg_agent

Send messages and receive replies via Telegram (automatically uses your tmux session name):

tg_agent "Message text"

Examples:

# Ask a question (inside a tmux session named "deploy")
tg_agent "Ready to deploy to production?"# Wait for user response via Telegram# User replies: "deploy: yes, proceed"# Reply appears in your terminal# Use in scripts (inside a tmux session named "approval")
tg_agent "Approve release v2.0?"# Returns the session name, user responds via Telegram# Check incoming message for approval

tg_done

Automatically notify when the previous command completes:

npm run build && tg_done

This sends a notification with:

  • Command that ran
  • Exit code (success/failure)
  • Timestamp

Bidirectional Communication

TeleMux uses session-based routing for bidirectional communication:

Sending Messages from Terminal

# In tmux session named "deploy"
tg_agent "Should I proceed with deployment?"

This sends a message to Telegram with instructions on how to reply. The session name is automatically detected.

Replying from Telegram

Reply with the format: session-name: your message

deploy: yes, proceed with deployment

The reply is automatically routed to the correct tmux session and appears in your terminal.

Telegram Commands

Send these commands directly to your Telegram bot:

  • capture - Capture and send back the last 100 lines of your active session
  • capture on - Enable auto-capture (waits 5 seconds after each message, then sends output)
  • capture off - Disable auto-capture
  • capture status - Check if auto-capture is enabled

Security

  • Messages are routed only to existing tmux sessions
  • User input is sanitized to prevent command injection
  • Session names are validated before routing
  • No session names are revealed in error messages

Bypass Sanitization (Advanced):

By default, all messages are sanitized using shlex.quote() to prevent command injection. If you need to send raw commands with special characters, prefix your message with !:

# Normal (sanitized) - safe for user input
session-name: echo"Hello World"# Bypass sanitization - execute command directly and get output
session-name: !ls -la
session-name: !echo "Current directory: $(pwd)"
session-name: !git status

When using the ! prefix, TeleMux will:

  1. Execute the command directly without sanitization
  2. Wait 2 seconds for the command to complete
  3. Capture the last 100 lines of terminal output
  4. Send the output back to you via Telegram

WARNING: The ! prefix disables all security sanitization. Only use this when you control the input and understand the security implications. Malicious use could execute arbitrary commands.

Configuration

Configuration is stored in ~/.telemux/:

~/.telemux/
├── telegram_config # Bot token and chat ID (chmod 600)
├── telegram_listener.log # Listener daemon logs
├── telegram_errors.log # Error logs
├── message_queue/ # Message routing data
│ ├── outgoing.log # Sent messages
│ ├── incoming.log # Received messages
│ └── archive/ # Rotated logs
└── shell_functions.sh # Shell integration functions

Environment Variables

You can override configuration with environment variables:

export TELEMUX_TG_BOT_TOKEN="your-bot-token"export TELEMUX_TG_CHAT_ID="your-chat-id"export TELEMUX_TG_USER_ID="your-user-id"# Optional: restrict control to specific userexport TELEMUX_LOG_LEVEL="DEBUG"# DEBUG, INFO, WARNING, ERROR

Log Management

Logs are automatically rotated when they exceed 10MB:

# Manual log rotation
telemux cleanup
# Install automatic monthly cleanup
telemux cleanup --install-cron

Archives are stored in ~/.telemux/message_queue/archive/ and compressed with gzip.

Troubleshooting

Run Health Check

telemux doctor

This checks:

  • Prerequisites (tmux, python3)
  • Configuration files
  • Telegram bot connection
  • Listener daemon status
  • Log files

Common Issues

Listener won't start:

# Check if it's already running
telemux status
# View logs for errors
telemux logs
# Restart the listener
telemux restart

Messages not being received:

# Check listener status
telemux status
# Verify configuration
cat ~/.telemux/telegram_config
# Test bot connection
telemux doctor

Shell functions not available:

# Reload your shell configurationsource~/.zshrc # or ~/.bashrc# Verify functions are sourcedtype tg_alert

Examples

Long-Running Build Notification

#!/bin/bash# Build script with notificationecho"Starting build..."
tg_alert "Build started for project-x"
npm run build
if [ $?-eq 0 ];then
tg_alert "Build succeeded!"else
tg_alert "Build failed! Check logs."fi

Interactive Deployment Agent

#!/bin/bash# Deployment with approval (run in tmux session named "deploy")
tg_agent "Ready to deploy v2.0 to production?"# User responds via Telegram: "deploy: yes"# Response appears in terminalread -p "Proceed with deployment? " response
if [[ "$response"==*"yes"* ]];then
./deploy.sh
tg_alert "Deployment complete!"fi

Multi-Step Workflow

#!/bin/bash# Complex workflow with multiple checkpoints (run in tmux session named "migration")
tg_alert "Starting migration workflow..."# Step 1: Backup
tg_agent "Backup database before migration?"# Wait for approval...# Step 2: Migration
./run-migration.sh && tg_done
# Step 3: Verification
tg_agent "Verify migration results?"# Wait for verification...
tg_alert "Migration workflow complete!"

Development

Running Tests

# Install development dependencies
pip install -e ".[dev]"# Run tests
pytest
# Run with coverage
pytest --cov=telemux --cov-report=term-missing

Project Structure

telemux/
├── telemux/
│ ├── __init__.py # Package initialization
│ ├── cli.py # Main CLI entry point
│ ├── control.py # Daemon control (start, stop, status)
│ ├── listener.py # Telegram listener daemon
│ ├── installer.py # Interactive installer
│ ├── cleanup.py # Log rotation and cleanup
│ ├── config.py # Configuration management
│ └── shell_functions.sh # Shell integration
├── examples/ # Example scripts
├── tests/ # Test suite
├── pyproject.toml # Package metadata and dependencies
├── MANIFEST.in # Package file manifest
└── README.md # This file

Requirements

  • Python 3.7+
  • tmux
  • curl
  • requests library (automatically installed)

License

MIT License - see LICENSE file for details

Contributing

Contributions are welcome! Please:

  1. Fork the repository
  2. Create a feature branch
  3. Make your changes
  4. Add tests if applicable
  5. Submit a pull request

Changelog

See CHANGELOG.md for version history.

Support

Credits

Created by Marco Almazan

Related Projects

About

Bidirectional Telegram bridge for tmux sessions running LLM CLI tools (Claude Code, Codex, Gemini). Send alerts and receive replies directly in your terminal.

Resources

Contributing

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - maarco/telemux: Bidirectional Telegram bridge for tmux sessions running LLM CLI tools (Claude Code, Codex, Gemini). Send alerts and receive replies directly in your terminal. · GitHub
Skip to content

Repository files navigation

TeleMux

Bidirectional Telegram integration for tmux sessions - Monitor commands, interact with agents, and stay connected to your terminal from anywhere.

Features

  • One-way notifications: Send alerts to Telegram when commands complete
  • Bidirectional communication: Interact with tmux sessions via Telegram
  • Agent support: Create interactive agents that can receive replies
  • Session routing: Messages automatically delivered to the correct tmux session
  • Daemon-based: Runs as a background service in tmux
  • Shell integration: Simple shell functions for easy use
  • Secure: Configuration files are automatically protected (chmod 600)

Installation

Via pip (Recommended)

# Install the package
pip install telemux
# Run the interactive installer
telemux install
# Start the listener daemon
telemux start

From source

# Clone the repository
git clone https://github.com/malmazan/telemux.git
cd telemux
# Install in development mode
pip install -e .# Run the installer
telemux install

Quick Start

1. Create a Telegram Bot

  1. Open Telegram and search for @BotFather
  2. Send /newbot and follow the prompts
  3. Save the bot token provided

2. Install TeleMux

# Install via pip
pip install telemux
# Run the interactive installer
telemux install

The installer will:

  • Check prerequisites (tmux, python3, curl)
  • Validate your bot token
  • Auto-detect available chats (with retry logic)
  • Create configuration files
  • Install shell functions
  • Test the connection

3. Start the Listener

# Start the daemon
telemux start
# Check status
telemux status
# View logs
telemux logs

4. Use Shell Functions

# Send a simple notification
tg_alert "Build complete!"# Send a message and receive replies (auto-detects tmux session name)
tg_agent "Ready to deploy to production?"# Reply via Telegram: "session-name: yes"# The reply appears directly in your terminal# Get notified when a command completes
npm run build && tg_done

Commands

Control Commands

telemux start # Start the listener daemon
telemux stop # Stop the listener daemon
telemux restart # Restart the listener daemon
telemux status # Check daemon status
telemux logs # View listener logs (tail -f)
telemux attach # Attach to the listener tmux session
telemux cleanup # Rotate and clean up log files
telemux doctor # Run health check and diagnose issues
telemux install # Run interactive installer

Shortcuts

For convenience, all commands have tg- shortcuts:

tg-start # Same as: telemux start
tg-stop # Same as: telemux stop
tg-status # Same as: telemux status
tg-logs # Same as: telemux logs

Shell Functions

After installation, these functions are available in your shell:

tg_alert

Send one-way notifications to Telegram:

tg_alert "Message text"

Examples:

# Simple notification
tg_alert "Server is ready"# Notify when command completes
npm install && tg_alert "Dependencies installed"# Multiline messages
tg_alert "Deploy complete- 50 files updated- 0 errors"

tg_agent

Send messages and receive replies via Telegram (automatically uses your tmux session name):

tg_agent "Message text"

Examples:

# Ask a question (inside a tmux session named "deploy")
tg_agent "Ready to deploy to production?"# Wait for user response via Telegram# User replies: "deploy: yes, proceed"# Reply appears in your terminal# Use in scripts (inside a tmux session named "approval")
tg_agent "Approve release v2.0?"# Returns the session name, user responds via Telegram# Check incoming message for approval

tg_done

Automatically notify when the previous command completes:

npm run build && tg_done

This sends a notification with:

  • Command that ran
  • Exit code (success/failure)
  • Timestamp

Bidirectional Communication

TeleMux uses session-based routing for bidirectional communication:

Sending Messages from Terminal

# In tmux session named "deploy"
tg_agent "Should I proceed with deployment?"

This sends a message to Telegram with instructions on how to reply. The session name is automatically detected.

Replying from Telegram

Reply with the format: session-name: your message

deploy: yes, proceed with deployment

The reply is automatically routed to the correct tmux session and appears in your terminal.

Telegram Commands

Send these commands directly to your Telegram bot:

  • capture - Capture and send back the last 100 lines of your active session
  • capture on - Enable auto-capture (waits 5 seconds after each message, then sends output)
  • capture off - Disable auto-capture
  • capture status - Check if auto-capture is enabled

Security

  • Messages are routed only to existing tmux sessions
  • User input is sanitized to prevent command injection
  • Session names are validated before routing
  • No session names are revealed in error messages

Bypass Sanitization (Advanced):

By default, all messages are sanitized using shlex.quote() to prevent command injection. If you need to send raw commands with special characters, prefix your message with !:

# Normal (sanitized) - safe for user input
session-name: echo"Hello World"# Bypass sanitization - execute command directly and get output
session-name: !ls -la
session-name: !echo "Current directory: $(pwd)"
session-name: !git status

When using the ! prefix, TeleMux will:

  1. Execute the command directly without sanitization
  2. Wait 2 seconds for the command to complete
  3. Capture the last 100 lines of terminal output
  4. Send the output back to you via Telegram

WARNING: The ! prefix disables all security sanitization. Only use this when you control the input and understand the security implications. Malicious use could execute arbitrary commands.

Configuration

Configuration is stored in ~/.telemux/:

~/.telemux/
├── telegram_config # Bot token and chat ID (chmod 600)
├── telegram_listener.log # Listener daemon logs
├── telegram_errors.log # Error logs
├── message_queue/ # Message routing data
│ ├── outgoing.log # Sent messages
│ ├── incoming.log # Received messages
│ └── archive/ # Rotated logs
└── shell_functions.sh # Shell integration functions

Environment Variables

You can override configuration with environment variables:

export TELEMUX_TG_BOT_TOKEN="your-bot-token"export TELEMUX_TG_CHAT_ID="your-chat-id"export TELEMUX_TG_USER_ID="your-user-id"# Optional: restrict control to specific userexport TELEMUX_LOG_LEVEL="DEBUG"# DEBUG, INFO, WARNING, ERROR

Log Management

Logs are automatically rotated when they exceed 10MB:

# Manual log rotation
telemux cleanup
# Install automatic monthly cleanup
telemux cleanup --install-cron

Archives are stored in ~/.telemux/message_queue/archive/ and compressed with gzip.

Troubleshooting

Run Health Check

telemux doctor

This checks:

  • Prerequisites (tmux, python3)
  • Configuration files
  • Telegram bot connection
  • Listener daemon status
  • Log files

Common Issues

Listener won't start:

# Check if it's already running
telemux status
# View logs for errors
telemux logs
# Restart the listener
telemux restart

Messages not being received:

# Check listener status
telemux status
# Verify configuration
cat ~/.telemux/telegram_config
# Test bot connection
telemux doctor

Shell functions not available:

# Reload your shell configurationsource~/.zshrc # or ~/.bashrc# Verify functions are sourcedtype tg_alert

Examples

Long-Running Build Notification

#!/bin/bash# Build script with notificationecho"Starting build..."
tg_alert "Build started for project-x"
npm run build
if [ $?-eq 0 ];then
tg_alert "Build succeeded!"else
tg_alert "Build failed! Check logs."fi

Interactive Deployment Agent

#!/bin/bash# Deployment with approval (run in tmux session named "deploy")
tg_agent "Ready to deploy v2.0 to production?"# User responds via Telegram: "deploy: yes"# Response appears in terminalread -p "Proceed with deployment? " response
if [[ "$response"==*"yes"* ]];then
./deploy.sh
tg_alert "Deployment complete!"fi

Multi-Step Workflow

#!/bin/bash# Complex workflow with multiple checkpoints (run in tmux session named "migration")
tg_alert "Starting migration workflow..."# Step 1: Backup
tg_agent "Backup database before migration?"# Wait for approval...# Step 2: Migration
./run-migration.sh && tg_done
# Step 3: Verification
tg_agent "Verify migration results?"# Wait for verification...
tg_alert "Migration workflow complete!"

Development

Running Tests

# Install development dependencies
pip install -e ".[dev]"# Run tests
pytest
# Run with coverage
pytest --cov=telemux --cov-report=term-missing

Project Structure

telemux/
├── telemux/
│ ├── __init__.py # Package initialization
│ ├── cli.py # Main CLI entry point
│ ├── control.py # Daemon control (start, stop, status)
│ ├── listener.py # Telegram listener daemon
│ ├── installer.py # Interactive installer
│ ├── cleanup.py # Log rotation and cleanup
│ ├── config.py # Configuration management
│ └── shell_functions.sh # Shell integration
├── examples/ # Example scripts
├── tests/ # Test suite
├── pyproject.toml # Package metadata and dependencies
├── MANIFEST.in # Package file manifest
└── README.md # This file

Requirements

  • Python 3.7+
  • tmux
  • curl
  • requests library (automatically installed)

License

MIT License - see LICENSE file for details

Contributing

Contributions are welcome! Please:

  1. Fork the repository
  2. Create a feature branch
  3. Make your changes
  4. Add tests if applicable
  5. Submit a pull request

Changelog

See CHANGELOG.md for version history.

Support

Credits

Created by Marco Almazan

Related Projects

About

Bidirectional Telegram bridge for tmux sessions running LLM CLI tools (Claude Code, Codex, Gemini). Send alerts and receive replies directly in your terminal.

Resources

Contributing

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ' GitHub - maarco/telemux: Bidirectional Telegram bridge for tmux sessions running LLM CLI tools (Claude Code, Codex, Gemini). Send alerts and receive replies directly in your terminal. · GitHub
Skip to content

Repository files navigation

TeleMux

Bidirectional Telegram integration for tmux sessions - Monitor commands, interact with agents, and stay connected to your terminal from anywhere.

Features

  • One-way notifications: Send alerts to Telegram when commands complete
  • Bidirectional communication: Interact with tmux sessions via Telegram
  • Agent support: Create interactive agents that can receive replies
  • Session routing: Messages automatically delivered to the correct tmux session
  • Daemon-based: Runs as a background service in tmux
  • Shell integration: Simple shell functions for easy use
  • Secure: Configuration files are automatically protected (chmod 600)

Installation

Via pip (Recommended)

# Install the package
pip install telemux
# Run the interactive installer
telemux install
# Start the listener daemon
telemux start

From source

# Clone the repository
git clone https://github.com/malmazan/telemux.git
cd telemux
# Install in development mode
pip install -e .# Run the installer
telemux install

Quick Start

1. Create a Telegram Bot

  1. Open Telegram and search for @BotFather
  2. Send /newbot and follow the prompts
  3. Save the bot token provided

2. Install TeleMux

# Install via pip
pip install telemux
# Run the interactive installer
telemux install

The installer will:

  • Check prerequisites (tmux, python3, curl)
  • Validate your bot token
  • Auto-detect available chats (with retry logic)
  • Create configuration files
  • Install shell functions
  • Test the connection

3. Start the Listener

# Start the daemon
telemux start
# Check status
telemux status
# View logs
telemux logs

4. Use Shell Functions

# Send a simple notification
tg_alert "Build complete!"# Send a message and receive replies (auto-detects tmux session name)
tg_agent "Ready to deploy to production?"# Reply via Telegram: "session-name: yes"# The reply appears directly in your terminal# Get notified when a command completes
npm run build && tg_done

Commands

Control Commands

telemux start # Start the listener daemon
telemux stop # Stop the listener daemon
telemux restart # Restart the listener daemon
telemux status # Check daemon status
telemux logs # View listener logs (tail -f)
telemux attach # Attach to the listener tmux session
telemux cleanup # Rotate and clean up log files
telemux doctor # Run health check and diagnose issues
telemux install # Run interactive installer

Shortcuts

For convenience, all commands have tg- shortcuts:

tg-start # Same as: telemux start
tg-stop # Same as: telemux stop
tg-status # Same as: telemux status
tg-logs # Same as: telemux logs

Shell Functions

After installation, these functions are available in your shell:

tg_alert

Send one-way notifications to Telegram:

tg_alert "Message text"

Examples:

# Simple notification
tg_alert "Server is ready"# Notify when command completes
npm install && tg_alert "Dependencies installed"# Multiline messages
tg_alert "Deploy complete- 50 files updated- 0 errors"

tg_agent

Send messages and receive replies via Telegram (automatically uses your tmux session name):

tg_agent "Message text"

Examples:

# Ask a question (inside a tmux session named "deploy")
tg_agent "Ready to deploy to production?"# Wait for user response via Telegram# User replies: "deploy: yes, proceed"# Reply appears in your terminal# Use in scripts (inside a tmux session named "approval")
tg_agent "Approve release v2.0?"# Returns the session name, user responds via Telegram# Check incoming message for approval

tg_done

Automatically notify when the previous command completes:

npm run build && tg_done

This sends a notification with:

  • Command that ran
  • Exit code (success/failure)
  • Timestamp

Bidirectional Communication

TeleMux uses session-based routing for bidirectional communication:

Sending Messages from Terminal

# In tmux session named "deploy"
tg_agent "Should I proceed with deployment?"

This sends a message to Telegram with instructions on how to reply. The session name is automatically detected.

Replying from Telegram

Reply with the format: session-name: your message

deploy: yes, proceed with deployment

The reply is automatically routed to the correct tmux session and appears in your terminal.

Telegram Commands

Send these commands directly to your Telegram bot:

  • capture - Capture and send back the last 100 lines of your active session
  • capture on - Enable auto-capture (waits 5 seconds after each message, then sends output)
  • capture off - Disable auto-capture
  • capture status - Check if auto-capture is enabled

Security

  • Messages are routed only to existing tmux sessions
  • User input is sanitized to prevent command injection
  • Session names are validated before routing
  • No session names are revealed in error messages

Bypass Sanitization (Advanced):

By default, all messages are sanitized using shlex.quote() to prevent command injection. If you need to send raw commands with special characters, prefix your message with !:

# Normal (sanitized) - safe for user input
session-name: echo"Hello World"# Bypass sanitization - execute command directly and get output
session-name: !ls -la
session-name: !echo "Current directory: $(pwd)"
session-name: !git status

When using the ! prefix, TeleMux will:

  1. Execute the command directly without sanitization
  2. Wait 2 seconds for the command to complete
  3. Capture the last 100 lines of terminal output
  4. Send the output back to you via Telegram

WARNING: The ! prefix disables all security sanitization. Only use this when you control the input and understand the security implications. Malicious use could execute arbitrary commands.

Configuration

Configuration is stored in ~/.telemux/:

~/.telemux/
├── telegram_config # Bot token and chat ID (chmod 600)
├── telegram_listener.log # Listener daemon logs
├── telegram_errors.log # Error logs
├── message_queue/ # Message routing data
│ ├── outgoing.log # Sent messages
│ ├── incoming.log # Received messages
│ └── archive/ # Rotated logs
└── shell_functions.sh # Shell integration functions

Environment Variables

You can override configuration with environment variables:

export TELEMUX_TG_BOT_TOKEN="your-bot-token"export TELEMUX_TG_CHAT_ID="your-chat-id"export TELEMUX_TG_USER_ID="your-user-id"# Optional: restrict control to specific userexport TELEMUX_LOG_LEVEL="DEBUG"# DEBUG, INFO, WARNING, ERROR

Log Management

Logs are automatically rotated when they exceed 10MB:

# Manual log rotation
telemux cleanup
# Install automatic monthly cleanup
telemux cleanup --install-cron

Archives are stored in ~/.telemux/message_queue/archive/ and compressed with gzip.

Troubleshooting

Run Health Check

telemux doctor

This checks:

  • Prerequisites (tmux, python3)
  • Configuration files
  • Telegram bot connection
  • Listener daemon status
  • Log files

Common Issues

Listener won't start:

# Check if it's already running
telemux status
# View logs for errors
telemux logs
# Restart the listener
telemux restart

Messages not being received:

# Check listener status
telemux status
# Verify configuration
cat ~/.telemux/telegram_config
# Test bot connection
telemux doctor

Shell functions not available:

# Reload your shell configurationsource~/.zshrc # or ~/.bashrc# Verify functions are sourcedtype tg_alert

Examples

Long-Running Build Notification

#!/bin/bash# Build script with notificationecho"Starting build..."
tg_alert "Build started for project-x"
npm run build
if [ $?-eq 0 ];then
tg_alert "Build succeeded!"else
tg_alert "Build failed! Check logs."fi

Interactive Deployment Agent

#!/bin/bash# Deployment with approval (run in tmux session named "deploy")
tg_agent "Ready to deploy v2.0 to production?"# User responds via Telegram: "deploy: yes"# Response appears in terminalread -p "Proceed with deployment? " response
if [[ "$response"==*"yes"* ]];then
./deploy.sh
tg_alert "Deployment complete!"fi

Multi-Step Workflow

#!/bin/bash# Complex workflow with multiple checkpoints (run in tmux session named "migration")
tg_alert "Starting migration workflow..."# Step 1: Backup
tg_agent "Backup database before migration?"# Wait for approval...# Step 2: Migration
./run-migration.sh && tg_done
# Step 3: Verification
tg_agent "Verify migration results?"# Wait for verification...
tg_alert "Migration workflow complete!"

Development

Running Tests

# Install development dependencies
pip install -e ".[dev]"# Run tests
pytest
# Run with coverage
pytest --cov=telemux --cov-report=term-missing

Project Structure

telemux/
├── telemux/
│ ├── __init__.py # Package initialization
│ ├── cli.py # Main CLI entry point
│ ├── control.py # Daemon control (start, stop, status)
│ ├── listener.py # Telegram listener daemon
│ ├── installer.py # Interactive installer
│ ├── cleanup.py # Log rotation and cleanup
│ ├── config.py # Configuration management
│ └── shell_functions.sh # Shell integration
├── examples/ # Example scripts
├── tests/ # Test suite
├── pyproject.toml # Package metadata and dependencies
├── MANIFEST.in # Package file manifest
└── README.md # This file

Requirements

  • Python 3.7+
  • tmux
  • curl
  • requests library (automatically installed)

License

MIT License - see LICENSE file for details

Contributing

Contributions are welcome! Please:

  1. Fork the repository
  2. Create a feature branch
  3. Make your changes
  4. Add tests if applicable
  5. Submit a pull request

Changelog

See CHANGELOG.md for version history.

Support

Credits

Created by Marco Almazan

Related Projects

About

Bidirectional Telegram bridge for tmux sessions running LLM CLI tools (Claude Code, Codex, Gemini). Send alerts and receive replies directly in your terminal.

Resources

Contributing

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - maarco/telemux: Bidirectional Telegram bridge for tmux sessions running LLM CLI tools (Claude Code, Codex, Gemini). Send alerts and receive replies directly in your terminal. · GitHub
Skip to content

Repository files navigation

TeleMux

Bidirectional Telegram integration for tmux sessions - Monitor commands, interact with agents, and stay connected to your terminal from anywhere.

Features

  • One-way notifications: Send alerts to Telegram when commands complete
  • Bidirectional communication: Interact with tmux sessions via Telegram
  • Agent support: Create interactive agents that can receive replies
  • Session routing: Messages automatically delivered to the correct tmux session
  • Daemon-based: Runs as a background service in tmux
  • Shell integration: Simple shell functions for easy use
  • Secure: Configuration files are automatically protected (chmod 600)

Installation

Via pip (Recommended)

# Install the package
pip install telemux
# Run the interactive installer
telemux install
# Start the listener daemon
telemux start

From source

# Clone the repository
git clone https://github.com/malmazan/telemux.git
cd telemux
# Install in development mode
pip install -e .# Run the installer
telemux install

Quick Start

1. Create a Telegram Bot

  1. Open Telegram and search for @BotFather
  2. Send /newbot and follow the prompts
  3. Save the bot token provided

2. Install TeleMux

# Install via pip
pip install telemux
# Run the interactive installer
telemux install

The installer will:

  • Check prerequisites (tmux, python3, curl)
  • Validate your bot token
  • Auto-detect available chats (with retry logic)
  • Create configuration files
  • Install shell functions
  • Test the connection

3. Start the Listener

# Start the daemon
telemux start
# Check status
telemux status
# View logs
telemux logs

4. Use Shell Functions

# Send a simple notification
tg_alert "Build complete!"# Send a message and receive replies (auto-detects tmux session name)
tg_agent "Ready to deploy to production?"# Reply via Telegram: "session-name: yes"# The reply appears directly in your terminal# Get notified when a command completes
npm run build && tg_done

Commands

Control Commands

telemux start # Start the listener daemon
telemux stop # Stop the listener daemon
telemux restart # Restart the listener daemon
telemux status # Check daemon status
telemux logs # View listener logs (tail -f)
telemux attach # Attach to the listener tmux session
telemux cleanup # Rotate and clean up log files
telemux doctor # Run health check and diagnose issues
telemux install # Run interactive installer

Shortcuts

For convenience, all commands have tg- shortcuts:

tg-start # Same as: telemux start
tg-stop # Same as: telemux stop
tg-status # Same as: telemux status
tg-logs # Same as: telemux logs

Shell Functions

After installation, these functions are available in your shell:

tg_alert

Send one-way notifications to Telegram:

tg_alert "Message text"

Examples:

# Simple notification
tg_alert "Server is ready"# Notify when command completes
npm install && tg_alert "Dependencies installed"# Multiline messages
tg_alert "Deploy complete- 50 files updated- 0 errors"

tg_agent

Send messages and receive replies via Telegram (automatically uses your tmux session name):

tg_agent "Message text"

Examples:

# Ask a question (inside a tmux session named "deploy")
tg_agent "Ready to deploy to production?"# Wait for user response via Telegram# User replies: "deploy: yes, proceed"# Reply appears in your terminal# Use in scripts (inside a tmux session named "approval")
tg_agent "Approve release v2.0?"# Returns the session name, user responds via Telegram# Check incoming message for approval

tg_done

Automatically notify when the previous command completes:

npm run build && tg_done

This sends a notification with:

  • Command that ran
  • Exit code (success/failure)
  • Timestamp

Bidirectional Communication

TeleMux uses session-based routing for bidirectional communication:

Sending Messages from Terminal

# In tmux session named "deploy"
tg_agent "Should I proceed with deployment?"

This sends a message to Telegram with instructions on how to reply. The session name is automatically detected.

Replying from Telegram

Reply with the format: session-name: your message

deploy: yes, proceed with deployment

The reply is automatically routed to the correct tmux session and appears in your terminal.

Telegram Commands

Send these commands directly to your Telegram bot:

  • capture - Capture and send back the last 100 lines of your active session
  • capture on - Enable auto-capture (waits 5 seconds after each message, then sends output)
  • capture off - Disable auto-capture
  • capture status - Check if auto-capture is enabled

Security

  • Messages are routed only to existing tmux sessions
  • User input is sanitized to prevent command injection
  • Session names are validated before routing
  • No session names are revealed in error messages

Bypass Sanitization (Advanced):

By default, all messages are sanitized using shlex.quote() to prevent command injection. If you need to send raw commands with special characters, prefix your message with !:

# Normal (sanitized) - safe for user input
session-name: echo"Hello World"# Bypass sanitization - execute command directly and get output
session-name: !ls -la
session-name: !echo "Current directory: $(pwd)"
session-name: !git status

When using the ! prefix, TeleMux will:

  1. Execute the command directly without sanitization
  2. Wait 2 seconds for the command to complete
  3. Capture the last 100 lines of terminal output
  4. Send the output back to you via Telegram

WARNING: The ! prefix disables all security sanitization. Only use this when you control the input and understand the security implications. Malicious use could execute arbitrary commands.

Configuration

Configuration is stored in ~/.telemux/:

~/.telemux/
├── telegram_config # Bot token and chat ID (chmod 600)
├── telegram_listener.log # Listener daemon logs
├── telegram_errors.log # Error logs
├── message_queue/ # Message routing data
│ ├── outgoing.log # Sent messages
│ ├── incoming.log # Received messages
│ └── archive/ # Rotated logs
└── shell_functions.sh # Shell integration functions

Environment Variables

You can override configuration with environment variables:

export TELEMUX_TG_BOT_TOKEN="your-bot-token"export TELEMUX_TG_CHAT_ID="your-chat-id"export TELEMUX_TG_USER_ID="your-user-id"# Optional: restrict control to specific userexport TELEMUX_LOG_LEVEL="DEBUG"# DEBUG, INFO, WARNING, ERROR

Log Management

Logs are automatically rotated when they exceed 10MB:

# Manual log rotation
telemux cleanup
# Install automatic monthly cleanup
telemux cleanup --install-cron

Archives are stored in ~/.telemux/message_queue/archive/ and compressed with gzip.

Troubleshooting

Run Health Check

telemux doctor

This checks:

  • Prerequisites (tmux, python3)
  • Configuration files
  • Telegram bot connection
  • Listener daemon status
  • Log files

Common Issues

Listener won't start:

# Check if it's already running
telemux status
# View logs for errors
telemux logs
# Restart the listener
telemux restart

Messages not being received:

# Check listener status
telemux status
# Verify configuration
cat ~/.telemux/telegram_config
# Test bot connection
telemux doctor

Shell functions not available:

# Reload your shell configurationsource~/.zshrc # or ~/.bashrc# Verify functions are sourcedtype tg_alert

Examples

Long-Running Build Notification

#!/bin/bash# Build script with notificationecho"Starting build..."
tg_alert "Build started for project-x"
npm run build
if [ $?-eq 0 ];then
tg_alert "Build succeeded!"else
tg_alert "Build failed! Check logs."fi

Interactive Deployment Agent

#!/bin/bash# Deployment with approval (run in tmux session named "deploy")
tg_agent "Ready to deploy v2.0 to production?"# User responds via Telegram: "deploy: yes"# Response appears in terminalread -p "Proceed with deployment? " response
if [[ "$response"==*"yes"* ]];then
./deploy.sh
tg_alert "Deployment complete!"fi

Multi-Step Workflow

#!/bin/bash# Complex workflow with multiple checkpoints (run in tmux session named "migration")
tg_alert "Starting migration workflow..."# Step 1: Backup
tg_agent "Backup database before migration?"# Wait for approval...# Step 2: Migration
./run-migration.sh && tg_done
# Step 3: Verification
tg_agent "Verify migration results?"# Wait for verification...
tg_alert "Migration workflow complete!"

Development

Running Tests

# Install development dependencies
pip install -e ".[dev]"# Run tests
pytest
# Run with coverage
pytest --cov=telemux --cov-report=term-missing

Project Structure

telemux/
├── telemux/
│ ├── __init__.py # Package initialization
│ ├── cli.py # Main CLI entry point
│ ├── control.py # Daemon control (start, stop, status)
│ ├── listener.py # Telegram listener daemon
│ ├── installer.py # Interactive installer
│ ├── cleanup.py # Log rotation and cleanup
│ ├── config.py # Configuration management
│ └── shell_functions.sh # Shell integration
├── examples/ # Example scripts
├── tests/ # Test suite
├── pyproject.toml # Package metadata and dependencies
├── MANIFEST.in # Package file manifest
└── README.md # This file

Requirements

  • Python 3.7+
  • tmux
  • curl
  • requests library (automatically installed)

License

MIT License - see LICENSE file for details

Contributing

Contributions are welcome! Please:

  1. Fork the repository
  2. Create a feature branch
  3. Make your changes
  4. Add tests if applicable
  5. Submit a pull request

Changelog

See CHANGELOG.md for version history.

Support

Credits

Created by Marco Almazan

Related Projects

About

Bidirectional Telegram bridge for tmux sessions running LLM CLI tools (Claude Code, Codex, Gemini). Send alerts and receive replies directly in your terminal.

Resources

Contributing

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - maarco/telemux: Bidirectional Telegram bridge for tmux sessions running LLM CLI tools (Claude Code, Codex, Gemini). Send alerts and receive replies directly in your terminal. · GitHub
Skip to content

Repository files navigation

TeleMux

Bidirectional Telegram integration for tmux sessions - Monitor commands, interact with agents, and stay connected to your terminal from anywhere.

Features

  • One-way notifications: Send alerts to Telegram when commands complete
  • Bidirectional communication: Interact with tmux sessions via Telegram
  • Agent support: Create interactive agents that can receive replies
  • Session routing: Messages automatically delivered to the correct tmux session
  • Daemon-based: Runs as a background service in tmux
  • Shell integration: Simple shell functions for easy use
  • Secure: Configuration files are automatically protected (chmod 600)

Installation

Via pip (Recommended)

# Install the package
pip install telemux
# Run the interactive installer
telemux install
# Start the listener daemon
telemux start

From source

# Clone the repository
git clone https://github.com/malmazan/telemux.git
cd telemux
# Install in development mode
pip install -e .# Run the installer
telemux install

Quick Start

1. Create a Telegram Bot

  1. Open Telegram and search for @BotFather
  2. Send /newbot and follow the prompts
  3. Save the bot token provided

2. Install TeleMux

# Install via pip
pip install telemux
# Run the interactive installer
telemux install

The installer will:

  • Check prerequisites (tmux, python3, curl)
  • Validate your bot token
  • Auto-detect available chats (with retry logic)
  • Create configuration files
  • Install shell functions
  • Test the connection

3. Start the Listener

# Start the daemon
telemux start
# Check status
telemux status
# View logs
telemux logs

4. Use Shell Functions

# Send a simple notification
tg_alert "Build complete!"# Send a message and receive replies (auto-detects tmux session name)
tg_agent "Ready to deploy to production?"# Reply via Telegram: "session-name: yes"# The reply appears directly in your terminal# Get notified when a command completes
npm run build && tg_done

Commands

Control Commands

telemux start # Start the listener daemon
telemux stop # Stop the listener daemon
telemux restart # Restart the listener daemon
telemux status # Check daemon status
telemux logs # View listener logs (tail -f)
telemux attach # Attach to the listener tmux session
telemux cleanup # Rotate and clean up log files
telemux doctor # Run health check and diagnose issues
telemux install # Run interactive installer

Shortcuts

For convenience, all commands have tg- shortcuts:

tg-start # Same as: telemux start
tg-stop # Same as: telemux stop
tg-status # Same as: telemux status
tg-logs # Same as: telemux logs

Shell Functions

After installation, these functions are available in your shell:

tg_alert

Send one-way notifications to Telegram:

tg_alert "Message text"

Examples:

# Simple notification
tg_alert "Server is ready"# Notify when command completes
npm install && tg_alert "Dependencies installed"# Multiline messages
tg_alert "Deploy complete- 50 files updated- 0 errors"

tg_agent

Send messages and receive replies via Telegram (automatically uses your tmux session name):

tg_agent "Message text"

Examples:

# Ask a question (inside a tmux session named "deploy")
tg_agent "Ready to deploy to production?"# Wait for user response via Telegram# User replies: "deploy: yes, proceed"# Reply appears in your terminal# Use in scripts (inside a tmux session named "approval")
tg_agent "Approve release v2.0?"# Returns the session name, user responds via Telegram# Check incoming message for approval

tg_done

Automatically notify when the previous command completes:

npm run build && tg_done

This sends a notification with:

  • Command that ran
  • Exit code (success/failure)
  • Timestamp

Bidirectional Communication

TeleMux uses session-based routing for bidirectional communication:

Sending Messages from Terminal

# In tmux session named "deploy"
tg_agent "Should I proceed with deployment?"

This sends a message to Telegram with instructions on how to reply. The session name is automatically detected.

Replying from Telegram

Reply with the format: session-name: your message

deploy: yes, proceed with deployment

The reply is automatically routed to the correct tmux session and appears in your terminal.

Telegram Commands

Send these commands directly to your Telegram bot:

  • capture - Capture and send back the last 100 lines of your active session
  • capture on - Enable auto-capture (waits 5 seconds after each message, then sends output)
  • capture off - Disable auto-capture
  • capture status - Check if auto-capture is enabled

Security

  • Messages are routed only to existing tmux sessions
  • User input is sanitized to prevent command injection
  • Session names are validated before routing
  • No session names are revealed in error messages

Bypass Sanitization (Advanced):

By default, all messages are sanitized using shlex.quote() to prevent command injection. If you need to send raw commands with special characters, prefix your message with !:

# Normal (sanitized) - safe for user input
session-name: echo"Hello World"# Bypass sanitization - execute command directly and get output
session-name: !ls -la
session-name: !echo "Current directory: $(pwd)"
session-name: !git status

When using the ! prefix, TeleMux will:

  1. Execute the command directly without sanitization
  2. Wait 2 seconds for the command to complete
  3. Capture the last 100 lines of terminal output
  4. Send the output back to you via Telegram

WARNING: The ! prefix disables all security sanitization. Only use this when you control the input and understand the security implications. Malicious use could execute arbitrary commands.

Configuration

Configuration is stored in ~/.telemux/:

~/.telemux/
├── telegram_config # Bot token and chat ID (chmod 600)
├── telegram_listener.log # Listener daemon logs
├── telegram_errors.log # Error logs
├── message_queue/ # Message routing data
│ ├── outgoing.log # Sent messages
│ ├── incoming.log # Received messages
│ └── archive/ # Rotated logs
└── shell_functions.sh # Shell integration functions

Environment Variables

You can override configuration with environment variables:

export TELEMUX_TG_BOT_TOKEN="your-bot-token"export TELEMUX_TG_CHAT_ID="your-chat-id"export TELEMUX_TG_USER_ID="your-user-id"# Optional: restrict control to specific userexport TELEMUX_LOG_LEVEL="DEBUG"# DEBUG, INFO, WARNING, ERROR

Log Management

Logs are automatically rotated when they exceed 10MB:

# Manual log rotation
telemux cleanup
# Install automatic monthly cleanup
telemux cleanup --install-cron

Archives are stored in ~/.telemux/message_queue/archive/ and compressed with gzip.

Troubleshooting

Run Health Check

telemux doctor

This checks:

  • Prerequisites (tmux, python3)
  • Configuration files
  • Telegram bot connection
  • Listener daemon status
  • Log files

Common Issues

Listener won't start:

# Check if it's already running
telemux status
# View logs for errors
telemux logs
# Restart the listener
telemux restart

Messages not being received:

# Check listener status
telemux status
# Verify configuration
cat ~/.telemux/telegram_config
# Test bot connection
telemux doctor

Shell functions not available:

# Reload your shell configurationsource~/.zshrc # or ~/.bashrc# Verify functions are sourcedtype tg_alert

Examples

Long-Running Build Notification

#!/bin/bash# Build script with notificationecho"Starting build..."
tg_alert "Build started for project-x"
npm run build
if [ $?-eq 0 ];then
tg_alert "Build succeeded!"else
tg_alert "Build failed! Check logs."fi

Interactive Deployment Agent

#!/bin/bash# Deployment with approval (run in tmux session named "deploy")
tg_agent "Ready to deploy v2.0 to production?"# User responds via Telegram: "deploy: yes"# Response appears in terminalread -p "Proceed with deployment? " response
if [[ "$response"==*"yes"* ]];then
./deploy.sh
tg_alert "Deployment complete!"fi

Multi-Step Workflow

#!/bin/bash# Complex workflow with multiple checkpoints (run in tmux session named "migration")
tg_alert "Starting migration workflow..."# Step 1: Backup
tg_agent "Backup database before migration?"# Wait for approval...# Step 2: Migration
./run-migration.sh && tg_done
# Step 3: Verification
tg_agent "Verify migration results?"# Wait for verification...
tg_alert "Migration workflow complete!"

Development

Running Tests

# Install development dependencies
pip install -e ".[dev]"# Run tests
pytest
# Run with coverage
pytest --cov=telemux --cov-report=term-missing

Project Structure

telemux/
├── telemux/
│ ├── __init__.py # Package initialization
│ ├── cli.py # Main CLI entry point
│ ├── control.py # Daemon control (start, stop, status)
│ ├── listener.py # Telegram listener daemon
│ ├── installer.py # Interactive installer
│ ├── cleanup.py # Log rotation and cleanup
│ ├── config.py # Configuration management
│ └── shell_functions.sh # Shell integration
├── examples/ # Example scripts
├── tests/ # Test suite
├── pyproject.toml # Package metadata and dependencies
├── MANIFEST.in # Package file manifest
└── README.md # This file

Requirements

  • Python 3.7+
  • tmux
  • curl
  • requests library (automatically installed)

License

MIT License - see LICENSE file for details

Contributing

Contributions are welcome! Please:

  1. Fork the repository
  2. Create a feature branch
  3. Make your changes
  4. Add tests if applicable
  5. Submit a pull request

Changelog

See CHANGELOG.md for version history.

Support

Credits

Created by Marco Almazan

Related Projects

About

Bidirectional Telegram bridge for tmux sessions running LLM CLI tools (Claude Code, Codex, Gemini). Send alerts and receive replies directly in your terminal.

Resources

Contributing

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Universal Dark Mode - works on any site (function() { var enabled = true; function applyDarkMode() { if (!enabled) return; // Create style element if it doesn't exist var style = document.getElementById('universal-dark-mode-style'); if (!style) { style = document.createElement('style'); style.id = 'universal-dark-mode-style'; document.head.appendChild(style); } // Dark mode CSS - inverts colors but preserves images/video style.textContent = ' /* Invert everything except media */ html { filter: invert(1) hue-rotate(180deg) !important; background: #1a1a2e !important; } /* Restore images, videos, iframes, canvas */ img, video, iframe, canvas, svg, picture, [style*="background-image"] { filter: invert(1) hue-rotate(180deg) !important; } /* Preserve specific elements that should not be inverted */ .no-dark-mode, .no-dark-mode *, [data-theme="light"], [data-theme="light"], .ace_editor, .ace_editor *, .CodeMirror, .CodeMirror *, .monaco-editor, .monaco-editor *, .markdown-body pre, .markdown-body pre *, .highlight, .highlight *, pre code, pre code * { filter: none !important; } /* Fix common UI elements */ .modal, .popup, .dropdown-menu, .tooltip, .popover { filter: invert(1) hue-rotate(180deg) !important; background: #2d2d44 !important; border-color: #444 !important; } /* Scrollbars */ ::-webkit-scrollbar { background: #1a1a2e !important; } ::-webkit-scrollbar-thumb { background: #444 !important; } ::-webkit-scrollbar-thumb:hover { background: #555 !important; } /* Selection */ ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; } ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; } '; } function removeDarkMode() { var style = document.getElementById('universal-dark-mode-style'); if (style) style.remove(); } // Toggle with Alt+Shift+D document.addEventListener('keydown', function(e) { if (e.altKey && e.shiftKey && e.key === 'D') { e.preventDefault(); enabled = !enabled; if (enabled) { applyDarkMode(); console.log('[Universal Dark Mode] Enabled'); } else { removeDarkMode(); console.log('[Universal Dark Mode] Disabled'); } } }); // Apply on load applyDarkMode(); // Re-apply on dynamic content var observer = new MutationObserver(function(mutations) { if (enabled && !document.getElementById('universal-dark-mode-style')) { applyDarkMode(); } }); observer.observe(document.head, { childList: true }); console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle'); })(); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })(); GitHub - maarco/telemux: Bidirectional Telegram bridge for tmux sessions running LLM CLI tools (Claude Code, Codex, Gemini). Send alerts and receive replies directly in your terminal. · GitHub
Skip to content

Repository files navigation

TeleMux

Bidirectional Telegram integration for tmux sessions - Monitor commands, interact with agents, and stay connected to your terminal from anywhere.

Features

  • One-way notifications: Send alerts to Telegram when commands complete
  • Bidirectional communication: Interact with tmux sessions via Telegram
  • Agent support: Create interactive agents that can receive replies
  • Session routing: Messages automatically delivered to the correct tmux session
  • Daemon-based: Runs as a background service in tmux
  • Shell integration: Simple shell functions for easy use
  • Secure: Configuration files are automatically protected (chmod 600)

Installation

Via pip (Recommended)

# Install the package
pip install telemux
# Run the interactive installer
telemux install
# Start the listener daemon
telemux start

From source

# Clone the repository
git clone https://github.com/malmazan/telemux.git
cd telemux
# Install in development mode
pip install -e .# Run the installer
telemux install

Quick Start

1. Create a Telegram Bot

  1. Open Telegram and search for @BotFather
  2. Send /newbot and follow the prompts
  3. Save the bot token provided

2. Install TeleMux

# Install via pip
pip install telemux
# Run the interactive installer
telemux install

The installer will:

  • Check prerequisites (tmux, python3, curl)
  • Validate your bot token
  • Auto-detect available chats (with retry logic)
  • Create configuration files
  • Install shell functions
  • Test the connection

3. Start the Listener

# Start the daemon
telemux start
# Check status
telemux status
# View logs
telemux logs

4. Use Shell Functions

# Send a simple notification
tg_alert "Build complete!"# Send a message and receive replies (auto-detects tmux session name)
tg_agent "Ready to deploy to production?"# Reply via Telegram: "session-name: yes"# The reply appears directly in your terminal# Get notified when a command completes
npm run build && tg_done

Commands

Control Commands

telemux start # Start the listener daemon
telemux stop # Stop the listener daemon
telemux restart # Restart the listener daemon
telemux status # Check daemon status
telemux logs # View listener logs (tail -f)
telemux attach # Attach to the listener tmux session
telemux cleanup # Rotate and clean up log files
telemux doctor # Run health check and diagnose issues
telemux install # Run interactive installer

Shortcuts

For convenience, all commands have tg- shortcuts:

tg-start # Same as: telemux start
tg-stop # Same as: telemux stop
tg-status # Same as: telemux status
tg-logs # Same as: telemux logs

Shell Functions

After installation, these functions are available in your shell:

tg_alert

Send one-way notifications to Telegram:

tg_alert "Message text"

Examples:

# Simple notification
tg_alert "Server is ready"# Notify when command completes
npm install && tg_alert "Dependencies installed"# Multiline messages
tg_alert "Deploy complete- 50 files updated- 0 errors"

tg_agent

Send messages and receive replies via Telegram (automatically uses your tmux session name):

tg_agent "Message text"

Examples:

# Ask a question (inside a tmux session named "deploy")
tg_agent "Ready to deploy to production?"# Wait for user response via Telegram# User replies: "deploy: yes, proceed"# Reply appears in your terminal# Use in scripts (inside a tmux session named "approval")
tg_agent "Approve release v2.0?"# Returns the session name, user responds via Telegram# Check incoming message for approval

tg_done

Automatically notify when the previous command completes:

npm run build && tg_done

This sends a notification with:

  • Command that ran
  • Exit code (success/failure)
  • Timestamp

Bidirectional Communication

TeleMux uses session-based routing for bidirectional communication:

Sending Messages from Terminal

# In tmux session named "deploy"
tg_agent "Should I proceed with deployment?"

This sends a message to Telegram with instructions on how to reply. The session name is automatically detected.

Replying from Telegram

Reply with the format: session-name: your message

deploy: yes, proceed with deployment

The reply is automatically routed to the correct tmux session and appears in your terminal.

Telegram Commands

Send these commands directly to your Telegram bot:

  • capture - Capture and send back the last 100 lines of your active session
  • capture on - Enable auto-capture (waits 5 seconds after each message, then sends output)
  • capture off - Disable auto-capture
  • capture status - Check if auto-capture is enabled

Security

  • Messages are routed only to existing tmux sessions
  • User input is sanitized to prevent command injection
  • Session names are validated before routing
  • No session names are revealed in error messages

Bypass Sanitization (Advanced):

By default, all messages are sanitized using shlex.quote() to prevent command injection. If you need to send raw commands with special characters, prefix your message with !:

# Normal (sanitized) - safe for user input
session-name: echo"Hello World"# Bypass sanitization - execute command directly and get output
session-name: !ls -la
session-name: !echo "Current directory: $(pwd)"
session-name: !git status

When using the ! prefix, TeleMux will:

  1. Execute the command directly without sanitization
  2. Wait 2 seconds for the command to complete
  3. Capture the last 100 lines of terminal output
  4. Send the output back to you via Telegram

WARNING: The ! prefix disables all security sanitization. Only use this when you control the input and understand the security implications. Malicious use could execute arbitrary commands.

Configuration

Configuration is stored in ~/.telemux/:

~/.telemux/
├── telegram_config # Bot token and chat ID (chmod 600)
├── telegram_listener.log # Listener daemon logs
├── telegram_errors.log # Error logs
├── message_queue/ # Message routing data
│ ├── outgoing.log # Sent messages
│ ├── incoming.log # Received messages
│ └── archive/ # Rotated logs
└── shell_functions.sh # Shell integration functions

Environment Variables

You can override configuration with environment variables:

export TELEMUX_TG_BOT_TOKEN="your-bot-token"export TELEMUX_TG_CHAT_ID="your-chat-id"export TELEMUX_TG_USER_ID="your-user-id"# Optional: restrict control to specific userexport TELEMUX_LOG_LEVEL="DEBUG"# DEBUG, INFO, WARNING, ERROR

Log Management

Logs are automatically rotated when they exceed 10MB:

# Manual log rotation
telemux cleanup
# Install automatic monthly cleanup
telemux cleanup --install-cron

Archives are stored in ~/.telemux/message_queue/archive/ and compressed with gzip.

Troubleshooting

Run Health Check

telemux doctor

This checks:

  • Prerequisites (tmux, python3)
  • Configuration files
  • Telegram bot connection
  • Listener daemon status
  • Log files

Common Issues

Listener won't start:

# Check if it's already running
telemux status
# View logs for errors
telemux logs
# Restart the listener
telemux restart

Messages not being received:

# Check listener status
telemux status
# Verify configuration
cat ~/.telemux/telegram_config
# Test bot connection
telemux doctor

Shell functions not available:

# Reload your shell configurationsource~/.zshrc # or ~/.bashrc# Verify functions are sourcedtype tg_alert

Examples

Long-Running Build Notification

#!/bin/bash# Build script with notificationecho"Starting build..."
tg_alert "Build started for project-x"
npm run build
if [ $?-eq 0 ];then
tg_alert "Build succeeded!"else
tg_alert "Build failed! Check logs."fi

Interactive Deployment Agent

#!/bin/bash# Deployment with approval (run in tmux session named "deploy")
tg_agent "Ready to deploy v2.0 to production?"# User responds via Telegram: "deploy: yes"# Response appears in terminalread -p "Proceed with deployment? " response
if [[ "$response"==*"yes"* ]];then
./deploy.sh
tg_alert "Deployment complete!"fi

Multi-Step Workflow

#!/bin/bash# Complex workflow with multiple checkpoints (run in tmux session named "migration")
tg_alert "Starting migration workflow..."# Step 1: Backup
tg_agent "Backup database before migration?"# Wait for approval...# Step 2: Migration
./run-migration.sh && tg_done
# Step 3: Verification
tg_agent "Verify migration results?"# Wait for verification...
tg_alert "Migration workflow complete!"

Development

Running Tests

# Install development dependencies
pip install -e ".[dev]"# Run tests
pytest
# Run with coverage
pytest --cov=telemux --cov-report=term-missing

Project Structure

telemux/
├── telemux/
│ ├── __init__.py # Package initialization
│ ├── cli.py # Main CLI entry point
│ ├── control.py # Daemon control (start, stop, status)
│ ├── listener.py # Telegram listener daemon
│ ├── installer.py # Interactive installer
│ ├── cleanup.py # Log rotation and cleanup
│ ├── config.py # Configuration management
│ └── shell_functions.sh # Shell integration
├── examples/ # Example scripts
├── tests/ # Test suite
├── pyproject.toml # Package metadata and dependencies
├── MANIFEST.in # Package file manifest
└── README.md # This file

Requirements

  • Python 3.7+
  • tmux
  • curl
  • requests library (automatically installed)

License

MIT License - see LICENSE file for details

Contributing

Contributions are welcome! Please:

  1. Fork the repository
  2. Create a feature branch
  3. Make your changes
  4. Add tests if applicable
  5. Submit a pull request

Changelog

See CHANGELOG.md for version history.

Support

Credits

Created by Marco Almazan

Related Projects

About

Bidirectional Telegram bridge for tmux sessions running LLM CLI tools (Claude Code, Codex, Gemini). Send alerts and receive replies directly in your terminal.

Resources

Contributing

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages