diff --git a/src/core/markdown.py b/src/core/markdown.py
index 16bd05b296143a0685ccbd1a4fdd70526bf72e27..95246a86fbfc492844a74c759c3ebdd1b1c4ebb3 100644
--- a/src/core/markdown.py
+++ b/src/core/markdown.py
@@ -35,7 +35,7 @@ class PageLink(SpanToken):
 
 
 class ProfileLink(SpanToken):
-    pattern = re.compile(r'(?<!\S)@([-a-zA-Z0-9_]+)')
+    pattern = re.compile(r'(?<!\S)@([-a-zA-Z0-9_]+)(?=\s|$)')
     parse_inner = False
 
     def __init__(self, match):
diff --git a/src/core/tests/markdown.py b/src/core/tests/markdown.py
index 0ab5b990e0ca4172ed7c90e3eb65d1fd24645e7d..de008cd8a96d7a1172c716c8b6328b276a1fec65 100644
--- a/src/core/tests/markdown.py
+++ b/src/core/tests/markdown.py
@@ -90,6 +90,10 @@ class MarkdownTest(TestCase):
         self.assertEqual(render_markdown(conf, '@nonexisting_user'), '<p><a href="/en/user/nonexisting_user/" class="internal">@nonexisting_user</a></p>\n')
         self.assertEqual(render_markdown(conf, 'foo@bar'), '<p>foo@bar</p>\n')
         self.assertEqual(render_markdown(conf, '@"'), '<p>@"</p>\n')
+        # ignores element handles
+        self.assertEqual(render_markdown(conf, '@foo:bar.org'), '<p>@foo:bar.org</p>\n')
+        # ignores mastodon handles
+        self.assertEqual(render_markdown(conf, '@test@chaos.social'), '<p>@test@chaos.social</p>\n')
 
         self.assertEqual(render_markdown_ex(conf, '@existing_user').linked_user_slugs, {'existing_user'})
         self.assertEqual(render_markdown_ex(conf, '@nonexisting_user').linked_user_slugs, {'nonexisting_user'})