Browser based command and control execution system
> A transparent, modular command execution platform that decouples the browser UI from system execution, enabling powerful Linux workflows without compiled black boxes or cloud dependencies.
Scatpack treats the browser as a dumb button panel—not an interpreter. Execute bash commands, launch GUI apps, and build complex workflows through a clean HTTP/WebSocket interface, all running locally on your machine.
Traditional Linux GUI tools force you to choose: GTK, Qt, Python GUI libraries, Electron, or massive compiled binaries. Scatpack offers a new approach:
-
Browser as Frontend - HTML, CSS, and JavaScript provide the UI
-
Bash as Backend - Local command execution, no cloud dependency
-
Modular Steps - Each task is independent, replaceable, and testable
-
File-Based Communication - Simple contracts between steps (no complex APIs)
-
Zero Vendor Lock-in - Edit, replace, and extend every component
-
✅ Dual Execution Methods - Direct HTTP to socat (port 9000) or WebSocket bridge (port 8080)
-
✅ 20-Button Dashboard - Customizable Scatpack UI with drag-reorder and profile switching
-
✅ Terminal & GUI Apps - Port 9000 for bash commands (spawns gnome-terminal), port 9001 for GUI apps (no terminal)
-
✅ Optional Node Bridge - Stream terminal output over WebSocket (port 3001) only when needed
-
✅ No Dependencies - Works without Node.js, VPN, or reverse proxy for basic execution
-
✅ CORS Bypass - Local HTTP links bypass browser security restrictions entirely
-
✅ Modular Architecture - Replace any step with Bash, Python, Node.js, AppImage, or compiled binaries
-
✅ RiteBrowser Integration - Use Calamares webview as a structured workflow engine
-
✅ Profile-Based Workflows - Save and switch between task-based button configurations
-
✅ Live Output Streaming - Watch command execution in real-time through the UI
-
✅ Transparent Logging - All output written to
/tmp/terminalOut.txtand multiple log files for debugging
Get up and running in 5 minutes:
# Clone the repository
git clone https://github.com/yourusername/scatpack.git
cd scatpack
# Start the socat backend (port 9000 for bash, 9001 for GUI apps)
./StartDesktop-socat9000-server-V2.4.sh
# In another terminal, start the optional Node bridge (ports 8080 & 3001)
node bridge.js
# Open your browser to the Scatpack UI
# For direct HTTP: http://localhost:9000/ls
# For WebSocket UI: open the HTML file in your browserVisit http://localhost:9000/ls to test the socat backend. You should see a terminal window popup.
-
Linux system (Ubuntu, Fedora, Arch, etc.)
-
socatinstalled (sudo apt install socator equivalent) -
gnome-terminal(or modify the script for your terminal) -
Node.js 16+ (optional, only if using the WebSocket bridge)
-
Modern web browser (Firefox, Chrome, Edge, Safari)
git clone https://github.com/yourusername/scatpack.git
cd scatpack# Ubuntu/Debian
sudo apt update && sudo apt install socat
# Fedora/RHEL
sudo dnf install socat
# Arch
sudo pacman -S socatchmod +x StartDesktop-socat9000-server-V2.4.sh
chmod +x bridge.js./StartDesktop-socat9000-server-V2.4.shThis binds socat to localhost:9000 (bash commands) and localhost:9001 (GUI apps).
If you want WebSocket support and live terminal output streaming:
node bridge.jsThis starts:
-
Port 8080: WebSocket command endpoint + static file serving
-
Port 3001: Terminal output stream
Option A - Direct HTML (no Node required)
Open scatpack-ui.html in your browser. Click any button to execute commands directly via socat.
Option B - Node Bridge (with output streaming)
Navigate to http://localhost:8080 in your browser. The Node bridge serves the UI and streams live output.
The simplest method—no Node.js needed:
# Open a browser link
http://localhost:9000/ls%20-la
# Or from the command line
curl http://localhost:9000/ls
# The command executes in a gnome-terminal windowThe Scatpack UI provides a clickable dashboard for repeated tasks:
// Button configuration (stored in localStorage)
{
"A1": {
"label": "List Files",
"url": "http://localhost:9000/ls%20-la",
"category": "Files"
},
"A2": {
"label": "Open VLC",
"url": "http://localhost:9001/vlc",
"category": "Apps"
},
"A3": {
"label": "Update System",
"url": "http://localhost:9000/sudo%20apt%20update",
"category": "System"
}
}Features:
-
Drag-reorder buttons
-
Save/load profiles
-
Dark mode toggle
-
Category filtering
-
Search functionality
Send commands over WebSocket and receive live terminal output:
// Connect to the WebSocket bridge
const ws = new WebSocket('ws://localhost:8080/shell');
// Send a command
ws.send('ls -la');
// Receive output
ws.onmessage = (event) => {
console.log('Output:', event.data);
};The Node bridge forwards the command to socat and streams the output back.
Build multi-step processes where each step is independent:
# Step 1: Scan partitions
./steps/01-scan-partitions/run.sh
# Step 2: Select source/build
./steps/02-select-partitions/run.sh
# Step 3: Mount partitions
./steps/03-mount-partitions/run.sh
# Each step writes to shared files:
# /tmp/partSelect (input for next step)
# /tmp/terminalOut.txt (output log)Each step can be:
-
Tested independently
-
Replaced with a different language
-
Debugged without affecting others
-
Documented with its own help page
| Port
| Purpose
| Example
| |---|---|---| | 9000
| Bash commands (spawns terminal)
| http://localhost:9000/ls
| | 9001
| GUI apps (no terminal)
| http://localhost:9001/vlc
| | 8080
| WebSocket command bridge + static files
| ws://localhost:8080/shell
| | 3001
| Terminal output stream
| ws://localhost:3001
| | 9500
| UI router / mode switch (optional)
| Load dynamic button sets
|
Browser (UI Layer)
├─ Scatpack UI (HTML/CSS/JS)
│ └─ Fetch to http://localhost:9000
│
├─ WebSocket Client
│ └─ ws://localhost:8080/shell
│
└─ Output Terminal
└─ ws://localhost:3001
Local Machine (Execution Layer)
├─ socat (port 9000, 9001)
│ └─ Converts HTTP → bash commands
│
├─ Node Bridge (port 8080, 3001)
│ ├─ Forwards WebSocket → HTTP → socat
│ └─ Streams output from /tmp/terminalOut.txt
│
└─ Bash Responder
├─ Parses HTTP path as command
├─ Executes asynchronously
└─ Logs to multiple files
Edit StartDesktop-socat9000-server-V2.4.sh:
# Bind to localhost only (security)
bind=127.0.0.1
# Change port numbers
PORT_BASH=9000
PORT_GUI=9001
# Modify terminal emulator
TERMINAL="gnome-terminal" # or "xterm", "konsole", etc.Edit bridge.js:
const TARGET_HOST = '127.0.0.1';
const TARGET_PORT = 9000;
const WS_PORT = 8080;
const OUTPUT_PORT = 3001;
const OUTPUT_FILE = '/tmp/terminalOut.txt';Edit scatpack-ui.html:
// Default host (change if running remotely)
const DEFAULT_HOST = 'http://localhost';
// WebSocket ports
const WS_COMMAND_PORT = 8080;
const WS_OUTPUT_PORT = 3001;
// Button grid size
const BUTTON_ROWS = 5;
const BUTTON_COLS = 4;By default, socat listens on 127.0.0.1 (localhost only). Never bind to `0.0.0.0` unless you fully understand the risks.
# SAFE (localhost only)
socat TCP-LISTEN:9000,bind=127.0.0.1,reuseaddr,fork ...
# DANGEROUS (network-exposed)
socat TCP-LISTEN:9000,reuseaddr,fork ...Restrict which commands can execute:
# In your socat responder script
ALLOWED_COMMANDS=("ls" "apt-update" "vlc" "gimp")
if [[ ! " ${ALLOWED_COMMANDS[@]} " =~ " ${cmd} " ]]; then
echo "Command not allowed: $cmd"
exit 1
fiAdd basic auth to the socat listener:
# Self-signed certificate
openssl req -x509 -newkey rsa:2048 -keyout key.pem -out cert.pem -days 365
# socat with SSL + basic auth
socat TCP-LISTEN:9000,bind=127.0.0.1,reuseaddr,fork \
OPENSSL:localhost:9001,cert=cert.pem,key=key.pemOr wrap socat with a simple Python auth layer (10 lines).
# Start socat
./StartDesktop-socat9000-server-V2.4.sh
# Test bash command (should spawn terminal)
curl http://localhost:9000/ls
# Test GUI app (should launch without terminal)
curl http://localhost:9001/vlc# Start Node bridge
node bridge.js
# Test WebSocket command
wscat -c ws://localhost:8080/shell
> ls -la
< (output from socat)
# Test output stream
wscat -c ws://localhost:3001
< (live terminal output)-
Open
scatpack-ui.htmlin your browser -
Click button A1 (should execute a test command)
-
Verify output appears in the terminal panel
-
Try drag-reordering a button
-
Save a profile and reload the page (should persist)
# Check if socat is running
lsof -i :9000
# Start the socat server
./StartDesktop-socat9000-server-V2.4.sh
# Check logs
tail -f /tmp/scatpack/s9000.log# Verify gnome-terminal is installed
which gnome-terminal
# Or use a different terminal
sed -i 's/gnome-terminal/xterm/g' StartDesktop-socat9000-server-V2.4.sh# Verify Node bridge is running
lsof -i :8080
# Check if /tmp/terminalOut.txt exists
ls -la /tmp/terminalOut.txt
# Restart the bridge
pkill -f "node bridge.js"
node bridge.js# Check socat logs for malformed commands
cat /tmp/socat_live_feed.txt
# URL-decode the command manually
echo "ls%20-la" | sed 's/%20/ /g'Contributions are welcome! This project thrives on modularity and transparency.
- Fork the repository
git clone https://github.com/yourusername/scatpack.git
cd scatpack
git checkout -b feature/your-feature-name- Make your changes
Keep the KISS principle in mind:
-
One step = one file
-
Each step has input, execution, output, log
-
No hidden complexity
-
Document your changes
-
Test thoroughly
# Test your step independently
./steps/your-step/run.sh
# Check logs
cat /tmp/terminalOut.txt
# Test with the UI
# (open scatpack-ui.html and click your button)- Commit and push
git add .
git commit -m "Add: your feature description"
git push origin feature/your-feature-name- Open a Pull Request
Include:
-
What the change does
-
Why it's needed
-
Any new dependencies
-
Test results
-
Be respectful and constructive
-
Focus on clarity and simplicity
-
Document your code
-
Test before submitting
-
Explain the "why" behind changes
-
Core socat HTTP-to-bash bridge
-
Scatpack UI (20-button dashboard)
-
WebSocket command method
-
Live output streaming (port 3001)
-
Command whitelisting system
-
Built-in authentication layer
-
RiteBrowser / Calamares webview integration
-
Windows PowerShell version
-
Mobile-responsive UI
-
Step execution history / rollback
-
Plugin system for custom steps
-
Dry-run mode for dangerous commands
This project is licensed under the MIT License - see the LICENSE file for details.
-
socat - The elegant Unix relay that makes this all possible
-
Calamares - For showing how modular installers can be
-
The Unix Philosophy - Do one thing and do it well
-
Browser APIs - For WebSocket and Fetch standards
-
Community feedback - For pushing toward transparency and modularity
-
🐛 Issues: GitHub Issues
-
💬 Discussions: GitHub Discussions
-
📖 Documentation: See
docs/folder for detailed guides -
🧪 Testing: Run
./test-all.shto verify your setup
Most GUI systems hide their own logic behind compiled binaries or opaque frameworks. Scatpack does the opposite: it invites you in.
-
Edit the HTML to change the UI
-
Modify the Bash to change behavior
-
Replace any step without breaking others
-
Understand every layer from browser to command execution
-
Learn by reading simple, modular code
This is the spirit of '93—powerful tools that don't require a PhD to understand or modify.
Made with ❤️ by the Scatpack community. Built on the principle that power should be understandable.