LaraEnv logo LaraEnv
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.

  1. 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.
  2. 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+K palette.
  3. 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 terminalEnter = native external terminal, Shift+Enter = in-app xterm.js tab. Applies to "Open terminal · ", the inline launcher (<project> php artisan …), and ssh:<host>. The palette footer and the selected row show the ⇧↵ xterm.js hint.
  • External SSHssh:<host> on Enter opens your default terminal running the ssh CLI 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.msi and 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.

  1. 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).
  2. 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.
  3. Inline launcher. Type project php artisan migrate to run a command in a project's terminal, or ssh:host to open an SSH session. Tab autocompletes projects, artisan/npm commands, and hosts.
  4. 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

20260617-1926-14 4788598

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.msi and 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.

  1. Custom dev commands now resolve php / composer without full paths. The dev runner only put the project's Node bin on PATH, so a custom command like composer run dev or php artisan serve failed unless you typed full executable paths. It now prepends the project's PHP + Composer + Node bin dirs, just like the embedded terminal.
  2. One-click "Make composer run dev Windows-safe". Laravel 11's dev script runs php artisan pail, which needs the pcntl extension — and pcntl has no Windows build, so composer run dev crashes (and --kill-others takes the whole stack down). A new button in the dev-command modal rewrites your project's composer.json to drop just the Pail process, so composer run dev runs natively on Windows.
  3. 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 dev Windows-safe" button — strips the php artisan pail process (and its --names entry) from composer.json's dev script. Explicit and user-triggered (never automatic), idempotent, and it only touches that one line — the rest of your composer.json formatting is preserved.
  • Stop actually frees the portcomposer run dev / php artisan serve spawn detached children that a PID-tree taskkill missed, leaving the port bound so the next Start collided. Stop now also frees the ports the tree was listening on (scoped to our own php/node processes).
  • Proxy targets the app server, not Vite — for a Laravel composer run dev that starts both artisan 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's ext-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/node processes.

Install

  • Download LaraEnv-0.4.19.msi and 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 dev Windows-safe" button edits your project's composer.json only 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:

  1. 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.
  2. Re-apply now preserves storage/ too. 0.4.17 protected .env; this release extends the same protection to the whole storage/ 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 apply blob alongside the fresh detection results 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, .env and storage/ 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 .env preserved, 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.msi and 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

  1. 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 install only runs when composer.json/composer.lock actually changed since the last deploy, npm ci && npm run build only when package.json/package-lock.json (or resources/, vite.config.*) changed. First deploys run everything.
  2. "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.
  3. Your .env survives re-apply. Re-running Apply used to wipe the deploy directory and recreate .env from .env.example, silently destroying hand-edited values (mail creds, API keys). Apply now backs up .env before the wipe and restores it over the fresh clone.
  4. Fixed: service cards stuck on RUNNING after Stop all. Closing the service-logs viewer silently deregistered every service:status listener 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

  • .env preserved on re-apply — backed up to /tmp before the wipe-and-clone, restored after. The deploy pipeline itself uses git fetch + reset and 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 allEventsOff("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 by EventsOn. The same fix was applied to install:progress (closing the PHP Extensions or Bootstrap modal no longer kills download progress on the Libs/Tools page).

Install

  • Download LaraEnv-0.4.17.msi and 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 install failed with Class "Normalizer" not found. The PHP package list installed during apply was missing php<ver>-intl. Without ext-intl, Symfony String (used by Composer) fatals on startup. Apply now installs php<ver>-intl alongside the other extensions.
  • nginx -t failed with invalid value "http_502". The generated vhost listed http_502 in fastcgi_next_upstream. Unlike proxy_next_upstream, the FastCGI variant does not accept http_502/http_504 (those are gateway errors nginx emits itself, not FastCGI backend responses). The directive now uses http_500 http_503 only.

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.msi and 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-cgi workers (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 tuningupload_max_filesize, post_max_size, memory_limit, max_execution_time and max_input_time are 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 limitclient_max_body_size default 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 when php_<x>.dll exists in ext/. 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. the mysqli "already loaded" warning), and stale Unix .so example 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.ini in 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 installafterPhpInstalled now derives the on-disk folder name from Source.InstallTo instead of trusting the catalog's full patch version ("8.4.20"). Previously SetActive("8.4.20") failed silently because the folder is \php\8.4\, leaving no current symlink and no PHP backend until the user restarted the app.
  • current symlink 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 from config.json automatically.
  • nginx Deps filter unregistered FPMs — even if a phantom version slips through, refreshPhpFpmServices now drops or remaps it before calling SetDeps, so nginx never tries to start a dependency that has no registered binary.
  • Loud error for unregistered servicesservices.Manager.startOne now returns service not registered: <name> instead of letting exec.Command("", ...) produce the cryptic exec: no command. Any future regression is immediately diagnosable.

Install

  • Download LaraEnv-0.4.4.msi and 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 existing config.json files 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=0 is now set on every php-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/nodejsmklink /J for the "current" version junction
  • internal/croncmd.exe /C for every fired cron job

All of these now spawn fully hidden with HideWindow + CREATE_NO_WINDOW.

Downloads

  • LaraEnv-0.4.3.msi
  • LaraEnv-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 portStartDevServer now starts its free-port scan from the project's configured ProxyPort (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.Listen succeeds. Up to 200 candidates per start.
  • Vhost follows the real port — when the actual listening port differs from the configured ProxyPort, applyVhostFor regenerates the nginx + Apache vhosts pointing at the live port and reloads the running web server. Two projects with identical PROXY:3000 config now route correctly to their own backends.
  • Vhost restores on Stop — stopping the dev server regenerates the vhost back to the configured ProxyPort so the next manual start uses the intended target.
  • Synchronous Stop bookkeepingManager.Stop now removes the project from its live-process map synchronously after taskkill, so a StartDevServer / applyVhostFor immediately after StopDevServer sees a consistent state instead of a stale "Running" status.

Install

  • Download LaraEnv-0.4.2.msi and 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/queueworker package runs php artisan queue:work per 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 under Projects.QueueArgs so the modal pre-fills next time, and the worker is killed cleanly via taskkill /T /F on 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:error events 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 every php-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 — neededPhpVersions now falls back to the active PHP version when the projects list is empty, so nginx/apache Deps always wire to a real FPM backend.
  • Branded MSI installer. build-msi.ps1 now generates WixDialog.bmp (493x312) and WixBanner.bmp (493x58) from editable assets/banner.jpg + assets/logo.png at build time using System.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.wxs references them via WixUIBannerBmp / 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 generated php.ini set extension_dir = "ext" (relative). PHP on Windows resolves a relative extension_dir against the current working directory, not the PHP install folder — so any php invocation 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:

  1. 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.
  2. 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 -m and 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 default www pool 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-insRestart=always + RestartSec=2s for both php<ver>-fpm and nginx. Crashes (segfault, OOM kill, failed reload) recover in ~2s instead of staying down until manual intervention.
  • nginx vhost retriesfastcgi_connect_timeout, fastcgi_send_timeout, fastcgi_read_timeout, plus fastcgi_next_upstream with 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:progress and 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 -m so 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.msi and 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.conf to www.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.msi and 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_ssl are loaded automatically and our sites dir is included in httpd.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.

SSH

  • ProxyJump support. Tunnel through any saved host (ssh -J equivalent) 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 / %p substitution, 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.msi and 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; Apache Timeout 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. Loads mod_proxy_fcgi/mod_rewrite/mod_ssl automatically and includes our sites dir in httpd.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 Apache Timeout, 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 -J equivalent) 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/%p substitution, 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; Apache Timeout 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 via PORT (and BROWSER=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.projectTags in config.json and exposed via a new SetProjectTags Wails binding. Deleting a project also clears its tag entry. Mirrors the existing SSH host tag UX.
  • Extracted FilterChip and the addTag / commitDraft helpers 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=none to 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