diff --git a/app/config.py b/app/config.py
index fe691d7..4b6444b 100644
--- a/app/config.py
+++ b/app/config.py
@@ -101,6 +101,7 @@ class Config(pydantic.BaseModel):
secret: str
debug: bool = False
trusted_hosts: list[str] = ["127.0.0.1"]
+ tags: list[str] | None = None
manually_approves_followers: bool = False
privacy_replace: list[_PrivacyReplace] | None = None
metadata: list[_ProfileMetadata] | None = None
diff --git a/app/static/pic.jpg b/app/static/pic.jpg
new file mode 100644
index 0000000..589a138
Binary files /dev/null and b/app/static/pic.jpg differ
diff --git a/app/templates.py b/app/templates.py
index ea4fb26..34b7f57 100644
--- a/app/templates.py
+++ b/app/templates.py
@@ -433,6 +433,7 @@ _templates.env.filters["privacy_replace_url"] = privacy_replace.replace_url
_templates.env.globals["JS_HASH"] = config.JS_HASH
_templates.env.globals["CSS_HASH"] = config.CSS_HASH
_templates.env.globals["BASE_URL"] = config.BASE_URL
+_templates.env.globals["TAGS"] = config.CONFIG.tags
_templates.env.globals["HIDES_FOLLOWERS"] = config.HIDES_FOLLOWERS
_templates.env.globals["HIDES_FOLLOWING"] = config.HIDES_FOLLOWING
_templates.env.globals["NAVBAR_ITEMS"] = config.NavBarItems
diff --git a/app/templates/admin_direct_messages.html b/app/templates/admin_direct_messages.html
deleted file mode 100644
index c6a2319..0000000
--- a/app/templates/admin_direct_messages.html
+++ /dev/null
@@ -1,20 +0,0 @@
-{%- import "utils.html" as utils with context -%}
-{% extends "layout.html" %}
-
-{% block head %}
-
{{ local_actor.display_name }} - Direct messages
-{% endblock %}
-
-{% block content %}
-
-{% for anybox_object, convo, actors in threads %}
-
- {{ utils.display_object(anybox_object) }}
-{% endfor %}
-{% endblock %}
diff --git a/app/templates/admin_inbox.html b/app/templates/admin_inbox.html
deleted file mode 100644
index 221b197..0000000
--- a/app/templates/admin_inbox.html
+++ /dev/null
@@ -1,46 +0,0 @@
-{%- import "utils.html" as utils with context -%}
-{% extends "layout.html" %}
-
-{% block head %}
-{{ local_actor.display_name }} - Inbox
-{% endblock %}
-
-{% block content %}
-
-{% if show_filters %}
-{{ utils.display_box_filters("admin_inbox") }}
-{% endif %}
-
-{% if not inbox %}
-
-{% endif %}
-
-{% for inbox_object in inbox %}
-{% if inbox_object.ap_type == "Announce" %}
- {{ utils.actor_action(inbox_object, "shared", with_icon=True) }}
- {{ utils.display_object(inbox_object.relates_to_anybox_object) }}
-{% elif inbox_object.ap_type in ["Article", "Note", "Video", "Page", "Question"] %}
-{{ utils.display_object(inbox_object) }}
-{% elif inbox_object.ap_type == "Follow" %}
- {{ utils.actor_action(inbox_object, "followed you") }}
- {{ utils.display_actor(inbox_object.actor, actors_metadata) }}
-{% elif inbox_object.ap_type == "Like" %}
- {{ utils.actor_action(inbox_object, "liked one of your posts", with_icon=True) }}
- {{ utils.display_object(inbox_object.relates_to_anybox_object) }}
-{% else %}
-
- Implement {{ inbox_object.ap_type }}
- {{ inbox_object.ap_object }}
-
-{% endif %}
-{% endfor %}
-
-{% if next_cursor %}
-
-{% endif %}
-
-{% endblock %}
diff --git a/app/templates/admin_new.html b/app/templates/admin_new.html
deleted file mode 100644
index ac3b3db..0000000
--- a/app/templates/admin_new.html
+++ /dev/null
@@ -1,94 +0,0 @@
-{%- import "utils.html" as utils with context -%}
-{% extends "layout.html" %}
-
-{% block head %}
-{{ local_actor.display_name }} - New
-{% endblock %}
-
-{% block content %}
-
-{% if in_reply_to_object %}
-In reply to:
-{{ utils.display_object(in_reply_to_object) }}
-{% endif %}
-
-
-
-
-
-
-
-
-{% endblock %}
diff --git a/app/templates/admin_outbox.html b/app/templates/admin_outbox.html
deleted file mode 100644
index d0ad58b..0000000
--- a/app/templates/admin_outbox.html
+++ /dev/null
@@ -1,35 +0,0 @@
-{%- import "utils.html" as utils with context -%}
-{% extends "layout.html" %}
-
-{% block head %}
-{{ local_actor.display_name }} - Outbox
-{% endblock %}
-
-{% block content %}
-
-{{ utils.display_box_filters("admin_outbox") }}
-
-{% for outbox_object in outbox %}
-
- {% if outbox_object.ap_type == "Announce" %}
- You shared {{ outbox_object.ap_published_at | timeago }}
- {{ utils.display_object(outbox_object.relates_to_anybox_object) }}
- {% elif outbox_object.ap_type == "Like" %}
- You liked {{ outbox_object.ap_published_at | timeago }}
- {{ utils.display_object(outbox_object.relates_to_anybox_object) }}
- {% elif outbox_object.ap_type == "Follow" %}
- You followed {{ outbox_object.ap_published_at | timeago }}
- {{ utils.display_actor(outbox_object.relates_to_actor, actors_metadata) }}
- {% elif outbox_object.ap_type in ["Article", "Note", "Video", "Question"] %}
- {{ utils.display_object(outbox_object) }}
- {% endif %}
-
-{% endfor %}
-
-{% if next_cursor %}
-
-{% endif %}
-
-{% endblock %}
diff --git a/app/templates/admin_profile.html b/app/templates/admin_profile.html
deleted file mode 100644
index 1f5646c..0000000
--- a/app/templates/admin_profile.html
+++ /dev/null
@@ -1,29 +0,0 @@
-{%- import "utils.html" as utils with context -%}
-
-{% block head %}
-{{ local_actor.display_name }} - {{ actor.display_name }}
-{% endblock %}
-
-{% extends "layout.html" %}
-{% block content %}
- {{ utils.display_actor(actor, actors_metadata, with_details=True) }}
- {% for inbox_object in inbox_objects %}
- {% if inbox_object.ap_type == "Announce" %}
- {{ utils.actor_action(inbox_object, "shared", with_icon=True) }}
- {{ utils.display_object(inbox_object.relates_to_anybox_object) }}
- {% else %}
- {{ utils.display_object(inbox_object) }}
- {% endif %}
- {% endfor %}
-
-{% if next_cursor %}
-
-{% endif %}
-
-{% endblock %}
diff --git a/app/templates/admin_stream.html b/app/templates/admin_stream.html
deleted file mode 100644
index 4fd8a79..0000000
--- a/app/templates/admin_stream.html
+++ /dev/null
@@ -1,18 +0,0 @@
-{%- import "utils.html" as utils with context -%}
-{% extends "layout.html" %}
-
-{% block head %}
-{{ local_actor.display_name }} - Stream
-{% endblock %}
-
-{% block content %}
-
-{% for inbox_object in stream %}
-{% if inbox_object.ap_type == "Announce" %}
- {{ utils.display_object(inbox_object.relates_to_anybox_object) }}
-{% elif inbox_object.ap_type in ["Article", "Note", "Video"] %}
-{{ utils.display_object(inbox_object) }}
-{% endif %}
-{% endfor %}
-
-{% endblock %}
diff --git a/app/templates/articles.html b/app/templates/articles.html
deleted file mode 100644
index 459492d..0000000
--- a/app/templates/articles.html
+++ /dev/null
@@ -1,20 +0,0 @@
-{%- import "utils.html" as utils with context -%}
-{% extends "layout.html" %}
-
-{% block head %}
-{{ local_actor.display_name }}'s articles
-{% endblock %}
-
-{% block content %}
-{% include "header.html" %}
-
-
-
-{% for outbox_object in objects %}
- -
- {{ outbox_object.name }}
-
-{% endfor %}
-
-
-{% endblock %}
diff --git a/app/templates/custom_page.html b/app/templates/custom_page.html
deleted file mode 100644
index 2f1c937..0000000
--- a/app/templates/custom_page.html
+++ /dev/null
@@ -1,30 +0,0 @@
-{%- import "utils.html" as utils with context -%}
-{% extends "layout.html" %}
-
-{% block head %}
-{{ title }}
-{% if request.url.path == "/" %}
-
-
-
-
-
-
-
-
-
-
-
-
-
-{% endif %}
-{% endblock %}
-
-{% block content %}
-{% include "header.html" %}
-
-
- {{ page_content | safe }}
-
-
-{% endblock %}
diff --git a/app/templates/error.html b/app/templates/error.html
deleted file mode 100644
index c45a567..0000000
--- a/app/templates/error.html
+++ /dev/null
@@ -1,12 +0,0 @@
-{%- import "utils.html" as utils with context -%}
-{% extends "layout.html" %}
-{% block main_tag %} class="main-flex"{% endblock %}
-{% block head %}
-{{ title }}
-{% endblock %}
-
-{% block content %}
-
-
{{ title | safe }}
-
-{% endblock %}
diff --git a/app/templates/followers.html b/app/templates/followers.html
deleted file mode 100644
index dabd049..0000000
--- a/app/templates/followers.html
+++ /dev/null
@@ -1,32 +0,0 @@
-{%- import "utils.html" as utils with context -%}
-{% extends "layout.html" %}
-
-{% block head %}
-{{ local_actor.display_name }}'s followers
-
-{% endblock %}
-
-{% block content %}
-{% include "header.html" %}
-
-
-{% for follower in followers %}
-- {{ utils.display_actor(follower.actor, actors_metadata) }}
-{% endfor %}
-
-
-{% set x_more = followers_count - followers | length %}
-{% if x_more > 0 %}
-
-
And {{ x_more }} more.
-
-{% endif %}
-
-{% if is_admin %}
-
-{% endif %}
-
-
-{% endblock %}
diff --git a/app/templates/following.html b/app/templates/following.html
deleted file mode 100644
index 3341725..0000000
--- a/app/templates/following.html
+++ /dev/null
@@ -1,32 +0,0 @@
-{%- import "utils.html" as utils with context -%}
-{% extends "layout.html" %}
-
-{% block head %}
-{{ local_actor.display_name }}'s follows
-
-{% endblock %}
-
-{% block content %}
-{% include "header.html" %}
-
-
-{% for follow in following %}
-- {{ utils.display_actor(follow.actor, actors_metadata) }}
-{% endfor %}
-
-
-{% set x_more = following_count - following | length %}
-{% if x_more > 0 %}
-
-
And {{ x_more }} more.
-
-{% endif %}
-
-{% if is_admin %}
-
-{% endif %}
-
-
-{% endblock %}
diff --git a/app/templates/header.html b/app/templates/header.html
deleted file mode 100644
index a15f051..0000000
--- a/app/templates/header.html
+++ /dev/null
@@ -1,62 +0,0 @@
-
diff --git a/app/templates/index.html b/app/templates/index.html
deleted file mode 100644
index 8db1638..0000000
--- a/app/templates/index.html
+++ /dev/null
@@ -1,60 +0,0 @@
-{%- import "utils.html" as utils with context -%}
-{% extends "layout.html" %}
-
-{% block head %}
-{{ local_actor.display_name }}'s microblog
-
-
-
-
-
-
-
-
-
-
-
-
-
-{% endblock %}
-
-{% block content %}
-{% include "header.html" %}
-
-{% if objects %}
-
-
-
- {% for outbox_object in objects %}
- {% if outbox_object.ap_type in ["Note", "Video", "Question"] %}
- {{ utils.display_object(outbox_object) }}
- {% elif outbox_object.ap_type == "Announce" %}
-
-
-
- {{ utils.display_object(outbox_object.relates_to_anybox_object, is_h_entry=False) }}
-
-
- {% endif %}
- {% endfor %}
-
-
- {% if has_previous_page or has_next_page %}
-
- {% if has_previous_page %}
-
Previous
- {% endif %}
-
- {% if has_next_page %}
-
Next
- {% endif %}
-
- {% endif %}
-
-{% else %}
-
-
Nothing to see here yet!
-
-{% endif %}
-
-{% endblock %}
diff --git a/app/templates/indieauth_flow.html b/app/templates/indieauth_flow.html
deleted file mode 100644
index fb4d15c..0000000
--- a/app/templates/indieauth_flow.html
+++ /dev/null
@@ -1,45 +0,0 @@
-{%- import "utils.html" as utils with context -%}
-{% extends "layout.html" %}
-{% block content %}
-
-
- {% if client.logo %}
-
-
-
- {% endif %}
-
-
- {% if client.url %}
-
{{ client.name }}
- {% else %}
-
{{ client.name }}
- {% endif %}
-
wants you to login{% if me %} as {{ me }}{% endif %} with the following redirect URI: {{ redirect_uri }}
.
-
-
-
-
-
-
-
-{% endblock %}
diff --git a/app/templates/layout.html b/app/templates/layout.html
deleted file mode 100644
index cdf5959..0000000
--- a/app/templates/layout.html
+++ /dev/null
@@ -1,60 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-{% block head %}{% endblock %}
-
-
-
-
-{% if is_admin %}
-
-{% macro admin_link(url, text) %}
-{% set url_for = BASE_URL + request.app.router.url_path_for(url) %}
-
{{ text }}
-{% endmacro %}
-
-
-
-{% endif %}
-{% block content %}{% endblock %}
-
-
-
-
-{% if is_admin %}
-
-{% endif %}
-
-
-
diff --git a/app/templates/login.html b/app/templates/login.html
deleted file mode 100644
index 8f3940a..0000000
--- a/app/templates/login.html
+++ /dev/null
@@ -1,21 +0,0 @@
-{%- import "utils.html" as utils with context -%}
-{% extends "layout.html" %}
-{% block head %}
-
-{% endblock %}
-{% block main_tag %} class="main-flex"{% endblock %}
-{% block content %}
-
-{% endblock %}
diff --git a/app/templates/lookup.html b/app/templates/lookup.html
deleted file mode 100644
index 0b077e2..0000000
--- a/app/templates/lookup.html
+++ /dev/null
@@ -1,38 +0,0 @@
-{%- import "utils.html" as utils with context -%}
-{% extends "layout.html" %}
-
-{% block head %}
-{{ local_actor.display_name }} - Lookup
-{% endblock %}
-
-{% block content %}
-
-
-
- {% if error %}
-
- {% if error.value == "NOT_FOUND" %}
-
The remote object is unavailable.
- {% elif error.value == "UNAUTHORIZED" %}
-
Missing permissions to fetch the remote object.
- {% elif error.value == "TIMEOUT" %}
-
Lookup timed out, please try refreshing the page.
- {% else %}
-
Unexpected error, please check the logs and report an issue if needed.
- {% endif %}
-
- {% endif %}
-
- {% if ap_object and ap_object.ap_type in actor_types %}
- {{ utils.display_actor(ap_object, actors_metadata, with_details=True) }}
- {% elif ap_object %}
- {{ utils.display_object(ap_object, actors_metadata=actors_metadata) }}
- {% endif %}
-{% endblock %}
diff --git a/app/templates/notifications.html b/app/templates/notifications.html
deleted file mode 100644
index b59eaeb..0000000
--- a/app/templates/notifications.html
+++ /dev/null
@@ -1,126 +0,0 @@
-{%- import "utils.html" as utils with context -%}
-{% extends "layout.html" %}
-
-{% block head %}
-{{ local_actor.display_name }} - Notifications
-{% endblock %}
-
-{% macro notif_actor_action(notif, text, with_icon=False) %}
-
-{% endmacro %}
-
-{% block content %}
-
-
Notifications
-
-
- {%- for notif in notifications %}
-
- {%- if notif.notification_type.value == "new_follower" %}
- {{ notif_actor_action(notif, "followed you") }}
- {{ utils.display_actor(notif.actor, actors_metadata) }}
- {%- elif notif.notification_type.value == "pending_incoming_follower" %}
- {{ notif_actor_action(notif, "sent a follow request") }}
- {{ utils.display_actor(notif.actor, actors_metadata, pending_incoming_follow_notif=notif) }}
- {% elif notif.notification_type.value == "rejected_follower" %}
- {% elif notif.notification_type.value == "unfollow" %}
- {{ notif_actor_action(notif, "unfollowed you") }}
- {{ utils.display_actor(notif.actor, actors_metadata) }}
- {%- elif notif.notification_type.value == "follow_request_accepted" %}
- {{ notif_actor_action(notif, "accepted your follow request") }}
- {{ utils.display_actor(notif.actor, actors_metadata) }}
- {%- elif notif.notification_type.value == "follow_request_rejected" %}
- {{ notif_actor_action(notif, "rejected your follow request") }}
- {{ utils.display_actor(notif.actor, actors_metadata) }}
- {% elif notif.notification_type.value == "blocked" %}
- {{ notif_actor_action(notif, "blocked you") }}
- {{ utils.display_actor(notif.actor, actors_metadata) }}
- {% elif notif.notification_type.value == "unblocked" %}
- {{ notif_actor_action(notif, "unblocked you") }}
- {{ utils.display_actor(notif.actor, actors_metadata) }}
- {% elif notif.notification_type.value == "block" %}
- {{ notif_actor_action(notif, "was blocked") }}
- {{ utils.display_actor(notif.actor, actors_metadata) }}
- {% elif notif.notification_type.value == "unblock" %}
- {{ notif_actor_action(notif, "was unblocked") }}
- {{ utils.display_actor(notif.actor, actors_metadata) }}
- {%- elif notif.notification_type.value == "move" %}
- {# for move notif, the actor is the target and the inbox object the Move activity #}
-
- {{ utils.display_actor(notif.actor) }}
- {% elif notif.notification_type.value == "like" %}
- {{ notif_actor_action(notif, "liked a post", with_icon=True) }}
- {{ utils.display_object(notif.outbox_object) }}
- {% elif notif.notification_type.value == "undo_like" %}
- {{ notif_actor_action(notif, "unliked a post", with_icon=True) }}
- {{ utils.display_object(notif.outbox_object) }}
- {% elif notif.notification_type.value == "announce" %}
- {{ notif_actor_action(notif, "shared a post", with_icon=True) }}
- {{ utils.display_object(notif.outbox_object) }}
- {% elif notif.notification_type.value == "undo_announce" %}
- {{ notif_actor_action(notif, "unshared a post", with_icon=True) }}
- {{ utils.display_object(notif.outbox_object) }}
- {% elif notif.notification_type.value == "mention" %}
- {{ notif_actor_action(notif, "mentioned you") }}
- {{ utils.display_object(notif.inbox_object) }}
- {% elif notif.notification_type.value == "new_webmention" %}
-
- {{ utils.display_object(notif.outbox_object) }}
- {% elif notif.notification_type.value == "updated_webmention" %}
-
- {{ utils.display_object(notif.outbox_object) }}
- {% elif notif.notification_type.value == "deleted_webmention" %}
-
- {{ utils.display_object(notif.outbox_object) }}
- {% else %}
-
- Implement {{ notif.notification_type }}
-
- {%- endif %}
-
- {%- endfor %}
-
-
-{% if next_cursor %}
-
-{% endif %}
-
-{% endblock %}
diff --git a/app/templates/object.html b/app/templates/object.html
deleted file mode 100644
index d89accb..0000000
--- a/app/templates/object.html
+++ /dev/null
@@ -1,56 +0,0 @@
-{%- import "utils.html" as utils with context -%}
-{% extends "layout.html" %}
-
-{% block head %}
-{% if outbox_object %}
-{% if outbox_object.content %}
- {% set excerpt = outbox_object.content | html2text | trim | truncate(50) %}
-{% else %}
- {% set excerpt = outbox_object.summary | html2text | trim | truncate(50) %}
-{% endif %}
-{% if outbox_object.name %}{{ outbox_object.name }}{% else %}{{ local_actor.display_name }}: "{{ excerpt }}"{% endif %}
-
-
-
-
-
-
-
-
-
-
-{% endif %}
-{% endblock %}
-
-{% block content %}
-
-{% if outbox_object %}
-{% include "header.html" %}
-{% endif %}
-
-{% macro display_replies_tree(replies_tree_node) %}
-
-{% if replies_tree_node.is_requested %}
-{{ utils.display_object(replies_tree_node.ap_object, likes=likes, shares=shares, webmentions=webmentions, expanded=not replies_tree_node.is_root, is_object_page=True, is_h_entry=False) }}
-{% else %}
- {% if replies_tree_node.wm_reply %}
- {# u-comment h-cite is displayed by default for webmention #}
- {{ utils.display_webmention_reply(replies_tree_node.wm_reply) }}
- {% else %}
-
- {% endif %}
-{% endif %}
-
-{% for child in replies_tree_node.children %}
- {{ display_replies_tree(child) }}
-{% endfor %}
-
-{% endmacro %}
-
-
-{{ display_replies_tree(replies_tree) }}
-
-
-{% endblock %}
diff --git a/app/templates/redirect.html b/app/templates/redirect.html
deleted file mode 100644
index f8b0601..0000000
--- a/app/templates/redirect.html
+++ /dev/null
@@ -1,15 +0,0 @@
-{%- import "utils.html" as utils with context -%}
-{% extends "layout.html" %}
-
-{% block head %}
-{{ local_actor.display_name }}'s microblog - Redirect
-{% endblock %}
-
-{% block content %}
-{% include "header.html" %}
-
-
-
-{% endblock %}
diff --git a/app/templates/redirect_to_remote_instance.html b/app/templates/redirect_to_remote_instance.html
deleted file mode 100644
index f814777..0000000
--- a/app/templates/redirect_to_remote_instance.html
+++ /dev/null
@@ -1,15 +0,0 @@
-{%- import "utils.html" as utils with context -%}
-{% extends "layout.html" %}
-
-{% block head %}
-{{ local_actor.display_name }}'s microblog - Redirect
-{% endblock %}
-
-{% block content %}
-{% include "header.html" %}
-
-
-
You are being redirected to your instance: {{ url }}
-
-
-{% endblock %}
diff --git a/app/templates/remote_follow.html b/app/templates/remote_follow.html
deleted file mode 100644
index ed25be0..0000000
--- a/app/templates/remote_follow.html
+++ /dev/null
@@ -1,21 +0,0 @@
-{%- import "utils.html" as utils with context -%}
-{% extends "layout.html" %}
-
-{% block head %}
-Remote follow {{ local_actor.display_name }}
-
-{% endblock %}
-
-{% block content %}
-{% include "header.html" %}
-
-
-
Remotely follow {{ local_actor.display_name }}
-
-
-
-{% endblock %}
diff --git a/app/templates/remote_interact.html b/app/templates/remote_interact.html
deleted file mode 100644
index 0fbfe26..0000000
--- a/app/templates/remote_interact.html
+++ /dev/null
@@ -1,27 +0,0 @@
-{%- import "utils.html" as utils with context -%}
-{% extends "layout.html" %}
-
-{% block head %}
-Interact from your instance
-
-{% endblock %}
-
-{% block content %}
-{% include "header.html" %}
-
-
-
Interact with this object
-
-
-{{ utils.display_object(outbox_object) }}
-
-
-
-
-
-{% endblock %}
diff --git a/app/templates/utils.html b/app/templates/utils.html
deleted file mode 100644
index d88a881..0000000
--- a/app/templates/utils.html
+++ /dev/null
@@ -1,853 +0,0 @@
-{% macro embed_csrf_token() %}
-{% block embed_csrf_token scoped %}
-
-{% endblock %}
-{% endmacro %}
-
-{% macro embed_redirect_url(permalink_id=None) %}
-{% block embed_redirect_url scoped %}
-
-{% endblock %}
-{% endmacro %}
-
-{% macro admin_block_button(actor) %}
-{% block admin_block_button scoped %}
-
-{% endblock %}
-{% endmacro %}
-
-{% macro admin_unblock_button(actor) %}
-{% block admin_unblock_button scoped %}
-
-{% endblock %}
-{% endmacro %}
-
-{% macro admin_hide_shares_button(actor) %}
-{% block admin_hide_shares_button scoped %}
-
-{% endblock %}
-{% endmacro %}
-
-{% macro admin_show_shares_button(actor) %}
-{% block admin_show_shares_button scoped %}
-
-{% endblock %}
-{% endmacro %}
-
-
-{% macro admin_follow_button(actor) %}
-{% block admin_follow_button scoped %}
-
-{% endblock %}
-{% endmacro %}
-
-{% macro admin_accept_incoming_follow_button(notif) %}
-{% block admin_accept_incoming_follow_button scoped %}
-
-{% endblock %}
-{% endmacro %}
-
-{% macro admin_reject_incoming_follow_button(notif) %}
-{% block admin_reject_incoming_follow_button scoped %}
-
-{% endblock %}
-{% endmacro %}
-
-{% macro admin_like_button(ap_object_id, permalink_id) %}
-{% block admin_like_button scoped %}
-
-{% endblock %}
-{% endmacro %}
-
-{% macro admin_bookmark_button(ap_object_id, permalink_id) %}
-{% block admin_bookmark_button scoped %}
-
-{% endblock %}
-{% endmacro %}
-
-{% macro admin_unbookmark_button(ap_object_id, permalink_id) %}
-{% block admin_unbookmark_button scoped %}
-
-{% endblock %}
-{% endmacro %}
-
-{% macro admin_pin_button(ap_object_id, permalink_id) %}
-{% block admin_pin_button scoped %}
-
-{% endblock %}
-{% endmacro %}
-
-{% macro admin_unpin_button(ap_object_id, permalink_id) %}
-{% block admin_unpin_button scoped %}
-
-{% endblock %}
-{% endmacro %}
-
-{% macro admin_delete_button(ap_object) %}
-{% block admin_delete_button scoped %}
-
-{% endblock %}
-{% endmacro %}
-
-{% macro admin_force_delete_button(ap_object_id, permalink_id=None) %}
-{% block admin_force_delete_button scoped %}
-
-{% endblock %}
-{% endmacro %}
-
-{% macro admin_force_delete_webmention_button(webmention_id, permalink_id=None) %}
-{% block admin_force_delete_webmention_button scoped %}
-
-{% endblock %}
-{% endmacro %}
-
-{% macro admin_announce_button(ap_object_id, permalink_id=None) %}
-{% block admin_announce_button scoped %}
-
-{% endblock %}
-{% endmacro %}
-
-{% macro admin_undo_button(ap_object_id, action="undo", permalink_id=None) %}
-{% block admin_undo_button scoped %}
-
-{% endblock %}
-{% endmacro %}
-
-{% macro admin_reply_button(ap_object_id) %}
-{% block admin_reply_button scoped %}
-
-{% endblock %}
-{% endmacro %}
-
-{% macro admin_dm_button(actor_handle) %}
-{% block admin_dm_button scoped %}
-
-{% endblock %}
-{% endmacro %}
-
-{% macro admin_mention_button(actor_handle) %}
-{% block admin_mention_button scoped %}
-
-{% endblock %}
-{% endmacro %}
-
-
-
-{% macro admin_profile_button(ap_actor_id) %}
-{% block admin_profile_button scoped %}
-
-{% endblock %}
-{% endmacro %}
-
-{% macro admin_expand_button(ap_object) %}
-{% block admin_expand_button scoped %}
-{# TODO turn these into a regular link and append permalink ID if it's a reply #}
-
-{% endblock %}
-{% endmacro %}
-
-{% macro display_box_filters(route) %}
-{% block display_box_filters scoped %}
-
-{% endblock %}
-{% endmacro %}
-
-{% macro display_tiny_actor_icon(actor) %}
-{% block display_tiny_actor_icon scoped %}
-
-{% endblock %}
-{% endmacro %}
-
-{% macro actor_action(inbox_object, text, with_icon=False) %}
-{% block actor_action scoped %}
-
-
-{% endblock %}
-{% endmacro %}
-
-{% macro display_actor(actor, actors_metadata={}, embedded=False, with_details=False, pending_incoming_follow_notif=None) %}
-{% block display_actor scoped %}
-{% set metadata = actors_metadata.get(actor.ap_id) %}
-
-{% if not embedded %}
-
-{% endif %}
-
-
-
-{% if is_admin and metadata %}
-
-
-
-{% endif %}
-
-{% if with_details %}
- {% if actor.summary %}
-
- {{ actor.summary | clean_html(actor) | safe }}
-
- {% endif %}
-
- {% if actor.attachments %}
-
- {% for prop in actor.attachments %}
-
- {% if prop.type == "PropertyValue" %}
- - {{ prop.name }}
- - {{ prop.value | clean_html(actor) | safe }}
- {% endif %}
-
- {% endfor %}
-
- {% endif %}
-{% endif %}
-
-{% if not embedded %}
-
-{% endif %}
-
-{% endblock %}
-{% endmacro %}
-
-{% macro display_og_meta(object) %}
-{% block display_og_meta scoped %}
-{% if object.og_meta %}
-{% for og_meta in object.og_meta[:1] %}
-
-{% endfor %}
-{% endif %}
-{% endblock %}
-{% endmacro %}
-
-
-{% macro display_attachments(object) %}
-{% block display_attachments scoped %}
-
- {% for attachment in object.attachments %}
- {% if attachment.type != "PropertyValue" %}
- {% set orientation = "unknown" %}
- {% if attachment.width %}
- {% set orientation = "portrait" if attachment.width < attachment.height else "landscape" %}
- {% endif %}
- {% if object.sensitive and (attachment.type == "Image" or (attachment | has_media_type("image")) or attachment.type == "Video" or (attachment | has_media_type("video"))) %}
-
-
-
-
-
-
-
- {% else %}
-
- {% endif %}
-
- {% if attachment.type == "Image" or (attachment | has_media_type("image")) %}
- {% if attachment.url not in object.inlined_images %}
-
-
-
- {% endif %}
- {% elif attachment.type == "Video" or (attachment | has_media_type("video")) %}
-
- {% elif attachment.type == "Audio" or (attachment | has_media_type("audio")) %}
-
- {% elif attachment.type == "Link" %}
-
{{ attachment.url | truncate(64, True) }} ({{ attachment.mimetype}})
- {% else %}
-
- {% if attachment.name %}{{ attachment.name }}{% else %}{{ attachment.url | truncate(64, True) }}{% endif %}
- ({{ attachment.mimetype }})
- {% endif %}
- {% if object.sensitive and (attachment.type == "Image" or (attachment | has_media_type("image")) or attachment.type == "Video" or (attachment | has_media_type("video"))) %}
-
-
-
-
- {% else %}
-
- {% endif %}
- {% endif %}
- {% endfor %}
-{% endblock %}
-{% endmacro %}
-
-{% macro display_webmention_reply(wm_reply) %}
-{% block display_webmention_reply scoped %}
-
-
-
-{% endblock %}
-{% endmacro %}
-
-{% macro display_object(object, likes=[], shares=[], webmentions=[], expanded=False, actors_metadata={}, is_object_page=False, is_h_entry=True) %}
-{% block display_object scoped %}
-{% set is_article_mode = object.is_from_outbox and object.ap_type == "Article" and is_object_page %}
-{% if object.ap_type in ["Note", "Article", "Video", "Page", "Question", "Event"] %}
-
-
- {% if is_article_mode %}
-
-
-
-
-
- {% else %}
- {{ display_actor(object.actor, actors_metadata, embedded=True) }}
- {% endif %}
-
- {% if object.in_reply_to %}
-
in reply to
- this object
-
- {% endif %}
-
- {% if object.ap_type in ["Article", "Event"] %}
-
{{ object.name }}
- {% endif %}
-
- {% if object.ap_type == "Event" %}
- {% if object.ap_object.get("endTime") and object.ap_object.get("startTime") %}
-
On {{ object.ap_object.startTime | parse_datetime | format_date }}
- (ends {{ object.ap_object.endTime | parse_datetime | format_date }})
- {% endif %}
- {% endif %}
-
- {% if object.ap_object.get("location") %}
- {% set loc = object.ap_object.get("location") %}
- {% if loc.type == "Place" and loc.latitude and loc.longitude %}
-
- {% endif %}
- {% endif %}
-
- {% if is_article_mode %}
-
- {% endif %}
-
- {% if object.summary %}
-
-
-
-
{{ object.summary | clean_html(object) | safe }}
-
-
-
- {% endif %}
-
-
- {{ object.content | clean_html(object) | safe }}
-
-
- {% if object.ap_type == "Question" %}
- {% set can_vote = is_admin and object.is_from_inbox and not object.is_poll_ended and not object.voted_for_answers %}
- {% if can_vote %}
-
- {% endif %}
-
-
- {% endif %}
-
- {{ display_og_meta(object) }}
-
-
- {% if object.summary %}
-
- {% endif %}
-
-
- {{ display_attachments(object) }}
-
-
-
-
- {% if is_admin %}
-
- {% endif %}
-
-
- {% if likes or shares or webmentions %}
-
- {% if likes %}
-
Likes
-
- {% for like in likes %}
-
-
-
- {% endfor %}
- {% if object.likes_count > likes | length %}
-
- and {{ object.likes_count - likes | length }} more.
-
- {% endif %}
-
-
- {% endif %}
-
- {% if shares %}
-
Shares
-
- {% for share in shares %}
-
-
-
- {% endfor %}
- {% if object.announces_count > shares | length %}
-
- and {{ object.announces_count - shares | length }} more.
-
- {% endif %}
-
-
- {% endif %}
-
- {% if webmentions %}
-
Webmentions
-
- {% for webmention in webmentions %}
- {% set wm = webmention.as_facepile_item %}
- {% if wm %}
-
-
-
- {% endif %}
- {% endfor %}
-
-
- {% endif %}
-
-
- {% endif %}
-
-
-
-{% endif %}
-{% endblock %}
-{% endmacro %}
diff --git a/data/_theme.scss b/data/_theme.scss
index bd7c861..d0ec062 100644
--- a/data/_theme.scss
+++ b/data/_theme.scss
@@ -1,11 +1,11 @@
// override vars for theming here
-$background: rgb(41, 41, 41);
-$light-background: #333333;
+$background: rgb(19, 19, 19);
+$light-background: #141414;
$text-color: rgb(238, 238, 238);
$primary-color: #dfd39d;
$secondary-color: #e07127;
-$form-background-color: rgb(95, 95, 95);
+$form-background-color: rgb(39, 39, 39);
$form-text-color: rgb(255, 255, 255);
-$muted-color: rgb(173, 173, 173); // solarized comment text
+$muted-color: rgb(156, 156, 156); // solarized comment text
$primary-button-text-color: rgb(34, 34, 34);
-$code-highlight-background: #1d1d1d;
\ No newline at end of file
+$code-highlight-background: #1b1b1b;
\ No newline at end of file
diff --git a/data/templates/app b/data/templates/app
deleted file mode 120000
index 6a6e8a4..0000000
--- a/data/templates/app
+++ /dev/null
@@ -1 +0,0 @@
-../../app/templates/
\ No newline at end of file
diff --git a/docker-compose.yml b/docker-compose.yml
index a95353f..d6730c1 100644
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -2,7 +2,8 @@ version: "3"
services:
server:
- image: microblogpub/microblogpub:latest
+ build: .
+ image: microblogpub
container_name: microblogpub
user: 1000:1000
restart: always
diff --git a/tasks.py b/tasks.py
index c968c85..76877c0 100644
--- a/tasks.py
+++ b/tasks.py
@@ -217,7 +217,7 @@ def embed_version() -> Generator[None, None, None]:
def build_docker_image(ctx):
# type: (Context) -> None
with embed_version():
- run("docker build -t microblogpub/microblogpub .")
+ run("docker build -t microblogpub .")
@task