diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,11 @@
 # Revision history for heist-extra
 
+## 0.3.0.0 (2023-08-09)
+
+- `treeSplice`: pass children to sortKey function (#2)
+- Remove video format hack (#4)
+- Require `pandoc-types >= 1.23` (adds `Figure` block support)
+
 ## 0.2.0.0 (2022-11-14)
 
 - Drop `heist-emanote`, and depend instead of the updated `heist` package.
diff --git a/README.md b/README.md
--- a/README.md
+++ b/README.md
@@ -2,7 +2,7 @@
 
 [![Hackage](https://img.shields.io/hackage/v/heist-extra.svg?logo=haskell)](https://hackage.haskell.org/package/heist-extra)
 
-Extensions on top of [heist](https://srid.ca/heist-start), that are especially useful for [Ema](https://ema.srid.ca/) apps.
+Extra functionality for [heist](https://srid.ca/heist-start) that are especially useful for [Ema](https://ema.srid.ca/) apps.
 
 ## Getting Started
 
@@ -15,4 +15,4 @@
 | Example                                    | Use cases                                  |
 | ------------------------------------------ | ------------------------------------------ |
 | https://github.com/EmaApps/timedot-invoice | Template file management                   |
-| https://github.com/EmaApps/emanote         | Template file management; Pandoc rendering |
+| https://github.com/srid/emanote            | Template file management; Pandoc rendering |
diff --git a/heist-extra.cabal b/heist-extra.cabal
--- a/heist-extra.cabal
+++ b/heist-extra.cabal
@@ -1,6 +1,6 @@
 cabal-version:      2.4
 name:               heist-extra
-version:            0.2.0.0
+version:            0.3.0.0
 license:            MIT
 copyright:          2022 Sridhar Ratnakumar
 maintainer:         srid@srid.ca
@@ -12,9 +12,9 @@
 
 bug-reports:        https://github.com/srid/heist-extra
 extra-source-files:
+  CHANGELOG.md
   LICENSE
   README.md
-  CHANGELOG.md
 
 common shared
   ghc-options:
@@ -69,13 +69,13 @@
     ViewPatterns
 
   build-depends:
-    , base          >=4.13.0.0 && <=4.18.0.0
+    , base          >=4.13.0.0 && <4.18.0.0.0
     , data-default
     , filepath
     , heist         >=1.1.1.0
     , map-syntax
     , mtl
-    , pandoc-types
+    , pandoc-types  >=1.23
     , relude        >=1.0
     , xmlhtml
 
diff --git a/src/Heist/Extra.hs b/src/Heist/Extra.hs
--- a/src/Heist/Extra.hs
+++ b/src/Heist/Extra.hs
@@ -13,8 +13,8 @@
     HI.runNode node <&> \case
       [resNode]
         | X.elementTag resNode == X.elementTag node ->
-          -- Get rid of the `node` itself.
-          X.elementChildren resNode
+            -- Get rid of the `node` itself.
+            X.elementChildren resNode
       res ->
         res
 
diff --git a/src/Heist/Extra/Splices/List.hs b/src/Heist/Extra/Splices/List.hs
--- a/src/Heist/Extra/Splices/List.hs
+++ b/src/Heist/Extra/Splices/List.hs
@@ -10,6 +10,6 @@
   if null xs
     then pure mempty
     else HI.runChildrenWith $ do
-      childTag
-        ## (HI.runChildrenWith . childSplice)
+      childTag ##
+        (HI.runChildrenWith . childSplice)
           `foldMapM` xs
diff --git a/src/Heist/Extra/Splices/Pandoc/Footnotes.hs b/src/Heist/Extra/Splices/Pandoc/Footnotes.hs
--- a/src/Heist/Extra/Splices/Pandoc/Footnotes.hs
+++ b/src/Heist/Extra/Splices/Pandoc/Footnotes.hs
@@ -36,8 +36,8 @@
     let footnotesWithIdx = zip [1 :: Int ..] fs
     Just $
       runCustomNode renderNode $ do
-        "footnote"
-          ## (HI.runChildrenWith . uncurry (footnoteSplices ctx)) `foldMapM` footnotesWithIdx
+        "footnote" ##
+          (HI.runChildrenWith . uncurry (footnoteSplices ctx)) `foldMapM` footnotesWithIdx
 
 footnoteSplices :: RenderCtx -> Int -> [B.Block] -> H.Splices (HI.Splice Identity)
 footnoteSplices ctx idx bs = do
diff --git a/src/Heist/Extra/Splices/Pandoc/Render.hs b/src/Heist/Extra/Splices/Pandoc/Render.hs
--- a/src/Heist/Extra/Splices/Pandoc/Render.hs
+++ b/src/Heist/Extra/Splices/Pandoc/Render.hs
@@ -56,21 +56,12 @@
       one . X.Element "div" (rpAttr $ bAttr b) $
         one . X.Element "pre" mempty $
           one . X.Element "code" (rpAttr (id', classes, attrs)) $
-            one $ X.TextNode s
+            one $
+              X.TextNode s
   B.RawBlock (B.Format fmt) s -> do
     pure $ case fmt of
       "html" ->
         rawNode "div" s
-      "video" ->
-        -- HACK format. TODO: replace with ![[foo.mp4]]
-        one . X.Element "video" [("autoplay", ""), ("loop", ""), ("muted", "")] $
-          one . X.Element "source" [("src", T.strip s)] $
-            one . X.Element "p" mempty $
-              [ X.TextNode "Your browser doesn't support HTML5 video. Here is a "
-              , X.Element "a" [("href", T.strip s)] $
-                  one . X.TextNode $ "link to the video"
-              , X.TextNode " instead."
-              ]
       _ ->
         one . X.Element "pre" [("class", "pandoc-raw-" <> show fmt)] $ one . X.TextNode $ s
   B.BlockQuote bs ->
@@ -123,8 +114,9 @@
   B.Div attr bs ->
     one . X.Element (getTag "div" attr) (rpAttr $ rewriteClass ctx attr)
       <$> foldMapM (rpBlock ctx) bs
-  B.Null ->
-    pure []
+  B.Figure attr _caption bs ->
+    -- TODO: support caption
+    one . X.Element "figure" (rpAttr attr) <$> foldMapM (rpBlock ctx) bs
   where
     getTag defaultTag (_, _, Map.fromList -> attrs) =
       Map.lookup "tag" attrs & fromMaybe defaultTag
@@ -194,7 +186,8 @@
   B.Code attr s ->
     pure $
       one . X.Element "code" (rpAttr $ concatAttr attr $ iAttr i) $
-        one . X.TextNode $ s
+        one . X.TextNode $
+          s
   B.Space -> pure $ one . X.TextNode $ " "
   B.SoftBreak -> pure $ one . X.TextNode $ " "
   B.LineBreak ->
@@ -205,17 +198,20 @@
       else
         pure $
           one . X.Element "pre" [("class", "pandoc-raw-" <> show fmt)] $
-            one . X.TextNode $ s
+            one . X.TextNode $
+              s
   B.Math mathType s ->
     case mathType of
       B.InlineMath ->
         pure $
           one . X.Element "span" [("class", "math inline")] $
-            one . X.TextNode $ "\\(" <> s <> "\\)"
+            one . X.TextNode $
+              "\\(" <> s <> "\\)"
       B.DisplayMath ->
         pure $
           one . X.Element "span" [("class", "math display")] $
-            one . X.TextNode $ "$$" <> s <> "$$"
+            one . X.TextNode $
+              "$$" <> s <> "$$"
   B.Link attr is (url, tit) -> do
     let attrs =
           catMaybes [Just ("href", url), guard (not $ T.null tit) >> pure ("title", tit)]
@@ -272,7 +268,8 @@
 rawNode :: Text -> Text -> [X.Node]
 rawNode wrapperTag s =
   one . X.Element wrapperTag (one ("xmlhtmlRaw", "")) $
-    one . X.TextNode $ s
+    one . X.TextNode $
+      s
 
 -- | Convert Pandoc AST inlines to raw text.
 plainify :: [B.Inline] -> Text
diff --git a/src/Heist/Extra/Splices/Tree.hs b/src/Heist/Extra/Splices/Tree.hs
--- a/src/Heist/Extra/Splices/Tree.hs
+++ b/src/Heist/Extra/Splices/Tree.hs
@@ -10,7 +10,7 @@
   forall a sortKey.
   (Ord sortKey) =>
   -- | How to sort children
-  (NonEmpty a -> sortKey) ->
+  (NonEmpty a -> [Tree a] -> sortKey) ->
   -- | Input tree
   [Tree a] ->
   -- | How to render a (sub-)tree root
@@ -19,14 +19,16 @@
 treeSplice =
   go []
   where
-    go :: [a] -> (NonEmpty a -> sortKey) -> [Tree a] -> (NonEmpty a -> [Tree a] -> H.Splices (HI.Splice Identity)) -> HI.Splice Identity
+    go :: [a] -> (NonEmpty a -> [Tree a] -> sortKey) -> [Tree a] -> (NonEmpty a -> [Tree a] -> H.Splices (HI.Splice Identity)) -> HI.Splice Identity
     go pars sortKey trees childSplice = do
       let extendPars x = maybe (one x) (<> one x) $ nonEmpty pars
-      flip foldMapM (sortOn (sortKey . extendPars . rootLabel) trees) $ \(Node lbl children) -> do
+          nodeKey x = sortKey (extendPars $ rootLabel x) (subForest x)
+      flip foldMapM (sortOn nodeKey trees) $ \(Node lbl children) -> do
         HI.runChildrenWith $ do
           let herePath = extendPars lbl
           childSplice herePath children
           "has-children" ## Heist.ifElseISplice (not . null $ children)
-          let childrenSorted = sortOn (sortKey . (herePath <>) . one . rootLabel) children
-          "children"
-            ## go (toList herePath) sortKey childrenSorted childSplice
+          let childKey x = sortKey (herePath <> one (rootLabel x)) (subForest x)
+              childrenSorted = sortOn childKey children
+          "children" ##
+            go (toList herePath) sortKey childrenSorted childSplice
