Skip to main content

Extra Platforms

Last release Python versions Downloads Unittests status Documentation status DOI

What is Extra Platforms?

Extra Platforms detects the runtime architecture, operating system (including Linux distribution), shell, terminal, CI environment & AI coding agents, and exposes rich, cacheable metadata (version, codename, icon, canonical URL). It also groups them into reusable families.

  • Accurate detection of architecture, OS/distribution, shell, terminal, CI systems, and AI coding agents using lightweight, cacheable heuristics.
  • Rich metadata for platforms: version, codename, icon, canonical URL, and "like" relationships.
  • Grouping and API primitives: predefined families, is_*() predicates, current_*() accessors, and Group membership helpers.
  • Testing helpers: Pytest decorators and markers such as @skip_<id> and @unless_<id> for concise platform-aware tests.
  • Extensible and CI-friendly: designed to be lightweight, easy to extend, and suitable for CI-aware workflows.
  • Built-in Linux distribution detection via /etc/os-release, with no external dependencies.

Quick start

Quickly inspect your current environment without installing anything, thanks to uvx:

$ uvx extra-platforms
extra-platforms 13.6.0

โ”€โ”€ Architecture โ”€โ”€ ๐Ÿ“ฑ ARM64 (AArch64) โ”€โ”€[AARCH64]โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
            id: aarch64
          (...)

โ”€โ”€ Platform โ”€โ”€ ๐ŸŽ macOS โ”€โ”€[MACOS]โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
            id: macos
          (...)

โ”€โ”€ Shell โ”€โ”€ โ„ค Zsh โ”€โ”€[ZSH]โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
            id: zsh
          (...)

โ”€โ”€ Terminal โ”€โ”€ ๐Ÿ Apple Terminal โ”€โ”€[APPLE_TERMINAL]โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
            id: apple_terminal
          (...)

โ”€โ”€ CI โ”€โ”€ โ“ Unknown CI โ”€โ”€[UNKNOWN_CI]โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
          (...)

โ”€โ”€ Agent โ”€โ”€ โœด๏ธ Claude Code โ”€โ”€[CLAUDE_CODE]โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
          (...)

The same output is available via python -m extra_platforms. Use --json for machine-readable output, or --help to see all options.

For scripting, pipe the JSON output into jq:

$ uvx extra-platforms --json | jq --raw-output .platform.id
macos

Or if you want to explore usage of the library in a Python REPL:

$ uvx --with extra-platforms python
>>> import extra_platforms
>>> extra_platforms.__version__
'13.6.0'

Examples

Get the current platform, from which you can access lots of metadata:

>>> from extra_platforms import current_platform
>>> my_os = current_platform()
>>> my_os
Platform(id='macos', name='macOS')
>>> my_os.id
'macos'
>>> my_os.name
'macOS'
>>> my_os.icon
'๐ŸŽ'
>>> my_os.info()
{
    'id': 'macos',
    'name': 'macOS',
    'icon': '๐ŸŽ',
    'url': 'https://apple.com/macos/',
    'current': True,
    'distro_id': None,
    'version': '26.2',
    'version_parts': {'major': '26', 'minor': '2', 'build_number': None},
    'like': None,
    'codename': 'Tahoe',
}

Check if a platform is a specific system:

>>> from extra_platforms import is_gentoo
>>> is_gentoo()
False

Use groups to check if the current platform is part of a specific family:

>>> from extra_platforms import current_platform, BSD, UNIX, LINUX
>>> current_platform()
Platform(id='macos', name='macOS')
>>> current_platform() in BSD
True
>>> current_platform() in UNIX
True
>>> current_platform() in LINUX
False

Or directly use the detection functions returning a boolean that is associated with each group:

>>> from extra_platforms import is_bsd, is_unix, is_linux
>>> is_bsd()
True
>>> is_unix()
True
>>> is_linux()
False

List all platforms of a family:

>>> from extra_platforms import LINUX
>>> LINUX.members
mappingproxy({
    'almalinux': Platform(id='almalinux', name='AlmaLinux'),
    'alpine': Platform(id='alpine', name='Alpine Linux'),
    'altlinux': Platform(id='altlinux', name='ALT Linux'),
    'amzn': Platform(id='amzn', name='Amazon Linux'),
    'android': Platform(id='android', name='Android'),
    'arch': Platform(id='arch', name='Arch Linux'),
    'buildroot': Platform(id='buildroot', name='Buildroot'),
    'cachyos': Platform(id='cachyos', name='CachyOS'),
    'centos': Platform(id='centos', name='CentOS'),
    'chromeos': Platform(id='chromeos', name='ChromeOS'),
    'clearlinux': Platform(id='clearlinux', name='Clear Linux OS'),
    'cloudlinux': Platform(id='cloudlinux', name='CloudLinux OS'),
    'debian': Platform(id='debian', name='Debian'),
    'endeavouros': Platform(id='endeavouros', name='EndeavourOS'),
    'exherbo': Platform(id='exherbo', name='Exherbo Linux'),
    'fedora': Platform(id='fedora', name='Fedora'),
    'generic_linux': Platform(id='generic_linux', name='Generic Linux'),
    'gentoo': Platform(id='gentoo', name='Gentoo Linux'),
    'guix': Platform(id='guix', name='Guix System'),
    'ibm_powerkvm': Platform(id='ibm_powerkvm', name='IBM PowerKVM'),
    'kali': Platform(id='kali', name='Kali Linux'),
    'kvmibm': Platform(id='kvmibm', name='KVM for IBM z Systems'),
    'linuxmint': Platform(id='linuxmint', name='Linux Mint'),
    'mageia': Platform(id='mageia', name='Mageia'),
    'mandriva': Platform(id='mandriva', name='Mandriva Linux'),
    'manjaro': Platform(id='manjaro', name='Manjaro Linux'),
    'nixos': Platform(id='nixos', name='NixOS'),
    'nobara': Platform(id='nobara', name='Nobara'),
    'opensuse': Platform(id='opensuse', name='openSUSE'),
    'openwrt': Platform(id='openwrt', name='OpenWrt'),
    'oracle': Platform(id='oracle', name='Oracle Linux'),
    'parallels': Platform(id='parallels', name='Parallels'),
    'pidora': Platform(id='pidora', name='Pidora'),
    'pikaos': Platform(id='pikaos', name='PikaOS'),
    'raspbian': Platform(id='raspbian', name='Raspbian'),
    'rhel': Platform(id='rhel', name='RedHat Enterprise Linux'),
    'rocky': Platform(id='rocky', name='Rocky Linux'),
    'scientific': Platform(id='scientific', name='Scientific Linux'),
    'slackware': Platform(id='slackware', name='Slackware'),
    'sles': Platform(id='sles', name='SUSE Linux Enterprise Server'),
    'slitaz': Platform(id='slitaz', name='SliTaz GNU/Linux'),
    'sourcemage': Platform(id='sourcemage', name='Source Mage GNU/Linux'),
    'tuxedo': Platform(id='tuxedo', name='Tuxedo OS'),
    'ubuntu': Platform(id='ubuntu', name='Ubuntu'),
    'ultramarine': Platform(id='ultramarine', name='Ultramarine'),
    'void': Platform(id='void', name='Void Linux'),
    'xenserver': Platform(id='xenserver', name='XenServer'),
})
>>> LINUX.member_ids
frozenset({'rocky', 'kvmibm', 'pidora', 'pikaos', 'sourcemage', 'sles', 'tuxedo', 'rhel', 'opensuse', 'android', 'ultramarine', 'fedora', 'ubuntu', 'nixos', 'generic_linux', 'oracle', 'buildroot', 'gentoo', 'void', 'chromeos', 'almalinux', 'alpine', 'slackware', 'arch', 'centos', 'amzn', 'xenserver', 'nobara', 'cachyos', 'cloudlinux', 'ibm_powerkvm', 'kali', 'exherbo', 'mandriva', 'openwrt', 'raspbian', 'debian', 'endeavouros', 'altlinux', 'guix', 'slitaz', 'linuxmint', 'mageia', 'scientific', 'manjaro', 'parallels', 'clearlinux'})
>>> print("\n".join([p.name for p in LINUX]))
AlmaLinux
Alpine Linux
ALT Linux
Amazon Linux
Android
Arch Linux
Buildroot
CachyOS
CentOS
ChromeOS
Clear Linux OS
CloudLinux OS
Debian
EndeavourOS
Exherbo Linux
Fedora
Generic Linux
Gentoo Linux
Guix System
IBM PowerKVM
Kali Linux
KVM for IBM z Systems
Linux Mint
Mageia
Mandriva Linux
Manjaro Linux
NixOS
Nobara
openSUSE
OpenWrt
Oracle Linux
Parallels
Pidora
PikaOS
Raspbian
RedHat Enterprise Linux
Rocky Linux
Scientific Linux
Slackware
SUSE Linux Enterprise Server
SliTaz GNU/Linux
Source Mage GNU/Linux
Tuxedo OS
Ubuntu
Ultramarine
Void Linux
XenServer

Reduce a disparate collection of groups and platforms into a minimal descriptive set, by grouping all platforms into families:

>>> from extra_platforms import AIX, MACOS, SOLARIS, reduce
>>> reduce([AIX, MACOS])
frozenset({
    Platform(id='macos', name='macOS'),
    Platform(id='aix', name='IBM AIX'),
})
>>> reduce([AIX, MACOS, SOLARIS])
frozenset({
    Group(id='system_v', name='AT&T System Five'),
    Platform(id='macos', name='macOS'),
})

Architectures

All recognized architectures and how they're grouped:

---
config: {"mindmap": {"padding": 5}}
---
mindmap
    ((๐Ÿ›๏ธ ALL_ARCHITECTURES))
        )๐˜… X86(
            (๐—ถ I386)
            (๐—ถ I586)
            (๐—ถ I686)
            (๐Ÿ–ฅ๏ธ X86_64)
        )๐ŸŒ WEBASSEMBLY(
            (๐ŸŒ WASM32)
            (๐ŸŒ WASM64)
        )โ…ค RISCV(
            (โ…ค RISCV32)
            (โ…ค RISCV64)
        )โšก POWERPC(
            (โšก PPC)
            (โšก PPC64)
            (โšก PPC64LE)
        )๐Ÿ‰ LOONGARCH(
            (๐Ÿ‰ LOONGARCH64)
        )๐Ÿข IBM_MAINFRAME(
            (๐Ÿข S390X)
        )โ˜€๏ธ ALL_SPARC(
            (โ˜€๏ธ SPARC)
            (โ˜€๏ธ SPARC64)
        )๐Ÿ”ฒ ALL_MIPS(
            (๐Ÿ”ฒ MIPS)
            (๐Ÿ”ฒ MIPS64)
            (๐Ÿ”ฒ MIPS64EL)
            (๐Ÿ”ฒ MIPSEL)
        )๐Ÿ“ฑ ALL_ARM(
            (๐Ÿ“ฑ AARCH64)
            (๐Ÿ“ฑ ARM)
            (๐Ÿ“ฑ ARMV5TEL)
            (๐Ÿ“ฑ ARMV6L)
            (๐Ÿ“ฑ ARMV7L)
            (๐Ÿ“ฑ ARMV8L)

Platforms

All recognized platforms and how they're grouped:

---
config: {"mindmap": {"padding": 5}}
---
mindmap
    ((โš™๏ธ ALL_PLATFORMS))
        )โ‰› UNIX_LAYERS(
            (ฯพ CYGWIN)
            (๐ŸŸฆ OS400)
        )๐• SYSTEM_V(
            (โžฟ AIX)
            (๐Ÿ”ฅ ILLUMOS)
            (๐ŸŒž SOLARIS)
        )๐Ÿ…Ÿ OTHER_POSIX(
            (๐Ÿ‚ HAIKU)
            (๐Ÿฆฌ HURD)
        )โ‰š LINUX_LAYERS(
            (โŠž WSL1)
            (โŠž WSL2)
        )๐Ÿง LINUX(
            (๏Œ ALMALINUX)
            (๐Ÿ”๏ธ ALPINE)
            (ฮ” ALTLINUX)
            (โคป AMZN)
            (๐Ÿค– ANDROID)
            (๐ŸŽ—๏ธ ARCH)
            (โ›‘๏ธ BUILDROOT)
            (โŒฌ CACHYOS)
            (๐Ÿ’  CENTOS)
            (๐Ÿงฟ CHROMEOS)
            (โœณ๏ธ CLEARLINUX)
            (๊ฉœ CLOUDLINUX)
            (๐ŸŒ€ DEBIAN)
            (๐Ÿš€ ENDEAVOUROS)
            (๐Ÿฝ EXHERBO)
            (๐ŸŽฉ FEDORA)
            (๐Ÿฅš GENERIC_LINUX)
            (๐Ÿ—œ๏ธ GENTOO)
            (๐Ÿƒ GUIX)
            (๐Ÿคน IBM_POWERKVM)
            (๐Ÿ”ฑ KALI)
            (๐Ÿคน KVMIBM)
            (๐ŸŒฟ LINUXMINT)
            (โฅ MAGEIA)
            (๐Ÿ’ซ MANDRIVA)
            (โ–ฒ MANJARO)
            (โ„๏ธ NIXOS)
            (๏Ž€ NOBARA)
            (๐ŸฆŽ OPENSUSE)
            (๐Ÿ“ถ OPENWRT)
            (๐Ÿฆด ORACLE)
            (โˆฅ PARALLELS)
            (๐Ÿ“ PIDORA)
            (๐Ÿน PIKAOS)
            (๐Ÿ“ RASPBIAN)
            (๐ŸŽฉ RHEL)
            (โ›ฐ๏ธ ROCKY)
            (โš›๏ธ SCIENTIFIC)
            (๐Ÿšฌ SLACKWARE)
            (๐ŸฆŽ SLES)
            (๐Ÿ•ท๏ธ SLITAZ)
            (๐Ÿง™ SOURCEMAGE)
            (๐Ÿคต TUXEDO)
            (๐ŸŽฏ UBUNTU)
            (๐ŸŒŠ ULTRAMARINE)
            (โˆ… VOID)
            (โ“ XENSERVER)
        )โ’ท BSD(
            (๐Ÿชฐ DRAGONFLY_BSD)
            (๐Ÿ˜ˆ FREEBSD)
            (๐ŸŽ MACOS)
            (๐ŸŒ˜ MIDNIGHTBSD)
            (๐Ÿšฉ NETBSD)
            (๐Ÿก OPENBSD)
            (๐ŸŒ… SUNOS)
        )๐ŸชŸ ALL_WINDOWS(
            (๐ŸชŸ WINDOWS)

[!TIP] More groups exist beyond those shown in the diagram, and more utilities are available for each platform. See the platform documentation for details.

Shells

All recognized shells:

---
config: {"mindmap": {"padding": 5}}
---
mindmap
    ((๐Ÿš ALL_SHELLS))
        )โŒจ๏ธ WINDOWS_SHELLS(
            (โ–ถ CMD)
            (๐Ÿ”ท POWERSHELL)
        )โ—‡ OTHER_SHELLS(
            (๐ŸŸ FISH)
            (๐œˆ NUSHELL)
            (๐Ÿ XONSH)
        )๐Ÿ…ฒ C_SHELLS(
            (๐‚ CSH)
            (๐“ TCSH)
        )๐Ÿ’ฒ BOURNE_SHELLS(
            (๐Ÿชถ ASH)
            (๏ผƒ BASH)
            (๐Ÿ’จ DASH)
            (๐Š KSH)
            (๐’ SH)
            (โ„ค ZSH)

Terminals

All recognized terminals:

---
config: {"mindmap": {"padding": 5}}
---
mindmap
    ((๐Ÿ’ป ALL_TERMINALS))
        )โฌข WEB_TERMINALS(
            (โฌก HYPER)
            (๐Ÿˆ TABBY)
            (๐Ÿ”ต VSCODE_TERMINAL)
        )โ–ฆ NATIVE_TERMINALS(
            (๐Ÿ APPLE_TERMINAL)
            (๐† GNOME_TERMINAL)
            (โฌ› ITERM2)
            (๐Ÿ’Ž KONSOLE)
            (๐Ÿ”€ TILIX)
            (โŠก WINDOWS_TERMINAL)
            (๐— XTERM)
        )โง‰ MULTIPLEXERS(
            (๐Ÿ“บ GNU_SCREEN)
            (๐Ÿ“Ÿ TMUX)
            (๐Ÿชต ZELLIJ)
        )๐ŸŽฎ GPU_TERMINALS(
            (๐Ÿ”ณ ALACRITTY)
            (โ—ฐ CONTOUR)
            (๐Ÿฆถ FOOT)
            (๐Ÿ‘ป GHOSTTY)
            (๐Ÿฑ KITTY)
            (๐Ÿž๏ธ RIO)
            (๐Ÿ”ก WEZTERM)

CI systems

All recognized CI systems:

---
config: {"mindmap": {"padding": 5}}
---
mindmap
    ((โ™บ ALL_CI))
        (โ• AZURE_PIPELINES)
        (โŸฒ BAMBOO)
        (๐Ÿช BUILDKITE)
        (โชพ CIRCLE_CI)
        (โ‰‹ CIRRUS_CI)
        (แš™ CODEBUILD)
        (๐Ÿ™ GITHUB_CI)
        (๐ŸฆŠ GITLAB_CI)
        (๐Ÿฅซ HERMETIC_BUILD)
        (โฅ HEROKU_CI)
        (๐Ÿ™๏ธ TEAMCITY)
        (๐Ÿ‘ท TRAVIS_CI)

Agents

All recognized AI coding agents:

---
config: {"mindmap": {"padding": 5}}
---
mindmap
    ((๐Ÿง  ALL_AGENTS))
        (โœด๏ธ CLAUDE_CODE)
        (๐Ÿ‘พ CLINE)
        (๐Ÿ“• CODEX)
        (โœˆ๏ธ COPILOT_CLI)
        (๐Ÿ’˜ CRUSH)
        (โžค CURSOR)
        (โ™Š GEMINI_CLI)
        (ฯ€ PI)

Used in

Check these projects to get real-life examples of extra-platforms usage:

Feel free to send a PR to add your project in this list if you are relying on Extra Platforms in any way.

Release files for extra-platforms 13.7.0

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

Source distribution (sdist)

Source distribution for extra-platforms 13.7.0
File Size Uploaded
extra_platforms-13.7.0.tar.gz 474.3 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for extra-platforms 13.7.0
File Interpreter ABI Platform
extra_platforms-13.7.0-py3-none-any.whl Python 3 none any Details

Total release size: 577.2 kB

Release files / extra_platforms-13.7.0.tar.gz

Download URL extra_platforms-13.7.0.tar.gz
Size 474.3 kB
Tags Source
SHA-256 checksum
How to use checksums
888437802eb1734de914c1dce062371c1c942acdddbfa0b94dd04be99eec0240
BLAKE2b-256 checksum
How to use checksums
3de101785853e8f1b1029b7417f4ca057ff1c58690e7e8bd97f2e79c101287ab
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via uv/0.12.4 {"installer":{"name":"uv","version":"0.12.4","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"26.04","id":"resolute","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

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 Aug 28, 2026.

Transparency log

Release files / extra_platforms-13.7.0-py3-none-any.whl

Download URL extra_platforms-13.7.0-py3-none-any.whl
Size 102.9 kB
Tags Python 3
SHA-256 checksum
How to use checksums
6af50473ee325e40eda3c5fafa782fbcf7484ed5c63c76b52ce21d3474987b3d
BLAKE2b-256 checksum
How to use checksums
e5c810044a206661cedf4596171efc53c8588bfa2bf77888c734e9410cfbf46a
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via uv/0.12.4 {"installer":{"name":"uv","version":"0.12.4","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"26.04","id":"resolute","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

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 Aug 28, 2026.

Transparency log

Release history Release notifications | RSS feed

This release

13.7.0 This release

2 release files

13.5.1

2 release files

13.5.0

2 release files

13.4.0

2 release files

13.3.1

2 release files

13.3.0

2 release files

13.2.0

2 release files

13.0.1

2 release files

13.0.0

2 release files

12.0.3

2 release files

12.0.2

2 release files

12.0.1

2 release files

12.0.0

2 release files

11.1.0

2 release files

11.0.4

2 release files

11.0.3

2 release files

11.0.0

2 release files

10.0.0

2 release files

9.2.0

2 release files

9.1.0

2 release files

9.0.0

2 release files

8.0.0

2 release files

7.0.0

2 release files

6.0.0

2 release files

5.1.0

2 release files

5.0.1

2 release files

5.0.0

2 release files

4.1.1

2 release files

4.1.0

2 release files

4.0.0

2 release files

3.2.3

2 release files

3.2.2

2 release files

3.2.1

2 release files

3.2.0

2 release files

3.1.0

2 release files

3.0.0

2 release files

2.1.0

2 release files

2.0.0

2 release files

1.7.0

2 release files

1.6.0

2 release files

1.5.0

2 release files

1.4.0

2 release files

1.3.1

2 release files

1.3.0

2 release files

1.2.1

2 release files

1.2.0

2 release files

1.1.1

2 release files

1.1.0

2 release files

1.0.2

2 release files

1.0.0

2 release files

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