mwguerra/web-terminal
Secure web terminal for Laravel with Filament integration. Run whitelisted commands locally or over SSH, with interactive PTY sessions, enum-based permissions, reusable scripts, and full audit logging for safe, traceable execution.
terminal:install scaffolder, Terminal Logs resource, and stats widgets represent weeks of undifferentiated work you can skip.TerminalPermission and per-instance allowedCommands give you a concrete artifact to point to in security reviews and SOC2/ISO control narratives — "operators can only execute a documented allowlist, and every command is logged."--with-tenant migration and built-in tenant isolation open a use case for exposing terminal-adjacent tooling (or restricted command surfaces) inside customer workspaces — but only after deciding whether that's a support capability or a customer-facing one (see risk below).--allow-secure-commands default, install flags, and migration guidance give you a template for "safe-by-default" adoption paths in your own platform team's tooling.Good fit when:
WebTerminalPlugin::make(), embeddable Schema component, logs resource) is the primary value prop.Look elsewhere when:
Minimum adoption gate: pin ^2.0, run terminal:install --no-tenant (or --with-tenant if applicable), start with --allow-secure-commands only, enable logging, restrict the terminal page to a named role, and review the allowlist with security before any production exposure.
To executives / leadership:
We can give trusted operators a controlled way to run a small, approved list of server commands — restarting queues, checking logs, running specific artisan tasks — from the admin panel, without giving anyone a raw shell. Every command, output, and error is logged, and access is gated by an explicit command allowlist and a permission enum. It's a ~30-day build we'd otherwise own; adopting the package gets us there in days with an audit trail built in. Key caveats: it's a small open-source project (single maintainer, ~30 stars), so we pin the version, restrict it to technical staff, and treat upgrades as planned work. The packaged "full interactive shell" feature is being deprecated into a separate plugin, so we intentionally are not dependent on it.
To engineering:
Drop-in Filament plugin —
WebTerminalPlugin::make()and you have a terminal page plus a searchable Terminal Logs resource with stats. UseWebTerminal::make()->local()->allowedCommands([...])for embedded scenarios, or SSH for remote hosts. Interactive PTY/tmux works forartisan tinkerandqueue:work. Requires Laravel 12–13 / Filament 5 / Livewire 4 / PHP 8.3 — if we're on older, we're stuck on v1.x. Default install is--allow-secure-commands(readonly-ish); do not ship--allow-all-commands. Enable logging and multi-tenancy only if we actually need tenant isolation. Ignore Stream mode — it's frozen and moving to a separate plugin; don't architect around it. Watch the v2 major-version removal of Stream when planning upgrades.
To security / compliance:
The package is explicit that it provides real shell access to real servers and ships with an "use at your own risk" disclaimer. Our mitigations: allowlist per terminal instance, enum-based permissions, mandatory audit logging (commands, outputs, errors, connections), rate limiting, session inactivity timeout, and access restricted to a small named role. We treat it as an internal-ops tool, not a customer surface. Reviewable allowlist is the primary control; logging is the secondary.
Bottom line: strong internal-ops fit if we're on Filament 5 and want a fast, auditable, whitelisted command runner; weak fit as a strategic dependency, a customer-facing feature, or a full-shell solution. Adopt with version pinning, a security-reviewed allowlist, and a small blast radius.
How can I help you explore Laravel packages today?