diff --git a/Propellor.hs b/Propellor.hs
--- a/Propellor.hs
+++ b/Propellor.hs
@@ -1,11 +1,44 @@
--- | Pulls in lots of useful modules for building Properties.
+-- | Pulls in lots of useful modules for building and using Properties.
+--
+-- Propellor enures that the system it's run in satisfies a list of
+-- properties, taking action as necessary when a property is not yet met.
+--
+-- A simple propellor program example:
+--
+--
+--> import Propellor
+--> import Propellor.CmdLine
+--> import qualified Propellor.Property.File as File
+--> import qualified Propellor.Property.Apt as Apt
+--> 
+--> main :: IO ()
+--> main = defaultMain getProperties
+--> 
+--> getProperties :: HostName -> Maybe [Property]
+--> getProperties "example.com" = Just
+-->    [ Apt.installed ["mydaemon"]
+-->    , "/etc/mydaemon.conf" `File.containsLine` "secure=1"
+-->        `onChange` cmdProperty "service" ["mydaemon", "restart"]]
+-->    ]
+--> getProperties _ = Nothing
+--
+-- See config.hs for a more complete example, and clone Propellor's
+-- git repository for a deployable system using Propellor:
+-- git clone <git://git.kitenet.net/propellor>
 
-module Propellor (module X) where
+module Propellor (
+	  module Propellor.Types
+	, module Propellor.Property
+	, module Propellor.Property.Cmd
+	, module Propellor.PrivData
 
-import Propellor.Types as X
-import Propellor.Property as X
-import Propellor.Property.Cmd as X
-import Propellor.PrivData as X
+	, module X
+) where
+
+import Propellor.Types
+import Propellor.Property
+import Propellor.Property.Cmd
+import Propellor.PrivData
 
 import Utility.PartialPrelude as X
 import Utility.Process as X
diff --git a/Propellor/PrivData.hs b/Propellor/PrivData.hs
--- a/Propellor/PrivData.hs
+++ b/Propellor/PrivData.hs
@@ -18,9 +18,9 @@
 import Utility.SafeCommand
 import Utility.Misc
 
-{- | Note that removing or changing field names will break the
- - serialized privdata files, so don't do that!
- - It's fine to add new fields. -}
+-- | Note that removing or changing field names will break the
+-- serialized privdata files, so don't do that!
+-- It's fine to add new fields.
 data PrivDataField
 	= DockerAuthentication
 	| SshPrivKey UserName
diff --git a/Propellor/Property/File.hs b/Propellor/Property/File.hs
--- a/Propellor/Property/File.hs
+++ b/Propellor/Property/File.hs
@@ -4,12 +4,12 @@
 
 type Line = String
 
-{- | Replaces all the content of a file. -}
+-- | Replaces all the content of a file.
 hasContent :: FilePath -> [Line] -> Property
 f `hasContent` newcontent = fileProperty ("replace " ++ f)
 	(\_oldcontent -> newcontent) f
 
-{- | Ensures that a line is present in a file, adding it to the end if not. -}
+-- | Ensures that a line is present in a file, adding it to the end if not.
 containsLine :: FilePath -> Line -> Property
 f `containsLine` l = fileProperty (f ++ " contains:" ++ l) go f
   where
@@ -17,13 +17,13 @@
 		| l `elem` ls = ls
 		| otherwise = ls++[l]
 
-{- | Ensures that a line is not present in a file.
- - Note that the file is ensured to exist, so if it doesn't, an empty
- - file will be written. -}
+-- | Ensures that a line is not present in a file.
+-- Note that the file is ensured to exist, so if it doesn't, an empty
+-- file will be written. -}
 lacksLine :: FilePath -> Line -> Property
 f `lacksLine` l = fileProperty (f ++ " remove: " ++ l) (filter (/= l)) f
 
-{- | Removes a file. Does not remove symlinks or non-plain-files. -}
+-- | Removes a file. Does not remove symlinks or non-plain-files.
 notPresent :: FilePath -> Property
 notPresent f = check (doesFileExist f) $ Property (f ++ " not present") $ 
 	makeChange $ nukeFile f
diff --git a/propellor.cabal b/propellor.cabal
--- a/propellor.cabal
+++ b/propellor.cabal
@@ -1,5 +1,5 @@
 Name: propellor
-Version: 0.1
+Version: 0.1.1
 Cabal-Version: >= 1.6
 License: GPL
 Maintainer: Joey Hess <joey@kitenet.net>
