norwegianblue

June 25, 2026 · View on GitHub

PyPI version Supported Python versions PyPI downloads GitHub Actions status Codecov Licence Code style: Black

Python interface to endoflife.date to show end-of-life dates for a number of products.

Installation

From PyPI

python3 -m pip install --upgrade norwegianblue

With pipx

pipx install norwegianblue

From conda-forge

With Pixi

pixi add norwegianblue

With conda

conda install --channel conda-forge norwegianblue

With pixi global

pixi global install norwegianblue

From source

git clone https://github.com/hugovk/norwegianblue
cd norwegianblue
python3 -m pip install .

To install tab completion on supported Linux and macOS shells, see https://kislyuk.github.io/argcomplete/

Example command-line use

Run norwegianblue or eol, they do the same thing.

Top-level help:

$ eol --help
usage: eol [-h] [-c {yes,no,auto}] [--clear-cache] [--show-title {yes,no,auto}] [-v] [-V] [-w]
           [--pretty | --md | --rst | --json | --csv | --tsv | --html | --yaml]
           [product ...]

CLI to show end-of-life dates for a number of products, from https://endoflife.date

For example:

* `eol python` to see Python EOLs
* `eol ubuntu` to see Ubuntu EOLs
* `eol centos fedora` to see CentOS and Fedora EOLs
* `eol all` or `eol` to list all available products

Something missing? Please contribute! https://endoflife.date/contribute

positional arguments:
  product               product to check, or 'all' to list all available (default: 'all')

options:
  -h, --help            show this help message and exit
  -c, --color {yes,no,auto}
                        colour the output (default: auto)
  --clear-cache         clear cache before running
  --show-title {yes,no,auto}
                        show or hide product title, 'auto' to show title only for multiple products (default: auto)
  -v, --verbose         print extra messages to stderr
  -V, --version         show program's version number and exit
  -w, --web             open product page in web browser

formatters:
  --pretty              output in pretty (default)
  --md                  output in Markdown
  --rst                 output in reStructuredText
  --json                output in JSON
  --csv                 output in CSV
  --tsv                 output in TSV
  --html                output in HTML
  --yaml                output in YAML

List all available products with end-of-life dates:

$ # eol all
$ # or:
$ eol
adonisjs
akeneo-pim
alibaba-ack
alibaba-dragonwell
almalinux
...

Show end-of-life dates:

$ norwegianblue python
┌───────┬────────────┬─────────┬────────────────┬────────────┬────────────┬──────────┐
│ cycle │  release   │ latest  │ latest release │  support   │    eol     │   pep    │
├───────┼────────────┼─────────┼────────────────┼────────────┼────────────┼──────────┤
│ 3.14  │ 2025-10-07 │ 3.14.6  │   2026-06-10   │ 2027-10-01 │ 2030-10-31 │ PEP-0745 │
│ 3.13  │ 2024-10-07 │ 3.13.14 │   2026-06-10   │ 2026-10-01 │ 2029-10-31 │ PEP-0719 │
│ 3.12  │ 2023-10-02 │ 3.12.13 │   2026-03-03   │ 2025-04-02 │ 2028-10-31 │ PEP-0693 │
│ 3.11  │ 2022-10-24 │ 3.11.15 │   2026-03-03   │ 2024-04-01 │ 2027-10-31 │ PEP-0664 │
│ 3.10  │ 2021-10-04 │ 3.10.20 │   2026-03-03   │ 2023-04-05 │ 2026-10-31 │ PEP-0619 │
│ 3.9   │ 2020-10-05 │ 3.9.25  │   2025-10-31   │ 2022-05-17 │ 2025-10-31 │ PEP-0596 │
│ 3.8   │ 2019-10-14 │ 3.8.20  │   2024-09-06   │ 2021-05-03 │ 2024-10-07 │ PEP-0569 │
│ 3.7   │ 2018-06-27 │ 3.7.17  │   2023-06-05   │ 2020-06-27 │ 2023-06-27 │ PEP-0537 │
│ 3.6   │ 2016-12-23 │ 3.6.15  │   2021-09-03   │ 2018-12-24 │ 2021-12-23 │ PEP-0494 │
│ 3.5   │ 2015-09-13 │ 3.5.10  │   2020-09-05   │   False    │ 2020-09-30 │ PEP-0478 │
│ 3.4   │ 2014-03-16 │ 3.4.10  │   2019-03-18   │   False    │ 2019-03-18 │ PEP-0429 │
│ 3.3   │ 2012-09-29 │ 3.3.7   │   2017-09-19   │   False    │ 2017-09-29 │ PEP-0398 │
│ 3.2   │ 2011-02-20 │ 3.2.6   │   2014-10-12   │   False    │ 2016-02-20 │ PEP-0392 │
│ 2.7   │ 2010-07-03 │ 2.7.18  │   2020-04-19   │   False    │ 2020-01-01 │ PEP-0373 │
│ 3.1   │ 2009-06-27 │ 3.1.5   │   2012-04-06   │   False    │ 2012-04-09 │ PEP-0375 │
│ 3.0   │ 2008-12-03 │ 3.0.1   │   2009-02-12   │   False    │ 2009-06-27 │ PEP-0361 │
│ 2.6   │ 2008-10-01 │ 2.6.9   │   2013-10-29   │   False    │ 2013-10-29 │ PEP-0361 │
└───────┴────────────┴─────────┴────────────────┴────────────┴────────────┴──────────┘

You can format in Markdown, ready for pasting in GitHub issues and PRs:

cyclereleaselatestlatest releasesupporteolpep
3.142025-10-073.14.62026-06-102027-10-012030-10-31PEP-0745
3.132024-10-073.13.142026-06-102026-10-012029-10-31PEP-0719
3.122023-10-023.12.132026-03-032025-04-022028-10-31PEP-0693
3.112022-10-243.11.152026-03-032024-04-012027-10-31PEP-0664
3.102021-10-043.10.202026-03-032023-04-052026-10-31PEP-0619
3.92020-10-053.9.252025-10-312022-05-172025-10-31PEP-0596
3.82019-10-143.8.202024-09-062021-05-032024-10-07PEP-0569
3.72018-06-273.7.172023-06-052020-06-272023-06-27PEP-0537
3.62016-12-233.6.152021-09-032018-12-242021-12-23PEP-0494
3.52015-09-133.5.102020-09-05False2020-09-30PEP-0478
3.42014-03-163.4.102019-03-18False2019-03-18PEP-0429
3.32012-09-293.3.72017-09-19False2017-09-29PEP-0398
3.22011-02-203.2.62014-10-12False2016-02-20PEP-0392
2.72010-07-032.7.182020-04-19False2020-01-01PEP-0373
3.12009-06-273.1.52012-04-06False2012-04-09PEP-0375
3.02008-12-033.0.12009-02-12False2009-06-27PEP-0361
2.62008-10-012.6.92013-10-29False2013-10-29PEP-0361

Or in other formats such as reStructuredText:

$ eol python --rst
+-------+------------+---------+----------------+------------+------------+----------+
| cycle |  release   | latest  | latest release |  support   |    eol     |   pep    |
+=======+============+=========+================+============+============+==========+
| 3.14  | 2025-10-07 | 3.14.6  |   2026-06-10   | 2027-10-01 | 2030-10-31 | PEP-0745 |
+-------+------------+---------+----------------+------------+------------+----------+
| 3.13  | 2024-10-07 | 3.13.14 |   2026-06-10   | 2026-10-01 | 2029-10-31 | PEP-0719 |
+-------+------------+---------+----------------+------------+------------+----------+
| 3.12  | 2023-10-02 | 3.12.13 |   2026-03-03   | 2025-04-02 | 2028-10-31 | PEP-0693 |
+-------+------------+---------+----------------+------------+------------+----------+
| 3.11  | 2022-10-24 | 3.11.15 |   2026-03-03   | 2024-04-01 | 2027-10-31 | PEP-0664 |
+-------+------------+---------+----------------+------------+------------+----------+
| 3.10  | 2021-10-04 | 3.10.20 |   2026-03-03   | 2023-04-05 | 2026-10-31 | PEP-0619 |
+-------+------------+---------+----------------+------------+------------+----------+
| 3.9   | 2020-10-05 | 3.9.25  |   2025-10-31   | 2022-05-17 | 2025-10-31 | PEP-0596 |
+-------+------------+---------+----------------+------------+------------+----------+
| 3.8   | 2019-10-14 | 3.8.20  |   2024-09-06   | 2021-05-03 | 2024-10-07 | PEP-0569 |
+-------+------------+---------+----------------+------------+------------+----------+
| 3.7   | 2018-06-27 | 3.7.17  |   2023-06-05   | 2020-06-27 | 2023-06-27 | PEP-0537 |
+-------+------------+---------+----------------+------------+------------+----------+
| 3.6   | 2016-12-23 | 3.6.15  |   2021-09-03   | 2018-12-24 | 2021-12-23 | PEP-0494 |
+-------+------------+---------+----------------+------------+------------+----------+
| 3.5   | 2015-09-13 | 3.5.10  |   2020-09-05   |   False    | 2020-09-30 | PEP-0478 |
+-------+------------+---------+----------------+------------+------------+----------+
| 3.4   | 2014-03-16 | 3.4.10  |   2019-03-18   |   False    | 2019-03-18 | PEP-0429 |
+-------+------------+---------+----------------+------------+------------+----------+
| 3.3   | 2012-09-29 | 3.3.7   |   2017-09-19   |   False    | 2017-09-29 | PEP-0398 |
+-------+------------+---------+----------------+------------+------------+----------+
| 3.2   | 2011-02-20 | 3.2.6   |   2014-10-12   |   False    | 2016-02-20 | PEP-0392 |
+-------+------------+---------+----------------+------------+------------+----------+
| 2.7   | 2010-07-03 | 2.7.18  |   2020-04-19   |   False    | 2020-01-01 | PEP-0373 |
+-------+------------+---------+----------------+------------+------------+----------+
| 3.1   | 2009-06-27 | 3.1.5   |   2012-04-06   |   False    | 2012-04-09 | PEP-0375 |
+-------+------------+---------+----------------+------------+------------+----------+
| 3.0   | 2008-12-03 | 3.0.1   |   2009-02-12   |   False    | 2009-06-27 | PEP-0361 |
+-------+------------+---------+----------------+------------+------------+----------+
| 2.6   | 2008-10-01 | 2.6.9   |   2013-10-29   |   False    | 2013-10-29 | PEP-0361 |
+-------+------------+---------+----------------+------------+------------+----------+

Example programmatic use

Return values are from the JSON responses documented in the API: https://endoflife.date/docs/api/

import norwegianblue

# Call the API
print(norwegianblue.norwegianblue())
print(norwegianblue.norwegianblue(product="ubuntu"))
print(norwegianblue.norwegianblue(format="json"))

Why "Norwegian Blue"?

The Norwegian Blue has reached end-of-life.