🚧 This project is in active beta development. This means the API is unstable, features may be added or removed, and breaking changes are likely to occur frequently and without notice as the design is refined.
TerrainGen
A high-performance scientific terrain generation tool for interplanetary bodies.
TerrainGen can:
- Generate synthetic terrain from scratch, or add fine detail to existing elevation models.
- Populate craters and boulders from cumulative size-frequency distributions.
- Model each crater's profile, age, degradation, irregularity.
- Bake small boulders into the heightmap, and generate procedural 3D boulder models for the large ones.
- Produce synthetic albedo maps with crater ejecta and rays that fade with crater age.
- Model complex geologic features such as complex and secondary craters, boulder ejecta fields, dunes and wind ripples, layered strata terraced into benches and cliffs, fractured bedrock pavement, wind-carved ventifacts, and sand pooled in lows or trailing behind boulders.
- Be extended through base classes in C++ or Python with custom size-frequency distributions, crater ages, profiles and degradation, albedo, sources, and layers.
- GPU-accelerated operations for generating noise, craters, boulders, albedo, and more.
- Generate deterministic results for the same seed on any grid, tile or thread count.
- Integrate into simulations and other external workflows.
We also provide:
- A modular C++ library with Python bindings and minimal dependencies.
- Smart and tested defaults for various surface features.
- A command-line interface that generates terrain from JSON configuration files.
- A GUI for editing configurations and viewing the results in 3D.
- Examples in C++, Python and JSON.
- A standalone demo that streams TerrainGen detail into a planetary-scale renderer on the GPU while navigating around the Moon.
- Example integrations with third-party tools such as Project Chrono, IsaacLab, and Newton.
For more information on the concepts behind TerrainGen and the API, see our latest documentation.
Quick Start
We recommended getting started by installing terraingenpy from PyPi and running the GUI.
pip install terraingenpy
terraingen --gui
Requirements
- Linux (Ubuntu 22.04 or newer), macOS 14 or newer, or Windows 10 or newer, on x86_64 or arm64.
- Python 3.10 or newer for the Python package.
- Optional: a Vulkan, CUDA or Metal driver for GPU acceleration. Run
terraingen backendsto see what is available.
Installation
Releases
Every release has the CLI, library, headers and CMake package for each platform, and .deb packages for Ubuntu and Debian. The latest pre-release is built from main on every push.
Building from Source
You need CMake 3.22 or newer and a C++20 compiler (GCC 11, Clang 14, Apple Clang 15 or MSVC 2022). CMake fetches everything else.
cmake -S . -B build -DCMAKE_BUILD_TYPE=Release
cmake --build build -j 8
cmake --install build --prefix /usr/local
To build the Python package from source, run pip install . instead.
Docker
docker run --rm ghcr.io/alexmaietta/terraingen:latest terraingen --help
The dev tag follows main.
Getting Started
Python
import terraingen
# A flat 513 x 513 grid with 2 m pixels
ground = terraingen.FlatSource(513, 513, 2.0)
# Fractal noise 40 m high with an 800 m wavelength
fractal = terraingen.FractalParams(seed=1, wavelength=800.0, amplitude=40.0)
noise = terraingen.NoiseLayer(fractal)
relief = terraingen.NoiseRelief([noise])
terrain = terraingen.Terrain(ground, [relief])
heights = terraingen.evaluate(terrain)
terraingen.write_geotiff("terrain.tif", heights)
C++
find_package(terraingen REQUIRED)
target_link_libraries(app PRIVATE terraingen::terraingen)
#include <terraingen/terraingen.h>
int main() {
// Fractal noise 40 m high with an 800 m wavelength
terraingen::NoiseLayer noise;
noise.fractal.seed = 1;
noise.fractal.wavelength = 800.0f;
noise.fractal.amplitude = 40.0f;
terraingen::SyntheticTerrainParams relief;
relief.layers = {noise};
// A flat 513 x 513 grid with 2 m pixels, plus the noise
terraingen::Terrain terrain;
terrain.source = std::make_shared<terraingen::FlatSource>(513, 513, 2.0);
terrain.layers.push_back(std::make_shared<terraingen::NoiseRelief>(relief));
terraingen::Raster<float> heights = terraingen::Evaluate(terrain);
terraingen::WriteGeoTiff("terrain.tif", heights);
}
Examples
examples/ has the same terrains as JSON configurations, C++ programs and Python scripts, covering basic terrains, craters, boulders, albedo, planets, DEM detail and tiles:
terraingen examples/config/craters/example_craters_simple.json
Demos
demos/ has larger showcases, such as terrain over a whole asteroid built from the Itokawa shape model.
Contributing
Contributions are welcome. See CONTRIBUTING.md for how to build, test and submit changes.
Documentation
The documentation is built with MkDocs and Doxygen from docs/. Run make -C docs build to build it locally.
Code Coverage
The coverage report is updated on every push to main. To generate it locally:
cmake -S . -B build-coverage -DTERRAINGEN_COVERAGE=ON -DCMAKE_BUILD_TYPE=Debug
cmake --build build-coverage -j 8 --target coverage
Citation
If you use TerrainGen for published research, please cite:
@software{maietta_terraingen,
author = {Maietta, Alex},
title = {{TerrainGen}: An open-source scientific terrain generation suite for planetary surfaces},
url = {https://github.com/alexmaietta/terraingen},
version = {0.1.0},
license = {BSD-3-Clause},
year = {2026}
}
License
TerrainGen is licensed under the BSD 3-Clause License.
Third-party code and assets keep their own licenses, listed in third_party/README.md.
Acknowledgements
TerrainGen draws inspiration from existing lunar terrain generation tools:
| Name | Organization | Availability | Capabilities | Limitations |
|---|---|---|---|---|
| synthterrain | NASA Ames | Open source (Apache-2.0) | Crater and boulder populations from size-frequency distributions, crater profiles and DEMs on flat terrain | Doesn't generate surface detail or upscale existing DEMs, not actively contributed to. |
| lunasynth | NASA JPL | Open source (Apache-2.0) | Adds craters and boulders to a lunar base DEM, down to 1 cm pixels, and renders images under varying camera and sun positions | Project is not actively-maintained |
| DLES Terrain Crafting | NASA JSC | Not publicly released (paper) | Enhances LOLA and NAC-derived DEMs of the lunar south pole to 20 cm with synthetic craters and boulders, including hand-placed craters from imagery | Not publicly released, relies on manual crater counting, stamps craters from four template shapes, leaves blending rings around craters and smooth interpolated ground between them, and doesn't produce albedo maps. |
| PANGU | University of Dundee / STAR-Dundee | Commercial (free for ESA projects) | Multi-resolution planet and asteroid surfaces from real or fractal DEMs with statistical craters and boulders; GPU camera, LiDAR and thermal sensor simulation | Requires a paid license outside ESA projects, and ships as standalone command-line tools and GUIs rather than a library to integrate into a project. |
Metadata
Release files for terraingenpy 0.1.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| terraingenpy-0.1.0.tar.gz | 1.2 MB | Details |
Built distributions (wheels)
Total release size: 49.3 MB
Release files / terraingenpy-0.1.0.tar.gz
| Download URL | terraingenpy-0.1.0.tar.gz |
|---|---|
| Size | 1.2 MB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
5e602f0fa95b9419b75bf90ba8f47f853f4dadd31e49fdb8b483a8d191b79f0c
|
|
BLAKE2b-256 checksum How to use checksums |
a18d5e4b7b30bbc3b31d17985e4df1d4dbe1940acbf869b4f5989fd6eb6382a7
|
| 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 18, 2026.
Transparency logRelease files / terraingenpy-0.1.0-cp312-abi3-win_amd64.whl
| Download URL | terraingenpy-0.1.0-cp312-abi3-win_amd64.whl |
|---|---|
| Size | 2.8 MB |
| Tags | CPython 3.12 Windows x86-64 abi3 |
|
SHA-256 checksum How to use checksums |
f3ed6892d8a26281149cc8b7b86b5bb31b6911c6f4ac0df7fc782b8c542698f3
|
|
BLAKE2b-256 checksum How to use checksums |
830dbd2f4836184a2d4c68b9defac6a9e0aff2ffa7d445cf9e7ca42b9b695667
|
| 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 18, 2026.
Transparency logRelease files / terraingenpy-0.1.0-cp312-abi3-manylinux_2_34_x86_64.whl
| Download URL | terraingenpy-0.1.0-cp312-abi3-manylinux_2_34_x86_64.whl |
|---|---|
| Size | 3.8 MB |
| Tags | CPython 3.12 Linux glibc 2.34+ x86-64 abi3 |
|
SHA-256 checksum How to use checksums |
512675e87d97ad99699c3fd31ee0c7dbcdaa1195f28c27183850ab60d52855f4
|
|
BLAKE2b-256 checksum How to use checksums |
00b0caf8bcd4cf9b21484e38666b8a0231947810d42ba7b0e13162c3d0782f50
|
| 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 18, 2026.
Transparency logRelease files / terraingenpy-0.1.0-cp312-abi3-manylinux_2_34_aarch64.whl
| Download URL | terraingenpy-0.1.0-cp312-abi3-manylinux_2_34_aarch64.whl |
|---|---|
| Size | 3.4 MB |
| Tags | CPython 3.12 Linux glibc 2.34+ ARM64 abi3 |
|
SHA-256 checksum How to use checksums |
ceb5b2227b0aef3fdfc8caa384ae600d5e4cd6e692017b0b350fba3a0206abd1
|
|
BLAKE2b-256 checksum How to use checksums |
fd0d2541ab62774b3b5fa09f63a3cfd32891b3b447a7da716cae480df5d73890
|
| 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 18, 2026.
Transparency logRelease files / terraingenpy-0.1.0-cp312-abi3-macosx_11_0_x86_64.whl
| Download URL | terraingenpy-0.1.0-cp312-abi3-macosx_11_0_x86_64.whl |
|---|---|
| Size | 3.0 MB |
| Tags | CPython 3.12 abi3 macOS 11.0+ x86-64 |
|
SHA-256 checksum How to use checksums |
332ef72e209cc295eee98309fa2b27d51cab7b6ca69c79f4eb1f1b01d016fc36
|
|
BLAKE2b-256 checksum How to use checksums |
e16040d014e514b3f4f015d109c6f83dab7f4848d1ac294b8c720cde02ab6ba6
|
| 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 18, 2026.
Transparency logRelease files / terraingenpy-0.1.0-cp312-abi3-macosx_11_0_arm64.whl
| Download URL | terraingenpy-0.1.0-cp312-abi3-macosx_11_0_arm64.whl |
|---|---|
| Size | 2.9 MB |
| Tags | CPython 3.12 abi3 macOS 11.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
9a1cc2538bd229046da9aab3032e0804bff21562ff2b8e170b48599a2c5251fa
|
|
BLAKE2b-256 checksum How to use checksums |
8742b420d2dd985fe1383eaaaa49a2f64f7a240e2ead87a80a15914dadb16fcf
|
| 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 18, 2026.
Transparency logRelease files / terraingenpy-0.1.0-cp311-cp311-win_amd64.whl
| Download URL | terraingenpy-0.1.0-cp311-cp311-win_amd64.whl |
|---|---|
| Size | 2.8 MB |
| Tags | CPython 3.11 Windows x86-64 |
|
SHA-256 checksum How to use checksums |
9bc8f34c4869992e023ea3585eb776887e5414cdd59ced861fd915df21086f45
|
|
BLAKE2b-256 checksum How to use checksums |
38940974994eb7419f3df9677d0396bf139f928510783774bd4882a903e30738
|
| 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 18, 2026.
Transparency logRelease files / terraingenpy-0.1.0-cp311-cp311-manylinux_2_34_x86_64.whl
| Download URL | terraingenpy-0.1.0-cp311-cp311-manylinux_2_34_x86_64.whl |
|---|---|
| Size | 3.8 MB |
| Tags | CPython 3.11 Linux glibc 2.34+ x86-64 |
|
SHA-256 checksum How to use checksums |
d5d2c6a632d520108cfafcfb0ec59f259993bc619e774472a175b5e19631ee16
|
|
BLAKE2b-256 checksum How to use checksums |
78038f49f1cad154fea9bbab92261320025bc5f24c03c6a410bad14c9d67a80c
|
| 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 18, 2026.
Transparency logRelease files / terraingenpy-0.1.0-cp311-cp311-manylinux_2_34_aarch64.whl
| Download URL | terraingenpy-0.1.0-cp311-cp311-manylinux_2_34_aarch64.whl |
|---|---|
| Size | 3.5 MB |
| Tags | CPython 3.11 Linux glibc 2.34+ ARM64 |
|
SHA-256 checksum How to use checksums |
0daa5d9aabe0e72e69b1f34003e00d61dd2f44b9f7cf41e0472520662c326ec4
|
|
BLAKE2b-256 checksum How to use checksums |
164a65b1418e14c67fd94f0b2538bb2833595415e26b07e2d05eaad953c8c8a8
|
| 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 18, 2026.
Transparency logRelease files / terraingenpy-0.1.0-cp311-cp311-macosx_11_0_x86_64.whl
| Download URL | terraingenpy-0.1.0-cp311-cp311-macosx_11_0_x86_64.whl |
|---|---|
| Size | 3.0 MB |
| Tags | CPython 3.11 macOS 11.0+ x86-64 |
|
SHA-256 checksum How to use checksums |
c7e8d2a428ca7e479d546a5d49f2a3163dd445717c6ea6c392004c8f636290ad
|
|
BLAKE2b-256 checksum How to use checksums |
62d324e9f13c37d468ed2c346e6615483529e117d75136a173312e33ac49dac7
|
| 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 18, 2026.
Transparency logRelease files / terraingenpy-0.1.0-cp311-cp311-macosx_11_0_arm64.whl
| Download URL | terraingenpy-0.1.0-cp311-cp311-macosx_11_0_arm64.whl |
|---|---|
| Size | 2.9 MB |
| Tags | CPython 3.11 macOS 11.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
e63550f1b45fa445c58f1378d0d71fd2e91264b69631c54b80a16d9aedd48541
|
|
BLAKE2b-256 checksum How to use checksums |
cb86304ca75c10573443b5ccecf44f193b4c8dea9a29cdb5f032aab79b849420
|
| 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 18, 2026.
Transparency logRelease files / terraingenpy-0.1.0-cp310-cp310-win_amd64.whl
| Download URL | terraingenpy-0.1.0-cp310-cp310-win_amd64.whl |
|---|---|
| Size | 2.8 MB |
| Tags | CPython 3.10 Windows x86-64 |
|
SHA-256 checksum How to use checksums |
a6561401442c523e24959b799eba070973005f530730f5c4e76f693fd69ec17c
|
|
BLAKE2b-256 checksum How to use checksums |
2777ed6029fc5d43dc175d5852aa8b9deb360d11bc4430c72fcb1d3bce3c8348
|
| 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 18, 2026.
Transparency logRelease files / terraingenpy-0.1.0-cp310-cp310-manylinux_2_34_x86_64.whl
| Download URL | terraingenpy-0.1.0-cp310-cp310-manylinux_2_34_x86_64.whl |
|---|---|
| Size | 3.8 MB |
| Tags | CPython 3.10 Linux glibc 2.34+ x86-64 |
|
SHA-256 checksum How to use checksums |
0349ae968eb70608c6aff6d9f0d9b922defc7b4488e31047457e1788992f080a
|
|
BLAKE2b-256 checksum How to use checksums |
4be5da87fc1d39c4329452c09d2f2b7069332424201cf398085a57264b90b428
|
| 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 18, 2026.
Transparency logRelease files / terraingenpy-0.1.0-cp310-cp310-manylinux_2_34_aarch64.whl
| Download URL | terraingenpy-0.1.0-cp310-cp310-manylinux_2_34_aarch64.whl |
|---|---|
| Size | 3.5 MB |
| Tags | CPython 3.10 Linux glibc 2.34+ ARM64 |
|
SHA-256 checksum How to use checksums |
b07663d0136f1683fa6c66b9718dc5e973d87dbc9babc5f20a3f5d900606bc5f
|
|
BLAKE2b-256 checksum How to use checksums |
f9d878faf5d9861872c16391c8ad8b2ad2a21022561154e327b11450c56776a3
|
| 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 18, 2026.
Transparency logRelease files / terraingenpy-0.1.0-cp310-cp310-macosx_11_0_x86_64.whl
| Download URL | terraingenpy-0.1.0-cp310-cp310-macosx_11_0_x86_64.whl |
|---|---|
| Size | 3.0 MB |
| Tags | CPython 3.10 macOS 11.0+ x86-64 |
|
SHA-256 checksum How to use checksums |
483f43d6bc893da9aed8c828da782b3ed85fa4e6b841b8693aa378bae610de57
|
|
BLAKE2b-256 checksum How to use checksums |
c8bc7b2cd19997319d7f2535564a54a632035ae53a8decf2071496c2f6e3bddb
|
| 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 18, 2026.
Transparency logRelease files / terraingenpy-0.1.0-cp310-cp310-macosx_11_0_arm64.whl
| Download URL | terraingenpy-0.1.0-cp310-cp310-macosx_11_0_arm64.whl |
|---|---|
| Size | 2.9 MB |
| Tags | CPython 3.10 macOS 11.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
faa56dd83c51601e8faeac55d6359a3bdc648edc117e47576713983698808427
|
|
BLAKE2b-256 checksum How to use checksums |
cbe8cbcb97fab431082e0ed5409903e5882c50a49713800d928c00cdb7815a80
|
| 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 18, 2026.
Transparency log