A modern, cross-platform process manager with a glassmorphism UI
Spawn, monitor, and manage your apps — all from one beautiful desktop GUI. Labalaba keeps your tasks running in the background while you stay in control.
Download · Report Bug · Request Feature
| Feature | Description |
|---|---|
| 🚀 Process Spawner | Launch any .exe, script, or binary with custom args and environment |
| 📋 Task Persistence | Tasks saved to tasks.yaml — survive restarts, start manually |
| 📡 Real-time Logs | Live terminal-style log viewer with stdout/stderr per task |
| 🔄 Start / Stop / Restart | Full lifecycle control with one click |
| 🛡️ Admin Elevation | Run tasks as Administrator via UAC (Windows) |
| 🔁 Auto-restart | Automatically restart crashed processes (survives window close in daemon mode) |
| ⏰ Cron Scheduling | Schedule tasks with standard 5-field cron expressions (survives window close in daemon mode) |
| 🔗 Task Dependencies | Start tasks in order with configurable delays |
| 🌓 Light / Dark Theme | Glassmorphism UI with smooth theme toggle |
| 🔔 Notifications | Desktop alerts on crash or unexpected stop |
| 🖥️ System Tray | Closing the window hides to the tray; use tray Quit to exit fully |
| 📊 Stats Bar | Live counts of running / stopped / crashed tasks |
Labalaba is split into two processes: a GUI (Tauri/SvelteKit) and a daemon (labalaba-daemon) that does the actual process management. The GUI is a thin client — it talks to the daemon over a local, token-authenticated HTTP + WebSocket connection on 127.0.0.1. The daemon binary is bundled as a sidecar and launched automatically by the GUI.
┌─────────────────────────────┐ ┌─────────────────────────────────┐
│ Labalaba GUI (Tauri) │ │ labalaba-daemon (sidecar) │
│ │ │ │
│ ┌─────────────────────┐ │ │ AppState · Use Cases │
│ │ SvelteKit UI │ │ HTTP │ YAML persistence │
│ │ (WebView) │◄──┼────────┤ Log streaming (WebSocket) │
│ └─────────────────────┘ │ WS │ Cron scheduler │
│ │ │ Auto-restart loop │
└─────────────────────────────┘ └──────────────┬───────────────────┘
│ std::process::Command
┌────────┼────────┐
Task1 Task2 TaskN ← OS processes
The daemon can run in two modes:
- Session only (default): the GUI starts the daemon as a child process and stops it on exit. Cron schedules and auto-restart are active only while the window is open.
- Daemon mode (Launch at login ON): the daemon is registered as a user-level autostart service (systemd user unit on Linux, LaunchAgent on macOS, registry entry on Windows) and keeps running after the window is closed. Cron and auto-restart survive the GUI closing.
The daemon logic is built with Domain-Driven Design (DDD):
crates/daemon/src/
├── domain/ # Entities, value objects, repository traits
├── application/ # One use case per file (StartTask, StopTask, …)
├── infrastructure/ # YAML persistence, process spawner, log collector
└── interface/ # axum HTTP + WebSocket server
Grab the latest release for your platform:
| Platform | Download |
|---|---|
| Windows (x64) | labalaba-windows-x64.msi |
| Linux (x64) | labalaba-linux-x64.AppImage |
| macOS | labalaba-macos.dmg |
Prerequisites: Rust 1.75+, Node.js 18+, npm
git clone https://github.com/rizquuula/labalaba.git
cd labalaba
make install # install frontend npm dependencies
make dev # dev mode: Tauri app + hot-reload frontend
make build # release build (produces installer in gui/src-tauri/target/release/bundle/)1. Launch the app
Open Labalaba. The daemon starts automatically as a background process — nothing else to install or run.
2. Add a task
Click New Task → fill in the executable path → Create Task.
3. Start it
Hit ▶ Start on the task card. Logs stream in real time.
Tasks are stored in tasks.yaml in the working directory (repo root in dev, next to the binary in production):
tasks:
- id: "550e8400-e29b-41d4-a716-446655440000"
name: "My API Server"
executable: "C:\\Apps\\server.exe"
arguments: ["--port", "8080"]
working_directory: "C:\\Apps"
environment:
NODE_ENV: "production"
run_as_admin: false
auto_restart: true
schedule: null # or cron: "0 */6 * * *"
startup_delay_ms: 0
depends_on: []App settings are in settings.yaml:
theme: "dark" # "dark" | "light"
log_buffer_lines: 5000
notifications_enabled: true
auto_check_updates: true
launch_at_login: false # true = daemon mode; survives window closeData directory: set
LABALABA_DATA_DIRto override wheretasks.yaml,settings.yaml, andlogs/are stored.
| Layer | Technology |
|---|---|
| GUI | Tauri 2 + SvelteKit 5 + TypeScript |
| Daemon | Rust + tokio — separate sidecar process |
| Transport | Local HTTP + WebSocket (axum) on 127.0.0.1, token-authenticated |
| Persistence | YAML (serde_yaml) |
| Scheduling | Standard 5-field cron expressions (cron crate) |
| Styling | Glassmorphism CSS with CSS custom properties |
Contributions are welcome! Please read CONTRIBUTING.md first.
# Fork the repo, then:
git clone https://github.com/YOUR_USERNAME/labalaba.git
cd labalaba
# Create a feature branch
git checkout -b feat/my-feature
# Make changes, then run checks
cargo check -p labalaba-daemon
cd gui && npm run check
# Commit and open a PR
git commit -m "feat: add my feature"
git push origin feat/my-featurelabalaba/
├── crates/
│ ├── daemon/ # Process manager logic (Rust, DDD) — lib + standalone bin
│ └── shared/ # Shared types (DTOs, API models)
├── gui/
│ ├── src/ # SvelteKit frontend
│ │ ├── lib/
│ │ │ ├── api/ # Tauri invoke/listen clients
│ │ │ ├── components/ # UI components
│ │ │ └── stores/ # Svelte stores (tasks, theme, settings)
│ │ └── styles/ # Glassmorphism + theme CSS
│ └── src-tauri/ # Tauri app — embeds daemon logic + Tauri commands
└── docs/ # Design documents & assets
MIT © M Razif Rizqullah
If Labalaba saves you time, consider giving it a ⭐
Made with ❤️ and a lot of ☕ in Rust