diff --git a/wasm/dm.go b/wasm/dm.go
index 27d1e81dfc3fcaac51bdd91d6ace2b262038cb3e..0328a2090604b68eede3109c3fccfbc97a0e53b7 100644
--- a/wasm/dm.go
+++ b/wasm/dm.go
@@ -322,7 +322,7 @@ func (dmc *DMClient) SendText(_ js.Value, args []js.Value) any {
 
 	jww.DEBUG.Printf("SendText(%s, %d, %s...)",
 		base64.RawStdEncoding.EncodeToString(partnerPubKeyBytes)[:8],
-		partnerToken, message[:10])
+		partnerToken, truncate(message, 10))
 
 	promiseFn := func(resolve, reject func(args ...any) js.Value) {
 		sendReport, err := dmc.api.SendText(partnerPubKeyBytes,
@@ -381,7 +381,7 @@ func (dmc *DMClient) SendReply(_ js.Value, args []js.Value) any {
 		base64.RawStdEncoding.EncodeToString(partnerPubKeyBytes)[:8],
 		partnerToken,
 		base64.RawStdEncoding.EncodeToString(replyID),
-		message[:10])
+		truncate(message, 10))
 
 	promiseFn := func(resolve, reject func(args ...any) js.Value) {
 		sendReport, err := dmc.api.SendReply(partnerPubKeyBytes,
@@ -428,7 +428,7 @@ func (dmc *DMClient) SendReaction(_ js.Value, args []js.Value) any {
 		base64.RawStdEncoding.EncodeToString(partnerPubKeyBytes)[:8],
 		partnerToken,
 		base64.RawStdEncoding.EncodeToString(replyID),
-		message[:10])
+		truncate(message, 10))
 
 	promiseFn := func(resolve, reject func(args ...any) js.Value) {
 		sendReport, err := dmc.api.SendReaction(partnerPubKeyBytes,
@@ -951,3 +951,12 @@ func (c *DMDbCipher) UnmarshalJSON(_ js.Value, args []js.Value) any {
 	}
 	return nil
 }
+
+// truncate truncates the string to length n. If the string is trimmed, then
+// ellipses (...) are appended.
+func truncate(s string, n int) string {
+	if len(s)-3 <= n {
+		return s
+	}
+	return s[:n] + "..."
+}
\ No newline at end of file