Lightweight Linux system optimizer - manage services, extensions, and disk space with an intuitive web UI
- Service Management - Enable/disable non-critical system services
- Extension Control - Manage GNOME shell extensions (UI + system)
- Disk Cleanup - One-click cleanup tasks (APT cache, thumbnails, logs, etc.)
- Real-time Monitoring - Live system stats (uptime, load, memory, CPU, disk)
- Critical Protection - Cannot disable critical system services
- Tabbed Interface - Single-page layout prevents scroll conflicts
- Auto-refresh - Updates every 5 seconds
- Responsive Design - Works on desktop and mobile
- Linux (Ubuntu, Debian, AnduinOS, etc.)
- Node.js >= 16
- npm or yarn
- sudo access (for system operations)
The easiest way to get started with Linuxify is using npx:
npx linuxifyThis will:
- Show an interactive setup wizard to choose your preferred setup mode
- Configure either sudoers or run directly with sudo
- Start the application automatically
Two setup modes are available. The setup wizard will guide you through both options:
npx linuxify
# Select option "1" when prompted- ✅ Configure sudoers file once during setup
- ✅ Run Linuxify as regular user afterwards
- ✅ Commands execute with limited, scoped sudo permissions
⚠️ Requires understanding of sudoers configuration⚠️ Exposes commands to sudoers file (potential privilege escalation vector if other apps exploit sudoers)
Method 1: Preserve PATH (Recommended)
cd linuxify
sudo PATH=$PATH bash bin/linuxify.shMethod 2: Preserve entire environment
cd linuxify
sudo -E bash bin/linuxify.shMethod 3: Use full path to node
cd linuxify
sudo $(which node) bin/linuxifyThe PATH=$PATH or -E flag tells sudo to preserve your environment variables so it can find Node.js, even with NVM, Homebrew, or other custom installations.
- ✅ No sudoers configuration needed
- ✅ Simplest setup (just one command with sudo)
- ✅ Full root privileges, complete control
⚠️ Web interface runs as root (security consideration)⚠️ Should only be accessed from localhost⚠️ Should not be exposed to network/internet
npx linuxify
# Select option "0" when prompted- Run without any setup
- Configure manually later with
npx linuxify --setuporsudo bash setup.sh
# Clone or navigate to project
cd linuxify
# Install dependencies
npm install
# Start with setup wizard
npm run cli
# Or start directly (skip setup)
npm startThis is the traditional approach where you configure the sudoers file once, then run Linuxify as a regular user.
Automatic Setup (Recommended)
When you run npx linuxify and select sudoers mode:
- The setup wizard displays the required sudoers rules
- Automatically edits the sudoers file (just enter your sudo password)
- Verifies the configuration with validation
- Tests if passwordless sudo is working
The wizard uses a secure bash script that:
- Validates sudoers syntax before applying changes
- Creates backups of your sudoers file
- Uses
/etc/sudoers.d/linuxify(safer approach when available) - Falls back to direct editing only if needed
- Shows clear success/error messages
Manual Setup (Alternative)
If you prefer manual setup:
sudo bash setup.shOr for interactive sudoers editing:
sudo visudoAdd at the end of the file:
# Linuxify - systemctl commands
%sudo ALL=(ALL) NOPASSWD: /bin/systemctl disable *
%sudo ALL=(ALL) NOPASSWD: /bin/systemctl stop *
%sudo ALL=(ALL) NOPASSWD: /bin/systemctl mask *
%sudo ALL=(ALL) NOPASSWD: /bin/systemctl unmask *
%sudo ALL=(ALL) NOPASSWD: /bin/systemctl enable *
%sudo ALL=(ALL) NOPASSWD: /bin/systemctl start *
%sudo ALL=(ALL) NOPASSWD: /bin/systemctl restart *
%sudo ALL=(ALL) NOPASSWD: /bin/systemctl reload *
# Linuxify - cleanup commands
%sudo ALL=(ALL) NOPASSWD: /usr/bin/apt clean
%sudo ALL=(ALL) NOPASSWD: /usr/bin/apt autoremove -y
%sudo ALL=(ALL) NOPASSWD: /usr/bin/apt autoremove --purge -y
%sudo ALL=(ALL) NOPASSWD: /usr/bin/journalctl --vacuum-time=7d
%sudo ALL=(ALL) NOPASSWD: /usr/bin/journalctl --vacuum-size=500M
%sudo ALL=(ALL) NOPASSWD: /usr/bin/flatpak remove --unused -y
%sudo ALL=(ALL) NOPASSWD: /usr/bin/dnf clean all
%sudo ALL=(ALL) NOPASSWD: /usr/bin/pacman -Sc --noconfirm
%sudo ALL=(ALL) NOPASSWD: /usr/bin/rm -rf /tmp/*
%sudo ALL=(ALL) NOPASSWD: /usr/bin/rm -rf /var/tmp/*
%sudo ALL=(ALL) NOPASSWD: /usr/bin/rm -rf /root/.cache
%sudo ALL=(ALL) NOPASSWD: /usr/bin/find /root -name "*.old" -delete
To verify sudoers was applied correctly:
sudo -n systemctl status systemdIf this runs without asking for a password, sudoers is configured correctly!
This approach runs Linuxify directly as root with full privileges, without needing sudoers configuration.
Setup
cd linuxify
sudo PATH=$PATH bash bin/linuxify.shOr to preserve the entire environment:
cd linuxify
sudo -E bash bin/linuxify.shWhy PATH preservation matters:
sudostrips environment variables for security- Without it, sudo can't find
nodefrom NVM, Homebrew, etc. PATH=$PATHor-Eexplicitly tells sudo to preserve these- The bash wrapper then finds and executes node properly
Security Considerations:
⚠️ The web interface runs as root (all operations have full system access)⚠️ Only access from localhost (127.0.0.1) - do not expose to network⚠️ Do not expose to internet or untrusted networks- ✅ Simpler setup - no sudoers configuration needed
- ✅ Useful for one-time administrative tasks
- ✅ Full control without privilege escalation concerns
When to Use:
- Initial system setup/optimization before users are added
- Running as system administrator on local machine only
- One-time cleanup/optimization tasks
- When you want to avoid sudoers configuration complexity
To configure sudoers without starting the app:
sudo bash setup.shThis script:
- ✓ Validates sudoers syntax before applying
- ✓ Creates automatic backups
- ✓ Prefers
/etc/sudoers.d/linuxifyfor safer configuration - ✓ Verifies the final configuration
- ✓ Shows clear success/error messages
- ✓ Handles both systemctl and cleanup commands
- Optimizable - Non-critical services you can safely disable
- All Services - Complete system services list
- Critical services are protected (cannot be disabled)
- UI Extensions - GNOME shell cosmetic/UI extensions (heavy hitters like blur-my-shell, arcmenu)
- Other Extensions - System extensions (keyboard layout, keyboard indicators)
One-click cleanup actions:
- APT cache & autoremove
- Desktop thumbnails & trash
- NPM, Yarn, Pip caches
- Flatpak unused packages
- Journal logs (7+ days)
- Old kernels
- Disable all UI extensions (preserves dash-to-panel)
- Force refresh system data
Real-time display of:
- Uptime - System uptime duration
- Load Average - CPU load (color-coded: green < 0.5, yellow < 1.0, red > 1.0)
- Memory - Used / Total RAM
- CPU - Processor model
- Disk - Available / Total / Used space
linuxify/
├── server.js # Express server
├── package.json # Dependencies
├── modules/
│ ├── services.js # Service management
│ ├── extensions.js # GNOME extension control
│ └── system.js # System info & cleanup
├── views/
│ └── index.ejs # Main UI (Vue 3)
├── docs/
│ ├── index.html # Landing page
│ └── docs.html # Advanced documentation
└── README.md # This file
- Backend: Node.js + Express
- Frontend: Vue 3 (CDN) + EJS templates
- Styling: Tailwind CSS + DaisyUI
- Task Runner: npm scripts + nodemon
Edit server.js to change:
- Port:
const PORT = 3000;(line 7) - Refresh interval:
setInterval(refresh, 5000);(line 338 in index.ejs)
- Critical Services - Marked red, cannot be toggled
- Non-critical Only - Services tab filters by default to safe options
- Cleanup Tasks - All non-destructive, safe to run multiple times
- Read-only Operations - Monitoring and info gathering don't modify system
Run through sudoers configuration above to allow passwordless sudo for specific commands.
Change PORT in server.js or kill existing process:
fuser -k 3000/tcpSome extensions may be installed in system directories. Refresh browser cache.
Some services may lock files. Try one task at a time and wait a moment.
MIT - See LICENSE file
Contributions welcome! Feel free to open issues and pull requests.
Linuxify - Keep your Linux system optimized, one click at a time.