COOLJAPAN
← All posts

OxiGIS 0.1.0 Released — A QGIS-Class GIS in Pure Rust, Running Live in Your Browser

OxiGIS 0.1.0 is a full desktop and browser GIS application with zero C/C++/Fortran FFI in its default features: wgpu tile rendering (COG, XYZ, MVT, PMTiles), a built-in EPSG registry with complete Japanese coverage, vector editing, and PDF print — one source tree, a native binary and a WASM bundle. Live now at gis.cooljapan.tech. 2,565 tests passing.

release oxigis gis qgis geospatial pure-rust wasm webgpu cartography

A map flying Bangkok → Dhaka → Kathmandu → Dubai → Belgrade → Greenwich, labelling every city in its own script — Thai, Bengali, Devanagari, Arabic, Cyrillic, Latin — each label placed, collision-checked and drawn at animation frame rates, inside a browser tab, with no C, no C++ and no Fortran anywhere in the default build.

Today we released OxiGIS 0.1.0 — a QGIS-class GIS application built on the COOLJAPAN Pure Rust ecosystem, shipped as five crates on crates.io. And you do not have to install anything to try it: the browser build is live right now at gis.cooljapan.tech — 11.2 MB of WebAssembly, served as application/wasm, running the same renderer and the same projection math as the desktop binary.

No C. No C++. No Fortran. deny.toml bans the C/C++ crypto and TLS stacks outright — ring, aws-lc-sys, aws-lc-rs, openssl*, native-tls, security-framework-sys — and admits cc only as a wrapper of wayland-backend, the one Linux windowing case with no pure-Rust equivalent. cargo deny check bans is part of the release gate. One source tree produces two artifacts: a single native binary for Linux, macOS and Windows, and a single WASM bundle for the browser. Same panels, same renderer, same CRS math.

Why OxiGIS 0.1.0 is a game changer

The incumbent geospatial stack is not wrong. It is unmovable:

OxiGIS 0.1.0 ends all three of those, and the claim is narrow enough to check:

Technical Deep Dive: five crates, two shells, one renderer

  1. oxigis-core — the model, and nothing else. Layers, sources, styles, renderers, the .oxigis.json project format and the Processing registry, with no rendering or windowing dependency at all. It models where data lives, not how to parse it. Its crs::wkt reader takes WKT1 and WKT2 and strips every TOWGS84[…], AUTHORITY[…] and ID[…] group before matching a datum name — because TOWGS84 contains the substring WGS84, and GDAL, ogr2ogr and QGIS emit that clause for every datum that has one. A naive name match loads Tokyo, ED50 and OSGB36 data unshifted, and looks right while being hundreds of metres wrong.
  2. oxigis-render — the wgpu tile renderer, deliberately I/O-free. Raster tiles (XYZ templates and Cloud-Optimized GeoTIFF over HTTP Range), vector tiles (MVT: fill / line / circle / symbol), PMTiles archives, a tile pyramid with LRU caching, and Web Mercator math out to zoom 24, with compile-time assertions guarding every constant that depends on that maximum. It owns no executor and opens no socket — its async surface is Pin<Box<dyn Future>> from core — which is exactly why it compiles identically for native and wasm32-unknown-unknown.
  3. The label engine — the part that is genuinely obsessive. A glyph atlas, greedy collision-avoiding placement, vertical and bidi-aware orientation, and CJK font fallback. A full atlas does not cost a frame its labels: eviction is per glyph, survivors do not move and the generation is not bumped, so labels the frame is mid-draw stay valid; clearing the whole atlas is the last resort. That is what lets the demo tour keep six scripts on screen while the camera moves.
  4. oxigis-ui — the application, testable without a screen. Layer tree, style and renderer editors, attribute table, Processing dialogs generated from oxigis-core’s registry, and a complete vector editing system (sketch, snapping, topology, selection, hit-testing, attribute forms, clipboard, undo/redo). Editing is a command/transaction model that is tested without egui — 1,565 of the workspace’s tests live here. Print/export produces real PDF with bidi text shaping, font subsetting, a segmented scale bar carrying its representative fraction, a north arrow, a legend and /Info metadata, up to 300 dpi, JPEG- or Flate-encoded whichever is smaller.
  5. oxigis-web and oxigis-desktop — two shells over one core. The web shell is wasm-bindgen + WebGPU with automatic WebGL2 fallback, fetch-backed tile and Range transports, drag-and-drop ingestion and #map=<zoom>/<lat>/<lon> permalinks. The desktop shell is winit with native file dialogs, session persistence, background CJK font discovery and a real command line. Everything that touches the DOM or fetch() is cfg-gated to target_arch = "wasm32", so the shell’s decisions — permalink rounding, in-flight counting, Content-Range parsing, tile-drain convergence — are tested on the host without a browser.

Getting Started

The fastest path is no path at all — open gis.cooljapan.tech and drop a file on the map.

For the desktop application:

cargo install oxigis-desktop     # installs the `oxigis` binary
oxigis --help
oxigis path/to/project.oxigis.json

As a library, oxigis-core is the platform-independent model — no GPU, no windowing:

cargo add oxigis-core
use oxigis_core::{Layer, LayerKind, Project, RasterSource};

fn main() -> oxigis_core::CoreResult<()> {
    let mut project = Project::new("My Map");
    let id = project.layers.add(Layer::new(
        "OSM",
        LayerKind::Raster(RasterSource::xyz(
            "https://tile.osm.example/{z}/{x}/{y}.png",
        )),
    ));
    project.layers.set_opacity(id, 0.8)?;

    let json = project.to_json_string()?;
    println!("{json}");
    Ok(())
}

Building the browser bundle yourself:

wasm-pack build crates/oxigis-web --target web
./crates/oxigis-web/serve.sh        # dev profile, http://localhost:8080

What’s New in 0.1.0

This is the initial release, so everything is new. The headlines:

Tips

This is the foundation

OxiGIS is the application layer of the COOLJAPAN geospatial stack, and it is built entirely out of it: OxiGeo 0.2.4 for data I/O and CRS (with OxiProj 0.1.5 resolved underneath oxigeo-proj for the projection math, and oxigeo-geoparquet behind the optional feature), OxiUI (oxiui-table) for the attribute table model, OxiText and OxiFont (oxitext, oxitext-raster, oxifont-subset / -bundled / -discovery) for glyph rasterisation, font discovery and PDF subsetting, and OxiArc (oxiarc-deflate, oxiarc-lzw) for the compressed payloads inside COG, MVT and PMTiles.

Every one of those is Pure Rust, and every one of them is why the browser build exists at all.

Repository: https://github.com/cool-japan/oxigis

Star the repo if you think opening a sensitive layer should not require uploading it to somebody’s server first. The era of “GIS means installing a C++ stack, or handing your data to one” is over — Pure Rust GIS is here, and it runs in the tab you already have open.

KitaSan at COOLJAPAN OÜ August 18, 2026

↑ Back to all posts