OLS OLS

Open Local Server is a local development environment manager for Windows. It installs and supervises runtimes, gives every project its own .test domain with trusted HTTPS, and keeps databases, mail and caches behind one core engine.

Windows 10 / 11, 64-bit. OLS-1.1.0-setup.exe, a portable zip, and SHA-256 sums to check either against. Source on GitHub.

  • v1.1.0
  • GPL-3.0-only
  • Rust core · Tauri 2 shell
  • GUI · CLI · HTTP API
The OLS dashboard: environment overview with CPU, RAM and disk donuts and a traffic graph, the web server card, and a services list with per-service ports, state and start, stop, restart, reload and log controls.
What is this

One environment per project, without hand-editing your machine

Other local stacks give you one PHP, one database and one shared web root, and the next project that needs a different PHP version changes it for everybody.

OLS keeps one environment per project instead. Multiple runtimes sit side by side, a version is pinned to the project that needs it, and the web server configuration, the database, the certificate and the domain registration are all done for you.

Every error it shows is a Diagnostic — what broke, why, and how to fix it. It never overwrites configuration you edited by hand: generated files are tracked, drift is detected, and history keeps a diff and a restore for every change.

Desktop app React 19 · Tauri 2
Command line olsc setup · doctor · status
Local HTTP API 127.0.0.1:7420 · bearer token

All three send the same CoreCommand JSON to ols-core. The CLI drives the open app, or starts a background daemon when the app is closed.

Key features

Everything a local environment needs, under one supervisor

No hand-edited paths, no manual certificate trust, no per-project README telling you which commands to run in which order.

Runtimes & toolchain

Side-by-side versions per runtime, with a default for new projects that a project can override.

  • Multiple versions of PHP and Node side by side, plus Composer, Python venvs, portable Git and k6
  • Any PHP, Node or Python already on this machine: scan a folder, or locate one executable
  • Per-version extensions, Xdebug and PECL; corepack for npm, pnpm and yarn
  • Downloads verified against vendor SHA-256; plugins can add more runtimes

Sites & trusted HTTPS

Every project gets its own domain and a certificate Windows already trusts.

  • Any domain plus wildcard subdomains; a folder gets an automatic <folder>.test domain
  • On-device CA, 397-day leaf certificates, auto-renew under 30 days left
  • Built-in wildcard DNS for .test, .localhost and .internal; optional elevated helper for everything else

Web servers

Three engines, generated configuration, and a history that shows every diff.

  • Nginx, Apache and Caddy — move a site from one to another
  • Managed, Advanced and Manual modes; validate before reload, roll back on failure
  • Drift detection plus config history with diff and restore

Projects & reproducible environments

A project that describes itself, and a setup that can be previewed before it touches anything.

  • Framework and version detected from composer.json, package.json, manage.py
  • Manifests in .openlocalserver/*.yaml: environment, services, commands, lock file
  • 14-step setup: resolve, plan, conflict report, dry run, apply — journaled, with rollback
  • Profiles, snapshots (zip, clone, import/export) and a lossless .env editor

Databases & services

Engines, users and backups managed per project, with mail capture.

  • MariaDB, PostgreSQL, MongoDB, Redis, Memcached, Mailpit, SQLite
  • Per-engine database and user management, connection details, backup and restore with a safety copy first
  • One-click GUIs: HeidiSQL, pgAdmin 4, NoSQLBooster, Tiny RDM
  • Import databases from other common Windows stacks without an SQL dump

Dashboard & diagnostics

Health, traffic and findings in one place, with the fix next to the finding.

  • Services card for all nine built-ins with colour-coded actions and TCP health
  • Traffic graph built from the web access log, with a hover inspector
  • Diagnostics as Problem / Cause / Fix, safe one-click auto-repair and an ignore list
  • Unified log viewer, process manager, Ctrl+K search and Ctrl+Shift+P command palette

Quick Apps & commands

Start from a recipe, then run what the project already exposes.

  • 13 built-in recipes: Laravel, Symfony, WordPress, Express, React/Vite, Vue, Next.js, Django, FastAPI, static sites
  • Validate, review the plan, run — with command history
  • Discovered Composer and npm scripts, one click to run, output kept in a ring

Tunnels & traffic inspector

Share a local site on purpose, and see what comes back.

  • Cloudflare, ngrok, LocalTunnel and Tailscale behind one provider abstraction
  • Exposure confirmation, optional password, public badge, one-click stop
  • Forwarding proxy with a redacted request log, replay and a webhook tester

CLI, API & automation

The same engine, reachable the way your tools expect.

  • Ships as olsc.exe beside the app, so olsc works with the GUI closed, through a background core
  • Local HTTP API with a bearer token and read-only vs operate scopes
  • Queue workers, a cron scheduler with no overlapping runs, and portable-pty terminals
  • Git manager, k6 load testing, a signed self-updater and declarative plugins
Product tour

The app, as it runs

Screenshots captured from the running desktop app in its dark theme. Nothing on this page is a mock-up.

Dashboard with an overview of sites and projects, CPU, RAM and disk rings, a traffic graph, the web server status card, the services list, diagnostics and environment health.

Dashboard Sites and projects counted, resource rings, a traffic graph built from the access log, all nine services with their ports, and diagnostics. Unavailable services are shown flat grey rather than looking clickable.

The Sites page: one table of sites and projects with a checkbox on every row, one row selected and a bulk bar offering Enable, Add auto domain, Disable, a web server dropdown with Move sites, Delete and Clear. Filters for all, PHP and static HTML, and rows-per-page and page controls at the foot of the table.

Sites One table for sites and projects. Tick rows and the bulk bar appears — enable, disable, add auto domains, move them to another web server, or delete — and a batch reports what changed and what it skipped. Each row's own settings open its web config, servers, terminal, .env, Git, workers, snapshots, repair and load testing.

The Runtimes page listing Apache, Caddy, Composer, HeidiSQL, k6, Mailpit, MariaDB, Memcached, MongoDB, Nginx, Node.js, pgAdmin, PHP, PostgreSQL and Redis with installed versions, default badges and manage actions.

Runtimes Every runtime with its installed versions, a default badge and a manage action — plus the two ways to bring your own: scan a folder, or locate a single executable.

The PHP versions dialog: search and install a version, then the installed versions list with the default badge, per-version extensions, Xdebug, set default and remove.

Version manager Per runtime: search the vendor catalog, download and install, then manage extensions, Xdebug and the default for each installed version. SHA-256 is checked when the vendor publishes it.

The Web server page showing the active engine, HTTP and HTTPS ports, one aligned row per server with site counts, and the generated configuration with validate and apply controls.

Web server Engine choice, ports and ownership mode. The config is validated before the reload, rolled back if it fails, and compared against what is on disk so hand edits surface as drift instead of being overwritten.

The Databases page showing engines with their data folders, database and user management, connection details, backup and restore, and links to external database tools.

Databases Engines, databases and users with the connection details to paste. Backup takes a safety copy first; SQLite runs .backup and an integrity check. Databases from other common Windows stacks import live, without a dump file.

The Tunnels page: an empty state explaining that a tunnel gives a site a temporary public address, and a providers list showing Cloudflare, ngrok and LocalTunnel with the binary locations OLS found them at.

Tunnels Nothing is made public without starting it and confirming the exposure. Provider binaries are found on PATH or in a known location rather than installed for you; tokens stay in Windows Credential Manager.

Getting started

Four steps, all inside the app

Everything below is done in the desktop app. The command line is optional and there is a section below for it, because most of the work is not terminal work.

Install the app

Run the downloaded OLS-1.1.0-setup.exe and open OLS. Windows 10 or 11, 64-bit.

Install a runtime

Open Runtimes and install a PHP version, plus Node or Python if you use them. Checksums are verified on download.

Point a site at it

Open Sites, add a project folder and give it a domain. .test names resolve without editing the hosts file.

Apply and trust

Apply the web config and trust the local certificate authority once, so HTTPS sites stop warning.

Optional: the olsc command

The install folder holds OLS.exe, the app, and olsc.exe, the command line — two separate programs with two separate names. (olsc rather than ols because Windows does not tell file names apart by case: the app is OLS.exe, so anything called ols finds the app and opens a window instead of running a command.) The installer does not add that folder to your PATH, which is why olsc can come back as "not recognised". Pick whichever of these suits you:

  • Add the folder to PATH — Windows Settings → System → About → Advanced system settings → Environment Variables, add C:\OpenLocalServer under Path, then open a new terminal. olsc status works from there on.
  • Call it by its full path — no change to the machine: C:\OpenLocalServer\olsc.exe status

olsc talks to the app while it is open and starts a background core when it is not, so it behaves the same either way.

Everyday commands

olsc
olsc status                      # services, sites, runtimes
olsc start                       # start every enabled service
olsc stop                        # stop everything
olsc doctor                     # problems as Problem / Cause / Fix

olsc project list                # registered projects
olsc service list                # MariaDB, Postgres, Redis, Mailpit…
olsc runtime list                # installed PHP and Node versions

olsc tunnel start --provider cloudflared --port 443
olsc worker run --queue default
olsc snapshot create --name "before-upgrade"
olsc search "mailpit"

A project, end to end

PowerShell
# Clone any PHP / Node / Python project
git clone https://github.com/example/my-laravel-app.git
cd my-laravel-app

# Runtimes, database, domain, DNS, SSL, mail, workers
olsc setup

# Preview the plan without applying it
olsc setup --dry-run

# Health, then safe fixes
olsc doctor
olsc repair

Build from source

For working on OLS itself. Nothing in the four steps above needs this.

Prerequisites
# Rust toolchain (if missing)
winget install Rustlang.Rustup

# Node 22 (if missing)
winget install OpenJS.NodeJS.LTS --version 22

# UI dependencies
cd ui
npm install

Run it, or bundle it

From the repo root
# Tauri + Vite + Rust core, with hot reload
.\scripts\dev.bat

# Quality gates
cargo fmt --all
cargo clippy -p ols-core -p ols-helper --all-targets
cargo test -p ols-core -p ols-helper
cd ui; npm run lint; npm run build
cd ..

# NSIS / MSI bundle
cargo tauri build
For developers

One core, three front doors

ols-core is a single CoreCommand dispatcher over shared state. The GUI, the CLI and the HTTP API are three front doors onto the same managers — there is no second implementation of anything.

Stack

Core
Rust · ols-core · Tokio
Shell
Tauri 2 · tray · single IPC command
Frontend
React 19 · Vite 8 · Tailwind 4 · shadcn/ui · CodeMirror 6 · xterm.js
CLI
olsc — a separate program beside the app; works once the install folder is on PATH
Helper
ols-helper — hosts, NRPT and services over a named pipe or one UAC prompt
State
SQLite app.db; OLS_HOME overrides every path
Platform
Windows 10 / 11, 64-bit. Linux is planned last; macOS is not planned.
License
GPL-3.0-only
Rust Tauri 2 React 19 Tailwind 4 Tokio CodeMirror 6 xterm.js portable-pty minisign-verify oxlint

Driving it from a script

The local API is off by default and listens on 127.0.0.1:7420. Every request needs a bearer token; requests carrying an Origin header are refused. A read-only scope covers queries, an operate scope covers changes.

HTTP
curl -H "Authorization: Bearer ols_..." \
     http://127.0.0.1:7420/v1/ping

curl -H "Authorization: Bearer ols_..." \
     -H "Content-Type: application/json" \
     -d '{"type":"list_services"}' \
     http://127.0.0.1:7420/v1/command

Extending it

Plugins are declarative: a plugin.yaml checked against a schema, contributing runtimes, Quick App recipes, project detections or health checks. A plugin stays off until you approve exactly the permissions it lists, and remote catalogs are minisign-signed and re-verified on every load.

ProblemPort 3306 is already used by mysqld.exe (PID 4120).
CauseA second MariaDB data folder is running from an older install.
Fixolsc repair stops the orphan and reassigns the port. Review the plan, then apply.
Open source

GPL-3.0-only, and the specs are in the repository

OLS keeps specs/ as its source of truth for architecture, modules, data models and API. A pull request that changes behaviour without updating the matching spec is rejected in review — so the documentation cannot drift away from the code.

Reports and discussions go to the issue tracker. Security issues follow the published policy rather than a public issue.

Your next project deserves its own environment

Start with the installer. The four steps above take a project folder from a clone to a working site on a certificate your browser already trusts.