diff --git a/examples/NanoFeldspar/Core.hs b/examples/NanoFeldspar/Core.hs
--- a/examples/NanoFeldspar/Core.hs
+++ b/examples/NanoFeldspar/Core.hs
@@ -171,13 +171,17 @@
 printExpr :: (Syntactic a, Domain a ~ FeldDomainAll) => a -> IO ()
 printExpr = print . reifySmart (const True) canShareDict
 
--- | Draw the syntax tree using ASCII
+-- | Show the syntax tree using Unicode art
 showAST :: (Syntactic a, Domain a ~ FeldDomainAll) => a -> String
 showAST = Syntactic.showAST . reifySmart (const True) canShareDict
 
--- | Draw the syntax tree on the terminal using ASCII
+-- | Draw the syntax tree on the terminal using Unicode art
 drawAST :: (Syntactic a, Domain a ~ FeldDomainAll) => a -> IO ()
 drawAST = Syntactic.drawAST . reifySmart (const True) canShareDict
+
+-- | Convert the syntax tree to an HTML file with foldable nodes
+writeHtmlAST :: (Syntactic a, Domain a ~ FeldDomain) => a -> IO ()
+writeHtmlAST = Syntactic.writeHtmlAST "tree.html" . desugar
 
 -- | Evaluation
 eval :: (Syntactic a, Domain a ~ FeldDomainAll) => a -> Internal a
diff --git a/src/Language/Syntactic/Constructs/Decoration.hs b/src/Language/Syntactic/Constructs/Decoration.hs
--- a/src/Language/Syntactic/Constructs/Decoration.hs
+++ b/src/Language/Syntactic/Constructs/Decoration.hs
@@ -4,8 +4,10 @@
 
 
 
-import Data.Tree
+import Data.Tree (Tree (..))
 
+import Data.Tree.View
+
 import Language.Syntactic
 
 
@@ -105,7 +107,7 @@
 
 -- | Show an decorated syntax tree using ASCII art
 showDecorWith :: StringTree dom => (forall a. info a -> String) -> ASTF (Decor info dom) a -> String
-showDecorWith showInfo = drawTree . stringTreeDecor showInfo
+showDecorWith showInfo = showTree . stringTreeDecor showInfo
 
 -- | Print an decorated syntax tree using ASCII art
 drawDecorWith :: StringTree dom => (forall a. info a -> String) -> ASTF (Decor info dom) a -> IO ()
diff --git a/src/Language/Syntactic/Interpretation/Render.hs b/src/Language/Syntactic/Interpretation/Render.hs
--- a/src/Language/Syntactic/Interpretation/Render.hs
+++ b/src/Language/Syntactic/Interpretation/Render.hs
@@ -5,12 +5,15 @@
     , stringTree
     , showAST
     , drawAST
+    , writeHtmlAST
     ) where
 
 
 
-import Data.Tree
+import Data.Tree (Tree (..))
 
+import Data.Tree.View
+
 import Language.Syntactic.Syntax
 
 
@@ -70,9 +73,12 @@
 
 -- | Show a syntax tree using ASCII art
 showAST :: StringTree dom => ASTF dom a -> String
-showAST = drawTree . stringTree
+showAST = showTree . stringTree
 
 -- | Print a syntax tree using ASCII art
 drawAST :: StringTree dom => ASTF dom a -> IO ()
 drawAST = putStrLn . showAST
+
+writeHtmlAST :: StringTree sym => FilePath -> ASTF sym a -> IO ()
+writeHtmlAST file = writeHtmlTree file . fmap (\n -> NodeInfo n "") . stringTree
 
diff --git a/syntactic.cabal b/syntactic.cabal
--- a/syntactic.cabal
+++ b/syntactic.cabal
@@ -1,5 +1,5 @@
 Name:           syntactic
-Version:        1.9
+Version:        1.10
 Synopsis:       Generic abstract syntax, and utilities for embedded languages
 Description:    This library provides:
                 .
@@ -107,6 +107,7 @@
     mtl >= 2 && < 3,
     template-haskell,
     transformers >= 0.2,
+    tree-view,
     tuple >= 0.2
 
   hs-source-dirs: src
@@ -197,6 +198,5 @@
     bytestring,
     mtl >= 2 && < 3,
     tasty,
-    tasty-golden
-
-
+    tasty-golden,
+    utf8-string
diff --git a/tests/NanoFeldsparTree.hs b/tests/NanoFeldsparTree.hs
--- a/tests/NanoFeldsparTree.hs
+++ b/tests/NanoFeldsparTree.hs
@@ -1,35 +1,35 @@
 import Test.Tasty
 import Test.Tasty.Golden
 
-import qualified Data.ByteString.Lazy.Char8 as B
+import Data.ByteString.Lazy.UTF8 (fromString)
 
 import NanoFeldspar.Core (showAST)
 import NanoFeldspar.Test
 
 
 
-mkGold_scProd = B.writeFile "tests/gold/scProd.txt" $ B.pack $ showAST scProd
-mkGold_matMul = B.writeFile "tests/gold/matMul.txt" $ B.pack $ showAST matMul
-mkGold_prog1  = B.writeFile "tests/gold/prog1.txt"  $ B.pack $ showAST prog1
-mkGold_prog2  = B.writeFile "tests/gold/prog2.txt"  $ B.pack $ showAST prog2
-mkGold_prog3  = B.writeFile "tests/gold/prog3.txt"  $ B.pack $ showAST prog3
-mkGold_prog4  = B.writeFile "tests/gold/prog4.txt"  $ B.pack $ showAST prog4
-mkGold_prog5  = B.writeFile "tests/gold/prog5.txt"  $ B.pack $ showAST prog5
-mkGold_prog6  = B.writeFile "tests/gold/prog6.txt"  $ B.pack $ showAST prog6
-mkGold_prog7  = B.writeFile "tests/gold/prog7.txt"  $ B.pack $ showAST prog7
-mkGold_prog8  = B.writeFile "tests/gold/prog8.txt"  $ B.pack $ showAST prog8
+mkGold_scProd = writeFile "tests/gold/scProd.txt" $ showAST scProd
+mkGold_matMul = writeFile "tests/gold/matMul.txt" $ showAST matMul
+mkGold_prog1  = writeFile "tests/gold/prog1.txt"  $ showAST prog1
+mkGold_prog2  = writeFile "tests/gold/prog2.txt"  $ showAST prog2
+mkGold_prog3  = writeFile "tests/gold/prog3.txt"  $ showAST prog3
+mkGold_prog4  = writeFile "tests/gold/prog4.txt"  $ showAST prog4
+mkGold_prog5  = writeFile "tests/gold/prog5.txt"  $ showAST prog5
+mkGold_prog6  = writeFile "tests/gold/prog6.txt"  $ showAST prog6
+mkGold_prog7  = writeFile "tests/gold/prog7.txt"  $ showAST prog7
+mkGold_prog8  = writeFile "tests/gold/prog8.txt"  $ showAST prog8
 
 tests = testGroup "TreeTests"
-    [ goldenVsString "scProd" "tests/gold/scProd.txt" $ return $ B.pack $ showAST scProd
-    , goldenVsString "matMul" "tests/gold/matMul.txt" $ return $ B.pack $ showAST matMul
-    , goldenVsString "prog1"  "tests/gold/prog1.txt"  $ return $ B.pack $ showAST prog1
-    , goldenVsString "prog2"  "tests/gold/prog2.txt"  $ return $ B.pack $ showAST prog2
-    , goldenVsString "prog3"  "tests/gold/prog3.txt"  $ return $ B.pack $ showAST prog3
-    , goldenVsString "prog4"  "tests/gold/prog4.txt"  $ return $ B.pack $ showAST prog4
-    , goldenVsString "prog5"  "tests/gold/prog5.txt"  $ return $ B.pack $ showAST prog5
-    , goldenVsString "prog6"  "tests/gold/prog6.txt"  $ return $ B.pack $ showAST prog6
-    , goldenVsString "prog7"  "tests/gold/prog7.txt"  $ return $ B.pack $ showAST prog7
-    , goldenVsString "prog8"  "tests/gold/prog8.txt"  $ return $ B.pack $ showAST prog8
+    [ goldenVsString "scProd" "tests/gold/scProd.txt" $ return $ fromString $ showAST scProd
+    , goldenVsString "matMul" "tests/gold/matMul.txt" $ return $ fromString $ showAST matMul
+    , goldenVsString "prog1"  "tests/gold/prog1.txt"  $ return $ fromString $ showAST prog1
+    , goldenVsString "prog2"  "tests/gold/prog2.txt"  $ return $ fromString $ showAST prog2
+    , goldenVsString "prog3"  "tests/gold/prog3.txt"  $ return $ fromString $ showAST prog3
+    , goldenVsString "prog4"  "tests/gold/prog4.txt"  $ return $ fromString $ showAST prog4
+    , goldenVsString "prog5"  "tests/gold/prog5.txt"  $ return $ fromString $ showAST prog5
+    , goldenVsString "prog6"  "tests/gold/prog6.txt"  $ return $ fromString $ showAST prog6
+    , goldenVsString "prog7"  "tests/gold/prog7.txt"  $ return $ fromString $ showAST prog7
+    , goldenVsString "prog8"  "tests/gold/prog8.txt"  $ return $ fromString $ showAST prog8
     ]
 
 main = defaultMain tests
diff --git a/tests/gold/matMul.txt b/tests/gold/matMul.txt
--- a/tests/gold/matMul.txt
+++ b/tests/gold/matMul.txt
@@ -1,87 +1,44 @@
 Lambda 0
-|
-`- Lambda 1
-   |
-   `- Let 6
-      |
-      +- arrLength
-      |  |
-      |  `- getIx
-      |     |
-      |     +- var:1
-      |     |
-      |     `- 0
-      |
-      `- Let 7
-         |
-         +- arrLength
-         |  |
-         |  `- var:1
-         |
-         `- parallel
-            |
-            +- arrLength
-            |  |
-            |  `- var:0
-            |
-            `- Lambda 2
-               |
-               `- Let 8
-                  |
-                  +- min
-                  |  |
-                  |  +- arrLength
-                  |  |  |
-                  |  |  `- getIx
-                  |  |     |
-                  |  |     +- var:0
-                  |  |     |
-                  |  |     `- var:2
-                  |  |
-                  |  `- var:7
-                  |
-                  `- Let 9
-                     |
-                     +- getIx
-                     |  |
-                     |  +- var:0
-                     |  |
-                     |  `- var:2
-                     |
-                     `- parallel
-                        |
-                        +- var:6
-                        |
-                        `- Lambda 3
-                           |
-                           `- forLoop
-                              |
-                              +- var:8
-                              |
-                              +- 0.0
-                              |
-                              `- Lambda 4
-                                 |
-                                 `- Lambda 5
-                                    |
-                                    `- (+)
-                                       |
-                                       +- (*)
-                                       |  |
-                                       |  +- getIx
-                                       |  |  |
-                                       |  |  +- var:9
-                                       |  |  |
-                                       |  |  `- var:4
-                                       |  |
-                                       |  `- getIx
-                                       |     |
-                                       |     +- getIx
-                                       |     |  |
-                                       |     |  +- var:1
-                                       |     |  |
-                                       |     |  `- var:4
-                                       |     |
-                                       |     `- var:3
-                                       |
-                                       `- var:5
+ └╴Lambda 1
+    └╴Let 6
+       ├╴arrLength
+       │  └╴getIx
+       │     ├╴var:1
+       │     └╴0
+       └╴Let 7
+          ├╴arrLength
+          │  └╴var:1
+          └╴parallel
+             ├╴arrLength
+             │  └╴var:0
+             └╴Lambda 2
+                └╴Let 8
+                   ├╴min
+                   │  ├╴arrLength
+                   │  │  └╴getIx
+                   │  │     ├╴var:0
+                   │  │     └╴var:2
+                   │  └╴var:7
+                   └╴Let 9
+                      ├╴getIx
+                      │  ├╴var:0
+                      │  └╴var:2
+                      └╴parallel
+                         ├╴var:6
+                         └╴Lambda 3
+                            └╴forLoop
+                               ├╴var:8
+                               ├╴0.0
+                               └╴Lambda 4
+                                  └╴Lambda 5
+                                     └╴(+)
+                                        ├╴(*)
+                                        │  ├╴getIx
+                                        │  │  ├╴var:9
+                                        │  │  └╴var:4
+                                        │  └╴getIx
+                                        │     ├╴getIx
+                                        │     │  ├╴var:1
+                                        │     │  └╴var:4
+                                        │     └╴var:3
+                                        └╴var:5
diff --git a/tests/gold/prog1.txt b/tests/gold/prog1.txt
--- a/tests/gold/prog1.txt
+++ b/tests/gold/prog1.txt
@@ -1,19 +1,10 @@
 Lambda 0
-|
-`- Lambda 1
-   |
-   `- parallel
-      |
-      +- var:0
-      |
-      `- Lambda 2
-         |
-         `- min
-            |
-            +- (+)
-            |  |
-            |  +- var:2
-            |  |
-            |  `- 3
-            |
-            `- var:1
+ └╴Lambda 1
+    └╴parallel
+       ├╴var:0
+       └╴Lambda 2
+          └╴min
+             ├╴(+)
+             │  ├╴var:2
+             │  └╴3
+             └╴var:1
diff --git a/tests/gold/prog2.txt b/tests/gold/prog2.txt
--- a/tests/gold/prog2.txt
+++ b/tests/gold/prog2.txt
@@ -1,15 +1,8 @@
 Lambda 0
-|
-`- Let 1
-   |
-   +- min
-   |  |
-   |  +- var:0
-   |  |
-   |  `- var:0
-   |
-   `- max
-      |
-      +- var:1
-      |
-      `- var:1
+ └╴Let 1
+    ├╴min
+    │  ├╴var:0
+    │  └╴var:0
+    └╴max
+       ├╴var:1
+       └╴var:1
diff --git a/tests/gold/prog3.txt b/tests/gold/prog3.txt
--- a/tests/gold/prog3.txt
+++ b/tests/gold/prog3.txt
@@ -1,59 +1,30 @@
 Lambda 0
-|
-`- Lambda 1
-   |
-   `- Let 4
-      |
-      +- (+)
-      |  |
-      |  +- (-)
-      |  |  |
-      |  |  +- max
-      |  |  |  |
-      |  |  |  +- var:0
-      |  |  |  |
-      |  |  |  `- var:1
-      |  |  |
-      |  |  `- min
-      |  |     |
-      |  |     +- var:0
-      |  |     |
-      |  |     `- var:1
-      |  |
-      |  `- 1
-      |
-      `- Let 5
-         |
-         +- min
-         |  |
-         |  +- var:0
-         |  |
-         |  `- var:1
-         |
-         `- forLoop
-            |
-            +- var:4
-            |
-            +- 0
-            |
-            `- Lambda 2
-               |
-               `- Lambda 3
-                  |
-                  `- (+)
-                     |
-                     +- (+)
-                     |  |
-                     |  +- (-)
-                     |  |  |
-                     |  |  +- (-)
-                     |  |  |  |
-                     |  |  |  +- var:4
-                     |  |  |  |
-                     |  |  |  `- var:2
-                     |  |  |
-                     |  |  `- 1
-                     |  |
-                     |  `- var:5
-                     |
-                     `- var:3
+ └╴Lambda 1
+    └╴Let 4
+       ├╴(+)
+       │  ├╴(-)
+       │  │  ├╴max
+       │  │  │  ├╴var:0
+       │  │  │  └╴var:1
+       │  │  └╴min
+       │  │     ├╴var:0
+       │  │     └╴var:1
+       │  └╴1
+       └╴Let 5
+          ├╴min
+          │  ├╴var:0
+          │  └╴var:1
+          └╴forLoop
+             ├╴var:4
+             ├╴0
+             └╴Lambda 2
+                └╴Lambda 3
+                   └╴(+)
+                      ├╴(+)
+                      │  ├╴(-)
+                      │  │  ├╴(-)
+                      │  │  │  ├╴var:4
+                      │  │  │  └╴var:2
+                      │  │  └╴1
+                      │  └╴var:5
+                      └╴var:3
diff --git a/tests/gold/prog4.txt b/tests/gold/prog4.txt
--- a/tests/gold/prog4.txt
+++ b/tests/gold/prog4.txt
@@ -1,21 +1,11 @@
 Lambda 0
-|
-`- Let 2
-   |
-   +- (+)
-   |  |
-   |  +- var:0
-   |  |
-   |  `- var:0
-   |
-   `- parallel
-      |
-      +- var:0
-      |
-      `- Lambda 1
-         |
-         `- (*)
-            |
-            +- var:2
-            |
-            `- var:1
+ └╴Let 2
+    ├╴(+)
+    │  ├╴var:0
+    │  └╴var:0
+    └╴parallel
+       ├╴var:0
+       └╴Lambda 1
+          └╴(*)
+             ├╴var:2
+             └╴var:1
diff --git a/tests/gold/prog5.txt b/tests/gold/prog5.txt
--- a/tests/gold/prog5.txt
+++ b/tests/gold/prog5.txt
@@ -1,43 +1,22 @@
 Lambda 0
-|
-`- Let 1
-   |
-   +- tup2
-   |  |
-   |  +- (*)
-   |  |  |
-   |  |  +- var:0
-   |  |  |
-   |  |  `- 2
-   |  |
-   |  `- (*)
-   |     |
-   |     +- var:0
-   |     |
-   |     `- 3
-   |
-   `- Let 2
-      |
-      +- sel1
-      |  |
-      |  `- var:1
-      |
-      `- Let 3
-         |
-         +- sel2
-         |  |
-         |  `- var:1
-         |
-         `- (*)
-            |
-            +- (-)
-            |  |
-            |  +- var:2
-            |  |
-            |  `- var:3
-            |
-            `- (-)
-               |
-               +- var:3
-               |
-               `- var:2
+ └╴Let 1
+    ├╴tup2
+    │  ├╴(*)
+    │  │  ├╴var:0
+    │  │  └╴2
+    │  └╴(*)
+    │     ├╴var:0
+    │     └╴3
+    └╴Let 2
+       ├╴sel1
+       │  └╴var:1
+       └╴Let 3
+          ├╴sel2
+          │  └╴var:1
+          └╴(*)
+             ├╴(-)
+             │  ├╴var:2
+             │  └╴var:3
+             └╴(-)
+                ├╴var:3
+                └╴var:2
diff --git a/tests/gold/prog6.txt b/tests/gold/prog6.txt
--- a/tests/gold/prog6.txt
+++ b/tests/gold/prog6.txt
@@ -1,67 +1,34 @@
 Let 9
-|
-+- parallel
-|  |
-|  +- (+)
-|  |  |
-|  |  +- (-)
-|  |  |  |
-|  |  |  +- 20
-|  |  |  |
-|  |  |  `- 1
-|  |  |
-|  |  `- 1
-|  |
-|  `- Lambda 0
-|     |
-|     `- (+)
-|        |
-|        +- var:0
-|        |
-|        `- 1
-|
-`- Let 10
-   |
-   +- forLoop
-   |  |
-   |  +- arrLength
-   |  |  |
-   |  |  `- var:9
-   |  |
-   |  +- 0
-   |  |
-   |  `- Lambda 2
-   |     |
-   |     `- Lambda 3
-   |        |
-   |        `- (+)
-   |           |
-   |           +- (*)
-   |           |  |
-   |           |  +- getIx
-   |           |  |  |
-   |           |  |  +- var:9
-   |           |  |  |
-   |           |  |  `- var:2
-   |           |  |
-   |           |  `- 2
-   |           |
-   |           `- var:3
-   |
-   `- (+)
-      |
-      +- (+)
-      |  |
-      |  +- (*)
-      |  |  |
-      |  |  +- getIx
-      |  |  |  |
-      |  |  |  +- var:9
-      |  |  |  |
-      |  |  |  `- 1
-      |  |  |
-      |  |  `- 2
-      |  |
-      |  `- var:10
-      |
-      `- var:10
+ ├╴parallel
+ │  ├╴(+)
+ │  │  ├╴(-)
+ │  │  │  ├╴20
+ │  │  │  └╴1
+ │  │  └╴1
+ │  └╴Lambda 0
+ │     └╴(+)
+ │        ├╴var:0
+ │        └╴1
+ └╴Let 10
+    ├╴forLoop
+    │  ├╴arrLength
+    │  │  └╴var:9
+    │  ├╴0
+    │  └╴Lambda 2
+    │     └╴Lambda 3
+    │        └╴(+)
+    │           ├╴(*)
+    │           │  ├╴getIx
+    │           │  │  ├╴var:9
+    │           │  │  └╴var:2
+    │           │  └╴2
+    │           └╴var:3
+    └╴(+)
+       ├╴(+)
+       │  ├╴(*)
+       │  │  ├╴getIx
+       │  │  │  ├╴var:9
+       │  │  │  └╴1
+       │  │  └╴2
+       │  └╴var:10
+       └╴var:10
diff --git a/tests/gold/prog7.txt b/tests/gold/prog7.txt
--- a/tests/gold/prog7.txt
+++ b/tests/gold/prog7.txt
@@ -1,25 +1,13 @@
 Lambda 0
-|
-`- Let 1
-   |
-   +- max
-   |  |
-   |  +- 5
-   |  |
-   |  `- (+)
-   |     |
-   |     +- 6
-   |     |
-   |     `- 7
-   |
-   `- condition
-      |
-      +- (==)
-      |  |
-      |  +- var:0
-      |  |
-      |  `- 10
-      |
-      +- var:1
-      |
-      `- var:1
+ └╴Let 1
+    ├╴max
+    │  ├╴5
+    │  └╴(+)
+    │     ├╴6
+    │     └╴7
+    └╴condition
+       ├╴(==)
+       │  ├╴var:0
+       │  └╴10
+       ├╴var:1
+       └╴var:1
diff --git a/tests/gold/prog8.txt b/tests/gold/prog8.txt
--- a/tests/gold/prog8.txt
+++ b/tests/gold/prog8.txt
@@ -1,39 +1,20 @@
 Lambda 0
-|
-`- Let 3
-   |
-   +- parallel
-   |  |
-   |  +- 10
-   |  |
-   |  `- Lambda 1
-   |     |
-   |     `- (+)
-   |        |
-   |        +- var:1
-   |        |
-   |        `- var:0
-   |
-   `- condition
-      |
-      +- (==)
-      |  |
-      |  +- (*)
-      |  |  |
-      |  |  +- (*)
-      |  |  |  |
-      |  |  |  +- (*)
-      |  |  |  |  |
-      |  |  |  |  +- var:0
-      |  |  |  |  |
-      |  |  |  |  `- var:0
-      |  |  |  |
-      |  |  |  `- var:0
-      |  |  |
-      |  |  `- var:0
-      |  |
-      |  `- 23
-      |
-      +- var:3
-      |
-      `- var:3
+ └╴Let 3
+    ├╴parallel
+    │  ├╴10
+    │  └╴Lambda 1
+    │     └╴(+)
+    │        ├╴var:1
+    │        └╴var:0
+    └╴condition
+       ├╴(==)
+       │  ├╴(*)
+       │  │  ├╴(*)
+       │  │  │  ├╴(*)
+       │  │  │  │  ├╴var:0
+       │  │  │  │  └╴var:0
+       │  │  │  └╴var:0
+       │  │  └╴var:0
+       │  └╴23
+       ├╴var:3
+       └╴var:3
diff --git a/tests/gold/scProd.txt b/tests/gold/scProd.txt
--- a/tests/gold/scProd.txt
+++ b/tests/gold/scProd.txt
@@ -1,39 +1,20 @@
 Lambda 0
-|
-`- Lambda 1
-   |
-   `- forLoop
-      |
-      +- min
-      |  |
-      |  +- arrLength
-      |  |  |
-      |  |  `- var:0
-      |  |
-      |  `- arrLength
-      |     |
-      |     `- var:1
-      |
-      +- 0.0
-      |
-      `- Lambda 2
-         |
-         `- Lambda 3
-            |
-            `- (+)
-               |
-               +- (*)
-               |  |
-               |  +- getIx
-               |  |  |
-               |  |  +- var:0
-               |  |  |
-               |  |  `- var:2
-               |  |
-               |  `- getIx
-               |     |
-               |     +- var:1
-               |     |
-               |     `- var:2
-               |
-               `- var:3
+ └╴Lambda 1
+    └╴forLoop
+       ├╴min
+       │  ├╴arrLength
+       │  │  └╴var:0
+       │  └╴arrLength
+       │     └╴var:1
+       ├╴0.0
+       └╴Lambda 2
+          └╴Lambda 3
+             └╴(+)
+                ├╴(*)
+                │  ├╴getIx
+                │  │  ├╴var:0
+                │  │  └╴var:2
+                │  └╴getIx
+                │     ├╴var:1
+                │     └╴var:2
+                └╴var:3
