diff --git a/mdoc.cabal b/mdoc.cabal
--- a/mdoc.cabal
+++ b/mdoc.cabal
@@ -1,6 +1,6 @@
 cabal-version:      1.18
 name:               mdoc
-version:            0.4.0.0
+version:            0.4.1.0
 license:            AGPL-3
 license-file:       COPYING
 maintainer:         Pat Brisbin
diff --git a/src/OptEnvConf/Mdoc.hs b/src/OptEnvConf/Mdoc.hs
--- a/src/OptEnvConf/Mdoc.hs
+++ b/src/OptEnvConf/Mdoc.hs
@@ -46,20 +46,18 @@
 addToPage
   :: Int
   -> Page
-  -> Either [CommandDoc (Maybe SetDoc)] (Described SetDoc)
+  -> Described SetDoc
   -> Page
-addToPage index acc = \case
-  Left cdocs -> addCommands (zipWith getCommand [1 ..] cdocs) acc
-  Right d ->
-    flip appEndo acc
-      $ mconcat
-      $ catMaybes
-        [ Endo . addSwitch <$> traverse setDocToFlag d
-        , Endo . addOption <$> traverse setDocToOption d
-        , Endo . addArgument <$> traverse (setDocToArgument index) d
-        , Endo . addEnvVar <$> traverse setDocToEnvVar d
-        , Just $ foldMap (Endo . addConfig) $ traverse setDocToConfigs d
-        ]
+addToPage index acc d =
+  flip appEndo acc
+    $ mconcat
+    $ catMaybes
+      [ Endo . addSwitch <$> traverse setDocToFlag d
+      , Endo . addOption <$> traverse setDocToOption d
+      , Endo . addArgument <$> traverse (setDocToArgument index) d
+      , Endo . addEnvVar <$> traverse setDocToEnvVar d
+      , Just $ foldMap (Endo . addConfig) $ traverse setDocToConfigs d
+      ]
 
 setDocToFlag :: SetDoc -> Maybe Flag
 setDocToFlag doc = do
@@ -91,31 +89,33 @@
     . setDocConfKeys
 
 foldSetDocs
-  :: (Int -> Page -> Either [CommandDoc (Maybe SetDoc)] (Described SetDoc) -> Page)
+  :: (Int -> Page -> Described SetDoc -> Page)
   -> AnyDocs (Maybe SetDoc)
   -> Page
 foldSetDocs f = flip evalState 0 . foldSetDocsM f mempty
 
 foldSetDocsM
   :: MonadState Int m
-  => (Int -> Page -> Either [CommandDoc (Maybe SetDoc)] (Described SetDoc) -> Page)
+  => (Int -> Page -> Described SetDoc -> Page)
   -> Page
   -> AnyDocs (Maybe SetDoc)
   -> m Page
 foldSetDocsM f acc = \case
-  AnyDocsCommands _ cdocs -> do
-    index <- get
-    modify (+ 1)
-    pure $ f index acc $ Left cdocs
+  AnyDocsCommands _ cdocs ->
+    pure $ addCommands (zipWith getCommand [1 ..] cdocs) acc
   AnyDocsAnd ds -> foldM (foldSetDocsM f) acc ds
-  AnyDocsOr ds -> foldM (foldSetDocsM fForOr) acc ds
+  AnyDocsOr [d] -> foldSetDocsM f acc d
+  -- Optionality represented as "<|> Nothing"
+  AnyDocsOr [d, AnyDocsSingle Nothing] -> foldSetDocsM fForOr acc d
+  AnyDocsOr ds -> do
+    sub <- foldM (foldSetDocsM fForOr) mempty $ traceShowId ds
+    pure $ addAlternation Optional (getPositionals sub) acc
   AnyDocsSingle Nothing -> pure acc -- hidden/internal
   AnyDocsSingle (Just d) -> do
     index <- get
     modify (+ 1)
     pure
       $ f index acc
-      $ Right
       $ Described
         { item = d
         , optionality = maybe Required Defaulted (setDocDefault d)
@@ -125,13 +125,14 @@
         }
  where
   -- This is crazy wrong but I keep adding shit based on test cases
-  fForOr i m e = f i m $ (<$> e) $ \d ->
-    d
-      { optionality = case d.optionality of
-          Required -> Optional
-          o -> o
-      , multiple = null $ setDocDasheds d.item
-      }
+  fForOr i m d =
+    f i m
+      $ d
+        { optionality = case d.optionality of
+            Required -> Optional
+            o -> o
+        , multiple = null $ setDocDasheds d.item
+        }
 
 exampleMdoc :: NonEmpty String -> Mdoc
 exampleMdoc = Mdoc . map (TextLine . esc . pack) . toList
