diff --git a/worker/imap/cache.go b/worker/imap/cache.go
index 62d450e..3c807c5 100644
--- a/worker/imap/cache.go
+++ b/worker/imap/cache.go
@@ -126,7 +126,8 @@ func (w *IMAPWorker) getCachedHeaders(msg *types.FetchMessageHeaders) []uint32 {
 		}, nil)
 	}
 	if len(found) > 0 {
-		w.worker.PostAction(&types.FetchMessageFlags{
+		// Post in a separate goroutine to prevent deadlocking
+		go w.worker.PostAction(&types.FetchMessageFlags{
 			Uids: found,
 		}, nil)
 	}
diff --git a/worker/imap/flags.go b/worker/imap/flags.go
index bda47e9..0cd0bb7 100644
--- a/worker/imap/flags.go
+++ b/worker/imap/flags.go
@@ -48,7 +48,8 @@ func (imapw *IMAPWorker) handleAnsweredMessages(msg *types.AnsweredMessages) {
 		emitErr(err)
 		return
 	}
-	imapw.worker.PostAction(&types.FetchMessageHeaders{
+	// Post in a separate goroutine to prevent deadlocking
+	go imapw.worker.PostAction(&types.FetchMessageHeaders{
 		Uids: msg.Uids,
 	}, func(_msg types.WorkerMessage) {
 		switch m := _msg.(type) {
@@ -79,7 +80,8 @@ func (imapw *IMAPWorker) handleFlagMessages(msg *types.FlagMessages) {
 		emitErr(err)
 		return
 	}
-	imapw.worker.PostAction(&types.FetchMessageHeaders{
+	// Post in a separate goroutine to prevent deadlocking
+	go imapw.worker.PostAction(&types.FetchMessageHeaders{
 		Uids: msg.Uids,
 	}, func(_msg types.WorkerMessage) {
 		switch m := _msg.(type) {
diff --git a/worker/types/worker.go b/worker/types/worker.go
index 9e24798..ba396aa 100644
--- a/worker/types/worker.go
+++ b/worker/types/worker.go
@@ -35,6 +35,8 @@ func (worker *Worker) setId(msg WorkerMessage) {
 	msg.setId(id)
 }
 
+// PostAction posts an action to the worker. This method should not be called
+// from the same goroutine that the worker runs in or deadlocks may occur
 func (worker *Worker) PostAction(msg WorkerMessage, cb func(msg WorkerMessage)) {
 	worker.setId(msg)
 
@@ -50,6 +52,8 @@ func (worker *Worker) PostAction(msg WorkerMessage, cb func(msg WorkerMessage))
 	}
 }
 
+// PostMessage posts an message to the UI. This method should not be called
+// from the same goroutine that the UI runs in or deadlocks may occur
 func (worker *Worker) PostMessage(msg WorkerMessage,
 	cb func(msg WorkerMessage),
 ) {