diff --git a/library/Text/Builder.hs b/library/Text/Builder.hs
--- a/library/Text/Builder.hs
+++ b/library/Text/Builder.hs
@@ -6,11 +6,16 @@
   length,
   null,
   -- * Constructors
+  -- ** Builder manipulators
   intercalate,
-  char,
+  padFromLeft,
+  -- ** Textual
   text,
   string,
   asciiByteString,
+  -- ** Character
+  char,
+  -- *** Low-level character
   unicodeCodePoint,
   utf16CodeUnits1,
   utf16CodeUnits2,
@@ -18,15 +23,17 @@
   utf8CodeUnits2,
   utf8CodeUnits3,
   utf8CodeUnits4,
+  -- ** Integers
   decimal,
   unsignedDecimal,
   thousandSeparatedDecimal,
   thousandSeparatedUnsignedDecimal,
-  decimalDigit,
   hexadecimal,
   unsignedHexadecimal,
+  -- ** Digits
+  decimalDigit,
   hexadecimalDigit,
-  padFromLeft,
+  -- ** Time
   intervalInSeconds,
 )
 where
@@ -45,6 +52,10 @@
 newtype Action =
   Action (forall s. B.MArray s -> Int -> ST s ())
 
+{-|
+Specification of how to efficiently construct strict 'Text'.
+Provides instances of 'Semigroup' and 'Monoid', which have complexity of /O(1)/.
+-}
 data Builder =
   Builder !Action !Int !Int
 
@@ -75,14 +86,17 @@
 -- * Accessors
 -------------------------
 
+{-| Get the amount of characters -}
 {-# INLINE length #-}
 length :: Builder -> Int
 length (Builder _ _ x) = x
 
+{-| Check whether the builder is empty -}
 {-# INLINE null #-}
 null :: Builder -> Bool
 null = (== 0) . length
 
+{-| Execute a builder producing a strict text -}
 run :: Builder -> Text
 run (Builder (Action action) arraySize _) =
   C.text array 0 arraySize
@@ -97,16 +111,19 @@
 -- * Constructors
 -------------------------
 
+{-| Unicode character -}
 {-# INLINE char #-}
 char :: Char -> Builder
 char x =
   unicodeCodePoint (ord x)
 
+{-| Unicode code point-}
 {-# INLINE unicodeCodePoint #-}
 unicodeCodePoint :: Int -> Builder
 unicodeCodePoint x =
   D.unicodeCodePoint x utf16CodeUnits1 utf16CodeUnits2
 
+{-| Single code-unit UTF-16 character -}
 {-# INLINABLE utf16CodeUnits1 #-}
 utf16CodeUnits1 :: Word16 -> Builder
 utf16CodeUnits1 unit =
@@ -115,6 +132,7 @@
     action =
       Action $ \array offset -> B.unsafeWrite array offset unit
 
+{-| Double code-unit UTF-16 character -}
 {-# INLINABLE utf16CodeUnits2 #-}
 utf16CodeUnits2 :: Word16 -> Word16 -> Builder
 utf16CodeUnits2 unit1 unit2 =
@@ -125,26 +143,31 @@
         B.unsafeWrite array offset unit1
         B.unsafeWrite array (succ offset) unit2
 
+{-| Single code-unit UTF-8 character -}
 {-# INLINE utf8CodeUnits1 #-}
 utf8CodeUnits1 :: Word8 -> Builder
 utf8CodeUnits1 unit1 =
   D.utf8CodeUnits1 unit1 utf16CodeUnits1 utf16CodeUnits2
 
+{-| Double code-unit UTF-8 character -}
 {-# INLINE utf8CodeUnits2 #-}
 utf8CodeUnits2 :: Word8 -> Word8 -> Builder
 utf8CodeUnits2 unit1 unit2 =
   D.utf8CodeUnits2 unit1 unit2 utf16CodeUnits1 utf16CodeUnits2
 
+{-| Triple code-unit UTF-8 character -}
 {-# INLINE utf8CodeUnits3 #-}
 utf8CodeUnits3 :: Word8 -> Word8 -> Word8 -> Builder
 utf8CodeUnits3 unit1 unit2 unit3 =
   D.utf8CodeUnits3 unit1 unit2 unit3 utf16CodeUnits1 utf16CodeUnits2
 
+{-| UTF-8 character out of 4 code units -}
 {-# INLINE utf8CodeUnits4 #-}
 utf8CodeUnits4 :: Word8 -> Word8 -> Word8 -> Word8 -> Builder
 utf8CodeUnits4 unit1 unit2 unit3 unit4 =
   D.utf8CodeUnits4 unit1 unit2 unit3 unit4 utf16CodeUnits1 utf16CodeUnits2
 
+{-| ASCII byte string -}
 {-# INLINABLE asciiByteString #-}
 asciiByteString :: ByteString -> Builder
 asciiByteString byteString =
@@ -158,6 +181,7 @@
           next (succ index)
         in ByteString.foldr step (const (return ())) byteString
 
+{-| Strict text -}
 {-# INLINABLE text #-}
 text :: Text -> Builder
 text text@(C.Text array offset length) =
@@ -167,11 +191,13 @@
       Action $ \builderArray builderOffset -> do
         B.copyI builderArray builderOffset array offset (builderOffset + length)
 
+{-| String -}
 {-# INLINE string #-}
 string :: String -> Builder
 string =
   foldMap char
 
+{-| Decimal representation of an integral value -}
 {-# INLINABLE decimal #-}
 decimal :: Integral a => a -> Builder
 decimal i =
@@ -179,11 +205,13 @@
     then unsignedDecimal i
     else unicodeCodePoint 45 <> unsignedDecimal (negate i)
 
+{-| Decimal representation of an unsigned integral value -}
 {-# INLINABLE unsignedDecimal #-}
 unsignedDecimal :: Integral a => a -> Builder
 unsignedDecimal =
   foldMap decimalDigit . Unfoldr.digits
 
+{-| Decimal representation of an integral value with thousands separated by the specified character -}
 {-# INLINABLE thousandSeparatedDecimal #-}
 thousandSeparatedDecimal :: Integral a => Char -> a -> Builder
 thousandSeparatedDecimal separatorChar a =
@@ -191,6 +219,7 @@
     then thousandSeparatedUnsignedDecimal separatorChar a
     else unicodeCodePoint 45 <> thousandSeparatedUnsignedDecimal separatorChar (negate a)
 
+{-| Decimal representation of an unsigned integral value with thousands separated by the specified character -}
 {-# INLINABLE thousandSeparatedUnsignedDecimal #-}
 thousandSeparatedUnsignedDecimal :: Integral a => Char -> a -> Builder
 thousandSeparatedUnsignedDecimal separatorChar a =
@@ -200,6 +229,7 @@
       then return (decimalDigit digit <> char separatorChar)
       else return (decimalDigit digit)
 
+{-| Hexadecimal representation of an integral value -}
 {-# INLINE hexadecimal #-}
 hexadecimal :: Integral a => a -> Builder
 hexadecimal i =
@@ -207,6 +237,7 @@
     then unsignedHexadecimal i
     else unicodeCodePoint 45 <> unsignedHexadecimal (negate i)
 
+{-| Unsigned hexadecimal representation of an integral value -}
 {-# INLINE unsignedHexadecimal #-}
 unsignedHexadecimal :: Integral a => a -> Builder
 unsignedHexadecimal =
@@ -221,11 +252,13 @@
                 then loop newBuilder quot
                 else newBuilder
 
+{-| Decimal digit -}
 {-# INLINE decimalDigit #-}
 decimalDigit :: Integral a => a -> Builder
 decimalDigit n =
   unicodeCodePoint (fromIntegral n + 48)
 
+{-| Hexadecimal digit -}
 {-# INLINE hexadecimalDigit #-}
 hexadecimalDigit :: Integral a => a -> Builder
 hexadecimalDigit n =
@@ -233,6 +266,7 @@
     then unicodeCodePoint (fromIntegral n + 48)
     else unicodeCodePoint (fromIntegral n + 87)
 
+{-| Intercalate builders -}
 {-# INLINE intercalate #-}
 intercalate :: Foldable foldable => Builder -> foldable Builder -> Builder
 intercalate separator = extract . foldl' step init where
@@ -242,6 +276,7 @@
     else element
   extract (Product2 _ builder) = builder
 
+{-| Pad a builder from the left side to the specified length with the specified character -}
 {-# INLINABLE padFromLeft #-}
 padFromLeft :: Int -> Char -> Builder -> Builder
 padFromLeft paddedLength paddingChar builder = let
diff --git a/text-builder.cabal b/text-builder.cabal
--- a/text-builder.cabal
+++ b/text-builder.cabal
@@ -1,5 +1,5 @@
 name: text-builder
-version: 0.6.1
+version: 0.6.1.1
 category: Text
 synopsis: An efficient strict text builder
 homepage: https://github.com/nikita-volkov/text-builder
