Skip to main content

๐Ÿ”Ž Detect architectures, platforms, shells, terminals, CI systems and agents, grouped by family

Project description

Extra Platforms

Last release Python versions Downloads Unittests status Coverage 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, and CI systems 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.0.1

โ”€โ”€ 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.0.1'

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({
    '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'),
    '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'),
    'tumbleweed': Platform(id='tumbleweed', name='openSUSE Tumbleweed'),
    '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', 'alpine', 'slackware', 'arch', 'centos', 'amzn', 'xenserver', 'nobara', 'cachyos', 'cloudlinux', 'ibm_powerkvm', 'kali', 'exherbo', 'mandriva', 'openwrt', 'raspbian', 'debian', 'altlinux', 'guix', 'slitaz', 'linuxmint', 'mageia', 'tumbleweed', 'scientific', 'manjaro', 'parallels', 'clearlinux'})
>>> print("\n".join([p.name for p in LINUX]))
Alpine Linux
ALT Linux
Amazon Linux
Android
Arch Linux
Buildroot
CachyOS
CentOS
ChromeOS
Clear Linux OS
CloudLinux OS
Debian
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
openSUSE Tumbleweed
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(
            (๐Ÿ”๏ธ ALPINE)
            (ฮ” ALTLINUX)
            (โคป AMZN)
            (๐Ÿค– ANDROID)
            (๐ŸŽ—๏ธ ARCH)
            (โ›‘๏ธ BUILDROOT)
            (โŒฌ CACHYOS)
            (๐Ÿ’  CENTOS)
            (๐Ÿงฟ CHROMEOS)
            (โœณ๏ธ CLEARLINUX)
            (๊ฉœ CLOUDLINUX)
            (๐ŸŒ€ DEBIAN)
            (๐Ÿฝ 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)
            (โ†ป TUMBLEWEED)
            (๐Ÿคต 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)
        (๐Ÿ‚ GUIX_BUILD)
        (โฅ HEROKU_CI)
        (๐Ÿ™๏ธ TEAMCITY)
        (๐Ÿ‘ท TRAVIS_CI)

Agents

All recognized AI coding agents:

---
config: {"mindmap": {"padding": 5}}
---
mindmap
    ((๐Ÿง  ALL_AGENTS))
        (โœด๏ธ CLAUDE_CODE)
        (๐Ÿ‘พ CLINE)
        (โžค CURSOR)

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.

Project details


Download files

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

Source Distribution

extra_platforms-13.2.0.tar.gz (83.5 kB view details)

Uploaded Source

Built Distribution

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

extra_platforms-13.2.0-py3-none-any.whl (86.1 kB view details)

Uploaded Python 3

File details

Details for the file extra_platforms-13.2.0.tar.gz.

File metadata

  • Download URL: extra_platforms-13.2.0.tar.gz
  • Upload date:
  • Size: 83.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.11.29 {"installer":{"name":"uv","version":"0.11.29","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for extra_platforms-13.2.0.tar.gz
Algorithm Hash digest
SHA256 0f88c3ae147e175b9ce230874377a6f769b8e6bde8a5d8beee2ae77c60521a15
MD5 4dd74be0c3e1afc0adef2850a4bca15f
BLAKE2b-256 84cd823e004612fa7ae3110a5a3e1383618c5a4198b0cdae47be74331122a397

See more details on using hashes here.

Provenance

The following attestation bundles were made for extra_platforms-13.2.0.tar.gz:

Publisher: release.yaml on kdeldycke/extra-platforms

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file extra_platforms-13.2.0-py3-none-any.whl.

File metadata

  • Download URL: extra_platforms-13.2.0-py3-none-any.whl
  • Upload date:
  • Size: 86.1 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.11.29 {"installer":{"name":"uv","version":"0.11.29","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for extra_platforms-13.2.0-py3-none-any.whl
Algorithm Hash digest
SHA256 178ad1cf567de078de58ce72c2f7049713980f14812d57b4a9c3250836446798
MD5 7fa98c719626c2c4dd92055732b67c42
BLAKE2b-256 479f15543dea0bad0dab4aa9bdbe2ece05a383cdd12138fa03eac83e7c1e9c76

See more details on using hashes here.

Provenance

The following attestation bundles were made for extra_platforms-13.2.0-py3-none-any.whl:

Publisher: release.yaml on kdeldycke/extra-platforms

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

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