Skip to main content

passagemath: Algorithms for Rubik's cube

Project description

passagemath is open source mathematical software in Python, released under the GNU General Public Licence GPLv2+.

It is a fork of SageMath, which has been developed 2005-2025 under the motto “Creating a Viable Open Source Alternative to Magma, Maple, Mathematica, and MATLAB”.

The passagemath fork uses the motto “Creating a Free Passage Between the Scientific Python Ecosystem and Mathematical Software Communities.” It was created in October 2024 with the following goals:

Full documentation is available online.

passagemath attempts to support and provides binary wheels suitable for all major Linux distributions and recent versions of macOS.

Binary wheels for native Windows (x86_64) are are available for a subset of the passagemath distributions. Use of the full functionality of passagemath on Windows currently requires the use of Windows Subsystem for Linux (WSL) or virtualization.

The supported Python versions in the passagemath 10.6.x series are 3.10.x-3.14.x.

About this pip-installable distribution package

This pip-installable distribution passagemath-rubiks provides an interface to several programs for working with Rubik’s cubes.

Michael Reid (GPL) http://www.cflmath.com/~reid/Rubik/optimal_solver.html

  • optimal - uses many pre-computed tables to find an optimal solution to the 3x3x3 Rubik’s cube

Dik T. Winter (MIT License)

  • cube - uses Kociemba’s algorithm to iteratively find a short solution to the 3x3x3 Rubik’s cube

  • size222 - solves a 2x2x2 Rubik’s cube

Eric Dietz (GPL) https://web.archive.org/web/20121212175710/http://www.wrongway.org/?rubiksource

  • cu2 - A fast, non-optimal 2x2x2 solver

  • cubex - A fast, non-optimal 3x3x3 solver

  • mcube - A fast, non-optimal 4x4x4 solver

What is included

  • Interface

  • Features (via passagemath-environment)

  • Binary wheels on PyPI contain prebuilt copies of rubiks executables.

Examples

Using rubiks programs on the command line:

$ pipx run --pip-args="--prefer-binary" --spec "passagemath-rubiks" sage -sh -c cubex

Finding the installation location of a rubiks program:

$ pipx run --pip-args="--prefer-binary" --spec "passagemath-rubiks[test]" ipython

In [1]: from sage.features.rubiks import cubex

In [2]: cubex().absolute_filename()

Using the Python interface:

$ pipx run --pip-args="--prefer-binary" --spec "passagemath-rubiks[test]" ipython

In [1]: from sage.interfaces.rubik import *

In [2]: C = RubiksCube("R U F L B D")

In [3]: sol = CubexSolver().solve(C.facets()); sol
Out[3]: "U' L' L' U L U' L U D L L D' L' D L' D' L D L' U' L D' L' U L' B' U' L' U B L D L D' U' L' U L B L B' L' U L U' L' F' L' F L' F L F' L' D' L' D D L D' B L B' L B' L B F' L F F B' L F' B D' D' L D B' B' L' D' B U' U' L' B' D' F' F' L D F'"

Using sage.groups.perm_gps:

$ pipx run --pip-args="--prefer-binary" --spec "passagemath-rubiks[test]" ipython

In [1]: from passagemath_rubiks import *

In [2]: rubik = CubeGroup(); state = rubik.faces("R")

In [3]: rubik.solve(state)
Out[3]: 'R'

Project details


Release history Release notifications | RSS feed

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

passagemath_rubiks-10.6.47.tar.gz (8.6 kB view details)

Uploaded Source

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

passagemath_rubiks-10.6.47-cp314-cp314t-musllinux_1_2_x86_64.whl (2.1 MB view details)

Uploaded CPython 3.14tmusllinux: musl 1.2+ x86-64

passagemath_rubiks-10.6.47-cp314-cp314t-musllinux_1_2_aarch64.whl (2.0 MB view details)

Uploaded CPython 3.14tmusllinux: musl 1.2+ ARM64

passagemath_rubiks-10.6.47-cp314-cp314t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl (1.1 MB view details)

Uploaded CPython 3.14tmanylinux: glibc 2.24+ x86-64manylinux: glibc 2.28+ x86-64

passagemath_rubiks-10.6.47-cp314-cp314t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl (1.0 MB view details)

Uploaded CPython 3.14tmanylinux: glibc 2.24+ ARM64manylinux: glibc 2.28+ ARM64

passagemath_rubiks-10.6.47-cp314-cp314t-macosx_13_0_x86_64.whl (214.0 kB view details)

Uploaded CPython 3.14tmacOS 13.0+ x86-64

passagemath_rubiks-10.6.47-cp314-cp314t-macosx_13_0_arm64.whl (205.8 kB view details)

Uploaded CPython 3.14tmacOS 13.0+ ARM64

passagemath_rubiks-10.6.47-cp312-abi3-musllinux_1_2_x86_64.whl (2.1 MB view details)

Uploaded CPython 3.12+musllinux: musl 1.2+ x86-64

passagemath_rubiks-10.6.47-cp312-abi3-musllinux_1_2_aarch64.whl (2.0 MB view details)

Uploaded CPython 3.12+musllinux: musl 1.2+ ARM64

passagemath_rubiks-10.6.47-cp312-abi3-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl (1.1 MB view details)

Uploaded CPython 3.12+manylinux: glibc 2.24+ x86-64manylinux: glibc 2.28+ x86-64

passagemath_rubiks-10.6.47-cp312-abi3-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl (1.0 MB view details)

Uploaded CPython 3.12+manylinux: glibc 2.24+ ARM64manylinux: glibc 2.28+ ARM64

passagemath_rubiks-10.6.47-cp312-abi3-macosx_13_0_x86_64.whl (213.9 kB view details)

Uploaded CPython 3.12+macOS 13.0+ x86-64

passagemath_rubiks-10.6.47-cp312-abi3-macosx_13_0_arm64.whl (205.4 kB view details)

Uploaded CPython 3.12+macOS 13.0+ ARM64

passagemath_rubiks-10.6.47-cp311-cp311-musllinux_1_2_x86_64.whl (2.1 MB view details)

Uploaded CPython 3.11musllinux: musl 1.2+ x86-64

passagemath_rubiks-10.6.47-cp311-cp311-musllinux_1_2_aarch64.whl (2.0 MB view details)

Uploaded CPython 3.11musllinux: musl 1.2+ ARM64

passagemath_rubiks-10.6.47-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl (1.1 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.24+ x86-64manylinux: glibc 2.28+ x86-64

passagemath_rubiks-10.6.47-cp311-cp311-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl (1.0 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.24+ ARM64manylinux: glibc 2.28+ ARM64

passagemath_rubiks-10.6.47-cp311-cp311-macosx_13_0_x86_64.whl (213.2 kB view details)

Uploaded CPython 3.11macOS 13.0+ x86-64

passagemath_rubiks-10.6.47-cp311-cp311-macosx_13_0_arm64.whl (204.8 kB view details)

Uploaded CPython 3.11macOS 13.0+ ARM64

passagemath_rubiks-10.6.47-cp310-cp310-musllinux_1_2_x86_64.whl (2.1 MB view details)

Uploaded CPython 3.10musllinux: musl 1.2+ x86-64

passagemath_rubiks-10.6.47-cp310-cp310-musllinux_1_2_aarch64.whl (2.0 MB view details)

Uploaded CPython 3.10musllinux: musl 1.2+ ARM64

passagemath_rubiks-10.6.47-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl (1.1 MB view details)

Uploaded CPython 3.10manylinux: glibc 2.24+ x86-64manylinux: glibc 2.28+ x86-64

passagemath_rubiks-10.6.47-cp310-cp310-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl (1.0 MB view details)

Uploaded CPython 3.10manylinux: glibc 2.24+ ARM64manylinux: glibc 2.28+ ARM64

passagemath_rubiks-10.6.47-cp310-cp310-macosx_13_0_x86_64.whl (213.4 kB view details)

Uploaded CPython 3.10macOS 13.0+ x86-64

passagemath_rubiks-10.6.47-cp310-cp310-macosx_13_0_arm64.whl (205.0 kB view details)

Uploaded CPython 3.10macOS 13.0+ ARM64

File details

Details for the file passagemath_rubiks-10.6.47.tar.gz.

File metadata

  • Download URL: passagemath_rubiks-10.6.47.tar.gz
  • Upload date:
  • Size: 8.6 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for passagemath_rubiks-10.6.47.tar.gz
Algorithm Hash digest
SHA256 a5c6fd139ad77102e9ea13ac847be3ce85935ed27f2d59bafeb66808d200f6bb
MD5 61e1bf193e7a3c60139d59e94e3078a0
BLAKE2b-256 7ef12b34205fe56fb113bd366e8dbeac271d01116a20f5d7c6cbb69c4175d4b1

See more details on using hashes here.

File details

Details for the file passagemath_rubiks-10.6.47-cp314-cp314t-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for passagemath_rubiks-10.6.47-cp314-cp314t-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 10af66c16afba8890df0d7c15e1da245c40a095bfb85790f08adb429e8d0bebc
MD5 9d10c9f3e58136052e9850f39a454077
BLAKE2b-256 0037a435b4aaa946a25eeb1dabe2e5b6fbe06c6f4fe43ab75acc71d4f1876670

See more details on using hashes here.

File details

Details for the file passagemath_rubiks-10.6.47-cp314-cp314t-musllinux_1_2_aarch64.whl.

File metadata

File hashes

Hashes for passagemath_rubiks-10.6.47-cp314-cp314t-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 c49e4f5f0681a23cca51887a14661bebdd05d60889294c525ca6df66a4517c7c
MD5 59374d763fbcd00ae35a345b237dc17b
BLAKE2b-256 1477ac476e16811219ddede46065c0736594c9f717b0283090c77e117240b18c

See more details on using hashes here.

File details

Details for the file passagemath_rubiks-10.6.47-cp314-cp314t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for passagemath_rubiks-10.6.47-cp314-cp314t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 6eb7c7e5fdb6425f229258913e76a89014f7712e08a109a41f5b445421dd740d
MD5 56c1b6d256e5d85927a8b4ee4e97785f
BLAKE2b-256 9e8f09bbba45cfc877b69fbb7c54cd472cdcf239f43271872b467416ed28c394

See more details on using hashes here.

File details

Details for the file passagemath_rubiks-10.6.47-cp314-cp314t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for passagemath_rubiks-10.6.47-cp314-cp314t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 4edaf2d0c81b96d8fff76d467535b1f8b9094a57e6c1c8ae714f79dff09e33c5
MD5 bcc726565f335aa651593e89886f2423
BLAKE2b-256 4e411f7348dad9ede24052f0017f298a4839e2561f2f77dac76fc1a0d6a21d95

See more details on using hashes here.

File details

Details for the file passagemath_rubiks-10.6.47-cp314-cp314t-macosx_13_0_x86_64.whl.

File metadata

File hashes

Hashes for passagemath_rubiks-10.6.47-cp314-cp314t-macosx_13_0_x86_64.whl
Algorithm Hash digest
SHA256 db526df426a50f1b0f4ea113a6e55fc68e99f33cac53d8aa3c06c0cb554c22f3
MD5 221d9128e6625bcd6a98a392e25a00a4
BLAKE2b-256 13b7ffcaf3104d2545755367e3bdfce4010ef38017f216ebe6732d821b611c5c

See more details on using hashes here.

File details

Details for the file passagemath_rubiks-10.6.47-cp314-cp314t-macosx_13_0_arm64.whl.

File metadata

File hashes

Hashes for passagemath_rubiks-10.6.47-cp314-cp314t-macosx_13_0_arm64.whl
Algorithm Hash digest
SHA256 eddb15e6006610f2aff2fb54c1de7ad5178df97058a903bf1bd577464ed2e5ad
MD5 7d29d3fe96df5e076ae0862fe5d620f3
BLAKE2b-256 526ce411a555cb9af140cda9346ae052921285099dc9d7880a207e7e351276b0

See more details on using hashes here.

File details

Details for the file passagemath_rubiks-10.6.47-cp312-abi3-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for passagemath_rubiks-10.6.47-cp312-abi3-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 10db5911a2a694ff730ed5014df81bea5598e75216aefec3096efae1284ab522
MD5 9a28dc41bafc2a2966d83b3e557ef515
BLAKE2b-256 74828b66cfcab205974dbb19796e587d6502c0c45a2893b76dc47970671c7652

See more details on using hashes here.

File details

Details for the file passagemath_rubiks-10.6.47-cp312-abi3-musllinux_1_2_aarch64.whl.

File metadata

File hashes

Hashes for passagemath_rubiks-10.6.47-cp312-abi3-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 9ff67734ae008540d5f1637997c29c2b299fa5cd2c4382d1f69303ecab18f641
MD5 5515affcb21f6163456b13fc2a01cd4a
BLAKE2b-256 2fefefd47e167672c7b8e25354c200b2484a71612f3bc881b3a72122a9ad61d9

See more details on using hashes here.

File details

Details for the file passagemath_rubiks-10.6.47-cp312-abi3-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for passagemath_rubiks-10.6.47-cp312-abi3-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 fd9ad67ef1de7fb8b0cad707e7ce23886e48a3bdf46615874cf6f6f1e0ade341
MD5 7ca8d10d63f5329bd086aec35df0b4e9
BLAKE2b-256 a33fe2c413e1176fc101c930cac01fbaa337065d5b6d0d2c2d15584b88b641a3

See more details on using hashes here.

File details

Details for the file passagemath_rubiks-10.6.47-cp312-abi3-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for passagemath_rubiks-10.6.47-cp312-abi3-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 e3ea3416a11a164c86074e35f55fd60e8d06cf20600c15fe7073d4cb7095c395
MD5 e43a528e0125ce0653ba286edb1bc170
BLAKE2b-256 50c2b5b830f4430cd6c3cb80332d761024cba20e25fc56be52c4545eb1a0cf63

See more details on using hashes here.

File details

Details for the file passagemath_rubiks-10.6.47-cp312-abi3-macosx_13_0_x86_64.whl.

File metadata

File hashes

Hashes for passagemath_rubiks-10.6.47-cp312-abi3-macosx_13_0_x86_64.whl
Algorithm Hash digest
SHA256 1576088c3004cd9e497d1c57ffa4330693c0930e6b996a3cff0f48be6d5d8e43
MD5 e00d6a1d5a76d101acf3f06804630225
BLAKE2b-256 503af78bc8afceb16064fabaa0aa905d77a21871f272f0c82d149de9f6dddd9e

See more details on using hashes here.

File details

Details for the file passagemath_rubiks-10.6.47-cp312-abi3-macosx_13_0_arm64.whl.

File metadata

File hashes

Hashes for passagemath_rubiks-10.6.47-cp312-abi3-macosx_13_0_arm64.whl
Algorithm Hash digest
SHA256 982ece46093bb50c276443abd01607a42271688edc1bf9ce6c05a3d4bd864ebb
MD5 b86c486f5d46031cacbd22402df24653
BLAKE2b-256 14463e233c40fecbdfe1fbfd50433ec7fb12a95fffb4f9f22d38bc9a2bc503ec

See more details on using hashes here.

File details

Details for the file passagemath_rubiks-10.6.47-cp311-cp311-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for passagemath_rubiks-10.6.47-cp311-cp311-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 8a2c57f2927487cef2ced88f166c5e0f5b21479a7e634ef25a8b3c72e3f49463
MD5 1c78add19be492d53f1cefa3857977f3
BLAKE2b-256 22f111c7f441da655f1dcf0665a7e00edf59794c5f20bdea72d6dc9e91b85dee

See more details on using hashes here.

File details

Details for the file passagemath_rubiks-10.6.47-cp311-cp311-musllinux_1_2_aarch64.whl.

File metadata

File hashes

Hashes for passagemath_rubiks-10.6.47-cp311-cp311-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 fc31e4db009d12162aeaf88942bdb19cbde16bb4c1e70431679d876f001465c1
MD5 b68505d49f751f580bd564e938dd897d
BLAKE2b-256 19a7c0dc69e20534fb5c1c94ad35e1159302b0ac5ccd7d756ccbb52f3ac127ef

See more details on using hashes here.

File details

Details for the file passagemath_rubiks-10.6.47-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for passagemath_rubiks-10.6.47-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 8ebb012be53482d017bcc9dd63067f8b00d6fa95bb8ceeffed92d5a32f4c1202
MD5 6375bc240549e047597f3dc2993bb9ad
BLAKE2b-256 0f768138ab6f886fbb9fe611381df73b4194cd3bb9d709850329e7e9900bed34

See more details on using hashes here.

File details

Details for the file passagemath_rubiks-10.6.47-cp311-cp311-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for passagemath_rubiks-10.6.47-cp311-cp311-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 1782bdb0b861569e25d93ba17a3b2f10efde12690e388472af3815e06e35a13b
MD5 82d23874535c3306d72674b481807a13
BLAKE2b-256 083bf4cb6a4e5afb32c7e1c002a360e54a83c5050e097b6e6fc6e5db3010aa3d

See more details on using hashes here.

File details

Details for the file passagemath_rubiks-10.6.47-cp311-cp311-macosx_13_0_x86_64.whl.

File metadata

File hashes

Hashes for passagemath_rubiks-10.6.47-cp311-cp311-macosx_13_0_x86_64.whl
Algorithm Hash digest
SHA256 d2a367b25b6dd04afeef2857163c18946314edd07f77a13390de18f8100c8cdc
MD5 dcc93365b1a1d63853e6b5005b615e91
BLAKE2b-256 80aea2caa2bf6ae027a33d6f21bf253585c96d494a11250f7d0f756d082578fe

See more details on using hashes here.

File details

Details for the file passagemath_rubiks-10.6.47-cp311-cp311-macosx_13_0_arm64.whl.

File metadata

File hashes

Hashes for passagemath_rubiks-10.6.47-cp311-cp311-macosx_13_0_arm64.whl
Algorithm Hash digest
SHA256 d57cb89f8f3deace9fbe97c4007204272d8f6041b679d53db866128ad9730243
MD5 cd383882a86cd33c9996a8b3b933e8e1
BLAKE2b-256 40c362c00aeada22ce0e17313743017140271b9e9aca26a05be99de89650c187

See more details on using hashes here.

File details

Details for the file passagemath_rubiks-10.6.47-cp310-cp310-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for passagemath_rubiks-10.6.47-cp310-cp310-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 d750c7b6891261b050ee3838abc368960dc478c1ee91d7e06d3539d3c6995953
MD5 244465afca426461e795efa4b409aaa0
BLAKE2b-256 62ab73a054081386ce12c7342599f190aee6f82d0e70a93adb34c64dc2a4c138

See more details on using hashes here.

File details

Details for the file passagemath_rubiks-10.6.47-cp310-cp310-musllinux_1_2_aarch64.whl.

File metadata

File hashes

Hashes for passagemath_rubiks-10.6.47-cp310-cp310-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 573953e00a995b698e0c830144fb357bb4e1e34271fa0da9826e6b8f909e138f
MD5 a4c906565e9a770aa824cc7bb79ad747
BLAKE2b-256 8c30c42b1b0c7c67fffc0dd6ce128a550a121b19ab42981ab5c6e8a5ddda9e49

See more details on using hashes here.

File details

Details for the file passagemath_rubiks-10.6.47-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for passagemath_rubiks-10.6.47-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 374b268cf43bf596223455c5a5513eac00f0f8eafa1df6c7f19febfd342d8d30
MD5 58c730a3fd72024c95670160e45a0358
BLAKE2b-256 637b87babc63791030193ac364e19cb948bd7ee470b3e0d7156cdd513abc3f84

See more details on using hashes here.

File details

Details for the file passagemath_rubiks-10.6.47-cp310-cp310-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for passagemath_rubiks-10.6.47-cp310-cp310-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 cdef4037678e97e5216d43d6723b2e9f8b137bb037cfe7e3ddb6392028148e0c
MD5 615c4c3faba520ed40e4ca35f43352f9
BLAKE2b-256 9784062038b75ec865a1b061135913c66a8a62d4cae84f129eb62e536bdc3ccb

See more details on using hashes here.

File details

Details for the file passagemath_rubiks-10.6.47-cp310-cp310-macosx_13_0_x86_64.whl.

File metadata

File hashes

Hashes for passagemath_rubiks-10.6.47-cp310-cp310-macosx_13_0_x86_64.whl
Algorithm Hash digest
SHA256 17fac693ae68965dc6eac530538a4ec80933f72489c1f8b3d86bc350aec59eb4
MD5 565348f28ee45416e702ae695d9adb53
BLAKE2b-256 7d5db10aa54a9c7173549d9642cebdaf641d9e34c1d71206ded082a3fee03375

See more details on using hashes here.

File details

Details for the file passagemath_rubiks-10.6.47-cp310-cp310-macosx_13_0_arm64.whl.

File metadata

File hashes

Hashes for passagemath_rubiks-10.6.47-cp310-cp310-macosx_13_0_arm64.whl
Algorithm Hash digest
SHA256 ec95283acc290d86138bcfd75124b332372289762a720def010e5fa1d2a18671
MD5 ac95630403eacebca5862019a8d958cb
BLAKE2b-256 413e395b45468a690bd244a5efe7fab435c29291e060a09dccf0866a3dd85f85

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page