diff --git a/ChangeLog.md b/ChangeLog.md
--- a/ChangeLog.md
+++ b/ChangeLog.md
@@ -1,11 +1,17 @@
 # Version history for fedora-repoquery
 
+## 0.9.1 (2026-06-28)
+- fix IO memory leak due to lazy String IO with typed-process
+  (thank you to Efraim Kaov for reporting this)
+- add --all-releases and proper reverse sorting of releases
+- various minor type and sorting correctness improvements
+
 ## 0.9 (2026-06-26)
 - add `--all-epel` releases
 - c10s: use mirror.stream.centos.org
 - improve handling of archived epel major and minor releases
-- preliminary support for pre-stream centos
-- fedora updates Everything was introduced from F28
+- preliminary support for pre-stream centos versions
+- fedora-updates Everything was introduced from F28
 - error for i386 arch unless epel6, f25, c7, or older
 - do not include i386 in `--all-archs` (regression in 0.8.2)
 
diff --git a/README.md b/README.md
--- a/README.md
+++ b/README.md
@@ -10,7 +10,7 @@
 `$ fedora-repoquery rawhide firefox`
 
 ```
-firefox-152.0-1.fc45.x86_64 (fedora-rawhide)
+firefox-152.0.2-1.fc45.x86_64 (fedora-rawhide)
 ```
 (note it is shorter to write `fedora-repoquery 45`).
 
@@ -37,7 +37,7 @@
 `$ fedora-repoquery eln kernel`
 
 ```
-kernel-7.1.0-0.rc3.260512g50897c955902.24.eln156.x86_64 (eln-BaseOS)
+kernel-7.2.0-0.rc0.260626g4edcdefd4083.12.eln157.x86_64 (eln-BaseOS)
 ```
 
 Without a release argument, the system yum repo configuration is used:
@@ -72,7 +72,7 @@
 
 ```
 2026-04-24 23:40:25 +08 <https://mirror.freedif.org/fedora/fedora/linux/releases/44/>
-2026-06-26 08:57:49 +08 <https://mirror.freedif.org/fedora/fedora/linux/updates/44/>
+2026-06-28 08:55:58 +08 <https://mirror.freedif.org/fedora/fedora/linux/updates/44/>
 ```
 
 One can also query multiple releases (or arch's):
@@ -81,7 +81,7 @@
 
 ```
 python3-3.14.0-1.fc43.x86_64 (f43)
-python3-3.14.5-1.fc43.x86_64 (f43-updates)
+python3-3.14.6-1.fc43.x86_64 (f43-updates)
 python3-3.14.3-2.fc44.x86_64 (f44)
 python3-3.14.6-1.fc44.x86_64 (f44-updates)
 ```
@@ -97,17 +97,18 @@
 which may be faster than dl.fp.o and fresher than other mirrors sometimes.
 
 Querying of epel10 minor versions is supported:
+
 `$ fedora-repoquery epel10.2 nix`
 
 ```
-nix-2.24.15-2.el10_2.x86_64 (epel10.2)
+nix-2.31.5-3.el10_2.x86_64 (epel10.2)
 ```
 
 ## Help
 `$ fedora-repoquery --version`
 
 ```
-0.9
+0.9.1
 ```
 
 `$ fedora-repoquery --help`
@@ -115,35 +116,35 @@
 ```
 fedora-repoquery tool for querying Fedora repos for packages.
 
-Usage: fedora-repoquery [--version] [-4|--dnf4] [(-q|--quiet) | (-v|--verbose)] 
-                        [--dynamic] [-T|--time] [-K|--koji] 
-                        [(-m|--mirror URL) | --cf | (-d|--dl)] 
-                        [(-F|--all-fedora) | (-E|--all-epel)] 
-                        [(-s|--source) | (-A|--all-archs) | 
-                          [-a|--repo-arch ARCH]] [-t|--testing] [-D|--debug] 
-                        [(-z|--cache-size) | (-e|--cache-clean-empty) | 
-                          --list-releases | --help-dnf | 
-                          [--advisories ARG | --advisory-severities ARG | 
-                            --arch ARG | --available | --bugfix | --bzs ARG | 
-                            --cves ARG | --disable-modular-filtering | 
-                            --duplicates | --enhancement | --exactdeps | 
-                            --extras | (-f|--file ARG) | --installed | 
-                            --installed-from-repo ARG | --installonly | 
-                            --latest-limit ARG | --leaves | --newpackage | 
-                            --providers-of ARG | --recent | --recursive | 
-                            --security | --srpm | --unneeded | --upgrades | 
-                            --userinstalled | --whatconflicts ARG | 
-                            (--wd|--whatdepends ARG) | --whatenhances ARG | 
-                            --whatobsoletes ARG | (--whatprovides|--wp ARG) | 
-                            --whatrecommends ARG | (--whatrequires|--wr ARG) | 
-                            --whatsuggests ARG | --whatsupplements ARG | 
-                            --conflicts | --depends | --enhances | --files | 
-                            (-l|--list) | --obsoletes | (-p|--provides) | 
-                            --recommends | (-r|--requires) | --requires-pre | 
-                            --sourcerpm | --suggests | --supplements | 
-                            --location | (-i|--info) | 
-                            (--changelog|--changelogs) | --querytags | 
-                            (--qf|--queryformat ARG)] 
+Usage: fedora-repoquery [--version] [-4|--dnf4] [(-q|--quiet) | (-v|--verbose)]
+                        [--dynamic] [-T|--time] [-K|--koji]
+                        [(-m|--mirror URL) | --cf | (-d|--dl)]
+                        [(-F|--all-fedora) | (-E|--all-epel) | --all-releases]
+                        [(-s|--source) | (-A|--all-archs) |
+                          [-a|--repo-arch ARCH]] [-t|--testing] [-D|--debug]
+                        [(-z|--cache-size) | (-e|--cache-clean-empty) |
+                          --list-releases | --help-dnf |
+                          [--advisories ARG | --advisory-severities ARG |
+                            --arch ARG | --available | --bugfix | --bzs ARG |
+                            --cves ARG | --disable-modular-filtering |
+                            --duplicates | --enhancement | --exactdeps |
+                            --extras | (-f|--file ARG) | --installed |
+                            --installed-from-repo ARG | --installonly |
+                            --latest-limit ARG | --leaves | --newpackage |
+                            --providers-of ARG | --recent | --recursive |
+                            --security | --srpm | --unneeded | --upgrades |
+                            --userinstalled | --whatconflicts ARG |
+                            (--wd|--whatdepends ARG) | --whatenhances ARG |
+                            --whatobsoletes ARG | (--whatprovides|--wp ARG) |
+                            --whatrecommends ARG | (--whatrequires|--wr ARG) |
+                            --whatsuggests ARG | --whatsupplements ARG |
+                            --conflicts | --depends | --enhances | --files |
+                            (-l|--list) | --obsoletes | (-p|--provides) |
+                            --recommends | (-r|--requires) | --requires-pre |
+                            --sourcerpm | --suggests | --supplements |
+                            --location | (-i|--info) |
+                            (--changelog|--changelogs) | --querytags |
+                            (--qf|--queryformat ARG)]
                           [[RELEASE]... [REPOQUERY_OPTS]... [PKGSPECIFIER]...]]
 
   where RELEASE is {fN or N (fedora), 'rawhide', epelN, epel10.x, epel9-next, cN
@@ -163,8 +164,9 @@
                            https://download.fedoraproject.org/pub]
   --cf                     Use CloudFront cache
   -d,--dl                  Use dl.fp.o
-  -F,--all-fedora          Query all Fedora releases
-  -E,--all-epel            Query all EPEL releases
+  -F,--all-fedora          Query all current Fedora releases
+  -E,--all-epel            Query all current EPEL releases
+  --all-releases           Query all current releases
   -s,--source              Query source repos
   -A,--all-archs           Query all arch repos
   -a,--repo-arch ARCH      Specify repo arch [default: x86_64]
diff --git a/fedora-repoquery.cabal b/fedora-repoquery.cabal
--- a/fedora-repoquery.cabal
+++ b/fedora-repoquery.cabal
@@ -1,5 +1,5 @@
 name:                fedora-repoquery
-version:             0.9
+version:             0.9.1
 synopsis:            Fedora release repos package query tool
 description:
         A CLI tool for repoquerying Fedora and Centos Stream release packages:
@@ -45,6 +45,8 @@
                        URL
   hs-source-dirs:      src
   build-depends:       base < 5,
+                       aeson,
+                       bytestring,
                        case-insensitive,
                        curl,
                        directory,
@@ -60,6 +62,7 @@
                        simple-cmd-args,
                        text,
                        time,
+                       typed-process,
                        xdg-basedir
 
   default-language:    Haskell2010
diff --git a/src/BodhiRelease.hs b/src/BodhiRelease.hs
--- a/src/BodhiRelease.hs
+++ b/src/BodhiRelease.hs
@@ -5,40 +5,44 @@
   activeFedoraRelease,
   activeEPELRelease,
   activeEPELMinorRelease,
-  activeFedoraReleases,
-  activeEPELReleases,
+  activeBodhiFedoraReleases,
+  activeBodhiEPELReleases,
+  activeBodhiReleases,
   rawhideFedoraRelease
   )
 where
 
+import Data.Aeson (Object)
 import Data.Function (on)
-import qualified Data.List as L
+import Data.List.Extra
 import Data.Maybe (mapMaybe)
 import Data.Version.Extra (readVersion, showVersion, Version(..))
 import Distribution.Fedora.BodhiReleases (getBodhiFedoraReleases,
-                                          getBodhiEPELReleases, lookupKey)
+                                          getBodhiEPELReleases,
+                                          getBodhiReleases,
+                                          lookupKey)
 import Safe (headMay)
 import SimpleCmd (error', (+-+))
 
-import Types (Natural, elnVersion)
+import Types (Release, Natural, elnVersion, readRelease)
 
 data BodhiRelease =
-  Release {releaseVersion :: String, -- to handle "eln"
-           releaseState ::  String,
-           releaseBranch :: String,
-           releaseComposed :: Bool,
-           releasePostBeta :: Bool}
+  BodhiRelease {releaseVersion :: String, -- to handle "eln"
+                releaseState ::  String,
+                releaseBranch :: Release,
+                releaseComposed :: Bool,
+                releasePostBeta :: Bool}
   deriving Eq
 
 activeFedoraRelease :: Natural -> IO (Maybe BodhiRelease)
 activeFedoraRelease n = do
   -- FIXME include eol releases?
-  active <- activeFedoraReleases
-  case L.sortOn releaseVersion active of
+  active <- activeBodhiFedoraReleases
+  case sortOn releaseBranch active of
     [] -> error' "failed to find active releases with Bodhi API"
     (oldest:_) ->
       return $
-      case L.find (\r -> releaseVersion r == show n) active of
+      case find (\r -> releaseVersion r == show n) active of
         Just rel -> Just rel
         Nothing ->
           let oldver = read $ releaseVersion oldest in
@@ -48,12 +52,12 @@
 
 activeEPELRelease :: Natural -> IO (Maybe BodhiRelease)
 activeEPELRelease n = do
-  active <- activeEPELReleases
-  case L.sortOn (readVersion . releaseVersion) active of
+  active <- activeBodhiEPELReleases
+  case sortOn (readVersion . releaseVersion) active of
     [] -> error' "failed to find active releases with Bodhi API"
     (oldest:_) ->
       return $
-      case L.find (\r -> majorVer (releaseVersion r) == show n) active of
+      case find (\r -> majorVer (releaseVersion r) == show n) active of
         Just rel -> Just rel
         Nothing ->
           let oldver = read . majorVer $ releaseVersion oldest in
@@ -65,8 +69,8 @@
 
 activeEPELMinorRelease :: Version -> IO (Maybe BodhiRelease)
 activeEPELMinorRelease ver = do
-  active <- activeEPELReleases
-  case L.find (\r -> readVersion (releaseVersion r) == ver) active of
+  active <- activeBodhiEPELReleases
+  case find (\r -> readVersion (releaseVersion r) == ver) active of
     Just rel -> return $ Just rel
     Nothing -> do
       let minors = filter (\r -> ((==) `on` majorVer) ver (readVersion . releaseVersion $ r)) active
@@ -80,36 +84,32 @@
         Just m -> m
         Nothing -> error $ "no major version:" +-+ showVersion ver
 
-activeFedoraReleases :: IO [BodhiRelease]
-activeFedoraReleases =
-  L.nub . mapMaybe maybeRelease <$> getBodhiFedoraReleases
-  where
-    maybeRelease obj = do
-      version <- lookupKey "version" obj
-      branch <- lookupKey "branch" obj
-      state <- lookupKey "state" obj
-      composed <- lookupKey "composed_by_bodhi" obj
-      let setting = lookupKey "setting_status" obj
-      return $
-        Release version state branch composed $
-        setting == Just ("post_beta" :: String)
+activeBodhiReleases :: IO [BodhiRelease]
+activeBodhiReleases =
+  nubOrdOn releaseBranch . mapMaybe maybeRelease <$> getBodhiReleases
 
-activeEPELReleases :: IO [BodhiRelease]
-activeEPELReleases =
-  L.nub . mapMaybe maybeRelease <$> getBodhiEPELReleases
-  where
-    maybeRelease obj = do
-      version <- lookupKey "version" obj
-      branch <- lookupKey "branch" obj
-      state <- lookupKey "state" obj
-      composed <- lookupKey "composed_by_bodhi" obj
-      let setting = lookupKey "setting_status" obj
-      return $
-        Release version state branch composed $
-        setting == Just ("post_beta" :: String)
+activeBodhiFedoraReleases :: IO [BodhiRelease]
+activeBodhiFedoraReleases =
+  nubOrdOn releaseBranch . mapMaybe maybeRelease <$> getBodhiFedoraReleases
 
+activeBodhiEPELReleases :: IO [BodhiRelease]
+activeBodhiEPELReleases =
+  nubOrdOn releaseBranch . mapMaybe maybeRelease <$> getBodhiEPELReleases
+
+maybeRelease :: Object -> Maybe BodhiRelease
+maybeRelease obj = do
+  version <- lookupKey "version" obj
+  branch <- lookupKey "branch" obj >>= readRelease
+  state <- lookupKey "state" obj
+  composed <- lookupKey "composed_by_bodhi" obj
+  let setting = lookupKey "setting_status" obj
+  return $
+    BodhiRelease version state branch composed $
+    setting == Just ("post_beta" :: String)
+
+
 rawhideFedoraRelease :: IO Natural
 rawhideFedoraRelease = do
-  actives <- activeFedoraReleases
+  actives <- activeBodhiFedoraReleases
   let pending = map releaseVersion (filter (\r -> releaseState r == "pending") actives)
-  return $ read $ maximum (L.delete "eln" pending)
+  return $ read $ maximum (delete "eln" pending)
diff --git a/src/List.hs b/src/List.hs
--- a/src/List.hs
+++ b/src/List.hs
@@ -6,14 +6,14 @@
 import Data.Ord (Down(Down))
 import SimpleCmd ((+-+))
 
-import Release (activeFedoraReleases, BodhiRelease(..))
+import BodhiRelease (activeBodhiReleases, BodhiRelease(..))
 
 listVersionsCmd :: IO ()
 listVersionsCmd =
-  activeFedoraReleases >>= mapM_ printRelease . sortOn releaseSorter
+  activeBodhiReleases >>= mapM_ printRelease . sortOn releaseSorter
   where
-    printRelease (Release _version state branch _composed _postbeta) =
-      putStrLn $ branch +-+ state
+    printRelease rel =
+      putStrLn $ show (releaseBranch rel) +-+ releaseState rel
 
     releaseSorter rel =
-      (Down (releaseState rel), Down(releaseVersion rel))
+      (Down (releaseState rel), Down (releaseBranch rel))
diff --git a/src/Main.hs b/src/Main.hs
--- a/src/Main.hs
+++ b/src/Main.hs
@@ -14,7 +14,7 @@
   )
 #endif
 import Control.Monad (forM_, unless, when)
-import Data.Either (rights, partitionEithers)
+import Data.Either (partitionEithers)
 import Data.Maybe (isNothing)
 #if !MIN_VERSION_base(4,11,0)
 import Data.Semigroup ((<>))
@@ -34,15 +34,14 @@
 import List (listVersionsCmd)
 import Paths_fedora_repoquery (version)
 import Query
-import Release (activeFedoraReleases, activeEPELReleases,downloadServer,
-                releaseBranch, showReleaseCmd)
-import Types (Mirror(..), Release (System), RepoSource(..), Verbosity(..),
-              eitherRelease)
+import Release (activeFedoraReleases, activeEPELReleases, activeReleases,
+                downloadServer, showReleaseCmd)
+import Types (Mirror(..), RepoSource(..), Verbosity(..), eitherRelease)
 
 data Command = Query [DnfOption] [String]
              | CacheSize | CacheEmpties | DnfHelp | ReleaseList
 
-data AllReleases = AllFedora | AllEPEL
+data AllReleases = AllFedora | AllEPEL | AllReleases
 
 main :: IO ()
 main = do
@@ -69,9 +68,9 @@
           <*> ((Mirror <$> strOptionWith 'm' "mirror" "URL" ("Fedora mirror [default: " ++ downloadServer ++ "]")) <|>
                flagLongWith' CloudFront "cf" "Use CloudFront cache" <|>
                flagWith DownloadFpo DlFpo 'd' "dl" "Use dl.fp.o"))
-    -- FIXME: --all-releases ?
-    <*> optional (flagWith' AllFedora 'F' "all-fedora" "Query all Fedora releases" <|>
-                  flagWith' AllEPEL 'E' "all-epel" "Query all EPEL releases")
+    <*> optional (flagWith' AllFedora 'F' "all-fedora" "Query all current Fedora releases" <|>
+                  flagWith' AllEPEL 'E' "all-epel" "Query all current EPEL releases" <|>
+                  flagLongWith' AllReleases "all-releases" "Query all current releases")
     <*> (flagWith' [Source] 's' "source" "Query source repos" <|>
          flagWith' allArchs 'A' "all-archs" "Query all arch repos" <|>
          many (optionWith (eitherReader eitherArch) 'a' "repo-arch" "ARCH" ("Specify repo arch [default:" +-+ showArch sysarch ++ "]")))
@@ -168,7 +167,7 @@
       let (args,releases) = partitionEithers $ map eitherRelease relargs
       in do
         unless (null releases || isNothing mallreleases) $
-          error' "cannot specify releases and --all-releases"
+          error' "cannot specify releases and --all-{fedora,epel}"
         when (null releases && isNothing mallreleases) $
           when (verbose == Verbose || debug) $
           warning "(using system repos)"
@@ -177,17 +176,18 @@
           then
             case mallreleases of
               Just allreleases ->
-                rights . map (eitherRelease . releaseBranch)
-                <$> case allreleases of
-                      AllFedora -> activeFedoraReleases
-                      AllEPEL -> activeEPELReleases
-              Nothing -> return [System]
-          else return releases
-        forM_ releaselist $ \release ->
+                map Just <$>
+                case allreleases of
+                  AllFedora -> activeFedoraReleases
+                  AllEPEL -> activeEPELReleases
+                  AllReleases -> activeReleases
+              Nothing -> return [Nothing]
+          else return $ map Just releases
+        forM_ releaselist $ \mrelease ->
           if null args && null opts
           then if null archs
-               then showReleaseCmd debug dynredir reposource release sysarch Nothing testing
-               else forM_ archs $ \arch -> showReleaseCmd debug dynredir reposource release sysarch (Just arch) testing
+               then showReleaseCmd debug dynredir reposource mrelease sysarch Nothing testing
+               else forM_ archs $ \arch -> showReleaseCmd debug dynredir reposource mrelease sysarch (Just arch) testing
           else
             let multiple = length releaselist > 1 || length archs > 1
-            in repoqueryCmd dnf4 debug verbose multiple dynredir time release reposource sysarch archs testing opts args
+            in repoqueryCmd dnf4 debug verbose multiple dynredir time mrelease reposource sysarch archs testing opts args
diff --git a/src/Query.hs b/src/Query.hs
--- a/src/Query.hs
+++ b/src/Query.hs
@@ -6,13 +6,15 @@
   ) where
 
 import Control.Monad.Extra
+import qualified Data.ByteString.Lazy as B
 import Data.Char (isSpace)
 import Data.List.Extra
-import Data.Maybe (isJust, fromMaybe)
+import Data.Maybe (fromMaybe, isJust, isNothing)
 import Safe (lastMay)
-import SimpleCmd (cmdLines)
 import System.Directory (doesFileExist, findExecutable)
+import System.Exit (exitFailure, ExitCode(ExitSuccess))
 import System.FilePath (takeBaseName, (<.>))
+import System.Process.Typed (proc, readProcess)
 
 import Arch
 import Common (warning)
@@ -51,15 +53,15 @@
     "changelogs"
   ]
 
-repoqueryCmd :: Bool -> Bool -> Verbosity -> Bool -> Bool -> Bool -> Release
-             -> RepoSource -> Arch -> [Arch] -> Bool -> [DnfOption]
-             -> [String] -> IO ()
-repoqueryCmd dnf4 debug verbose multiple dynredir checkdate release reposource sysarch archs testing opts args = do
+repoqueryCmd :: Bool -> Bool -> Verbosity -> Bool -> Bool -> Bool
+             -> Maybe Release -> RepoSource -> Arch -> [Arch] -> Bool
+             -> [DnfOption] -> [String] -> IO ()
+repoqueryCmd dnf4 debug verbose multiple dynredir checkdate mrelease reposource sysarch archs testing opts args = do
   forM_ (if null archs then [sysarch] else archs) $ \arch -> do
     repoConfigs <-
-      if release == System
-      then return []
-      else getRelease debug dynredir True checkdate reposource release sysarch (Just arch) testing
+      case mrelease of
+        Nothing -> return []
+        Just release -> getRelease debug dynredir True checkdate reposource release sysarch (Just arch) testing
     -- dnf5 writes repo update output to stdout
     -- https://github.com/rpm-software-management/dnf5/issues/1361
     -- but seems to cache better
@@ -76,17 +78,21 @@
                   ["--disableplugin=subscription-manager" | rhsm] ++
                   ["--queryformat=" ++ queryformat | queryFormatAllowed] ++
                   -- drop modules for F39+
-                  ["--setopt=module_platform_id=platform:" ++ show release] ++
+                  ["--setopt=module_platform_id=platform:" ++ maybe "system" show mrelease] ++
                   concatMap renderRepoConfig repoConfigs ++
                   map (renderOption . tweakQfOpt (isJust mdnf5)) opts ++ args
     -- FIXME drop "/usr/bin/"?
     let dnf = fromMaybe "/usr/bin/dnf-3" mdnf5
     when debug $
       warning $ unwords $ ('\n' : takeBaseName dnf) : map show cmdargs
-    res <- cmdLines dnf cmdargs
-    unless (null res) $ do
-      unless (not checkdate || release == System || multiple) $ warning ""
-      putStrLn $ intercalate "\n" res
+    -- We have to be careful here: this can be a very large output
+    -- https://bugzilla.redhat.com/show_bug.cgi?id=2493905
+    (ok, out, err) <- readProcess $ proc dnf cmdargs
+    unless (B.null err) $ B.putStr err
+    unless (B.null out) $ do
+      unless (not checkdate || isNothing mrelease || multiple) $ warning ""
+      B.putStr out
+    unless (ok == ExitSuccess) exitFailure
   where
     queryFormatAllowed =
       not $ any (`elem` map DnfFlag noQueryFormatOptions) opts
diff --git a/src/Release.hs b/src/Release.hs
--- a/src/Release.hs
+++ b/src/Release.hs
@@ -5,16 +5,17 @@
   getRelease,
   activeFedoraReleases,
   activeEPELReleases,
-  BodhiRelease(..),
+  activeReleases,
   downloadServer
   )
 where
 
-import Control.Monad.Extra (forM_, unless, void, when)
+import Control.Monad.Extra (forM_, void, when)
 import Data.Bifunctor (first)
 import qualified Data.CaseInsensitive as CI
 import Data.List.Extra
 import Data.Maybe (fromMaybe)
+import Data.Ord (Down(Down))
 import qualified Data.Text as T
 import Data.Time.Format (defaultTimeLocale, parseTimeM, rfc822DateFormat)
 import Data.Time.LocalTime (utcToLocalZonedTime)
@@ -36,9 +37,11 @@
 import Types
 import URL
 
-showReleaseCmd :: Bool -> Bool -> RepoSource -> Release  -> Arch -> Maybe Arch
-               -> Bool -> IO ()
-showReleaseCmd debug dynredir reposource release sysarch march testing =
+showReleaseCmd :: Bool -> Bool -> RepoSource -> Maybe Release  -> Arch
+               -> Maybe Arch -> Bool -> IO ()
+showReleaseCmd _debug _dynredir _reposource Nothing _sysarch _march _testing =
+  return ()
+showReleaseCmd debug dynredir reposource (Just release) sysarch march testing =
   void $ getRelease debug dynredir False True reposource release sysarch march testing
 
 getRelease :: Bool -> Bool -> Bool -> Bool -> RepoSource -> Release -> Arch
@@ -131,7 +134,6 @@
                    [("epel-testing",url +//+ ["testing", show n ++ "." ++ show m]) | testing],
                    [])
         EPEL9Next -> return ([("epelnext",urlpath)],[])
-        System -> error' "showRelease: unsupported for system"
   rawhide <- rawhideFedoraRelease
   let basicrepourls =
         map (repoConfigArgs reposource sysarch march rawhide release) basicrepos
@@ -140,7 +142,7 @@
   forM_ basicrepourls $ \(reponame,(url',path')) -> do
     let baserepo = url' +//+ path'
     when debug $ print $ renderUrl Dir baserepo
-    unless (not checkdate || release == System) $ do
+    when checkdate $ do
       let composeinfo =
             url' +//+
             if koji
@@ -158,7 +160,6 @@
                             then ["Everything" | n >= 28] ++ ["state"]
                             else ["COMPOSE_ID"]
                 Rawhide -> ["COMPOSE_ID"]
-                System -> error' "system not supported"
       let composeUrl = renderUrl File composeinfo
       when debug $ print composeUrl
       mtimestr <- curlGetHeader Nothing "Last-Modified" composeUrl
@@ -225,7 +226,7 @@
           -- state values: ["disabled","pending","frozen","current","archived"]
           let pending = releaseState rel /= "current"
               postbeta = releasePostBeta rel
-              rawhide = pending && releaseBranch rel == "rawhide"
+              rawhide = pending && releaseBranch rel == Rawhide
               releasestr = if rawhide then "rawhide" else show n
           in
             if arch == RISCV64
@@ -235,7 +236,6 @@
               [if pending || postbeta then "development" else "releases",
                releasestr]
     Rawhide -> getFedoraServer debug dynredir reposource fedoraTop ["development", "rawhide"]
-    System -> error' "getURL: unsupported for system"
   where
     fedoraTop =
       -- FIXME support older archs
@@ -275,7 +275,6 @@
           EPEL9Next -> ["Everything", showArch arch]
           Fedora _ -> ["Everything", showArch arch] ++ (if arch == Source then ["tree"] else ["os" | repo `elem` ["releases","development"]])
           Rawhide -> ["Everything", showArch arch, if arch == Source then "tree" else "os"]
-          System -> error' "repoConfigArgs: unsupported for system"
   in (reponame, (url, path ++ ["/"]))
   where
     repoVersion :: String
@@ -293,7 +292,6 @@
         Centos _ -> show release ++ '-':repo
         OldCentos 8 -> show release ++  '-':repo
         OldCentos _ -> show release
-        System -> ""
 -- koji
 repoConfigArgs (RepoSource True _mirror) sysarch march _rawhide release (repo,url) =
   let (compose,path) =
@@ -387,3 +385,19 @@
     (_,"") -> s
     (_,_) -> dropWhileEnd (== '/') s ++ '/' : dropWhile (== '/') t
 #endif
+
+activeFedoraReleases :: IO [Release]
+activeFedoraReleases =
+  sortReleases <$> activeBodhiFedoraReleases
+
+activeEPELReleases :: IO [Release]
+activeEPELReleases =
+  sortReleases <$> activeBodhiEPELReleases
+
+activeReleases :: IO [Release]
+activeReleases =
+  sortReleases <$> activeBodhiReleases
+
+sortReleases :: [BodhiRelease] -> [Release]
+sortReleases =
+  sortOn Down . map releaseBranch
diff --git a/src/Types.hs b/src/Types.hs
--- a/src/Types.hs
+++ b/src/Types.hs
@@ -7,6 +7,7 @@
   Verbosity(..),
   Release(..),
   eitherRelease,
+  readRelease,
   elnVersion
   ) where
 
@@ -35,9 +36,42 @@
              | Fedora Natural
              | ELN
              | Rawhide
-             | System
-  deriving (Eq, Ord)
+  deriving Eq
 
+-- derived from fedora-releases Branch
+-- | defined such that: EPELNext 9 < EPEL 10 < Fedora 41 < Rawhide
+instance Ord Release where
+  compare Rawhide Rawhide = EQ
+  compare ELN ELN = EQ
+  compare (Fedora m) (Fedora n) = compare m n
+  compare (EPEL m) (EPEL n) = compare m n
+  compare (EpelMinor m1 n1) (EpelMinor m2 n2) =
+    case compare m1 m2 of
+      LT -> LT
+      GT -> GT
+      EQ -> compare n1 n2
+  compare EPEL9Next EPEL9Next = EQ
+  compare (Centos m) (Centos n) = compare m n
+  compare (OldCentos m) (OldCentos n) = compare m n
+  compare Rawhide _ = GT
+  compare _ Rawhide = LT
+  compare ELN _ = GT
+  compare _ ELN = LT
+  compare (Fedora _) _ = GT
+  compare _ (Fedora _) = LT
+  compare (EPEL m) EPEL9Next = if m == 9 then LT else compare m 9
+  compare EPEL9Next (EPEL n) = if n == 9 then GT else compare 9 n
+  compare (EPEL m) (EpelMinor maj _) = if m >= maj then GT else LT
+  compare (EpelMinor maj _) (EPEL n) = if maj <= n then LT else GT
+  compare (EpelMinor _ _) EPEL9Next = GT
+  compare EPEL9Next (EpelMinor _ _) = LT
+  compare (Centos _) (OldCentos _) = GT
+  compare (OldCentos _) (Centos _) = LT
+  compare (Centos _) _ = LT
+  compare _ (Centos _) = GT
+  compare (OldCentos _) _ = LT
+  compare _ (OldCentos _) = GT
+
 -- FIXME determine via EPEL or Centos
 elnVersion :: Natural
 elnVersion = 11
@@ -87,6 +121,12 @@
                    GT -> Fedora r
     _ -> Left rel
 
+readRelease :: String -> Maybe Release
+readRelease s =
+  case eitherRelease s of
+    Right r -> Just r
+    Left _ -> Nothing
+
 instance Show Release where
   show Rawhide = "rawhide"
   show (Fedora n) = "f" ++ show n
@@ -96,4 +136,3 @@
   show ELN = "eln"
   show (Centos n) = 'c' : show n ++ "s"
   show (OldCentos n) = 'c' : show n
-  show System = "system"
diff --git a/test/tests.hs b/test/tests.hs
--- a/test/tests.hs
+++ b/test/tests.hs
@@ -27,12 +27,14 @@
 
 tests :: [([String],Maybe String)]
 tests =
-  [(["rawhide"], Nothing)
+  [(["--list-releases"], Nothing)
+  ,(["rawhide"], Nothing)
   ,(["-D","rawhide"], Nothing)
   ,([current], Nothing)
   ,([previous], Nothing)
   ,(["eln"], Nothing)
   ,(["epel10"], Nothing)
+  ,(["epel10.2"], Nothing)
   ,(["epel9"], Nothing)
   ,(["epel8"], Nothing)
   ,(["epel7"], Nothing)
