mrkeyoor.com_
Tue 01 Sept 17:43 UTC
Dataevaluationupdated 25 Aug 2026

martin review

Martin is a tile server that turns PostGIS tables and GeoJSON into vector tiles, or serves existing PMTiles and MBTiles archives. It also handles styles, sprites, fonts, composite sources, bulk tile generation, and MBTiles inspection without requiring a separate map application server.

+11stars / 7d
Verdict

Martin is an excellent fit when one deployment must cover live PostGIS tiles and archive formats while retaining serious MBTiles tooling. Use a release binary or official container unless you are ready to supply native build dependencies, because our clean source build did not complete. Existing users should keep current on security releases and test startup with their largest normalized MBTiles before upgrading.

We ran it

Lab card: what happened when we ran martinScreenshot of martin (martin.maplibre.org)
Install✓ · 29s826 packages
Build✗ · 443s
Tests✗ · 149sran, no count parsed
Repo1020 files~77,690 lines of source · 14.7 MB · 13 CI workflows · tests dir

Answers from our run

Does martin build from source?

Dependencies installed in 29 seconds (826 packages), and the build failed. We cloned commit 1b58507 into a clean Debian container with 3 CPUs and no project-specific setup.

Do martin's tests pass?

The test command failed in our container, and its output did not report a pass or fail count.

Who should not use martin?

Developers expecting a source build to work in a plain Debian Rust container: our build stopped because CMake could not find libuv.

What are the alternatives to martin?

Tegola, pg_tileserv, TileServer GL. Martin is an excellent fit when one deployment must cover live PostGIS tiles and archive formats while retaining serious MBTiles tooling.

Setup2/5Binaries are simple; measured source build stopped on libuv
Docs4/5Dedicated book covers sources, configuration, API, and tooling
Community5/5Pushes, issue work, pull requests, and releases are current
Maturity4/5Broad proven scope with active security and regression work

Who it’s for

Mapping teams that need vector tiles generated directly from PostGIS.
Operators serving local or remote PMTiles and MBTiles through one service.
Data engineers who need command-line tools to create, validate, compare, or patch MBTiles files.
MapLibre users who want tiles, styles, sprites, and font glyphs under the same server.

Who it’s NOT for

Developers expecting a source build to work in a plain Debian Rust container: our build stopped because CMake could not find libuv.
Teams that need GeoParquet serving under a stable compatibility promise: the README labels its DuckDB-backed GeoParquet source unstable.
Operators placing Martin behind a proxy that must rewrite the public host automatically: an open request says generated TileJSON URLs can point clients at the internal Martin or Lambda address.
Deployments with large Tippecanoe MBTiles that cannot tolerate slow restarts without testing: a current report says versions 1.13 and 1.14 can spend several minutes resolving large normalized archives.
Windows users who need the experimental rendering feature: the installation guide says maplibre_native rendering is unavailable there.

Setup reality

At commit 1b58507, Cargo installed 826 packages in 29 seconds. The build failed with exit 101 after 443 seconds, and tests failed with exit 101 after 149 seconds. The checkout held 1,020 files, about 77,690 lines of source, and occupied 14.7 MB.

The build log shows CMake failing because none of the required libuv packages were found while compiling maplibre_native. The test log tail only shows CMake compiler-flag checks, some passing and some failing, so it does not establish a separate test failure cause.

For normal use, release binaries and the published container avoid most compiler setup. PostGIS sources require PostGIS 3.0 or newer, with 3.1 or newer recommended, plus a connection string. File sources need mounted paths or reachable URLs. Styles, fonts, sprites, caching, and a public reverse proxy require deliberate configuration.

More than a PostGIS tile endpoint

Martin's simplest job is attractive: point it at a PostGIS database and let it discover tables and functions that can produce vector tiles. It can also convert GeoJSON on demand, serve PMTiles from local storage or HTTP, and read MBTiles archives. A passthrough source relays an upstream tile server, while composite sources combine several inputs into one response.

Martin can serve MapLibre styles, build sprites, and generate font glyphs. martin-cp writes tiles from supported sources into an MBTiles file for bulk or offline delivery. A separate mbtiles tool can inspect metadata, validate archives, copy content, compare files, and apply diffs.

GeoParquet support widens that scope through DuckDB, but the README marks it unstable. That label matters if a team is choosing a storage format for a durable service. PostGIS, PMTiles, MBTiles, and GeoJSON are the safer reasons to adopt Martin today; GeoParquet is something to evaluate behind a compatibility boundary.

What happened when we ran it

We cloned commit 1b58507 into an unprivileged Rust container with 3 CPUs and 12 GB of RAM. The repository had 1,020 files, about 77,690 lines of source, and occupied 14.7 MB. Dependency installation succeeded in 29 seconds with 826 packages installed. Martin has 13 CI workflow files, a Compose file, and a tests directory, but no Dockerfile in the checked-out repository.

The build ran for 443 seconds and failed with exit 101. CMake was configuring maplibre_native when FindPkgConfig.cmake reported that none of the required libuv packages were found. The Rust cmake crate then reported that the command exited unsuccessfully and its build script stopped. The log supports a missing native library finding; it does not tell us whether another error would appear after that dependency is installed.

Tests failed with exit 101 after 149 seconds. Their final lines are CMake checks for C++ compiler flags and pthread support. Some flag checks failed and the pthread check passed, but the tail does not contain a final diagnostic that proves why the test command exited. We would need a fuller log or a rerun with the missing native prerequisites before judging Martin's tests themselves.

Binary and container users get a shorter path

The installation guide offers release archives for Linux, macOS on Arm, and Windows x64, plus a Debian package, Homebrew tap, Cargo binstall, and a published container image. Those are better starting points than source compilation for operators who only need the server. The container example mounts a configuration directory, passes a database URL, and exposes port 3000.

PostGIS deployments require PostGIS 3.0 or newer, with 3.1 or newer recommended. Martin can discover suitable database objects, but the operator still owns database credentials, network policy, query cost, indexes, connection limits, and tile caching. PMTiles over HTTP trades database work for object-host availability and range-request behavior. Local PMTiles and MBTiles need persistent mounts and a plan for replacing files without serving partial updates.

Configuration deserves attention behind proxies. An open request describes TileJSON containing the internal Lambda or Martin hostname when the client should continue through CloudFront or another proxy. The users in that discussion were rewriting returned URLs outside Martin. If the public and internal origins differ, verify the tiles URLs returned to a real browser before launch.

Performance claims need workload testing

The README says Martin is optimized for speed and heavy traffic, but it does not publish a universal throughput figure, and neither do we. Tile cost depends on geometry, SQL, zoom, source format, compression, caching, and client concurrency. A useful evaluation should use the team's worst table, largest archive, and actual style rather than an empty health endpoint.

Startup behavior can matter as much as request speed. An August issue reports that Martin 1.13 and 1.14 took several minutes to resolve large Tippecanoe MBTiles using a normalized map and images schema. The report points to a metadata query that calculates minimum and maximum zoom across the tiles view and supplies an alternative query that completed much faster for that data. This is a focused report, not a general benchmark, but it is directly relevant to large archive fleets and autoscaled instances.

Environment behavior has another long-running design discussion. Martin can consume common variables such as DATABASE_URL; an open issue argues that implicit reads can conflict with other tools and proposes moving environment substitution into explicit configuration. Operators should pass a named config file and audit the process environment, especially in platforms that inject database variables automatically.

Security work and project health

Release 1.14.0 shipped on August 18, 2026, and fixed two security problems. One high-severity flaw affected the optional Linux rendering feature: crafted out-of-gamut colors could permanently kill rendering workers. A medium-severity sprite issue allowed repeated IDs in one unauthenticated request to multiply rasterization work. The fixes clamp colors, limit and deduplicate sprite IDs, and bound rasterization concurrency. Public deployments using rendering or sprites should not sit on an older image.

The repository was pushed on August 25, the same day as this review. Pull requests and issues were also active that day, including work on PostgreSQL source reloading, image formats, hillshade processing, and test cleanup. GitHub lists 76 open issues and pull requests combined. Recent security fixes, active CI work, and current releases support a strong maintenance rating.

Documentation lives in a dedicated book rather than overloading the README. It covers installation, CLI use, configuration files, sources, API use, and development. Source builders need a clearer path from a fresh Debian image to all native dependencies exercised by the workspace.

Martin is the first server I would trial for a mixed PostGIS, PMTiles, and MBTiles estate. The archive tools and MapLibre asset support reduce the number of side utilities an operator needs. Start with a published binary or container, pin the release, test returned public URLs, and measure both cold startup and tile generation against production-shaped data.

Alternatives

ProjectWhat it isPick it when
TegolaA Go server focused on producing Mapbox Vector Tiles from geospatial data sources.pick this instead when you want a narrower vector-tile server with a Go deployment stack.
pg_tileservA small PostGIS-only server that executes SQL and returns vector tiles.pick this instead when all data lives in PostGIS and a minimal database-to-tile boundary is the priority.
TileServer GLA tile server with GL styles and server-side raster rendering for several map clients.pick this instead when styled raster output is central and you are comfortable with its Node and native rendering stack.

What people are saying

  1. [github-trending] maplibre/martin

Sources

  1. Martin README
  2. Martin documentation
  3. Martin repository
  4. Martin 1.14.0 release
  5. Large MBTiles startup report
  6. Reverse proxy URL request
  7. Environment variable behavior discussion

More data reviews

turso · TrackersListCollection · dash · getcontact-cli · awesome-zhuiju-free · iggy · the whole board →