On this page
Changelog
All notable changes to LaraEnv are published as releases on GitHub. This page mirrors them, newest first. The full list with downloadable installers lives at github.com/thayronarrais/laraenv/releases.
[v0.4.21] — 2026-06-18
Highlights
This release makes the Command Palette work from the tray and gives terminal/SSH commands a native-or-in-app choice.
- Commands work even when LaraEnv is minimized to the tray. Opening a folder, an editor, a browser URL, or toggling a service from the global command bar previously did nothing while the window was hidden — those actions were sent to the hidden UI. They now run directly, so the bar is useful without ever showing the main window.
- Terminal & SSH: native by default, xterm.js on demand. From the palette, Enter opens a native external terminal (or SSH session); Shift+Enter opens it as an in-app xterm.js tab (multi-tab, inside LaraEnv) using your configured default shell. Same behavior in the global command bar and the in-app
Ctrl+Kpalette. - Reliability fix. The first couple of command-bar actions could silently fail (a write/quit race dropped the intent). The bar now waits for the action to be handed off before closing, so commands fire on the first try.
What's new & fixed
Command bar
- Runs from the tray — open folder / open in editor / open in browser and service start/stop/reload execute directly in the backend, independent of the main window's visibility.
- Native vs in-app terminal —
Enter= native external terminal,Shift+Enter= in-app xterm.js tab. Applies to "Open terminal ·", the inline launcher ( <project> php artisan …), andssh:<host>. The palette footer and the selected row show the⇧↵ xterm.jshint. - External SSH —
ssh:<host>on Enter opens your default terminal running thesshCLI for the saved host (port, key, and ProxyJump are applied automatically; password hosts prompt in the window).
Fixes
- No more dropped commands — the bar now awaits the intent write before quitting, fixing the intermittent "had to try 2–3 times" behavior.
Install
- Download
LaraEnv-0.4.21.msiand double-click. - SHA-256 in
LaraEnv-0.4.21.msi.sha256. - Auto-update from prior versions picks this up automatically.
Compatibility
- Windows 10+ (x64).
- No config or data migrations — drop-in replacement for 0.4.20.
[v0.4.20] — 2026-06-17
Highlights
This release adds a Command Palette — a Spotlight-style launcher that drives all of LaraEnv from the keyboard — summonable with an OS-wide global hotkey even when the window is hidden in the tray.
- Command Palette (
Ctrl+K). Fuzzy-search and run anything without leaving the keyboard: jump to any page, start/stop/reload services, and act on any project (open its terminal, folder, editor, or browser). - Global hotkey. Bind an OS-wide shortcut (e.g.
Win+Shift+K) that pops the palette as a focused Spotlight bar over any app — even when LaraEnv is minimised to the tray. It opens ready to type, so you can start typing the instant it appears, no mouse click needed. - Inline launcher. Type
project php artisan migrateto run a command in a project's terminal, orssh:hostto open an SSH session. Tab autocompletes projects, artisan/npm commands, and hosts. - Custom commands. Define your own palette entries in Settings — run a terminal command, control a service, or navigate — each with an optional global hotkey of its own.
What's new
Command Palette (new)
- In-app palette on
Ctrl+K(rebindable in Settings → Command Center). - Built-in commands, generated from live app state:
- Navigation — Dashboard, Projects, Terminal, SSH, Cron, Deployments, Libs/Tools, Settings.
- Services — Start / Stop all, Reload web stack, and per-service Start / Stop / Reload.
- Projects — New Project, and per project: open terminal, folder, editor, or browser.
- Launcher mode —
<project> <command…>runs in that project's terminal;ssh:<host>opens SSH. - Keyboard-first — ↑↓ navigate, Tab complete, Enter run, Esc close.
Global hotkey & command bar
- A rebindable OS-wide hotkey summons the palette as a standalone Spotlight bar, even when LaraEnv is hidden or minimised to the tray.
- The bar opens already focused — type the instant it appears, no click required. (On Windows, a freshly spawned WebView2 window does not receive keyboard focus until clicked; LaraEnv now hands focus to the web content the way the window manager expects.)
Custom commands
- Add your own commands in Settings → Command Center: run a terminal command (optionally scoped to a project), control a service, or navigate — each bindable to its own global hotkey.
Install
- Download
LaraEnv-0.4.20.msiand double-click. - SHA-256 in
LaraEnv-0.4.20.msi.sha256. - Auto-update from prior versions picks this up automatically.
Compatibility
- Windows 10+ (x64).
- No config or data migrations — drop-in replacement for 0.4.19.
[v0.4.19] — 2026-06-15
Highlights
This release makes custom dev commands work properly on Windows (the focus of #3) and ships a batch of dev-server lifecycle fixes plus a new Ports panel.
- Custom dev commands now resolve
php/composerwithout full paths. The dev runner only put the project's Node bin onPATH, so a custom command likecomposer run devorphp artisan servefailed unless you typed full executable paths. It now prepends the project's PHP + Composer + Node bin dirs, just like the embedded terminal. - One-click "Make
composer run devWindows-safe". Laravel 11'sdevscript runsphp artisan pail, which needs thepcntlextension — andpcntlhas no Windows build, socomposer run devcrashes (and--kill-otherstakes the whole stack down). A new button in the dev-command modal rewrites your project'scomposer.jsonto drop just the Pail process, socomposer run devruns natively on Windows. - New Ports panel — see every TCP port LaraEnv holds (dev servers + services), grouped by owner and searchable, with a per-port Kill to reclaim a stuck port.
What's new & fixed
Dev servers (#3)
- PATH includes PHP + Composer + Node — custom dev commands resolve bare
php,composer,artisan, etc. without full paths. - "Make
composer run devWindows-safe" button — strips thephp artisan pailprocess (and its--namesentry) fromcomposer.json'sdevscript. Explicit and user-triggered (never automatic), idempotent, and it only touches that one line — the rest of yourcomposer.jsonformatting is preserved. Stopactually frees the port —composer run dev/php artisan servespawn detached children that a PID-treetaskkillmissed, leaving the port bound so the next Start collided. Stop now also frees the ports the tree was listening on (scoped to our ownphp/nodeprocesses).- Proxy targets the app server, not Vite — for a Laravel
composer run devthat starts bothartisan serve(:8000) and Vite (:5174), the reverse proxy now locks onto the application server instead of the asset server. composer create-project --ignore-platform-reqs— creating a Laravel project no longer aborts on Windows when a package declares POSIX-only extensions (Horizon'sext-pcntl, etc.).
Ports panel (new)
- A Ports in use view (network icon in the title bar): owner · port · process · PID, grouped by owner, with a filter box and a Kill button per port.
App lifecycle
- Single-instance lock — relaunching LaraEnv now focuses the existing window instead of spawning a duplicate process. Previously, closing to the tray and reopening started a second instance that couldn't see the first one's running dev servers and reported their ports as "busy".
- Startup orphan reclaim — stray dev-server ports left by a previous run (e.g. after a crash) are freed on launch, with a notice of what was reclaimed. Strictly scoped to ports LaraEnv reserved and to our own
php/nodeprocesses.
Install
- Download
LaraEnv-0.4.19.msiand double-click. - SHA-256 in
LaraEnv-0.4.19.msi.sha256. - Auto-update from prior versions picks this up automatically.
Compatibility
- Windows 10+ (x64).
- No config or data migrations — drop-in replacement for 0.4.18.
- The "Make
composer run devWindows-safe" button edits your project'scomposer.jsononly when you click it; it's reversible (it's your file, under version control).
[v0.4.18] — 2026-06-10
Highlights
Two data-safety fixes for Deployments, both found while dogfooding 0.4.17:
- Detect no longer erases your deployment config. Running Detect used to overwrite the server-side config blob with detection results only, silently dropping the saved Apply settings (preset, domain, git URL, SSL…) — which also made the Deploy button vanish. Detect now preserves the apply config, mirroring how Apply preserves detection results.
- Re-apply now preserves
storage/too. 0.4.17 protected.env; this release extends the same protection to the wholestorage/directory (user uploads, logs). Re-provisioning a live site no longer destroys client-uploaded files.
What's fixed
Deployments
- Detect preserves the saved apply config — the PATCH sent after detection now carries the existing
applyblob alongside the freshdetectionresults instead of replacing the whole config. Re-running Detect keeps the Deploy button, the chosen preset, and every Apply form value intact. storage/survives re-apply — before the wipe-and-clone,.envandstorage/are moved into a keep directory on the same filesystem (/var/www/.laraenv-keep-<name>), then restored over the fresh clone. Moving (not copying) means zero extra disk usage even for multi-GB storage dirs, and nothing lands in/tmp(often RAM-backed tmpfs).- Crash-safe keep-dir lifecycle — the keep directory is only removed after a successful clone + restore. If the clone fails midway (network drop, bad PAT), the preserved data stays put and the next Apply picks it up. Destroy removes the keep directory along with the deploy dir, so nothing is left behind. At most one keep dir exists per deployment (each backup replaces the previous one).
- DB credentials are never rotated on re-apply anymore — with
.envpreserved, the MySQL bootstrap's idempotent fast path (existing credentials authenticate → skip) now actually triggers on re-apply, so the database user and password stay untouched.
Install
- Download
LaraEnv-0.4.18.msiand double-click. - SHA-256 in
LaraEnv-0.4.18.msi.sha256. - Auto-update from prior versions picks this up automatically.
Compatibility
- Windows 10+ (x64) for the desktop app.
- Cloud deploy targets: Ubuntu/Debian (apt-based).
- No config or data migrations. Drop-in replacement for 0.4.17.
- Note: deployments whose config was already lost to the Detect bug (config saved before 0.4.18, Detect re-run on 0.4.16/0.4.17) need their Apply form filled in once more — this release prevents the loss going forward but can't recover what the server already overwrote.
[v0.4.17] — 2026-06-10
Highlights
- Deploy script presets. Deployments now ship with a library of bash pipeline presets — Laravel Production, Laravel Development, Static/Node — that you pick per deployment, adapt with variables, and preview before anything runs. Built-ins are smart:
composer installonly runs whencomposer.json/composer.lockactually changed since the last deploy,npm ci && npm run buildonly whenpackage.json/package-lock.json(orresources/,vite.config.*) changed. First deploys run everything. - "Deploy" is now its own button. Provisioning (Apply) and deploying code (pull + builds) are separate steps. The new green Deploy button on each deployment card runs just the pipeline over SSH with live logs — no packages, vhosts, or SSL touched.
- Your
.envsurvives re-apply. Re-running Apply used to wipe the deploy directory and recreate.envfrom.env.example, silently destroying hand-edited values (mail creds, API keys). Apply now backs up.envbefore the wipe and restores it over the fresh clone. - Fixed: service cards stuck on RUNNING after Stop all. Closing the service-logs viewer silently deregistered every
service:statuslistener in the app, freezing the Dashboard cards until restart — Stop all then looked like a no-op even though services actually stopped.
What's new
Deploy script presets
- Preset manager — "Script presets" button on the Deployments page. Three read-only built-ins; duplicate any of them to create a customizable copy edited in Monaco (shell highlighting).
- Variables — presets resolve
{name},{domain},{raw_domain},{branch},{php_version},{deploy_root},{environment},{git_url},{web_server},{database}from the deployment config, plus custom variables you declare per preset (label + default) and fill per deployment. Bash${VAR}expansion is left untouched. - Per-deployment adaptation — pick a preset in the Apply form, fill its variables, or click "Customize script for this deployment" to edit a private copy (the preset itself stays untouched, with "Reset to preset" one click away).
- Script preview — see the exact rendered bash (variables substituted, execution wrapper included) before saving or running. Unresolved variables are flagged. Preview and execution share one code path, so what you see is literally what runs.
- One pipeline, three triggers — the same rendered script runs as the Apply build step, behind the new Deploy button, and inside the auto-deploy cron on the server.
- Cloud sync — custom presets sync across machines as end-to-end-encrypted resources (Pro + sync enabled); they work fully offline/local otherwise.
- Run history — manual deploys are recorded as runs with encrypted logs, like Apply.
What's fixed
Deployments
.envpreserved on re-apply — backed up to/tmpbefore the wipe-and-clone, restored after. The deploy pipeline itself usesgit fetch + resetand never touches untracked files.- Auto-pull script written via base64 — the cron script is no longer written through a heredoc, so user-authored pipelines containing arbitrary lines can't truncate it.
- Legacy build scripts unchanged — existing deployments with a free-text build script keep producing byte-identical plans; the Apply form preselects "Free-text build script (legacy)" for them.
Dashboard / services
- Stale RUNNING status after Stop all —
EventsOff("service:status")in the service-logs modal removed every listener for the event app-wide (Wails semantics), permanently deafening the kept-alive Dashboard, Projects, and Downloads pages. All shared-event consumers now use the per-listener canceler returned byEventsOn. The same fix was applied toinstall:progress(closing the PHP Extensions or Bootstrap modal no longer kills download progress on the Libs/Tools page).
Install
- Download
LaraEnv-0.4.17.msiand double-click. - SHA-256 in
LaraEnv-0.4.17.msi.sha256. - Auto-update from prior versions picks this up automatically.
Compatibility
- Windows 10+ (x64) for the desktop app.
- Cloud deploy targets: Ubuntu/Debian (apt-based).
- No config or data migrations. Drop-in replacement for 0.4.16.
- Deployments saved before this version keep their free-text build script behavior exactly as-is until you switch them to a preset.
[v0.4.16] — 2026-06-09
What's fixed
Two bugs that broke cloud deploys to fresh Ubuntu/Debian hosts:
composer installfailed withClass "Normalizer" not found. The PHP package list installed during apply was missingphp<ver>-intl. Without ext-intl, Symfony String (used by Composer) fatals on startup. Apply now installsphp<ver>-intlalongside the other extensions.nginx -tfailed withinvalid value "http_502". The generated vhost listedhttp_502infastcgi_next_upstream. Unlikeproxy_next_upstream, the FastCGI variant does not accepthttp_502/http_504(those are gateway errors nginx emits itself, not FastCGI backend responses). The directive now useshttp_500 http_503only.
If you already have a host that failed mid-deploy, you can unblock it manually:
sudo apt install php8.4-intl && sudo systemctl restart php8.4-fpm
sudo sed -i 's/http_500 http_502 http_503/http_500 http_503/' /etc/nginx/sites-enabled/*.conf
sudo nginx -t && sudo systemctl reload nginx
Then re-run the deploy — both steps are idempotent and will overwrite cleanly.
Install
- Download
LaraEnv-0.4.16.msiand double-click. - SHA-256 in
LaraEnv-0.4.16.msi.sha256. - Auto-update from prior versions picks this up automatically.
Compatibility
- Windows 10+ (x64) for the desktop app.
- Cloud deploy targets: Ubuntu/Debian (apt-based). No changes for Windows-local stacks.
- No config or data migrations. Drop-in replacement for 0.4.15.
[v0.4.15] — 2026-06-09
English-only UI strings
Translated the remaining Portuguese strings that surfaced in the UI to English:
- Libs/Tools catalog notes (MySQL, PostgreSQL, Redis, Node.js, PHP, Cmder, Mailpit).
- Service start/stop/restart error toasts.
- Installer progress and error messages.
Install
Run LaraEnv-0.4.15.msi. Existing installs update in place; the in-app updater will also offer it. Verify against LaraEnv-0.4.15.msi.sha256.
[v0.4.14] — 2026-06-09
Service logs, running indicators & smarter splits
View service logs
A new button next to the window controls opens a Service logs viewer. Each service's stdout/stderr is captured into a rolling buffer, so you can read the output of any started service — nginx, MySQL, PostgreSQL, Mailpit, Redis, php-fpm — and quickly see why one failed to come up.
Libs/Tools shows running state
Each service in Libs/Tools now shows a live RUNNING / STOPPED badge. A service that's running but hidden from the dashboard no longer looks "off".
Splits open in the same folder
Splitting a terminal pane now opens the new pane in the active pane's working context (the project folder / the directory it was started in) instead of the default install directory.
Install
Run LaraEnv-0.4.14.msi. Existing installs update in place; the in-app updater will also offer it. Verify against LaraEnv-0.4.14.msi.sha256.
[v0.4.13] — 2026-06-09
Dashboard & terminal quality-of-life
Service cards show a transitional state
Starting or stopping a service (nginx, MySQL, Postgres, Mailpit, Redis…) now shows an amber STARTING… / STOPPING… state immediately and disables the card until the real status arrives. No more wondering whether your click registered — or accidentally double-clicking a service (like nginx, which also brings up its php-fpm dependencies) while it's still coming up.
Terminal resolves the live PATH
The embedded terminal used to inherit the PATH snapshot from when LaraEnv launched, so a CLI you installed afterwards (global npm bins, claude, etc.) showed up as "command not found" until you fully quit and reopened the app. It now re-reads the live machine + user PATH from the Windows registry every time a shell opens, so newly installed tools work without restarting LaraEnv.
Install
Run LaraEnv-0.4.13.msi. Existing installs update in place; the in-app updater will also offer it. Verify against LaraEnv-0.4.13.msi.sha256.
[v0.4.12] — 2026-06-09
Terminal workspace — floating groups & detachable windows
The Terminal page is now a flexible workstation built for "vibe coding": run many shells, SSH sessions and project terminals side by side, arrange them however you like, and even pop them out into their own windows.
What's new
- Floating group windows — each group is a movable, resizable window with its own browser-style tab strip. Overlap them, bring one to front, maximize, or snap to a screen edge/quadrant (Windows Snap style).
- Drag-to-split panes — drag a tab or pane onto another pane's edge to split it; drop on the center to merge as a tab. The split buttons remain as a shortcut.
- Browser-style tabs — reorder within a group, drag a tab into another group to merge, or tear it off onto the canvas to spin up a new group.
- Detach to an independent window — pop a group out into its own OS window (opens maximized) with the ⧉ button or by dragging it outside LaraEnv. Bring it back anytime with the ⇤ button.
- Layout persistence — your groups, tabs and splits are restored on the next launch, with each terminal re-opened (SSH reconnects with the live progress timeline).
- Polish — the first terminal opens maximized, panes have rounded corners and a small text inset, and a closed-out canvas always offers a New terminal button.
Install
Run LaraEnv-0.4.12.msi. Existing installs update in place; the in-app updater will also offer it.
Verify the download against LaraEnv-0.4.12.msi.sha256.
[v0.4.11] — 2026-06-07
Large uploads (e.g. a few-hundred-MB video) could freeze the whole dev server until a restart. This release fixes that and makes PHP upload/runtime limits configurable.
Highlights
- PHP-FPM worker pool — each PHP version now runs a pool of
php-cgiworkers (4 by default) behind an nginx upstream, so a single long request (like a big upload) no longer blocks every other request on the site. - Automatic php.ini tuning —
upload_max_filesize,post_max_size,memory_limit,max_execution_timeandmax_input_timeare now provisioned on every installed version (generous 512M / 300s defaults), instead of the tiny stock values that silently rejected large uploads. - New "PHP" section in Settings — tune the upload/memory limits, timeouts and the worker-pool size; changes apply immediately and reload the PHP-FPM pools + nginx.
- Higher nginx body limit —
client_max_body_sizedefault raised to 512M so large uploads aren't rejected before reaching PHP.
Install
Download LaraEnv-0.4.11.msi and run it. Verify the download against LaraEnv-0.4.11.msi.sha256.
[v0.4.10] — 2026-06-06
What's new in 0.4.10
New: Custom dev server command per project
The Start button in a project's Dev section is no longer locked to
npm run dev. You can now set your own command per project — ideal for
Laravel stacks that drive their dev workflow through Composer or Artisan.
- Click the ▾ caret next to Start and choose Configure command… to set a custom command for that project.
- It runs any command, not just package-manager scripts — e.g.
composer run dev,php artisan serve, or whatever your stack uses. - Leave it empty to keep the default
npm run dev— existing projects are unaffected. - Need the port? Drop a
{port}token anywhere in your command (e.g.php artisan serve --port={port}) and LaraEnv substitutes the free port it reserves. Without the token, the tool picks its own port and LaraEnv still detects it from the logs to wire up the reverse proxy. - Projects with a custom command now show the Dev section even when they aren't a JavaScript project, so plain Laravel apps get a Start button too.
Thanks to @azharazziz for the feature request (#3).
Install / verify
Download LaraEnv-0.4.10.msi and verify with the included sidecar:
(Get-FileHash -Algorithm SHA256 LaraEnv-0.4.10.msi).Hash
# expected: 2BFFCBB263D94E8680CA54E83119EC064CD9FAC82717604DBD4A28F9F9198C30
[v0.4.9] — 2026-06-04
What's new in 0.4.9
New: Projects menu in the system tray
The tray icon now lets you act on your projects without opening the main window. Right-click the tray icon and open Projects to browse your projects grouped by tag.
- Projects are organized into submenus by tag (a project with multiple tags appears under each one); projects without tags are grouped under Untagged.
- Each project offers the same quick actions as the Projects page:
- Open Folder — open the project folder in Explorer.
- Open Editor — open it in your configured/default editor.
- Open Terminal — open an external terminal already in the project directory, with the project's PHP/Node on PATH.
- Open in Browser — open the project URL (e.g.
http://project.test).
- The menu refreshes automatically, so adding/removing projects or editing tags shows up without restarting the app.
The existing Services menu, Start All / Stop All, and Quit behavior are unchanged.
Install / verify
Download LaraEnv-0.4.9.msi and verify with the included sidecar:
(Get-FileHash -Algorithm SHA256 LaraEnv-0.4.9.msi).Hash
# expected: 7A296C27DA6D3C33941F3ED075012A4E54F47925AE895FA068588670F57821A5
[v0.4.8] — 2026-06-03
What's new in 0.4.8
Fixed: PHP startup warnings on every command
Running php, php artisan tinker, or Composer no longer floods the
terminal with PHP Warning: Unable to load dynamic library 'bcmath'
(and similar) messages.
Root cause: the php.ini generator enabled extensions without
checking whether a matching DLL actually shipped in ext/. Statically
compiled built-ins such as bcmath have no php_bcmath.dll by design,
so the extension=bcmath line could never load and warned on every run —
even though the functions were fully available.
The fix makes php.ini provisioning warning-free by construction and self-healing:
- An
extension=<x>line is now written only whenphp_<x>.dllexists inext/. Built-ins and genuinely missing DLLs are skipped. - Existing installs are repaired automatically on next launch: dead
extension=lines (no DLL), duplicate active lines (e.g. themysqli"already loaded" warning), and stale Unix.soexample paths left over from the PHP template are commented out.
bcmath and other built-ins keep working — they are compiled into the PHP binary; only the redundant, warning-emitting lines are removed.
Verified clean across PHP 7.4, 8.1, 8.3, and 8.4.
Install / verify
Download LaraEnv-0.4.8.msi and verify with the included sidecar:
(Get-FileHash -Algorithm SHA256 LaraEnv-0.4.8.msi).Hash
# expected: 92954EF7CEEB93C6202017C8727E2F85F9DFD7C752B186E1F919A389AF569670
[v0.4.7] — 2026-05-30
What's New
SFTP In-App File Editor
Edit remote files without leaving LaraEnv. Open any text file over SFTP, modify it in a built-in editor, and save it back to the server instantly. For files that are too large or binary, LaraEnv offers to open them in your system editor instead.
External Editor Sessions
Open a remote file in VS Code, Cursor, PhpStorm, or any installed editor with one click. LaraEnv downloads the file to a temp folder, watches it for changes, and automatically uploads it back to the server on every save — no manual sync needed.
Editor Auto-Detection
LaraEnv now detects installed editors at startup and lets you pick a per-project default. Supported: VS Code, Cursor, PhpStorm, WebStorm, Sublime Text, Notepad++, and any custom command.
Bug Fixes
System Tray Restore
- Double-clicking the tray icon (Windows convention) now reopens the app window
- The window is reliably brought to the foreground instead of appearing silently behind other windows
[v0.4.6] — 2026-05-22
What's New
Open in Editor
Projects can now be opened directly in your preferred code editor with one click. LaraEnv detects installed editors automatically — VS Code, Cursor, PhpStorm, and Sublime Text — with support for a fully custom command. The default editor can be set globally and overridden per project.
SFTP File Editor
Remote files can now be edited directly in the SFTP browser without leaving LaraEnv. The built-in Monaco editor provides syntax highlighting for PHP, JavaScript, TypeScript, JSON, YAML, HTML, CSS, Shell, and more. Changes are auto-saved locally and written back to the server on save.
SFTP External Edit Session
Prefer your local editor for remote files? Open any SFTP file in an external editor session — LaraEnv syncs a temp file, watches for changes, and writes them back automatically.
PHP .ini Editor Upgrade
The php.ini editor now uses Monaco (the same engine as VS Code) instead of a plain textarea, with full syntax highlighting and line numbers. A new "Open in system editor" button opens the file directly in your default application.
Bug Fix: Window Overflow on 1366×768 Screens
The app window now detects the primary screen bounds at startup and clamps its size to fit. No more UI being cut off on smaller displays. (#2)
Installation
Download LaraEnv-0.4.6.msi and run it. The installer will upgrade any previous version automatically.
| File | SHA-256 |
|---|---|
LaraEnv-0.4.6.msi |
030a2013e865f4a486e272d30519f65282861a097e5adb7be2dbbb105d777434 |
[v0.4.5] — 2026-05-14
Remote file editing comes to the SFTP browser, and php.ini gets a real code editor.
SFTP file editing
- New Edit action on remote files. Pick your flow from a chooser modal:
- Built-in editor (VSCode) — Monaco with search (Ctrl+F), syntax highlight, minimap, Ctrl+S to save.
- System editor — opens the file in the OS default app (Notepad, VSCode, etc.) via a temp copy.
- Right-click context menu on remote files: Edit file, Open in built-in editor, Open with system editor, Rename, Delete.
- AutoSave toggle in both flows:
- Built-in editor: debounced auto-save (~800 ms idle) straight back over SFTP.
- System editor: watches the temp file's mtime and auto re-uploads on save — toggle off to use the manual Re-upload button.
- 5 MiB cap and binary sniffing on the built-in editor — falls back to the system editor for oversized or non-text files.
- Temp files cleaned up automatically when the SFTP modal closes.
php.ini editor
- "view php.ini" now opens the same chooser modal (Built-in vs System).
- Built-in path renders php.ini in Monaco instead of the old plain textarea — search, ini syntax highlight, Ctrl+S saves and restarts FPM.
- System path opens
C:\laraenv\php\<version>\php.iniin your OS default editor.
Verification
- SHA256:
ba87b7005c6caf7b54b0d1a9e3ab13166219f4113342bd98a9a6e3c64ec13af5 - File:
LaraEnv-0.4.5.msi
[v0.4.4] — 2026-05-14
Highlights
Fresh-install reliability fix: clicking Start All on a clean PC no longer fails with dep php-fpm:8.4.20: exec: no command. The PHP-FPM service registry, per-project version overrides, and nginx dependency wiring are now consistent across the major.minor folder layout (\php\8.4\).
What's fixed
Start All on a freshly bootstrapped machine
- PHP auto-activates immediately after install —
afterPhpInstallednow derives the on-disk folder name fromSource.InstallToinstead of trusting the catalog's full patch version ("8.4.20"). PreviouslySetActive("8.4.20")failed silently because the folder is\php\8.4\, leaving nocurrentsymlink and no PHP backend until the user restarted the app. currentsymlink is created in the same session — the post-install routine now refreshes the FPM registry a second time after activation, so nginx's Deps pick up the just-installed PHP without needing an app restart.- Per-project PHP overrides self-heal — a stale
Projects.PhpVersions[name] = "8.4.20"from an older release (when the catalog used patch-numbered folders) is now rewritten on first resolve to the matching installed major.minor ("8.4"). One-shot migration: the bad value disappears fromconfig.jsonautomatically. - nginx Deps filter unregistered FPMs — even if a phantom version slips through,
refreshPhpFpmServicesnow drops or remaps it before callingSetDeps, so nginx never tries to start a dependency that has no registered binary. - Loud error for unregistered services —
services.Manager.startOnenow returnsservice not registered: <name>instead of lettingexec.Command("", ...)produce the crypticexec: no command. Any future regression is immediately diagnosable.
Install
- Download
LaraEnv-0.4.4.msiand double-click. - SHA-256 in
LaraEnv-0.4.4.msi.sha256. - Auto-update from prior versions picks this up automatically.
Compatibility
- Windows 10+ (x64).
- No config or data migrations required. Stale
"8.4.20"-style overrides in existingconfig.jsonfiles are rewritten on the next project resolve — no manual edit needed. - Drop-in replacement for 0.4.3.
[v0.4.3] — 2026-05-12
Fixes
PHP-FPM no longer "randomly" stops
PHP-CGI on Windows self-terminates after PHP_FCGI_MAX_REQUESTS (default 500),
and the service supervisor never restarted it — so under normal use, a project
would suddenly start returning 502 Bad Gateway until you clicked Start
again on the Dashboard.
PHP_FCGI_MAX_REQUESTS=0is now set on everyphp-fpm:<version>service, disabling the self-recycle. PHP-CGI stays alive as long as the stack is up.- The service manager now auto-restarts internal services (php-fpm) with exponential backoff (500 ms → 1 s → 2 s → 4 s → 8 s). If PHP ever does crash, nginx/apache stop serving 502s within ~1 second instead of waiting for the next manual Start.
- The auto-restart respects user intent: clicking Stop still stops the process for good. A streak of 10 consecutive short-lived failures gives up with a clear error event instead of looping forever on a broken binary.
No more console window flashes on service start
Starting or restarting services briefly flashed a black console window. The
culprit was a Visual C++ Runtime smoke probe (<exe> --version) that ran
before every spawn without CREATE_NO_WINDOW. Fixed in:
internal/vcruntime— the smoke probe (fires on every Start and auto-restart)internal/php,internal/nodejs—mklink /Jfor the "current" version junctioninternal/cron—cmd.exe /Cfor every fired cron job
All of these now spawn fully hidden with HideWindow + CREATE_NO_WINDOW.
Downloads
LaraEnv-0.4.3.msiLaraEnv-0.4.3.msi.sha256
SHA-256: 18d59a77ea00353c6df42ae6e9a6521638fbaa700324c8de48530e03859ba92a
[v0.4.2] — 2026-05-11
Highlights
No more collisions when two npm projects share the same configured proxy port. Before, if you set PROXY:3000 on multiple projects, the second one to start would silently land on port 3001 while its vhost still pointed at 3000 — so both *.test hostnames hit the same backend. Now LaraEnv probes upward from the configured port until it finds a free one and rewrites the vhost to follow the real listening port for the lifetime of the run.
What's fixed
Dev server — automatic port collision handling
- Probe from the configured Proxy port —
StartDevServernow starts its free-port scan from the project's configuredProxyPort(instead of always from 3000). If that port is free, the dev server uses it and the vhost matches. - Slide up on conflict — if the preferred port is held by another LaraEnv dev server or by an external process, the manager increments (3000 → 3001 → 3002 …) until
net.Listensucceeds. Up to 200 candidates per start. - Vhost follows the real port — when the actual listening port differs from the configured
ProxyPort,applyVhostForregenerates the nginx + Apache vhosts pointing at the live port and reloads the running web server. Two projects with identicalPROXY:3000config now route correctly to their own backends. - Vhost restores on Stop — stopping the dev server regenerates the vhost back to the configured
ProxyPortso the next manual start uses the intended target. - Synchronous Stop bookkeeping —
Manager.Stopnow removes the project from its live-process map synchronously aftertaskkill, so aStartDevServer/applyVhostForimmediately afterStopDevServersees a consistent state instead of a stale "Running" status.
Install
- Download
LaraEnv-0.4.2.msiand double-click. - SHA-256 in
LaraEnv-0.4.2.msi.sha256. - Auto-update from prior versions picks this up automatically.
Compatibility
- Windows 10+ (x64).
- No config or data migrations. Drop-in replacement for 0.4.1.
[v0.4.1] — 2026-05-09
Summary
- Laravel queue worker manager. New
internal/queueworkerpackage runsphp artisan queue:workper project with start/stop/restart, ring-buffered logs, and a split-button + parameters modal on the Projects page. Extra args (e.g.--queue=high --tries=3 --timeout=60) are persisted per project underProjects.QueueArgsso the modal pre-fills next time, and the worker is killed cleanly viataskkill /T /Fon app shutdown. - Actionable VC++ Redistributable prompt. When PHP / MySQL / Apache
fail to launch because the Microsoft VC++ runtime is missing, the UI
now opens a dedicated modal with a copyable URL and a one-click
download button instead of burying the link inside a 4-second toast or
a non-selectable log line. Triggered from both Dashboard
service:errorevents and the New Project modal create flow. - Robust Start All on a fresh install. Replaced the per-service loop
in the Dashboard's Start/Stop All button with
StartManagedAll/StopManagedAll, which refresh the FPM registry and explicitly start/stop everyphp-fpm:*worker alongside the user-visible stack. This fixes the case where PHP-FPM stayed STOPPED after a one-click bootstrap because no projects were registered yet —neededPhpVersionsnow falls back to the active PHP version when the projects list is empty, so nginx/apacheDepsalways wire to a real FPM backend. - Branded MSI installer.
build-msi.ps1now generatesWixDialog.bmp(493x312) andWixBanner.bmp(493x58) from editableassets/banner.jpg+assets/logo.pngat build time usingSystem.Drawing(high-quality bicubic, cover-fit dialog, right-aligned logo on white banner). The two BMPs are gitignored — only the source art is tracked.laraenv.wxsreferences them viaWixUIBannerBmp/WixUIDialogBmp.
Test plan
- On a clean machine: install LaraEnv, run Bootstrap stack, hit Start All on the Dashboard — PHP-FPM card flips to RUNNING.
- Create a Laravel project, click Queue on the row — worker starts, button turns green, PID is shown in the tooltip.
- Open More → Start with parameters…, enter
--queue=high --tries=3, Start. Stop. Reopen — args pre-fill. - Restart while running re-spawns the worker with the saved args.
- On a machine without the VC++ redist installed: trigger a service start failure → modal opens with copy/open buttons working.
- Build the MSI with
build-msi.ps1— installer wizard shows the branded dialog and progress banner.
[v0.4.0] — 2026-05-09
Highlights
🎼 Composer bundled out of the box — Closes #1
The composer.phar (2.8.5) is now embedded in the binary and materialized
into C:\laraenv\composer\ automatically on first launch. No download, no
manual PATH setup — just install a PHP version, open the integrated
terminal and composer install works.
A second LTS entry (Composer 2.2.25) is also available from Libs / Tools for projects pinned to older PHP versions.
📦 Eager-fetch of PHP extensions
Right after a PHP version finishes installing, LaraEnv now copies a curated
set of ~25 popular extensions out of the cached zip into ext/ — so toggling
them on/off in the UI never hits a "no DLL" error again. Includes:
openssl, curl, mbstring, fileinfo, intl, gd, pdo_mysql, pdo_pgsql, pdo_sqlite, sqlite3, mysqli, pgsql, zip, exif, sockets, soap, bcmath, gmp, sodium, xsl, ldap, ftp, calendar, shmop, tidy
🐞 PECL extensions support (Windows builds)
New section in the Extensions modal lets you install PECL extensions in one click. Curated catalog with pinned versions per PHP series:
- xdebug (Zend) — step debugger & profiler
- redis — Redis client
- mongodb — MongoDB driver
- apcu — user-land in-memory cache
- imagick — ImageMagick bindings (companion DLLs auto-extracted)
- swoole — Laravel Octane runtime
- memcached — Memcached client
DLLs are downloaded from windows.php.net/downloads/pecl/ and the matching
ini directive (extension= or zend_extension=) is written automatically.
Bug fixes
bcmath(and other extensions) reported as missing despite being installed. Root cause: the generatedphp.inisetextension_dir = "ext"(relative). PHP on Windows resolves a relativeextension_diragainst the current working directory, not the PHP install folder — so anyphpinvocation from outside the install dir failed to load every bundled extension. Fixed by writing an absolute path (extension_dir = "C:/laraenv/php/<version>/ext").
Install
Download LaraEnv-0.4.0.msi from the assets below. Verify with the
SHA-256 checksum in LaraEnv-0.4.0.msi.sha256. Existing installs will
auto-update via the in-app updater.
Full Changelog: https://github.com/thayronarrais/laraenv/compare/v0.3.7...v0.4.0
[v0.3.7] — 2026-05-06
Highlights
Two reliability wins:
- No more 502 Bad Gateway on cloud-deployed Laravel sites. The apply pipeline now provisions PHP-FPM and nginx so they self-heal — no more SSHing in to restart services.
- Download missing extension DLLs from the UI, with live progress. The "NO DLL" badge in the PHP Extensions modal is now a clickable button that pulls the matching DLL from the official PHP zip on windows.php.net (or the local cache), with a real-time progress bar and an inline error banner. Statically-compiled built-ins on PHP 7.4 (bcmath, ctype, date, SPL, …) are now correctly detected via
php -n -mand no longer flagged as missing.
Cloud deploys — eliminate intermittent 502s
- Per-application PHP-FPM pool at
/etc/php/<ver>/fpm/pool.d/<app>.conf:pm.max_children=25,pm.max_requests=500(recycles workers, kills memory bloat),request_terminate_timeout=300(frees stuck workers),listen.backlog=8192(absorbs traffic spikes). The distro defaultwwwpool is moved aside so two pools don't compete for memory. - Per-app FPM socket (
/var/run/php/php<ver>-fpm-<app>.sock) — isolates workers between sites and enables future per-project tuning. - systemd auto-restart drop-ins —
Restart=always+RestartSec=2sfor bothphp<ver>-fpmandnginx. Crashes (segfault, OOM kill, failed reload) recover in ~2s instead of staying down until manual intervention. - nginx vhost retries —
fastcgi_connect_timeout,fastcgi_send_timeout,fastcgi_read_timeout, plusfastcgi_next_upstreamwith 3 retries. Brief FPM reload windows turn into a 1-2s blip instead of a hard 502. - Destroy cleans up the new pool config, slow log, and per-app socket.
PHP extensions
- One-click DLL download for any extension bundled with the official PHP zip (bcmath, gd, curl, mbstring, openssl, …). Reuses the install cache when possible.
- Live progress — the modal subscribes to
install:progressand renders a bar with bytes/throughput. - Persistent error banner for non-bundled (PECL) extensions instead of a disappearing toast.
- Built-in detection via
php -n -mso statically-compiled extensions stop showing false-positive "NO DLL".
Other
- New SFTP browser modal (two-pane local/remote, upload/download, rename, mkdir).
- Terminal tabs and Deployments/Projects polish.
Install
- Download
LaraEnv-0.3.7.msiand double-click. - Auto-update from prior versions picks this up automatically.
Compatibility
- Windows 10+ (x64) for the desktop app.
- Cloud deploy targets: Ubuntu/Debian (apt-based).
- No config or data migrations. Drop-in replacement for 0.3.3 → 0.3.6.
- First deploy onto an existing host moves
/etc/php/<ver>/fpm/pool.d/www.conftowww.conf.disabled— restore by renaming back if you have other (non-LaraEnv) sites depending on it.
[v0.3.0] — 2026-05-05
Highlights
Small UX fix: the Projects list now scrolls inside its card instead of overflowing the window when you have many sites.
What's fixed
Projects
- Scrollable project list — when the number of configured sites exceeds the viewport, the list scrolls within the "Configured sites" card. The header (title + filter) stays pinned at the top, and individual project cards keep their natural height when expanded — no more clipped Runtime / Open / Dev / Manage rows.
Install
- Download
LaraEnv-0.3.0.msiand double-click. - SHA-256 in
LaraEnv-0.3.0.msi.sha256. - Auto-update from prior versions picks this up automatically.
Compatibility
- Windows 10+ (x64).
- No config or data migrations. Drop-in replacement for 0.2.9.
[v0.2.9] — 2026-05-04
Highlights
This release brings two big quality-of-life additions: full Apache support alongside Nginx, and a tuning UI for both web servers — fixing the "504 Gateway Timeout on slow uploads" pain in one click.
What's new
Web servers
- Apache vhost generator — per-project
<VirtualHost>written automatically, in parallel with the Nginx config.mod_proxy_fcgi/mod_rewrite/mod_sslare loaded automatically and our sites dir is included inhttpd.conf. Toggle Apache on the Dashboard like any other service. - Web server tuning UI in Settings → Services. Edit the directives that actually cause failed uploads in dev:
- Nginx:
client_max_body_size,client_body_timeout,fastcgi_read_timeout,proxy_read_timeout,keepalive_timeout,worker_connections, server_names_hash sizes. - Apache:
Timeout,KeepAliveTimeout,LimitRequestBody,ProxyTimeout. - Saving rewrites the live config and reloads the running service.
- Nginx:
SSH
- ProxyJump support. Tunnel through any saved host (
ssh -Jequivalent) without re-entering credentials. Works for both the in-app interactive shell and the deploy runner. - ProxyCommand advanced field — spawn an arbitrary command (e.g.
cloudflared access ssh) whose stdio becomes the connection.%h/%psubstitution, takes precedence over ProxyJump.
Cron
- Run jobs when LaraEnv is closed (opt-in per job). Registers a Windows Task Scheduler entry that fires every minute; the runner re-evaluates the cron expression each tick, so any robfig-compatible schedule works without translation. Default behavior is unchanged.
Dashboard
- Disk gauge — system drive usage now appears as a full-width progress bar below CPU / Memory / GPU.
- Memory card no longer truncates the "used / total" text on narrow widths.
Projects
- Project tags + filtering — free-form labels on each project, comma-separated input, filter chips on the Projects page.
Install
- Download
LaraEnv-0.2.9.msiand double-click. - SHA-256 in
LaraEnv-0.2.9.msi.sha256. - Auto-update from prior versions picks this up automatically.
Compatibility
- Windows 10+ (x64).
- Existing config carries over. New tuning fields fall back to safe defaults when zero: nginx
client_max_body_size 100M, all timeouts 300s; ApacheTimeout 300,LimitRequestBody 100M.
[v0.2.6] — 2026-05-04
What's new
Web servers
- Apache vhost generator — per-project
<VirtualHost>written alongside the Nginx config. Loadsmod_proxy_fcgi/mod_rewrite/mod_sslautomatically and includes our sites dir inhttpd.conf. Toggle Apache on the Dashboard like any other service. - Nginx + Apache tuning UI in Settings → Services. Edit
client_max_body_size,client_body_timeout,fastcgi_read_timeout,proxy_read_timeout,keepalive_timeout,worker_connections, server_names_hash sizes — and ApacheTimeout,KeepAliveTimeout,LimitRequestBody,ProxyTimeout. Saves rewrite the live config and reload the running service. Fixes the "504 on slow uploads" pain.
SSH
- ProxyJump support. Tunnel through any saved host (
ssh -Jequivalent) without re-entering credentials. Works for both the in-app interactive shell and the deploy runner. - ProxyCommand advanced field — spawn an arbitrary command (e.g.
cloudflared access ssh) whose stdio becomes the connection.%h/%psubstitution, takes precedence over ProxyJump.
Cron
- Run jobs when LaraEnv is closed (opt-in per job). Registers a Windows Task Scheduler entry that fires every minute; the runner re-evaluates the cron expression each tick, so any robfig-compatible schedule works without translation. Default behavior is unchanged.
Dashboard
- Disk gauge — system drive usage shown as a full-width progress bar below CPU/Memory/GPU.
- Memory card no longer truncates the "used / total" text on narrow widths.
Projects
- Project tags + filtering — free-form labels on each project, comma-separated input, filter chips on the Projects page.
Install
LaraEnv-0.2.6.msi— double-click to install. Auto-update from prior versions also picks this up.- SHA-256 in
LaraEnv-0.2.6.msi.sha256.
Compatibility
- Windows 10+ (x64).
- Existing config carries over. New tuning fields are zero-valued by default and fall back to safe defaults: nginx
client_max_body_size 100M, all timeouts 300s; ApacheTimeout 300,LimitRequestBody 100M.
[v0.2.4] — 2026-05-04
What's new
- Auto port allocation for Node dev servers. Starting a second Node project no longer fails with
Something is already running on port 3000. LaraEnv now picks a free port from 3000 upward, injects it viaPORT(andBROWSER=none) before launching, and shows it in the UI immediately. - Projects list scroll fix. Expanding a project card no longer pushes the bottom card outside the main panel — the list now scrolls inside its container.
Checksums
SHA256 (LaraEnv-0.2.4.msi):
6faf12bab52cf32c3c11e83b3fee9262b539111e974f6c0b8f136f7e89c81764
[v0.2.3] — 2026-05-04
Summary
- Projects can now be categorized with free-form tags. The Projects
page shows a filter chip row (all /
/ untagged with counts), tag chips on each project row that toggle the filter when clicked, and a tag editor (chip-style input) reachable from each row and from the New Project modal at creation time. - Tags are persisted under
projects.projectTagsinconfig.jsonand exposed via a newSetProjectTagsWails binding. Deleting a project also clears its tag entry. Mirrors the existing SSH host tag UX. - Extracted
FilterChipand theaddTag/commitDrafthelpers into shared modules so the SSH page and modal reuse them. - Dev server now pre-allocates a free TCP port (3000+) and exports
PORT/BROWSER=noneto the child process, so multiple JS dev servers no longer collide on a single default port. The port read from log output still wins if the framework picks a different one.
[v0.2.2] — 2026-05-04
Multiple tags in SSH Connections
[v0.2.0] — 2026-05-04
New layout design for projects
[v0.1.3] — 2026-05-03
What's new
- Settings page now has tabs: Appearance and Updates
- New "Midnight" theme — pure dark with graphite accents
- Updates removed from the sidebar (lives inside Settings now)
- Update-available indicator moved to the Settings sidebar row
How to update
If you have v0.1.2 or newer installed: open Settings → Updates, click Check for updates, then Download and Restart & install.
Your projects, PHP versions, MySQL data and config in C:\laraenv\ are preserved.
[v0.1.1] — 2026-05-03
What's new
- New "Midnight" theme — pure dark with graphite accents