diff --git a/library/TheatreDev/Daemon.hs b/library/TheatreDev/Daemon.hs
--- a/library/TheatreDev/Daemon.hs
+++ b/library/TheatreDev/Daemon.hs
@@ -2,6 +2,7 @@
   ( Daemon,
 
     -- * Acquisition
+    Config (..),
     spawn,
 
     -- * Control
@@ -13,10 +14,25 @@
 import TheatreDev.Prelude
 import TheatreDev.Wait qualified as Wait
 
+-- | Configuration of the daemon behaviour.
 data Config = forall state.
   Config
-  { initialState :: state,
+  { -- | Initial state of the daemon.
+    initialState :: state,
+    -- | Iteration action, updating the daemon's state.
+    -- It gets executed in a loop,
+    -- with checks of whether the daemon is still alive after each one.
+    -- Killing the daemon will not interrupt the currently ongoing iteration,
+    -- thus providing gracefulness guarantees.
+    --
+    -- If an exception is thrown by this action,
+    -- the iteration loop will stop,
+    -- the 'cleanUp' action will get executed and
+    -- in all place where 'wait' is called the exception will be rethrown.
     iterate :: state -> IO state,
+    -- | Clean up after the iteration loop is stopped.
+    -- You can use that to release resources or
+    -- issue notifications about the daemon dying.
     cleanUp :: state -> IO ()
   }
 
@@ -49,6 +65,8 @@
         wait = Wait.all (fmap (.wait) daemons)
       }
 
+-- | Fork a thread to run the daemon loop on
+-- returning immediately with a handle to control it.
 spawn :: Config -> IO Daemon
 spawn Config {..} = do
   iteratingVar <- newTVarIO True
@@ -77,10 +95,19 @@
       }
   where
 
+-- | Command the daemon to stop iterating,
+-- finish the ongoing iteration and execute the clean up action.
+--
+-- This action executes immediately.
+-- If you want to block waiting for the daemon to actually die,
+-- after 'kill' you can run 'wait'.
 kill :: Daemon -> IO ()
 kill daemon =
   atomically daemon.kill
 
+-- | Block waiting for the daemon to die either due to getting killed
+-- or due to its iterator action throwing an exception.
+-- The exception will get rethrown here.
 wait :: Daemon -> IO ()
 wait daemon =
   atomically daemon.wait >>= maybe (pure ()) throwIO
diff --git a/theatre-dev.cabal b/theatre-dev.cabal
--- a/theatre-dev.cabal
+++ b/theatre-dev.cabal
@@ -1,6 +1,6 @@
 cabal-version: 3.0
 name:          theatre-dev
-version:       0.4
+version:       0.4.0.1
 category:      Concurrency, Actors
 synopsis:      Minimalistic actor library experiments
 description:
