Fixes #934 ## Summary The Go desktop binary started its local server and printed the URL, but never opened a browser automatically. This PR: - opens the default browser after the listener successfully binds - uses the actual runtime URL - uses a stdlib-only cross-platform launcher - keeps browser-open failures non-fatal - adds `--no-browser` for headless/Docker use - leaves the normal Vite/web development flow unchanged The listener is created before launching the browser so the browser cannot race the server startup path. ## Platform behavior - Windows: `rundll32 url.dll,FileProtocolHandler` - macOS: `open` - Linux: `xdg-open` No shell command strings are used; arguments are passed directly through `exec.Command`. ## Testing - `go test ./...` - `go vet ./...` - `go build ./...` - `git diff --check` - repeated manual Windows startup verification (3 clean runs, confirmed the browser opened and hit the server, no duplicate launches) - `--no-browser` verification (confirmed no launch attempt occurs) - non-fatal launcher failure covered by a unit test that injects a nonexistent opener binary macOS/Linux launch paths were not runtime-tested on this Windows machine — they follow the standard `open`/`xdg-open` convention used across other Go CLIs but are unverified here. The full packaged release flow (`gox`, `go.rice`, `go-winres`) was not exercised locally.
Maputnik Desktop [
][github-action-ci]
A Golang based cross platform executable for integrating Maputnik locally. This binary packages up the JavaScript and CSS bundle produced by maputnik and embeds it in the program for easy distribution. It also allows exposing a local style file and work on it both in Maputnik and with your favorite editor.
Report issues on maplibre/maputnik.
Install
You can download a zip file containing desktop binaries for Linux, OSX and Windows from the latest releases of maplibre/maputnik.
Usage
Simply start up a web server and access the Maputnik editor GUI at localhost:8000.
maputnik
Expose a local style file to Maputnik allowing the web based editor to save to the local filesystem.
maputnik --file basic-v9.json
Watch the local style for changes and inform the editor via web socket. This makes it possible to edit the style with a local text editor and still use Maputnik.
maputnik --watch --file basic-v9.json
Choose a local port to listen on, instead of using the default port 8000.
maputnik --port 8001
Specify a path to a directory which, if it exists, will be served under http://localhost:8000/static/ . Could be used to serve sprites and glyphs.
maputnik --static ./localFolder
API
maputnik exposes the configured styles via a HTTP API.
| Method | Description |
|---|---|
GET /styles |
List the ID of all configured style files |
GET /styles/{filename} |
Get contents of a single style file |
PUT /styles/{filename} |
Update contents of a style file |
WEBSOCKET /ws |
Listen to change events for the configured style files |
Build
From the root of the maplibre/maputnik project, install the deps and run the desktop-build command.
npm install
npm run build-desktop
You should now find the maputnik binary in your desktop/bin directory.