diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,9 @@
+## [2.9.2](https://github.com/haskell-github-trust/effectful-cli/compare/2.9.1...2.9.2) (2026-11-13)
+
+### Bug Fixes
+
+* autoOpen for macos ([097c571](https://github.com/haskell-github-trust/effectful-cli/commit/097c571a1052776e3cb4c1a8b385f21359e561fc))
+
 ## [2.9.1](https://github.com/haskell-github-trust/effectful-cli/compare/2.9.0...2.9.1) (2026-11-12)
 
 ### Bug Fixes
diff --git a/effectful-cli.cabal b/effectful-cli.cabal
--- a/effectful-cli.cabal
+++ b/effectful-cli.cabal
@@ -5,7 +5,7 @@
 -- see: https://github.com/sol/hpack
 
 name:           effectful-cli
-version:        0.2.9.1
+version:        0.2.9.2
 synopsis:       CLI helpers for the effectful ecosystem
 description:    Please see the README at https://github.com/haskell-github-trust/effectful-cli
 category:       CLI
diff --git a/src/Effectful/CLI/IO.hs b/src/Effectful/CLI/IO.hs
--- a/src/Effectful/CLI/IO.hs
+++ b/src/Effectful/CLI/IO.hs
@@ -31,6 +31,7 @@
 import Effectful.Process (Process, callProcess)
 import Effectful.Reader.Static (Reader, ask)
 import System.IO (hFlush, stderr)
+import System.Info (os)
 import Text.Layout.Table (columnHeaderTableS, def, rowsG, tableString, titlesH, unicodeS)
 import Text.Megaparsec (Parsec, eof, errorBundlePretty, runParser, (<|>))
 import Text.Megaparsec.Char (string')
@@ -139,7 +140,7 @@
     unless ok $ throwError (UserCanceled Nothing)
   action
 
--- | Open a file or URL with @xdg-open@.
+-- | Open a file or URL with @open@ on macOS, @xdg-open@ elsewhere.
 --
 -- @since 0.1.0.0
 autoOpen
@@ -147,7 +148,7 @@
   => String
   -- ^ file path or URL
   -> Eff es ()
-autoOpen arg = callProcess "xdg-open" [arg]
+autoOpen arg = callProcess (if os == "darwin" then "open" else "xdg-open") [arg]
 
 -- | Let the user pick one item from a table; a single item is returned without prompting, none throws 'NotFoundError'.
 --
