// security

Security

LaraBench asks to reach your Laravel apps, including ones running in production, and it can hand an AI client a way in. That is a large ask, so this page states plainly what the app stores, what it does not store, what the local MCP server listens on, and what leaves your machine.

Last updated: August 3, 2026

Connections and credentials

The short version: LaraBench never stores an SSH password or a private key. It shells out to the tools you already trust and lets them handle authentication.

SSH connections

An SSH connection stores a host, a user, a port, an app path, and optionally the path to a private key you already have. The key itself is never read into the app, never copied, and never synced. Runs are executed by spawning your system ssh binary, so authentication is handled by OpenSSH and your agent exactly as it is on your own command line. There is no password field, because there is nowhere for a password to go.

Local and Docker connections

A local connection stores an app path and optionally the path to a PHP binary. A Docker connection stores a container name and an optional container user, and runs through your system docker binary. Neither stores database credentials — your app's own .env stays where it is, and LaraBench reads nothing out of it to keep.

Where this lives

Connections, saved snippets, run history, and preferences are written to the app's own directory: ~/.config/LaraBench on macOS and Linux, or %APPDATA%\LaraBench on Windows. They are plain files under your user account, protected by your operating system's file permissions, and they stay on your machine unless you sign in and turn on Premium cloud sync. Connection profiles are never synced, shared, or uploaded — they are deliberately local-only, even for Premium accounts.

Sharing a connection

Connections can be exported and imported as JSON. The AI access level is deliberately stripped on import, so a connection file someone sends you cannot silently grant an AI client access to a production host. You set that level yourself, on your own machine, every time.

The local MCP server

When the MCP server is on, LaraBench listens for AI clients. What it listens on matters more than the token does.

It is not a web port

The server binds a Unix domain socket inside the app directory on macOS and Linux, and a named pipe on Windows. It does not open a TCP port, on loopback or anywhere else. A web page cannot address a filesystem socket, so the whole class of attacks where a site in your browser quietly POSTs to a developer tool on localhost does not apply here. On macOS and Linux the socket is set to owner-only permissions, which keeps other user accounts on the same machine out.

The token

Every connecting client must present a token: 32 bytes from a cryptographic random source, stored owner-only in the app directory, and compared in constant time. It is a backstop behind the socket, not the primary control. It is scoped to the local server only — it is not an account credential, it grants nothing on larabench.com, and it is never transmitted off your machine.

What a connected AI client can reach

Access is set per connection, not once for the whole app: Off, Read only, Dry run, or Full. Production connections default to Off and stay hidden from AI clients until you say otherwise. A dry-run connection suppresses writes, and a tool call cannot loosen that — the request is refused rather than upgraded. A write against production needs a confirmation from you, in the app, at the time. Every run an AI client triggers is recorded in History with an AI badge, so there is no invisible activity to reconstruct later.

The server can be turned off entirely from its page in the app.

More about the MCP server

What leaves your machine

Telemetry

The app reports install-level activity to LaraBench endpoints only: an anonymous install identifier, the events app_installed and app_seen, and coarse fields such as version, platform, architecture, release channel, whether you are signed in, and your plan. It does not include snippet code, Artisan commands, project paths, hostnames, database names, SQL, log contents, or run and benchmark activity. There is currently no in-app telemetry toggle.

Accounts and sync

The core app needs no account. If you create one, the website stores a hashed password and the app keeps a desktop authentication token locally. Premium cloud sync covers saved snippets, saved commands, custom themes, and — only if you switch it on — run history, which can contain code, output, and SQL. History sync is off until you enable it. Billing runs through Stripe; card details never reach LaraBench servers.

Read the privacy policy

Share links

Publishing a snippet or a benchmark report creates an unlisted link. Unlisted means unguessable, not private: anyone holding the URL can open it. Do not publish output containing customer data or secrets.

Distribution and status

macOS builds are signed and notarized by Apple. Windows is distributed through the Microsoft Store. Linux ships as an AppImage from the release catalog on this site. Unsigned public installers are not part of the plan — if you find LaraBench offered anywhere else, it did not come from us.

LaraBench is pre-1.0. The safety model described above is shipped behavior, not a roadmap item, and the app is used daily against real projects. But the version number is honest: APIs, storage formats, and defaults can still change between releases, and there is no formal support or uptime commitment yet. Read the release notes before upgrading a machine you rely on.

Reporting a vulnerability

Email [email protected] with steps to reproduce. Please report privately first and give us a chance to ship a fix before disclosing publicly. The same address is published at /.well-known/security.txt.