diff --git a/hedgehog/HaskellWorks/Polysemy/Hedgehog/Time.hs b/hedgehog/HaskellWorks/Polysemy/Hedgehog/Time.hs
new file mode 100644
--- /dev/null
+++ b/hedgehog/HaskellWorks/Polysemy/Hedgehog/Time.hs
@@ -0,0 +1,22 @@
+{-# LANGUAGE NumericUnderscores #-}
+{-# LANGUAGE TypeApplications   #-}
+
+module HaskellWorks.Polysemy.Hedgehog.Time (
+    genPOSIXTime,
+) where
+
+import           Data.Time.Clock.POSIX (POSIXTime)
+
+import           Hedgehog
+import qualified Hedgehog.Gen          as Gen
+import qualified Hedgehog.Range        as Range
+
+import           HaskellWorks.Prelude
+
+genPOSIXTime :: Gen POSIXTime
+genPOSIXTime = do
+    -- Generate a random integer within a reasonable range for POSIX time
+    -- POSIXTime is a type synonym for NominalDiffTime, which is in seconds
+    -- We'll use a range from 0 to a large number of seconds to cover a wide time span
+    seconds <- Gen.integral (Range.linear 0 4_102_444_800) -- Up to year 2100
+    return $ fromIntegral @Word64 seconds
diff --git a/hedgehog/HaskellWorks/Polysemy/Hedgehog/Ulid.hs b/hedgehog/HaskellWorks/Polysemy/Hedgehog/Ulid.hs
new file mode 100644
--- /dev/null
+++ b/hedgehog/HaskellWorks/Polysemy/Hedgehog/Ulid.hs
@@ -0,0 +1,35 @@
+module HaskellWorks.Polysemy.Hedgehog.Ulid (
+    genUlid,
+    genUlidRandom,
+    genUlidTimeStamp,
+) where
+
+import           Data.Binary                         (decodeOrFail)
+import qualified Data.ByteString.Lazy                as LBS
+import           Data.ULID                           (ULID (..))
+import           Data.ULID.Random                    (ULIDRandom)
+import           Data.ULID.TimeStamp                 (ULIDTimeStamp,
+                                                      mkULIDTimeStamp)
+import           HaskellWorks.Polysemy.Hedgehog.Time
+
+import           Hedgehog
+import qualified Hedgehog.Gen                        as Gen
+import qualified Hedgehog.Range                      as Range
+
+import           HaskellWorks.Prelude
+
+genUlidRandom :: Gen ULIDRandom
+genUlidRandom = do
+    bytes <- Gen.bytes (Range.singleton 10) -- 80 bits
+    let lazyBytes = LBS.fromStrict bytes
+    case decodeOrFail lazyBytes of
+        Left (_, _, err)   -> fail $ "Failed to decode ULIDRandom: " <> err -- This shouldn't happen.
+        Right (_, _, ulid) -> pure ulid
+
+genUlidTimeStamp :: Gen ULIDTimeStamp
+genUlidTimeStamp =
+    mkULIDTimeStamp <$> genPOSIXTime
+
+genUlid :: Gen ULID
+genUlid =
+    ULID <$> genUlidTimeStamp <*> genUlidRandom
diff --git a/hw-polysemy.cabal b/hw-polysemy.cabal
--- a/hw-polysemy.cabal
+++ b/hw-polysemy.cabal
@@ -1,6 +1,6 @@
 cabal-version:          3.4
 name:                   hw-polysemy
-version:                0.2.14.9
+version:                0.2.14.10
 synopsis:               Opinionated polysemy library
 description:            Opinionated polysemy library.
 license:                Apache-2.0
@@ -54,6 +54,7 @@
 common text                       { build-depends: text                                        < 3      }
 common time                       { build-depends: time                                        < 2      }
 common transformers               { build-depends: transformers                                < 0.7    }
+common ulid                       { build-depends: ulid                                        < 0.4    }
 common unliftio                   { build-depends: unliftio                                    < 0.3    }
 common yaml                       { build-depends: yaml                                        < 0.12   }
 
@@ -172,6 +173,7 @@
                         aeson,
                         aeson-pretty,
                         async,
+                        binary,
                         bytestring,
                         contravariant,
                         Diff,
@@ -192,6 +194,7 @@
                         text,
                         time,
                         transformers,
+                        ulid,
                         yaml,
   visibility:           public
   exposed-modules:      HaskellWorks.Polysemy.Hedgehog
@@ -206,6 +209,8 @@
                         HaskellWorks.Polysemy.Hedgehog.Process.Internal
                         HaskellWorks.Polysemy.Hedgehog.Property
                         HaskellWorks.Polysemy.Hedgehog.Test
+                        HaskellWorks.Polysemy.Hedgehog.Time
+                        HaskellWorks.Polysemy.Hedgehog.Ulid
                         HaskellWorks.Polysemy.Hedgehog.Workspace
                         HaskellWorks.Polysemy.Hedgehog.Workspace.Types
   hs-source-dirs:       hedgehog
