diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,12 @@
 # Changelog
 
+## 0.2.4.0 — 2026-02-25
+
+- New module: `NovaCache.Base64` — base64 encode/decode re-exported for
+  downstream consumers (nova-nix) so they don't need a direct
+  `base64-bytestring` dependency
+- No changes to existing modules
+
 ## 0.2.3.0 — 2026-02-23
 
 - Drop `unix` dependency — `checkExecutable` now uses cross-platform
diff --git a/nova-cache.cabal b/nova-cache.cabal
--- a/nova-cache.cabal
+++ b/nova-cache.cabal
@@ -1,6 +1,6 @@
 cabal-version:      3.0
 name:               nova-cache
-version:            0.2.3.0
+version:            0.2.4.0
 synopsis:           Pure Nix binary cache protocol library
 description:
   A focused, minimal, pure-first library implementing the full Nix binary
@@ -35,6 +35,7 @@
 library
   exposed-modules:
     NovaCache.Base32
+    NovaCache.Base64
     NovaCache.Hash
     NovaCache.NAR
     NovaCache.NarInfo
diff --git a/src/NovaCache/Base64.hs b/src/NovaCache/Base64.hs
new file mode 100644
--- /dev/null
+++ b/src/NovaCache/Base64.hs
@@ -0,0 +1,22 @@
+-- | Base64 encoding and decoding for the Nix ecosystem.
+--
+-- Thin wrappers over @base64-bytestring@, re-exported so downstream
+-- packages (nova-nix) don't need a direct dependency on the same lib.
+module NovaCache.Base64
+  ( encode,
+    decode,
+  )
+where
+
+import Data.ByteString (ByteString)
+import qualified Data.ByteString.Base64 as B64
+import Data.Text (Text)
+import qualified Data.Text.Encoding as TE
+
+-- | Encode bytes to base64 'Text'.
+encode :: ByteString -> Text
+encode = TE.decodeUtf8 . B64.encode
+
+-- | Decode base64 'Text' to bytes.
+decode :: Text -> Either String ByteString
+decode = B64.decode . TE.encodeUtf8
