diff --git a/.nix-helpers/nixpkgs.nix b/.nix-helpers/nixpkgs.nix
--- a/.nix-helpers/nixpkgs.nix
+++ b/.nix-helpers/nixpkgs.nix
@@ -2,27 +2,42 @@
 # imported with an overlay adding Termonad. It is imported from various other
 # files.
 
-{ # String representing a GHC version to use.  Normally something like
-  # "ghc865".  If null, then use a known-working GHC version.
-  compiler ? null
-, # A path to nixpkgs.  This will be imported.  If null, use a known-working
+{ # A path to nixpkgs.  This will be imported.  If null, use a known-working
   # nixpkgs version.
   nixpkgs ? null
 , # Additional overlays to apply when importing nixpkgs.
   additionalOverlays ? []
+, # String representing a GHC version to use.  Normally something like
+  # "ghc865".  If null, then use a known-working GHC version.
+  compiler ? null
 , # Build all the examples bundled with termonad.  Normally this is only used
   # in CI for testing that the examples all still compile.
   buildExamples ? false
+, # Enable SIXEL support in VTE.
+  #
+  # Setting this to true builds the VTE library with SIXEL enabled. Note that
+  # this uses a special version of VTE that may still have issues.  This is
+  # necessary because VTE doesn't yet support SIXEL by default in their release
+  # versions. See https://github.com/cdepillabout/termonad/pull/221 and
+  # https://github.com/cdepillabout/termonad/pull/219 for more information and
+  # examples of what SIXEL looks like in Termonad.
+  #
+  # Also, see https://gitlab.gnome.org/GNOME/vte/-/issues/253 which seems to be
+  # the upstream VTE issue for the SIXEL implementation.
+  #
+  # TODO: Remove this option when the upstream VTE releases officially support
+  # SIXEL.
+  enableSixelSupport ? false
 , # This is only used for `termonadShell`.
   #
   # If this is `true`, Hoogle will also index the Termonad libraries,
   # however this will mean the environment will need to be rebuilt every
   # time the termonad source changes.
   indexTermonad ? false
-  # Extra Haskell packages that will be visible by Termonad when it compiles
+, # Extra Haskell packages that will be visible by Termonad when it compiles
   # itself.  See ./termonad-with-packages.nix for an example of how to use
   # this.
-, extraHaskellPackages ? null
+  extraHaskellPackages ? null
 }:
 
 let
@@ -39,7 +54,9 @@
 
   haskellPackagesOverlays = import ./overlays.nix;
 
-  # This overlays sets some of the options use we at development time.
+  # This overlay sets some of the options use we at development time. This
+  # overlay is basically an easy way to pass options to `./overlays.nix`
+  # without having to do it explicitly.
   termonadOptionsOverlay = self: super: {
     termonadCompilerVersion =
       if isNull compiler then super.termonadCompilerVersion else compiler;
@@ -50,6 +67,8 @@
 
     termonadExtraHaskellPackages =
       if isNull extraHaskellPackages then super.termonadExtraHaskellPackages else extraHaskellPackages;
+
+    termonadEnableSixelSupport = enableSixelSupport;
   };
 
 in
diff --git a/.nix-helpers/overlays.nix b/.nix-helpers/overlays.nix
--- a/.nix-helpers/overlays.nix
+++ b/.nix-helpers/overlays.nix
@@ -34,6 +34,7 @@
                     ! any (flip hasPrefix (baseNameOf path)) [ "dist" ".ghc" ];
                 };
 
+
               extraCabal2nixOptions =
                 self.lib.optionalString self.termonadBuildExamples "-fbuildexamples";
 
@@ -54,6 +55,25 @@
         };
     };
 
+    vte =
+      if self.termonadEnableSixelSupport then
+        super.vte.overrideAttrs (oldAttrs: {
+          # As of 2022-10-20, VTE from Nixpkgs doesn't have sixel enabled by default.
+          # We enable it here.
+          mesonFlags = oldAttrs.mesonFlags ++ [ "-Dsixel=true" ];
+          # As of 2022-10-20, the released version of VTE doesn't even include SIXEL
+          # support, because upstream says it still has bugs.  See
+          # https://github.com/cdepillabout/termonad/pull/221#discussion_r997222069
+          # and https://gitlab.gnome.org/GNOME/vte/-/issues/253 for more information.
+          src = self.fetchurl {
+            # This is VTE master as of 2022-10-17.
+            url = "https://github.com/GNOME/vte/archive/8ef3f6b2f8043d28cbc82520eb094f09333b26ae.tar.gz";
+            sha256 = "sha256-2V3dTTu9EH7sO2NeWWZ7pOurQopV/Ji+muoS6+IMNrA=";
+          };
+        })
+      else
+        super.vte;
+
     # This defines which compiler version is used to build Termonad.
     #
     # Either this, or termonadKnownWorkingHaskellPkgSet can be changed in an overlay
@@ -71,6 +91,9 @@
 
     # See ./nixpkgs.nix for an explanation of what this does.
     termonadIndexTermonad = false;
+
+    # See ./nixpkgs.nix for an explanation of what this does.
+    termonadEnableSixelSupport = false;
 
     # This is a shell environment for hacking on Termonad with cabal.  See the
     # top-level shell.nix for an explanation.
diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,10 +1,19 @@
+## 4.4.0.0
+
+*   Add support for opening URLs in a browser by right-clicking on them.
+    URLs will also become underlined if you mouse-over them.
+    [#222](https://github.com/cdepillabout/termonad/pull/222)
+
 ## 4.3.0.0
 
 *   Add SIXEL support.  Note that you will need to set `enableSixel` to `True`
-    in your `ConfigOptions`, as well as using a version of VTE that is >= 0.63
-    for this option to have any affect.  There is also a report that even if you
-    enable SIXEL and have a supported version of VTE, SIXEL doesn't work.  See
-    the linked PR for more information. Thanks [@junjihashimoto](https://github.com/junjihashimoto)!
+    in your `ConfigOptions`. In order for `enableSixel` to have any affect,
+    you'll need to use version of VTE that is >= 0.63, and has been compiled
+    with SIXEL support. There is also a report that even if you enable SIXEL
+    and have a supported version of VTE, there may still be some problems.  See
+    the linked PR for more information, including how to compile VTE with SIXEL
+    support. Thanks
+    [@junjihashimoto](https://github.com/junjihashimoto)!
     [#219](https://github.com/cdepillabout/termonad/pull/219)
 
 ## 4.2.0.1
diff --git a/README.md b/README.md
--- a/README.md
+++ b/README.md
@@ -495,6 +495,25 @@
 [`.nix-helpers/termonad-with-packages.nix`](./.nix-helpers/termonad-with-packages.nix)
 file.
 
+## Additional Info
+
+This section contains some additional info that may be helpful for using Termonad.
+
+### Opening URLs by right-clicking
+
+It is possible to open a URL in a browser by right-clicking on it, and
+selecting `Open URL in browser`.  In order for this you work, you may
+have to setup your XDG defaults.  You can set the default browser to
+Firefox with a command like the following:
+
+```console
+$ xdg-mime default firefox.desktop x-scheme-handler/http
+$ xdg-mime default firefox.desktop x-scheme-handler/https
+```
+
+This `xdg-mime` executable comes from a package called `xdg-utils` in both
+Nixpkgs and Ubutun/Debian.
+
 ## Goals
 
 Termonad has the following goals:
diff --git a/default.nix b/default.nix
--- a/default.nix
+++ b/default.nix
@@ -21,6 +21,7 @@
 , additionalOverlays ? []
 , compiler ? null
 , buildExamples ? false
+, enableSixelSupport ? false
 }@args:
 
 (import .nix-helpers/nixpkgs.nix args).termonad-with-packages
diff --git a/shell.nix b/shell.nix
--- a/shell.nix
+++ b/shell.nix
@@ -24,11 +24,12 @@
 # will also index the Termonad libraries, however this will mean the environment
 # will need to be rebuilt every time the termonad source changes.
 
-{ compiler ? null
-, indexTermonad ? false
-, nixpkgs ? null
-, buildExamples ? false
+{ nixpkgs ? null
 , additionalOverlays ? []
+, compiler ? null
+, buildExamples ? false
+, enableSixelSupport ? false
+, indexTermonad ? false
 }@args:
 
 (import .nix-helpers/nixpkgs.nix args).termonadShell
diff --git a/src/Termonad/Term.hs b/src/Termonad/Term.hs
--- a/src/Termonad/Term.hs
+++ b/src/Termonad/Term.hs
@@ -8,7 +8,8 @@
 import Data.Colour.SRGB (Colour, RGB(RGB), toSRGB)
 import Data.FocusList (appendFL, deleteFL, getFocusItemFL)
 import GI.Gdk
-  ( EventButton
+  ( Event (Event)
+  , EventButton
   , EventKey
   , RGBA
   , getEventButtonButton
@@ -16,12 +17,16 @@
   , setRGBABlue
   , setRGBAGreen
   , setRGBARed
+  , pattern BUTTON_SECONDARY
+  , pattern CURRENT_TIME
   )
-import GI.Gdk.Constants (pattern BUTTON_SECONDARY)
 import GI.Gio
   ( Cancellable
+  , actionMapAddAction
   , menuAppend
   , menuNew
+  , onSimpleActionActivate
+  , simpleActionNew
   )
 import GI.GLib
   ( SpawnFlags(SpawnFlagsDefault)
@@ -40,6 +45,7 @@
   , ReliefStyle(ReliefStyleNone)
   , ResponseType(ResponseTypeNo, ResponseTypeYes)
   , ScrolledWindow
+  , Window
   , applicationGetActiveWindow
   , boxNew
   , buttonNewFromIconName
@@ -71,6 +77,7 @@
   , scrolledWindowNew
   , scrolledWindowSetPolicy
   , setWidgetMargin
+  , showUriOnWindow
   , widgetDestroy
   , widgetGrabFocus
   , widgetSetCanFocus
@@ -86,7 +93,11 @@
   , Terminal
   , onTerminalChildExited
   , onTerminalWindowTitleChanged
+  , regexNewForMatch
+  , terminalGetAllowHyperlink
   , terminalGetWindowTitle
+  , terminalMatchAddRegex
+  , terminalMatchCheckEvent
   , terminalNew
   , terminalSetBoldIsBright
   , terminalSetCursorBlinkMode
@@ -133,6 +144,9 @@
   , tmNotebookTabTermContainer
   , tmNotebookTabs
   )
+import Data.Coerce (coerce)
+import Data.GI.Base (toManagedPtr)
+import Termonad.Pcre (pcre2Multiline)
 
 focusTerm :: Int -> TMState -> IO ()
 focusTerm i mvarTMState = do
@@ -473,9 +487,26 @@
     relabelTab notebook tabLabel scrolledWin vteTerm
   void $ onWidgetKeyPressEvent vteTerm $ handleKeyPress mvarTMState
   void $ onWidgetKeyPressEvent scrolledWin $ handleKeyPress mvarTMState
-  void $ onWidgetButtonPressEvent vteTerm $ handleMousePress vteTerm
+  void $ onWidgetButtonPressEvent vteTerm $ handleMousePress tmStateAppWin vteTerm
   void $ onTerminalChildExited vteTerm $ \_ -> termExit notebookTab mvarTMState
 
+  -- Underline URLs so that the user can see they are right-clickable.
+  --
+  -- This regex is from https://www.regextester.com/94502
+  --
+  -- TODO: Roxterm and gnome-terminal have a much more in-depth set of regexes
+  -- for URLs and things similar to URLs.  At some point it might make sense to
+  -- switch to something like this:
+  -- https://github.com/realh/roxterm/blob/30f1faf8be4ccac8ba12b59feb5b8f758bc65a7b/src/roxterm-regex.c
+  -- and
+  -- https://github.com/realh/roxterm/blob/30f1faf8be4ccac8ba12b59feb5b8f758bc65a7b/src/terminal-regex.h
+  let regexPat =
+        "(?:http(s)?:\\/\\/)[\\w.-]+(?:\\.[\\w\\.-]+)+[\\w\\-\\._~:/?#[\\]@!\\$&'\\(\\)\\*\\+,;=.]+"
+  -- We must set the pcre2Multiline option, otherwise VTE prints a warning.
+  let pcreFlags = fromIntegral pcre2Multiline
+  regex <- regexNewForMatch regexPat (fromIntegral $ length regexPat) pcreFlags
+  void $ terminalMatchAddRegex vteTerm regex 0
+
   -- Put the keyboard focus on the term
   setFocusOn tmStateAppWin vteTerm
 
@@ -487,12 +518,31 @@
   pure tmTerm
 
 -- | Popup the context menu on right click
-handleMousePress :: Terminal -> EventButton -> IO Bool
-handleMousePress vteTerm event = do
-  button <- getEventButtonButton event
+handleMousePress :: ApplicationWindow -> Terminal -> EventButton -> IO Bool
+handleMousePress win vteTerm eventButton = do
+  x <- terminalGetAllowHyperlink vteTerm
+  print x
+  button <- getEventButtonButton eventButton
   let rightClick = button == fromIntegral BUTTON_SECONDARY
   when rightClick $ do
     menuModel <- menuNew
+
+    -- if the user right-clicked on a URL, add an option to open the URL
+    -- in a browser
+    (maybeUrl, _regexId) <- terminalMatchCheckEvent vteTerm (eventButtonToEvent eventButton)
+    case maybeUrl of
+      Nothing -> pure ()
+      Just url -> do
+        openUrlAction <- simpleActionNew "openurl" Nothing
+        void $ onSimpleActionActivate openUrlAction $ \_ ->
+          showUriOnWindow (Nothing :: Maybe Window) url (fromIntegral CURRENT_TIME)
+        -- This will add the openurl action to the Application Window's action
+        -- map everytime the user right-clicks on a URL.  It is okay to add
+        -- actions multiple times.
+        actionMapAddAction win openUrlAction
+        menuAppend menuModel (Just "Open URL in browser") (Just "win.openurl")
+
+
     menuAppend menuModel (Just "Copy") (Just "app.copy")
     menuAppend menuModel (Just "Paste") (Just "app.paste")
     menuAppend menuModel (Just "Preferences") (Just "app.preferences")
@@ -500,3 +550,11 @@
     menuAttachToWidget menu vteTerm Nothing
     menuPopupAtPointer menu Nothing
   pure rightClick
+
+-- The terminalMatchCheckEvent function takes an Event, while we only
+-- have an EventButton.  It is apparently okay to just cast an EventButton
+-- to an Event, since they are just pointers under the hood, and they
+-- are laid out the same in memory.  See
+-- https://github.com/haskell-gi/haskell-gi/issues/109
+eventButtonToEvent :: EventButton -> Event
+eventButtonToEvent = Event . coerce . toManagedPtr
diff --git a/src/Termonad/Types.hs b/src/Termonad/Types.hs
--- a/src/Termonad/Types.hs
+++ b/src/Termonad/Types.hs
@@ -411,7 +411,11 @@
   , enableSixel :: !Bool
     -- ^ Enable SIXEL to draw graphics in a terminal.
     --
-    -- Note that SIXEL may not be fully supported in VTE. Follow
+    -- In order for this option to do anything, you need to be using a version
+    -- of VTE >= 0.63, and compile VTE with SIXEL support.
+    --
+    -- Note that even if you do the above, there may still be some problems
+    -- with SIXEL support in VTE. Follow
     -- <https://gitlab.gnome.org/GNOME/vte/-/issues/253> for more information.
   } deriving (Eq, Generic, FromJSON, Show, ToJSON)
 
diff --git a/termonad.cabal b/termonad.cabal
--- a/termonad.cabal
+++ b/termonad.cabal
@@ -1,5 +1,5 @@
 name:                termonad
-version:             4.3.0.0
+version:             4.4.0.0
 synopsis:            Terminal emulator configurable in Haskell
 description:
   Termonad is a terminal emulator configurable in Haskell.  It is extremely
diff --git a/test/readme/README.lhs b/test/readme/README.lhs
--- a/test/readme/README.lhs
+++ b/test/readme/README.lhs
@@ -495,6 +495,25 @@
 [`.nix-helpers/termonad-with-packages.nix`](./.nix-helpers/termonad-with-packages.nix)
 file.
 
+## Additional Info
+
+This section contains some additional info that may be helpful for using Termonad.
+
+### Opening URLs by right-clicking
+
+It is possible to open a URL in a browser by right-clicking on it, and
+selecting `Open URL in browser`.  In order for this you work, you may
+have to setup your XDG defaults.  You can set the default browser to
+Firefox with a command like the following:
+
+```console
+$ xdg-mime default firefox.desktop x-scheme-handler/http
+$ xdg-mime default firefox.desktop x-scheme-handler/https
+```
+
+This `xdg-mime` executable comes from a package called `xdg-utils` in both
+Nixpkgs and Ubutun/Debian.
+
 ## Goals
 
 Termonad has the following goals:
