Library / SDK
maplibre/maplibre-rs avatar
maplibre/maplibre-rs

maplibre-rs: Experimental WebGPU Renderer for Native Maps

Rust-based WebGPU map renderer for Web, Mobile and Desktop

1,585 stars98 forksRustApache-2.0

At a glance

What is it?
maplibre-rs is an experimental Rust vector-map renderer built around WebGPU for browser, mobile, and desktop targets. It renders vector tiles and supports basic navigation and feature queries, but text, labels, symbols, raster data, and several production map features remain unfinished.
Who is it for?
maplibre-rs fits developers evaluating a Rust and WebGPU map-rendering stack or building a limited vector-tile proof of concept. It is not a direct replacement for a complete map renderer at present.
Can I use it commercially?
Yes. Apache-2.0 is a permissive licence: you can use, modify and sell software built on it, as long as you keep its copyright and licence notices.
Is it still maintained?
Yes. The repository last received commits 1 day ago.
What is it written in?
Mainly Rust, according to GitHub's language statistics.

Answers come from the project's GitHub data, last synced on October 24, 2026, and from our analysis. They are not legal advice.

From daily snapshots

Star history

  • maplibre/maplibre-rs1,585 ★ · +5
Star history
Repository2026-10-162026-10-24
maplibre/maplibre-rs1.6k1.6k

5 Stars in the last 8 days, measured from the daily GitHub snapshot. Compare with other projects

Editorial analysis

What maplibre-rs solves for Rust application developers

maplibre-rs targets applications that need to display vector map tiles while sharing Rust-based rendering code across web, mobile, and desktop environments. Its stated platform coverage includes Linux, Android, iOS, macOS, Firefox, Safari 16 or later, and Chrome. The common rendering core is written in Rust, while WebAssembly makes that code available in browsers. For native applications, the README says standalone WebGPU implementations can use Vulkan, OpenGL, or Metal.

This approach is relevant to teams that want a Rust map component instead of separate renderer implementations for several targets. The repository contains separate `android`, `apple`, `web`, `maplibre-winit`, and `maplibre-demo` entries alongside the central `maplibre` crate, which reflects a workspace organized around shared code and platform-facing pieces.

The present scope is narrower than its platform list suggests. maplibre-rs can render a vector tile dataset, provide simple navigation through `winit`, use multiple threads on supported platforms, and query feature data. It does not aim to replace Google Maps, Apple Maps, or MapLibre. The README calls it a proof of concept and says it is unclear whether the current graphics stack can meet the high-performance requirements of vector map rendering. Teams looking for an interactive map engine with labels and a complete style pipeline are looking past what this repository currently implements.

How the WebGPU rendering stack processes map data

The project aims to implement a renderer compliant with the MapLibre Style Spec in Rust using WebGPU. WebGPU is the central graphics interface rather than an incidental dependency. Browser implementations connect Rust code running through WebAssembly to the browser graphics stack. Native builds can connect the renderer to implementations based on Vulkan, OpenGL, or Metal.

The input identified by the README is a vector tile dataset. The central `maplibre` workspace member holds the renderer, while `maplibre-winit` supplies the `winit` navigation layer used by the desktop demo. Feature querying is another exposed capability, so an application can obtain feature data rather than only receive rendered pixels. The documented multithreaded behavior is intended to apply across platforms, although the README does not describe the scheduling model, synchronization boundaries, or tile cache.

The renderer is based substantially on Bevy's renderer, which the README says was forked into the project to provide a generic graphics base. Workspace dependencies reinforce that direction. They include `wgpu`-era graphics components such as `naga`, while vector tile processing is represented by `geozero`, `geo`, and `geo-types`. The repository also includes flatbuffers-related dependencies and format tooling, but the README does not provide enough detail to describe the complete tile parsing pipeline as a documented public contract.

The repository description and README use both WebGPU and WebGL language in places, including a demo named WebGL and graphics keywords in the workspace. That naming should not be treated as evidence that maplibre-rs currently offers a stable WebGL renderer. Its stated technical objective is the WebGPU-based cross-platform stack, and the browser demo availability does not erase the experimental status.

Desktop installation and the first maplibre-rs demo run

The README recommends `rustup` for managing Rust toolchains. The workspace declares Rust 1.97.1 in `Cargo.toml`, and the repository includes `rust-toolchain.toml`, which can download or select the required toolchain during a build. The following is the complete desktop tutorial documented at a high level.

Clone the repository into the directory where you want to keep the source:

bash
git clone https://github.com/maplibre/maplibre-rs.git

After the clone completes, open the repository directory and build and run the desktop demo package from there:

bash
cargo run -p maplibre-demo

The README identifies the result as the desktop demo, with simple navigation powered by `winit`. It does not document a successful screenshot, exact startup log sequence, required map credentials, or default camera state. The repository's `data` and `test-data` directories indicate that map assets are part of the project layout, but the README does not say whether additional setup is required for this particular command.

Developers can open generated Rust API documentation with the command below:

bash
cargo doc --open

This generates documentation for the crates and their dependencies, then opens it in a browser. Platform-specific demo instructions are not included in the README excerpt. It directs readers to the development guide for running demos on other platforms, so Android, Apple, and browser setup should be taken from that guide rather than inferred from desktop commands.

Current vector-tile features and the missing map behavior

The implemented feature list has a clear boundary. maplibre-rs can render vector tiles, query feature data, support simple `winit` navigation, and run with multithreading across platforms. That is enough to study the rendering architecture or build a limited demonstration around vector geometry.

Several capabilities expected from a production map renderer are explicitly missing. There is no text rendering, per-feature rendering, label or symbol rendering, collision detection, raster data support, 3D terrain, or hill-shade support. GeoJSON support is also absent. These omissions affect more than visual completeness. These omissions limit the kinds of labels and map symbols the renderer can display. Without collision detection, it also lacks machinery for resolving overlapping map annotations or text.

The missing TypeScript, Swift, and Java/Kotlin APIs further narrow the present integration path. The repository has platform directories, but those entries do not by themselves establish public language bindings for those three ecosystems. A TypeScript application would need to interact through the web build described by the project documentation. Native mobile teams should not assume that a Swift or Kotlin wrapper is available based solely on the `apple` and `android` directories.

There are also browser-specific constraints. The multithreaded WebGL demo does not work in Safari according to the README. The WebGPU demo only works with development versions of Safari TP, Firefox, and Chrome. Those statements may change as browser implementations evolve, but they are the only browser compatibility conditions documented here. Safari support for the project is listed as beginning at version 16, yet the stated WebGPU demo requirement is more restrictive. Adoption decisions should distinguish general platform support from the conditions attached to each demo.

Why the current WebGPU architecture may not suit every product

The largest engineering risk is stated by the project itself: it is unknown whether the selected stack can satisfy demanding vector-map performance requirements. A WebGPU abstraction can provide a common graphics interface, but the README does not publish frame rates, memory budgets, tile counts, device coverage, or comparisons against an established renderer. The presence of a `benchmarks` directory does not fill that gap because no benchmark methodology or result is documented here.

Multithreading should also be evaluated as a platform-specific capability rather than an unconditional benefit. The project lists multithreading as available on all platforms, yet its multithreaded web demo does not work in Safari. The README does not explain whether WebAssembly thread requirements, browser settings, or another mechanism cause that limitation. Browser deployments may therefore face separate support work even if the desktop build succeeds.

Another constraint is the experimental API. There are no GitHub releases, and the README does not define a stable interface, compatibility promise, migration procedure, or long-term support window. Version 0.1.0 in the workspace package metadata is consistent with an early crate version, but version numbering alone does not provide a production guarantee. An application that requires stable bindings, complete cartography, predictable upgrades, or documented rollback would need work beyond simply adding the crate.

The absence of raster tiles and GeoJSON is particularly important for teams migrating an existing map product. A vector-tile-only experiment cannot replace an application that combines vector layers with raster imagery, GeoJSON overlays, labels, symbols, terrain, or language-specific SDKs. maplibre-rs is better understood as research into a portable rendering approach than as a drop-in replacement for a mature map application.

MapLibre-rs compared with MapLibre and Bevy's existing renderer

MapLibre is the closest architectural comparison named in the project. Both relate to the MapLibre Style Spec and vector-map rendering, but they approach adoption differently. MapLibre is an existing renderer that maplibre-rs explicitly says it does not currently aim to replace. maplibre-rs instead explores a Rust core using WebGPU across web and native graphics backends. Its renderer was forked from Bevy, which gives it a Rust graphics foundation while also making it an experiment with a technology stack rather than a complete replacement application.

Bevy's renderer is the source of the generic rendering base, as stated in the acknowledgements. That creates a useful contrast for engineering evaluation. A team may want the WebGPU abstraction and Rust portability offered by the Bevy-derived path, or it may prefer to build on the existing Bevy renderer directly. The README does not claim that maplibre-rs exposes every Bevy renderer feature, and it should not be interpreted as a separate maintained map layer within Bevy.

A real alternative is to choose an established vector map renderer and reserve Rust for the surrounding application. That avoids making this proof of concept responsible for labels, collision handling, raster rendering, terrain, and public mobile bindings. The trade-off is losing the specific cross-platform Rust and WebGPU experiment that maplibre-rs is designed to evaluate.

The choice therefore depends on the reason for adoption. If the objective is studying WebGPU-backed Rust map rendering, maplibre-rs is direct and relevant. If the objective is shipping a complete map experience, the missing feature list makes an established renderer the more defensible starting point unless the application accepts implementing substantial map behavior itself.

Editorial conclusion

maplibre-rs fits developers evaluating a Rust and WebGPU map-rendering stack or building a limited vector-tile proof of concept. It is not a direct replacement for a complete map renderer at present. Before adoption, verify whether the absent label, symbol, raster, GeoJSON, and language-binding features matter to the application, then test the required WebGPU implementation and inspect the experimental API.

Frequently asked questions

What is maplibre-rs used for?

maplibre-rs is a Rust library for rendering vector map tiles across web, mobile, and desktop targets using WebGPU. Its current implementation includes vector tile rendering, simple winit navigation, multithreading, and feature querying.

How do I run the maplibre-rs desktop demo?

Clone the repository, install Rust through rustup, then run `cargo run -p maplibre-demo`. The workspace specifies Rust 1.97.1 and includes `rust-toolchain.toml` for toolchain selection.

Does maplibre-rs render labels, text, and symbols?

No. Text, labels, symbols, collision detection, raster data, 3D terrain, hill-shade data, and GeoJSON support are all listed as missing features.

Official sources

  1. Issues
  2. License: Apache-2.0
  3. maplibre/maplibre-rs on GitHub
  4. README
Add this badge to your README

If you maintain this project, the badge below links readers to this analysis and shows its maintenance status from the daily GitHub snapshot. Paste the markdown into your README; add ?metric=license or ?metric=stars to the image URL for a different field.

Add this badge to your README

markdown
[![Hysen Labs](https://hysenlabs.com/badge/maplibre-maplibre-rs.svg)](https://hysenlabs.com/projects/maplibre-maplibre-rs)

Star history chart for your README

markdown
[![Star history](https://hysenlabs.com/chart/maplibre-maplibre-rs.svg)](https://hysenlabs.com/projects/maplibre-maplibre-rs)

Was this useful?