diff --git a/briar-desktop/build.gradle.kts b/briar-desktop/build.gradle.kts
index 46303cba6e94d6faa0866160a0a432e4c8e0e8a4..e9bb07b9587309ee9ec4c32705ffbc0df88fa5bf 100644
--- a/briar-desktop/build.gradle.kts
+++ b/briar-desktop/build.gradle.kts
@@ -144,6 +144,7 @@ dependencies {
         exclude(group = "net.java.dev.jna", module = "jna")
     }
 
+    implementation("com.vladsch.flexmark:flexmark-all:0.64.8")
     implementation("com.vladsch.flexmark:flexmark-html2md-converter:0.64.8")
 
     kapt("com.google.dagger:dagger-compiler:$dagger_version")
diff --git a/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/blog/BlogPostView.kt b/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/blog/BlogPostView.kt
index 1578e40444a68f6bc832ffb6a6629c899b0057a0..b173af058213c92dae445635590db9b45726aaec 100644
--- a/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/blog/BlogPostView.kt
+++ b/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/blog/BlogPostView.kt
@@ -54,7 +54,14 @@ import androidx.compose.ui.text.font.FontWeight
 import androidx.compose.ui.text.style.TextAlign
 import androidx.compose.ui.text.style.TextOverflow
 import androidx.compose.ui.unit.dp
+import com.vladsch.flexmark.ast.Text
 import com.vladsch.flexmark.html2md.converter.FlexmarkHtmlConverter
+import com.vladsch.flexmark.parser.Parser
+import com.vladsch.flexmark.util.ast.Document
+import com.vladsch.flexmark.util.ast.NodeVisitor
+import com.vladsch.flexmark.util.ast.VisitHandler
+import com.vladsch.flexmark.util.ast.Visitor
+import com.vladsch.flexmark.util.data.MutableDataSet
 import org.briarproject.bramble.api.sync.GroupId
 import org.briarproject.bramble.api.sync.MessageId
 import org.briarproject.briar.api.blog.BlogCommentHeader
@@ -80,6 +87,7 @@ import org.briarproject.briar.desktop.utils.getRandomId
 import org.briarproject.briar.desktop.utils.getRandomString
 import kotlin.random.Random
 
+
 @Suppress("HardCodedStringLiteral")
 fun main() = preview {
     Column(verticalArrangement = spacedBy(8.dp)) {
@@ -139,6 +147,25 @@ fun main() = preview {
     }
 }
 
+class MarkdownVisitor {
+
+    fun run(document: Document) {
+        visitor.visit(document)
+    }
+
+    // example of visitor for a node or nodes, just add VisitHandlers<> to the list
+    // any node type not handled by the visitor will default to visiting its children
+    var visitor: NodeVisitor = NodeVisitor(
+        VisitHandler(Text::class.java, Visitor { text: Text -> visit(text) })
+    )
+
+    fun visit(text: Text) {
+        val string = text.getChars().unescape()
+        // TODO: do stuff with string
+        visitor.visitChildren(text)
+    }
+}
+
 @Composable
 @OptIn(ExperimentalFoundationApi::class)
 fun BlogPostView(
@@ -151,6 +178,13 @@ fun BlogPostView(
     val text = item.text ?: ""
     val markdown = FlexmarkHtmlConverter.Builder().build().convert(text)
 
+    val options = MutableDataSet()
+    val parser: Parser = Parser.builder(options).build()
+    val md = parser.parse(markdown)
+
+    val visitor = MarkdownVisitor()
+    visitor.run(md)
+
     Row(modifier = Modifier.height(IntrinsicSize.Min)) {
         Column(modifier = Modifier.weight(1f)) {
             BlogPostViewHeader(item, onItemRepeat, onAuthorClicked, Modifier.padding(8.dp))