Skip to main content

PyMGL: Maplibre GL Native Static Renderer for Python

This package provides an interface to Mapblibre Native to render Mapbox GL / Maplibre GL styles to PNG images.

WARNING: this package is under active development and the API may change without notice.

Goals

This package is intended to provide a lightweight interface to maplibre-native for rendering Mapbox GL / Maplibre GL styles to PNG image data using Python. This is particularly useful for server-side rendering of maps for use in reports.

This package provides only the Python API for interacting with maplibre-native; it does not provide higher-level functionality such as a web server or a CLI.

Install

Supported operating systems

MacOS (arm64 only) and Linux (manylinux x86_64/arm64) wheels are available on PyPI:

pip install pymgl

Windows is not and will not be supported.

The manylinux wheels currently target Ubuntu 18+, Debian 10+, Fedora 29+, RHEL 8+, Alma Linux 8+. However, several of these are EOL and not tested. Ubuntu 22.04, 24.04, and 26.04 are actively tested.

You may need to set the SSL CA certificate path specific to your version of Linux, because they might be in a different location than on your version than in the manylinux builder. For example, on Ubuntu 22+:

sudo mkdir -p /etc/pki/tls/certs
sudo ln -s /etc/ssl/certs/ca-certificates.crt /etc/pki/tls/certs/ca-bundle.crt

To verify that pymgl installed correctly, install with the test dependencies and run the included test suite:

pip install pymgl[test]
pytest --pyargs pymgl -v

Usage

To create a map object, you must always provide a Mapbox GL / Maplibre GL style JSON string or URL to a well-known style hosted by Mapbox or Maptiler:

from pymgl import Map

style = """{
    "version": 8,
    "sources": {
        "basemap": {
            "type": "raster",
            "tiles": ["https://services.arcgisonline.com/arcgis/rest/services/Ocean/World_Ocean_Base/MapServer/tile/{z}/{y}/{x}"],
            "tileSize": 256
        }
    },
    "layers": [
        { "id": "basemap", "source": "basemap", "type": "raster" }
    ]
}"""

map = Map(style, <height=256>, <width=256>, <ratio=1>, <longitude=0>, <latitude=0>, <zoom=0>, <token=None>, <provider=None>)

See the styles section for more information about map styles.

Other than style, all other parameters are optional with default values.

NOTE: style and ratio cannot be changed once the instance is constructed.

You can use a well-known style instead of providing a style JSON string, but you must also provide a token and identify the correct provider:

map = Map("mapbox://styles/mapbox/streets-v11", token=<mapbox token>, provider="mapbox")

Valid providers are mapbox, maptiler, and maplibre.

Map properties

You can set additional properties on the map instance after it is created:

map.setCenter(longitude, latitude)

map.setZoom(zoom)

map.setSize(width, height)

map.setBearing(bearing)  # map bearing in degrees

map.setPitch(pitch)  # map pitch in degrees

map.setFilter(layerId, filterJSON or None)

map.setPaintProperty(layerId, property, value)

map.setVisibility(layerId, True / False)

You can retrieve these values using attributes, if needed:

map.size  # (width, height)

map.center  # (longitude, latitude)

map.zoom

map.bearing

map.pitch

You can also retrive information about the map's style or a specific layer:

map.listLayers()  # [<layerId1>, ...]

map.listSources()  # [<sourceId1>, ...]

map.getFilter(<layerId>)  # returns JSON value or None

map.getPaintProperty(<layerId>, <property>)  # returns JSON value or None

map.getLayerJSON(<layerId>)  # returns JSON describing layer

NOTE: paint properties may be decoded to their internal representation. For example, a CSS color string #FF0000 will be returned as ["rgba", 255, 0, 0, 1].

IMPORTANT: if you are using a remotely-hosted style, you need to force the map to load - which loads all underying assets - before listing the style's layers, sources, or other properties.

map = Map("mapbox://styles/mapbox/streets-v11", token=<mapbox token>, provider="mapbox")

map.listLayers()  # []
map.load()
map.listLayers()  # [<layerId1>, ...]

Alternatively, you can download the style yourself and provide that as input to the Map, and it will show all layers without requiring a render first. However, not all assets will be loaded until the first render.

from urllib.request import urlopen

url = f"https://api.mapbox.com/styles/v1/mapbox/streets-v11?access_token={MAPBOX_TOKEN}"

with urlopen(url) as r:
    style = r.read()

map = Map(style.decode("UTF-8") token=<mapbox token>, provider="mapbox")
map.listLayers()  # [<layerId1>, ...]

You can auto-fit the map to bounds instead of using center longitude / lantitude and zoom:

map.setBounds(xmin, ymin, xmax, ymax, <padding=0>)

You can register an image for use with your style by providing an ID, raw image bytes, width, height, pixel ratio, and indicate if it should be interpreted as SDF:

map.addImage("id", img_bytes, width, height, <ratio=1>, <make_SDF=False>)

See the SDF image docs for more information about using SDF images.

Rendering

You can render the map to PNG bytes:

img_bytes = map.renderPNG()

This returns bytes containing the RGBA PNG data.

You can render the map to a raw buffer as a numpy array (uint8 dtype):

array = map.renderBuffer()

The array is a sequence of RGBA values for each pixel in the image.

This may be useful if you are going to immediately read the image data into another package such as Pillow or pyvips to combine with other image operations.

Map instances

WARNING: you must manually delete the map instance if you assign a new map instance to that variable, or this package will segfault (not yet sure why). This problem does not occur if separate instances are assigned to separate variables.

map = Map(<style>, <width>, <height>)

del map  # must manually delete BEFORE creating a new instance assigned to this

map = Map(<style>, <width>, <height>)

For this reason, you should consider using a context manager:

with Map(<style>, <width>, <height>) as map:
    map.renderPNG()

You can also use the map instance to directly render to PNG, if you don't need to set other properties on the map instance:

Map(<style>, <width>, <height>).renderPNG()

Styles

PyMGL should support basic styles as of Mapbox GL JS 1.13.

Remote tilesets, sources, and assets

Remote tilesets, tile sources, and assets (glyphs, sprites) should be well-supported. These are loaded by the underlying C++ library outside our control. Invalid URLs will generally raise errors. However, network timeouts or incorrect formats may cause the process to crash.

Local mbtiles

Local MBTiles are supported, but must be provided using an absolute path to the mbtiles file as the source url of a tileset; it must resolve to an actual file.

Local MBTiles are denoted with a mbtiles:// URI prefix.

Example:

{
    "sources": {
        "source_id": {
            "url": "mbtiles:///<pymgl_root_dir>/tests/fixtures/geography-class-png.mbtiles",
            ...
        }
    },
    "layers": [...],
    ...
}

PMTiles

Local and remote PMTiles files are supported, but must include a file:// with the absolute path or https:// remote URL.

{
    "sources": {
        "local_pmtiles": {
            "url": "pmtiles://file:///<pymgl_root_dir>/tests/fixtures/geography-class-png.pmtiles",
            ...
        },
        "remote_pmtiles": {
            "url": "pmtiles://https://latest.protomaps.com/v4.pmtiles",
            ...
        },
    },
    "layers": [...],
    ...
}

Local files

GeoJSON files and other local file assets are supported, but must be provided using an absolute path to the file source.

Example:

{
    "sources": {
        "geojson": {
            "type": "geojson",
            "data": "file:///<pymgl_root_dir>/tests/fixtures/test.geojson"
        }
    },
    "layers": [...],
    ...
}

WARNING: providing a URI to tiles under the tiles key of a source is NOT currently supported by Maplibre Native; attempting to do so will fail.

Images

You must register the image with the map instance before rendering the map. See map.addImage() above.

{
    "sources": {...},
    "layers": [
        {
            ...,
            "paint": {
                "fill-pattern": "pattern"
            }
        },
    ]
}

You can use map images as fill patterns or icon images.

Adding sources and layers after construction

You can add sources and layers dynamically after constructing the map instance:

import json

map = Map("")  # construct with empty style

map.addSource("my_id", json.dumps({
    "type": "geojson",
    "data": {"type": "Point", "coordinates": [0, 0]}
}))

map.addLayer(json.dumps({
    "id": "geojson-point",
    "source": "geojson",
    "type": "circle",
    "paint": { ... }
}))

Feature state

You can get, set, and remove feature state after the map has been loaded.

map = Map(<style with source "exampleSource" and layer "exampleLayer">, ...)

map.load()
map.getFeatureState("exampleSource", "exampleLayer", "0")  # returns None
map.setFeatureState("exampleSource", "exampleLayer", "0", "{\"a\": true}")
map.getFeatureState("exampleSource", "exampleLayer", "0")  # returns "{\"a\": true}"

# remove the state value for key "a"
map.removeFeatureState("exampleSource", "exampleLayer", "0", "a")
map.render()
map.getFeatureState("exampleSource", "exampleLayer", "0")  # returns None

NOTE: features must already have a unique, numeric ID set on each feature. There is currently no support for promoteId like in MapLibre GL JS.

IMPORTANT: the map must be loaded before getting or setting feature state. You must manually force a render in order for the map to update feature state after removing a state key

Unsupported features

PyMGL does not support alternative projections or 3D terrain.

Developing

Dependencies:

MacOS:

Developing on MacOS requires the following binary libraries to be installed via homebrew:

  • cmake
  • ninja

Developing on Ubuntu requires the following binary libraries:

  • cmake
  • ninja-build
  • build-essential
  • libcurl4-openssl-dev
  • libicu-dev
  • libpng-dev
  • libwebp-dev
  • libprotobuf-dev
  • libjpeg-turbo8-dev
  • libx11-dev
  • libegl-dev
  • libopengl-dev
  • xvfb

To run on Linux, XVFB must also be running; otherwise the process will segfault.

See docker/README.md for more information.

nanobind

nanonbind is used to provide bindings for Python against a C++ class that wraps maplibre-native for easier rendering operations.

It is included here as a git submodule, per the installation instructions.

git submodule add https://github.com/wjakob/nanobind vendor/nanobind
cd vendor/nanobind
git submodule update --init --recursive

Then to upgrade to a specific version of nanobind for development, if needed:

cd vendor/nanobind
git checkout <version tag>

Maplibre Native

Maplibre Native is included as a git submodule, and it includes many submodules of its own.

git submodule add -b main https://github.com/maplibre/maplibre-native vendor/maplibre-native

Git submodules

Run

git submodule update --init

We only need some of the submodules under maplibre-native. In particular, we do not need maplibre-gl-js or Android / IOS dependencies.

Run the following:

cd vendor/maplibre-native

git submodule update --init --recursive \
    vendor/boost \
    vendor/cpp-httplib \
    vendor/csscolorparser \
    vendor/earcut.hpp \
    vendor/eternal \
    vendor/expected-lite \
    vendor/freetype \
    vendor/googletest \
    vendor/harfbuzz \
    vendor/kdbush.hpp \
    vendor/maplibre-native-base \
    vendor/maplibre-tile-spec \
    vendor/metal-cpp \
    vendor/parsedate \
    vendor/PMTiles \
    vendor/polylabel \
    vendor/protozero \
    vendor/rapidjson \
    vendor/supercluster \
    vendor/unique_resource \
    vendor/unordered_dense \
    vendor/vector-tile \
    vendor/wagyu

To later update maplibre-native:

cd vendor/maplibre-native
git checkout main
git pull origin

cd ../..
git commit -am "update maplibre-native" to latest

Note: this can also checkout a recent release of the core.

Architecture

This package is composed of 2 main parts:

  • wrapper around Maplibre Native classes to make constructing and managing properties of the map easier
  • Python bindings created using nanobind against that wrapper

The wrapper is located in src/map.cpp.

Build

C++ tests

See tests/README for more information.

Build Python extension

The Python setup.py script manages building the library and extension using CMake.

From project root directory:

python setup.py build_ext --inplace

Docstrings / type information

Docstrings are maintained in both src/_pymgl.cpp and pymgl/__init__.pyi.

Python-friendly type annotations are maintained in pymgl/__init__.pyi.

Note: pymgl/__init__.pyi is necessary to support autocompletion and tooltips in VSCode.

Building wheels

Most wheels are automatically built by Github when pushing a new version tag. These are created for Linux using the manylinux_2_28 Docker container.

See also

mbgl-renderer provides a NodeJS API, CLI, and server based on the NodeJS bindings to Mapbox GL Native.

Credits

This project was developed with the support of the U.S. Fish and Wildlife Service Southeast Conservation Adaptation Strategy for use in the Southeast Conservation Blueprint Viewer.

This project is made possible because of the mapbox-gl-native project by Mapbox by the efforts of the Maplibre community maintaining the open-source fork of that project at maplibre-native.

Metadata

Release files for pymgl 0.6.1

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Built distributions (wheels)

Table of built distributions (wheels) for pymgl 0.6.1
File Actions
pymgl-0.6.1-cp314-cp314-manylinux_2_28_x86_64.whl CPython 3.14 CPython 3.14 Linux glibc 2.28+ x86-64 Details for pymgl-0.6.1-cp314-cp314-manylinux_2_28_x86_64.whl
pymgl-0.6.1-cp314-cp314-manylinux_2_28_aarch64.whl CPython 3.14 CPython 3.14 Linux glibc 2.28+ ARM64 Details for pymgl-0.6.1-cp314-cp314-manylinux_2_28_aarch64.whl
pymgl-0.6.1-cp314-cp314-macosx_26_0_arm64.whl CPython 3.14 CPython 3.14 macOS 26.0+ ARM64 Details for pymgl-0.6.1-cp314-cp314-macosx_26_0_arm64.whl
pymgl-0.6.1-cp314-cp314-macosx_15_0_arm64.whl CPython 3.14 CPython 3.14 macOS 15.0+ ARM64 Details for pymgl-0.6.1-cp314-cp314-macosx_15_0_arm64.whl
pymgl-0.6.1-cp313-cp313-manylinux_2_28_x86_64.whl CPython 3.13 CPython 3.13 Linux glibc 2.28+ x86-64 Details for pymgl-0.6.1-cp313-cp313-manylinux_2_28_x86_64.whl
pymgl-0.6.1-cp313-cp313-manylinux_2_28_aarch64.whl CPython 3.13 CPython 3.13 Linux glibc 2.28+ ARM64 Details for pymgl-0.6.1-cp313-cp313-manylinux_2_28_aarch64.whl
pymgl-0.6.1-cp313-cp313-macosx_14_0_universal2.whl CPython 3.13 CPython 3.13 macOS 14.0+ universal2 (ARM64, x86-64) Details for pymgl-0.6.1-cp313-cp313-macosx_14_0_universal2.whl
pymgl-0.6.1-cp312-cp312-manylinux_2_28_x86_64.whl CPython 3.12 CPython 3.12 Linux glibc 2.28+ x86-64 Details for pymgl-0.6.1-cp312-cp312-manylinux_2_28_x86_64.whl
pymgl-0.6.1-cp312-cp312-manylinux_2_28_aarch64.whl CPython 3.12 CPython 3.12 Linux glibc 2.28+ ARM64 Details for pymgl-0.6.1-cp312-cp312-manylinux_2_28_aarch64.whl
pymgl-0.6.1-cp312-cp312-macosx_14_0_universal2.whl CPython 3.12 CPython 3.12 macOS 14.0+ universal2 (ARM64, x86-64) Details for pymgl-0.6.1-cp312-cp312-macosx_14_0_universal2.whl

Total release size: 167.8 MB

Release files / pymgl-0.6.1-cp314-cp314-manylinux_2_28_x86_64.whl

Download URL pymgl-0.6.1-cp314-cp314-manylinux_2_28_x86_64.whl
Size 25.9 MB
Tags CPython 3.14 Linux glibc 2.28+ x86-64
SHA-256 checksum
How to use checksums
abfd0270b85e341c603c2196141ebfd3d9d25cc768fa935d028159a9abad4aac
BLAKE2b-256 checksum
How to use checksums
ca1accb39f96787fd1ea1235944f9adaa5ae8ba0c232d43bcc0be6572fb3c70d
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 12, 2026.

Transparency log

Release files / pymgl-0.6.1-cp314-cp314-manylinux_2_28_aarch64.whl

Download URL pymgl-0.6.1-cp314-cp314-manylinux_2_28_aarch64.whl
Size 25.0 MB
Tags CPython 3.14 Linux glibc 2.28+ ARM64
SHA-256 checksum
How to use checksums
b9fe7c9746ff3b994710db979a40b15836abed5d78ea176bdd2b4f4b0def7873
BLAKE2b-256 checksum
How to use checksums
7c81b2fcbcb63364145d81a09b33fe27ffb417a3e007bc5007cb1e0c41661ca5
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 12, 2026.

Transparency log

Release files / pymgl-0.6.1-cp314-cp314-macosx_26_0_arm64.whl

Download URL pymgl-0.6.1-cp314-cp314-macosx_26_0_arm64.whl
Size 3.8 MB
Tags CPython 3.14 macOS 26.0+ ARM64
SHA-256 checksum
How to use checksums
c5eee63e998003a7dace05a0085e07f66b1a1b00948dad02407a3e8ccd65aadb
BLAKE2b-256 checksum
How to use checksums
bc0d67ce95fb340b41000463e77dc5a83cad49e28e03a3e5b5060bcbcf7a6e4f
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 12, 2026.

Transparency log

Release files / pymgl-0.6.1-cp314-cp314-macosx_15_0_arm64.whl

Download URL pymgl-0.6.1-cp314-cp314-macosx_15_0_arm64.whl
Size 3.8 MB
Tags CPython 3.14 macOS 15.0+ ARM64
SHA-256 checksum
How to use checksums
3b399da57a250cbe7077b1ae60c2357f548a1812432b4f0e9c8ed30faea25650
BLAKE2b-256 checksum
How to use checksums
6c73d9e10000227b5577fd7d61eef0342c69e32ce22c4bcd520fe5f41d52cecf
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 12, 2026.

Transparency log

Release files / pymgl-0.6.1-cp313-cp313-manylinux_2_28_x86_64.whl

Download URL pymgl-0.6.1-cp313-cp313-manylinux_2_28_x86_64.whl
Size 25.9 MB
Tags CPython 3.13 Linux glibc 2.28+ x86-64
SHA-256 checksum
How to use checksums
b7fb6e66d2898c49c1167637ce469981bf4987a039a56fdb9db68dabb32524fa
BLAKE2b-256 checksum
How to use checksums
ef6431da9585ac2f8795818fcd96c8b83b810fbf7003222788345e16e94bed9b
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 12, 2026.

Transparency log

Release files / pymgl-0.6.1-cp313-cp313-manylinux_2_28_aarch64.whl

Download URL pymgl-0.6.1-cp313-cp313-manylinux_2_28_aarch64.whl
Size 25.0 MB
Tags CPython 3.13 Linux glibc 2.28+ ARM64
SHA-256 checksum
How to use checksums
3e97689cfbd0137ade27ca8a55107db8573ba49d81573b6df1239c303e24f957
BLAKE2b-256 checksum
How to use checksums
ca244d7014125c140c6b64bb739bf5962d0f5267bc2cbf7e885ab4e69555542a
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 12, 2026.

Transparency log

Release files / pymgl-0.6.1-cp313-cp313-macosx_14_0_universal2.whl

Download URL pymgl-0.6.1-cp313-cp313-macosx_14_0_universal2.whl
Size 3.8 MB
Tags CPython 3.13 macOS 14.0+ universal2 (ARM64, x86-64)
SHA-256 checksum
How to use checksums
dcaae20c09239ec152072a78722c63aaa8d02323e2b75df2d4d070d033957f84
BLAKE2b-256 checksum
How to use checksums
619574e8d3c87d168bf11cff38da620435eb592ff2562f0a073121aae63e8a7d
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 12, 2026.

Transparency log

Release files / pymgl-0.6.1-cp312-cp312-manylinux_2_28_x86_64.whl

Download URL pymgl-0.6.1-cp312-cp312-manylinux_2_28_x86_64.whl
Size 25.9 MB
Tags CPython 3.12 Linux glibc 2.28+ x86-64
SHA-256 checksum
How to use checksums
4cfdd6615bbee3360ba3227ad1bb85c415461938912b30419b0b42bf44b4825a
BLAKE2b-256 checksum
How to use checksums
a8e1c7d60c37cf3e9d4bcedff9764cde883e6dbef0afcfc9a834b3acc97ce9fb
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 12, 2026.

Transparency log

Release files / pymgl-0.6.1-cp312-cp312-manylinux_2_28_aarch64.whl

Download URL pymgl-0.6.1-cp312-cp312-manylinux_2_28_aarch64.whl
Size 25.0 MB
Tags CPython 3.12 Linux glibc 2.28+ ARM64
SHA-256 checksum
How to use checksums
bc8edda7614c2b862de87037288e78d881060b111d544c8349877b84bc0b7e44
BLAKE2b-256 checksum
How to use checksums
b0140c76dc8b5909662b9b27238b9aa174239ab262ac5c744c68ef8ff213110d
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 12, 2026.

Transparency log

Release files / pymgl-0.6.1-cp312-cp312-macosx_14_0_universal2.whl

Download URL pymgl-0.6.1-cp312-cp312-macosx_14_0_universal2.whl
Size 3.8 MB
Tags CPython 3.12 macOS 14.0+ universal2 (ARM64, x86-64)
SHA-256 checksum
How to use checksums
7b33df77654023cbfb7558947733b59b59fec9bb2494facfae73bf5f70fe2ba3
BLAKE2b-256 checksum
How to use checksums
32fa86a38481c7db6e8597154ebb1b3891b021c49a66a8038097093f877999a8
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 12, 2026.

Transparency log

Security for pymgl 0.6.1

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

Full provenance

All 10 files in this release have been uploaded with provenance metadata.

Select from 10 files

Attestation for pymgl-0.6.1-cp314-cp314-manylinux_2_28_x86_64.whl

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 12, 2026.

Transparency log

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page