diff --git a/app/templates/base.html b/app/templates/base.html
index 5ea81870..6f55245a 100644
--- a/app/templates/base.html
+++ b/app/templates/base.html
@@ -197,6 +197,7 @@
+
{{ _('You will be notified of replies to these comments') }}
+ {% for reply in entities.items %}
+
+
+
+
+ {% with comment=dict(comment=reply) %}
+ {% include 'post/_reply_notification_toggle.html' %}
+ {% endwith %}
+
+
+
+ {% else %}
+
{{ _('You have not subscribed to any comments. Use the bell icon on each comment to do so.') }}
+ {% endfor %}
+
+
diff --git a/app/templates/user/alerts/_communities.html b/app/templates/user/alerts/_communities.html
new file mode 100644
index 00000000..421cbcba
--- /dev/null
+++ b/app/templates/user/alerts/_communities.html
@@ -0,0 +1,19 @@
+{% include 'user/alerts/_filter.html' %}
+
+
{{ _('You will be notified of new posts in these communities') }}
+ {% for community in entities.items %}
+
+
+
+
+ {% include 'community/_notification_toggle.html' %}
+
+
+
+ {% else %}
+
{{ _('You have not subscribed to an alert for new content in any communities. Use the bell icon in each community to do so.') }}
+ {% endfor %}
+
+
diff --git a/app/templates/user/alerts/_filter.html b/app/templates/user/alerts/_filter.html
new file mode 100644
index 00000000..c6cb0197
--- /dev/null
+++ b/app/templates/user/alerts/_filter.html
@@ -0,0 +1,11 @@
+
+
{{ _('You will be notified of top-level replies to these posts') }}
+ {% for post in entities.items %}
+
+
+
+
+ {% include 'post/_post_notification_toggle.html' %}
+
+
+
+ {% else %}
+
{{ _('You have not subscribed to any posts. Use the bell icon on each post to do so.') }}
+ {% endfor %}
+
+
diff --git a/app/templates/user/alerts/_topics.html b/app/templates/user/alerts/_topics.html
new file mode 100644
index 00000000..9e008e83
--- /dev/null
+++ b/app/templates/user/alerts/_topics.html
@@ -0,0 +1,18 @@
+
+
{{ _('You will be notified of new posts in communities covered by these topics') }}
+ {% for topic in entities.items -%}
+
+
+
+
+ {% include 'topic/_notification_toggle.html' -%}
+
+
+
+ {% else -%}
+
{{ _('You have not subscribed to any topics. Use the bell icon on each topic to do so.') }}
+ {% endfor -%}
+
+
diff --git a/app/templates/user/alerts/_type.html b/app/templates/user/alerts/_type.html
new file mode 100644
index 00000000..6e06d535
--- /dev/null
+++ b/app/templates/user/alerts/_type.html
@@ -0,0 +1,17 @@
+
+
{{ _('You will be notified of new posts by these users') }}
+ {% for user in entities.items %}
+
+
+
+
+ {% include 'user/_notification_toggle.html' %}
+
+
+
+ {% else %}
+
{{ _('You have not subscribed to an alert for new content from any users. Use the bell icon on each person to do so.') }}
+ {% endfor %}
+
+
diff --git a/app/user/routes.py b/app/user/routes.py
index 8f3b15f8..8815a6de 100644
--- a/app/user/routes.py
+++ b/app/user/routes.py
@@ -12,12 +12,11 @@ from app.activitypub.signature import post_request, default_context
from app.activitypub.util import find_actor_or_create
from app.auth.util import random_token
from app.community.util import save_icon_file, save_banner_file, retrieve_mods_and_backfill
-from app.constants import SUBSCRIPTION_MEMBER, SUBSCRIPTION_PENDING, NOTIF_USER, POST_TYPE_VIDEO, POST_TYPE_LINK, \
- POST_TYPE_IMAGE, POST_TYPE_POLL
+from app.constants import *
from app.email import send_verification_email
from app.models import Post, Community, CommunityMember, User, PostReply, PostVote, Notification, utcnow, File, Site, \
Instance, Report, UserBlock, CommunityBan, CommunityJoinRequest, CommunityBlock, Filter, Domain, DomainBlock, \
- InstanceBlock, NotificationSubscription, PostBookmark, PostReplyBookmark, read_posts
+ InstanceBlock, NotificationSubscription, PostBookmark, PostReplyBookmark, read_posts, Topic
from app.user import bp
from app.user.forms import ProfileForm, SettingsForm, DeleteAccountForm, ReportUserForm, \
FilterForm, KeywordFilterEditForm, RemoteFollowForm, ImportExportForm
@@ -1143,6 +1142,86 @@ def user_bookmarks_comments():
next_url=next_url, prev_url=prev_url)
+@bp.route('/alerts')
+@bp.route('/alerts/