diff --git a/district/models.py b/district/models.py
index 68270abaabb159ddfd320bed2e2c103ea580b91b..e57ea2ae006e40b827f6d70d20ca82a68aa228fa 100644
--- a/district/models.py
+++ b/district/models.py
@@ -49,6 +49,7 @@ from shared.models import (
     ArticleMixin,
     ExtendedMetadataHomePageMixin,
     ExtendedMetadataPageMixin,
+    HomepageMixin,
     MenuMixin,
     SubpageMixin,
 )
@@ -64,7 +65,12 @@ CONTENT_BLOCKS = DEFAULT_CONTENT_BLOCKS + [
 
 
 class DistrictHomePage(
-    MenuMixin, ExtendedMetadataHomePageMixin, MetadataPageMixin, CalendarMixin, Page
+    MenuMixin,
+    ExtendedMetadataHomePageMixin,
+    MetadataPageMixin,
+    CalendarMixin,
+    HomepageMixin,
+    Page,
 ):
     ### FIELDS
 
@@ -252,6 +258,7 @@ class DistrictHomePage(
             gettext_lazy("Nastavení lišty s kalendářem a mapou"),
         ),
         FieldPanel("fallback_image"),
+        FieldPanel("mastodon_feed"),
     ]
 
     ### EDIT HANDLERS
@@ -376,6 +383,7 @@ class DistrictArticlePage(
         FieldPanel("is_black"),
         FieldPanel("tags"),
         FieldPanel("thumb_image"),
+        FieldPanel("mastodon_feed"),
     ]
 
     promote_panels = make_promote_panels(
@@ -426,6 +434,7 @@ class DistrictArticlesPage(
 
     content_panels = Page.content_panels + [
         FieldPanel("max_items"),
+        FieldPanel("mastodon_feed"),
     ]
 
     promote_panels = make_promote_panels()
@@ -565,6 +574,7 @@ class DistrictContactPage(
     content_panels = Page.content_panels + [
         FieldPanel("contact_people"),
         FieldPanel("text"),
+        FieldPanel("mastodon_feed"),
     ]
 
     promote_panels = make_promote_panels()
@@ -698,6 +708,7 @@ class DistrictPersonPage(
                 FieldPanel("flickr_url"),
                 FieldPanel("custom_web_url"),
                 FieldPanel("other_urls"),
+                FieldPanel("mastodon_feed"),
             ],
             "Sociální sítě",
         ),
@@ -772,7 +783,10 @@ class DistrictPeoplePage(
 
     ### PANELS
 
-    content_panels = Page.content_panels + [FieldPanel("content")]
+    content_panels = Page.content_panels + [
+        FieldPanel("content"),
+        FieldPanel("mastodon_feed"),
+    ]
 
     promote_panels = make_promote_panels()
 
@@ -806,7 +820,10 @@ class DistrictElectionBasePage(
 
     ### PANELS
 
-    content_panels = Page.content_panels + [FieldPanel("content")]
+    content_panels = Page.content_panels + [
+        FieldPanel("content"),
+        FieldPanel("mastodon_feed"),
+    ]
 
     promote_panels = make_promote_panels()
 
@@ -850,6 +867,7 @@ class DistrictPostElectionStrategyPage(
 
     content_panels = DistrictElectionBasePage.content_panels + [
         FieldPanel("perex"),
+        FieldPanel("mastodon_feed"),
     ]
 
     ### RELATIONS
@@ -892,6 +910,7 @@ class DistrictElectionProgramPage(
         PageChooserPanel("guarantor"),
         FieldPanel("image"),
         FieldPanel("perex"),
+        FieldPanel("mastodon_feed"),
     ]
 
     ### RELATIONS
@@ -1019,6 +1038,7 @@ class DistrictElectionCampaignPage(DistrictElectionBasePage):
             "Hero banner",
         ),
         FieldPanel("order"),
+        FieldPanel("mastodon_feed"),
     ]
 
     ### RELATIONS
@@ -1122,6 +1142,7 @@ class DistrictInteractiveProgramPage(
     content_panels = Page.content_panels + [
         FieldPanel("perex"),
         FieldPanel("content"),
+        FieldPanel("mastodon_feed"),
     ]
 
     promote_panels = make_promote_panels()
@@ -1171,6 +1192,7 @@ class DistrictProgramPage(
     content_panels = Page.content_panels + [
         FieldPanel("perex"),
         FieldPanel("content"),
+        FieldPanel("mastodon_feed"),
     ]
 
     promote_panels = make_promote_panels()
@@ -1245,6 +1267,7 @@ class DistrictCenterPage(
         FieldPanel("content"),
         FieldPanel("calendar_url"),
         FieldPanel("sidebar_content"),
+        FieldPanel("mastodon_feed"),
     ]
 
     promote_panels = make_promote_panels()
@@ -1325,6 +1348,7 @@ class DistrictCrossroadPage(
     content_panels = Page.content_panels + [
         FieldPanel("cards_content"),
         FieldPanel("content"),
+        FieldPanel("mastodon_feed"),
     ]
 
     promote_panels = make_promote_panels()
@@ -1374,6 +1398,7 @@ class DistrictCustomPage(
 
     content_panels = Page.content_panels + [
         FieldPanel("content"),
+        FieldPanel("mastodon_feed"),
     ]
 
     promote_panels = make_promote_panels()
@@ -1476,6 +1501,7 @@ class DistrictGeoFeatureCollectionPage(
                 FieldPanel("promoted_block_title"),
                 FieldPanel("logo_image"),
                 FieldPanel("image"),
+                FieldPanel("mastodon_feed"),
             ],
             "Obsah hlavní stránky kolekce",
         ),
@@ -1699,6 +1725,7 @@ class DistrictGeoFeatureDetailPage(
         ),
         PageChooserPanel("guarantor"),
         FieldPanel("sort_order"),
+        FieldPanel("mastodon_feed"),
     ]
 
     settings_panels = []
diff --git a/district/templates/district/base.html b/district/templates/district/base.html
index 0f20b30bd7e8579b8006969b559f882b8250e118..2128f77c5dedfe781287a3b785e6d86d1a05e36e 100644
--- a/district/templates/district/base.html
+++ b/district/templates/district/base.html
@@ -160,7 +160,7 @@
   <div class="__js-root">
     <ui-app inline-template>
 
-      <ui-view-provider :initial="{regions: false, calendar: false}" v-slot="{ isCurrentView, toggleView }">
+      <ui-view-provider :initial="{regions: false, calendar: false, mastodon: false}" v-slot="{ isCurrentView, toggleView }">
         <nav class="subnav py-2">
           <div class="container container--wide">
             <div class="flex">
@@ -201,8 +201,20 @@
                 {% endwith %}
               {% endif %}
 
+              <button
+                class="btn btn--condensed btn--grey-500 btn--hoveractive btn--to-white text-sm ml-2 px-0"
+                :class="{'btn--activated': isCurrentView('mastodon')}"
+                @click="toggleView('mastodon')"
+                aria-label="Mastodon feed"
+              >
+                <div class="btn__body py-2">
+                  {% include "shared/mastodon_icon_snippet.html" with size="20" class_name="mr-2" %}
+                  <span class="hidden md:block" aria-hidden="true">Mastodon feed</span>
+                </div>
+              </button>
+
               {% if page.root_page.facebook %}
-                <a href="{{ page.root_page.facebook }}" target="_blank" rel="noopener noreferrer" class="btn btn--inline-icon btn--condensed btn--hoveractive btn--grey-500 btn--to-brands-facebook text-sm ml-2  px-0">
+                <a href="{{ page.root_page.facebook }}" target="_blank" rel="noopener noreferrer" class="btn btn--inline-icon btn--condensed btn--hoveractive btn--grey-500 btn--to-brands-facebook text-sm ml-2 px-0">
                   <div class="btn__body py-2">
                     <i class="btn__inline-icon ico--facebook mr-0 md:mr-2 text-brands-facebook"></i>
                     <span class="hidden md:block">{{ page.root_page }}</span>
@@ -223,6 +235,11 @@
               {% include "shared/calendar_current_events_snippet.html" %}
             </div>
           </div>
+          <div class="subnav-aside__item" :class="{'subnav-aside__item--visible': isCurrentView('mastodon')}">
+            <div class="container container--default flex justify-center">
+              {% include "shared/mastodon_feed_snippet.html" %}
+            </div>
+          </div>
         </aside>
       </ui-view-provider>
     </ui-app>
diff --git a/district/templates/district/district_interactive_program_page.html b/district/templates/district/district_interactive_program_page.html
index 065b10f2d1c1536ead789d52b0f604170842a1b9..e298a7b777726cd4513cdf8a2a6cf7dc3a97a1c2 100644
--- a/district/templates/district/district_interactive_program_page.html
+++ b/district/templates/district/district_interactive_program_page.html
@@ -111,12 +111,7 @@
                 <button class="mast-share-button">Sdílet</button>
             </div>
             <label class="mast-top mast-check-label">
-                <img
-                    src="{% static 'district/svg/share-icons/mastodon-brands.svg' %}"
-                    alt="Sdílet na Mastodonu"
-                    height="40"
-                    width="40"
-                >
+                {% include "shared/mastodon_icon_snippet.html" with size="40" %}
             </label>
         </div>
 
diff --git a/senate/models.py b/senate/models.py
index 8b3facef72b25bc08a756080c8ef11f1c9df2aff..b6b95aa998f72a2c1d9ae3a68eea6a36275ac238 100644
--- a/senate/models.py
+++ b/senate/models.py
@@ -8,6 +8,7 @@ from wagtail.images.edit_handlers import FieldPanel
 from wagtail.models import Page
 from wagtailmetadata.models import MetadataPageMixin
 
+from shared.models import HomepageMixin
 from tuning import admin_help
 
 
@@ -25,7 +26,7 @@ class PersonBlock(blocks.StructBlock):
         label = "osoba"
 
 
-class SenateHomePage(MetadataPageMixin, Page):
+class SenateHomePage(MetadataPageMixin, HomepageMixin, Page):
     ### FIELDS
 
     senators = StreamField(
@@ -70,7 +71,11 @@ class SenateHomePage(MetadataPageMixin, Page):
         ),
     ]
 
-    settings_panels = [FieldPanel("matomo_id"), CommentPanel()]
+    settings_panels = [
+        FieldPanel("matomo_id"),
+        FieldPanel("mastodon_feed"),
+        CommentPanel(),
+    ]
 
     ### RELATIONS
 
diff --git a/senate/templates/senate/base.html b/senate/templates/senate/base.html
index bcbab5841b7526968383e3cdee6b13698747eb1a..b45a7bfe9981b55c9d9fbad8322e78213667dbaa 100644
--- a/senate/templates/senate/base.html
+++ b/senate/templates/senate/base.html
@@ -62,6 +62,7 @@
                                     <a href="https://www.instagram.com/pirati.cz/"><i class="fab fa-instagram"></i></a>
                                     <a href="https://www.youtube.com/user/CeskaPiratskaStrana"><i class="fab fa-youtube"></i></a>
                                     <a href="https://www.flickr.com/photos/pirati/"><i class="fab fa-flickr"></i></a>
+                                    {% include "shared/mastodon_feed_link_snippet" %}
                                 </div>
                                 <a href="https://nalodeni.pirati.cz" class="btn-icon c-green my-1">
                                     <div class="btn-wrap">
diff --git a/shared/blocks.py b/shared/blocks.py
index 87031401f18e99b5ad16deae83897f70df0c3933..99061111fa87a3e2daca3f7261b0438342fe910d 100644
--- a/shared/blocks.py
+++ b/shared/blocks.py
@@ -1044,14 +1044,13 @@ class ChartBlock(blocks.StructBlock):
 Zobrazí se tolik definovaných sloupců, kolik existuje skupin."""
 
 
-class MastodonFeedBlock:
+class MastodonFeedBlock(blocks.StructBlock):
     url = blocks.URLBlock(
         required=True,
         label="URL pro mastodon feed",
         default="https://mastodon.pirati.cz",
     )
-    userId = blocks.IntegerBlock(required=False, label="ID uživatele mastodonu")
-    userName = blocks.CharBlock(required=False, label="Uživatelské jméno pro mastodon")
+    user_name = blocks.CharBlock(required=True, label="Uživatelské jméno pro mastodon")
 
     class Meta:
         label = "Mastodon feed"
diff --git a/shared/models.py b/shared/models.py
index 44924a502f840168fc695196c754f8ca8ae4def9..7608e06b760b5503e0fe28daefdd8ca6ec86f209 100644
--- a/shared/models.py
+++ b/shared/models.py
@@ -6,14 +6,48 @@ from wagtail.admin.panels import FieldPanel, MultiFieldPanel, PublishingPanel
 from wagtail.fields import StreamField
 from wagtail.models import Page
 
-from shared.blocks import DEFAULT_CONTENT_BLOCKS, MenuItemBlock, MenuParentBlock
+from shared.blocks import (
+    DEFAULT_CONTENT_BLOCKS,
+    MastodonFeedBlock,
+    MenuItemBlock,
+    MenuParentBlock,
+)
 
 logger = logging.getLogger(__name__)
 
 
-class SubpageMixin:
+class HomepageMixin(models.Model):
+    """
+    Use this for homepage types
+    """
+
+    mastodon_feed = StreamField(
+        [
+            ("mastodon_feed", MastodonFeedBlock()),
+        ],
+        verbose_name="Mastodon feed",
+        blank=True,
+        use_json_field=True,
+        max_length=1,
+    )
+
+    class Meta:
+        abstract = True
+
+
+class SubpageMixin(models.Model):
     """Must be used in class definition before MetadataPageMixin!"""
 
+    mastodon_feed = StreamField(
+        [
+            ("mastodon_feed", MastodonFeedBlock()),
+        ],
+        verbose_name="Mastodon feed",
+        blank=True,
+        use_json_field=True,
+        max_length=1,
+    )
+
     @property
     def root_page(self):
         if not hasattr(self, "_root_page"):
@@ -25,6 +59,9 @@ class SubpageMixin:
     def get_meta_image(self):
         return self.search_image or self.root_page.get_meta_image()
 
+    class Meta:
+        abstract = True
+
 
 class ArticleMixin(models.Model):
     """
diff --git a/shared/static/shared/js/mastodon_helper.js b/shared/static/shared/js/mastodon_helper.js
deleted file mode 100644
index 5a5207e1c8580a4dbe8a67f585de9cae2383aa32..0000000000000000000000000000000000000000
--- a/shared/static/shared/js/mastodon_helper.js
+++ /dev/null
@@ -1,51 +0,0 @@
-window.resources ||= {};
-
-/**
- * @param {string} url
- * @returns {Promise<string>}
- */
-const fetchResource = async (url) => {
-    return await (await window.fetch(url)).text();
-};
-
-/**
- * @param {string} url
- */
-const loadResource = async (url) => {
-    if (window.resources[url]) {
-        return window.resources[url];
-    }
-    window.resources[url] = fetchResource(url);
-    return await window.resources[url];
-};
-
-/**
- * @param {HTMLElement} parent
- * @param {string} content
- */
-const applyScript = async (parent, content) => {
-    const base64 = btoa(content);
-    if (!document.querySelector(`script[data-content='${base64}']`)) {
-        const scriptTag = document.createElement("script");
-        scriptTag.setAttribute("type", "text/javascript");
-        scriptTag.dataset.content = base64;
-        scriptTag.innerHTML = script;
-        parent.appendChild(scriptTag);
-    }
-}
-
-loadResource("https://gitlab.com/idotj/mastodon-embed-feed-timeline/-/raw/91677cc3a76b300428ed478f4cd4e546e34f827b/src/mastodon-timeline.min.js");
-loadResource("https://gitlab.com/idotj/mastodon-embed-feed-timeline/-/raw/91677cc3a76b300428ed478f4cd4e546e34f827b/src/mastodon-timeline.min.css");
-
-/**
- * @param {HTMLElement} feedElement
- */
-const createMastodonScript = async (feedElement) => {
-    if (!feedElement.dataset.init) {
-
-
-        feedElement.dataset.init = "true";
-    }
-};
-
-[...document.querySelectorAll("[data-mastodon]")].forEach(createMastodonScript);
diff --git a/shared/static/shared/svg/share-icons/mastodon-brands.svg b/shared/static/shared/svg/share-icons/mastodon-brands.svg
new file mode 100644
index 0000000000000000000000000000000000000000..cf8063e92fe7eb02388bc9fc9a64b69823fe66d9
--- /dev/null
+++ b/shared/static/shared/svg/share-icons/mastodon-brands.svg
@@ -0,0 +1,56 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   viewBox="0 0 417.99884 448.07172"
+   version="1.1"
+   id="svg24"
+   sodipodi:docname="mastodon-brands.svg"
+   width="417.99884"
+   height="448.07172"
+   inkscape:version="1.0.2 (e86c870879, 2021-01-15)">
+  <metadata
+     id="metadata30">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <defs
+     id="defs28" />
+  <sodipodi:namedview
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1"
+     objecttolerance="10"
+     gridtolerance="10"
+     guidetolerance="10"
+     inkscape:pageopacity="0"
+     inkscape:pageshadow="2"
+     inkscape:window-width="1680"
+     inkscape:window-height="965"
+     id="namedview26"
+     showgrid="false"
+     inkscape:zoom="1.2265625"
+     inkscape:cx="77.314305"
+     inkscape:cy="224.00265"
+     inkscape:window-x="1920"
+     inkscape:window-y="51"
+     inkscape:window-maximized="1"
+     inkscape:current-layer="svg24"
+     inkscape:document-rotation="0" />
+  <!--! Font Awesome Pro 6.1.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license (Commercial License) Copyright 2022 Fonticons, Inc. -->
+  <path
+     d="m 417.9831,147.11265 c 0,-97.200002 -63.71,-125.700002 -63.71,-125.700002 -62.52,-28.7000002 -228.56,-28.4000002 -290.480005,0 0,0 -63.71999978,28.5 -63.71999978,125.700002 0,115.7 -6.60000002,259.4 105.63000478,289.1 40.51,10.7 75.32,13 103.33,11.4 50.81,-2.8 79.32,-18.1 79.32,-18.1 l -1.7,-36.9 c 0,0 -36.31,11.4 -77.12,10.1 -40.41,-1.4 -83,-4.4 -89.63,-54 a 102.54,102.54 0 0 1 -0.9,-13.9 c 85.63,20.9 158.65,9.1 178.75,6.7 56.12,-6.7 105,-41.3 111.23,-72.9 9.8,-49.8 9,-121.5 9,-121.5 z m -75.12,125.2 h -46.63 v -114.2 c 0,-49.7 -64,-51.6 -64,6.9 v 62.5 h -46.33 v -62.51 c 0,-58.5 -64,-56.6 -64,-6.9 v 114.2 H 75.173095 c 0,-122.1 -5.2,-147.9 18.41,-175.000002 25.900005,-28.9 79.820005,-30.8 103.830005,6.100002 l 11.6,19.5 11.6,-19.5 c 24.11,-37.100002 78.12,-34.800002 103.83,-6.100002 23.71,27.300002 18.4,53.000002 18.4,175.000002 z"
+     id="path22"
+     style="fill-opacity:1;fill:#000000" />
+</svg>
diff --git a/shared/templates/shared/blocks/mastodon_feed_block.html b/shared/templates/shared/blocks/mastodon_feed_block.html
index f56e811734f99bf0d8874829e0caa44a5a178602..49677866c2515ba2d56f2608a54368f8862f59e0 100644
--- a/shared/templates/shared/blocks/mastodon_feed_block.html
+++ b/shared/templates/shared/blocks/mastodon_feed_block.html
@@ -1,6 +1,9 @@
-<script type="text/javascript" src="{% static "shared/js/mastodon_helper.js" %}" data-mastodon="true" data-feed="{{ self.url }}" data-user-id="{{ self.userId }}" data-user-name="{{ self.userName }}"></script>
-<div class="mt-timeline">
-    <div id="mt-body" class="mt-body" role="feed">
-        <div class="loading-spinner"></div>
-    </div>
-</div>
+{% load static shared_filters %}
+
+<iframe
+    allowfullscreen
+    sandbox="allow-top-navigation allow-scripts allow-popups allow-popups-to-escape-sandbox"
+    width="400"
+    height="800"
+    src="https://mastofeed.com/apiv2/feed?userurl={{ self.url | mastodon_url:self.user_name | urlencode:'' }}&theme=dark&size=100&header=true&replies=false&boosts=false">
+</iframe>
diff --git a/shared/templates/shared/mastodon_feed_link_snippet.html b/shared/templates/shared/mastodon_feed_link_snippet.html
new file mode 100644
index 0000000000000000000000000000000000000000..5368bb63920038f78eb705f49fe393081a4db171
--- /dev/null
+++ b/shared/templates/shared/mastodon_feed_link_snippet.html
@@ -0,0 +1,9 @@
+{% load shared_filters %}
+
+{% if page.mastodon_feed %}
+    <a href="{{ page.mastodon_feed.url | mastodon_url: page.mastodon_feed.user_name }}" class="social-icon ">{% include "shared/mastodon_icon_snippet.html" with size="20" %}</a>
+{% elif page.root_page.mastodon_feed %}
+    <a href="{{ page.root_page.mastodon_feed.url | mastodon_url: page.root_page.mastodon_feed.user_name }}" class="social-icon ">{% include "shared/mastodon_icon_snippet.html" with size="20" %}</a>
+{% else %}
+    <a href="https://mastodon.pirati.cz" class="social-icon ">{% include "shared/mastodon_icon_snippet.html" with size="20" %}</a>
+{% endif %}
diff --git a/shared/templates/shared/mastodon_feed_snippet.html b/shared/templates/shared/mastodon_feed_snippet.html
new file mode 100644
index 0000000000000000000000000000000000000000..5c09a78506bf047fc9ff72fa3dbe0427d22afdde
--- /dev/null
+++ b/shared/templates/shared/mastodon_feed_snippet.html
@@ -0,0 +1,15 @@
+{% load wagtailcore_tags shared_filters %}
+
+{% if page.mastodon_feed %}
+    {% include_block page.mastodon_feed %}
+{% elif page.root_page.mastodon_feed %}
+    {% include_block page.root_page.mastodon_feed %}
+{% else %}
+    <iframe
+        allowfullscreen
+        sandbox="allow-top-navigation allow-scripts allow-popups allow-popups-to-escape-sandbox"
+        width="400"
+        height="800"
+        src="https://mastofeed.com/api/feed?url={{ 'https://mastodon.pirati.cz' | urlencode:'' }}&theme=dark&size=100&header=true&replies=false&boosts=false">
+    </iframe>
+{% endif %}
diff --git a/shared/templates/shared/mastodon_icon_snippet.html b/shared/templates/shared/mastodon_icon_snippet.html
new file mode 100644
index 0000000000000000000000000000000000000000..4943741263ba1d05b29b1b07cc43303f902dc019
--- /dev/null
+++ b/shared/templates/shared/mastodon_icon_snippet.html
@@ -0,0 +1,9 @@
+{% load static %}
+
+<img
+    src="{% static 'shared/svg/share-icons/mastodon-brands.svg' %}"
+    alt="Sdílet na Mastodonu"
+    class="{{ class_name }}"
+    height="{{ size }}"
+    width="{{ size }}"
+>
diff --git a/shared/templatetags/shared_filters.py b/shared/templatetags/shared_filters.py
index 2f06f9ad6a92564d9e3e51757ad0d935f2f7f84f..c216b263b200ca699a32ff1dc55f4fc3966288b3 100644
--- a/shared/templatetags/shared_filters.py
+++ b/shared/templatetags/shared_filters.py
@@ -1,5 +1,6 @@
 import markdown as md
 from django import template
+from django.utils.http import urlencode as urlencodeInternal
 from django.utils.safestring import mark_safe
 
 register = template.Library()
@@ -9,3 +10,15 @@ register = template.Library()
 def markdown(value):
     """Prekonvertuje vstupni text na markdown, necekane"""
     return mark_safe(md.markdown(value))
+
+
+@register.filter
+def mastodon_url(url: str | None, name: str | None = None):
+    """
+    Gets mastodon url
+    """
+    if url is None or url == "/":
+        return "https://mastodon.pirati.cz"
+    if name is None or name == "":
+        return url
+    return url + "/users/" + name
diff --git a/uniweb/models.py b/uniweb/models.py
index 42389c9de3ddf587262948ca1d37b00549c5bd25..9eeb63441ebbdad2722d755ec8b09c1fac87132d 100644
--- a/uniweb/models.py
+++ b/uniweb/models.py
@@ -1,3 +1,5 @@
+import random
+
 from captcha.fields import CaptchaField
 from django import forms
 from django.core.paginator import Paginator
@@ -29,9 +31,10 @@ from shared.models import (
     ArticleMixin,
     ExtendedMetadataHomePageMixin,
     ExtendedMetadataPageMixin,
+    HomepageMixin,
     SubpageMixin,
 )
-from shared.utils import make_promote_panels
+from shared.utils import make_promote_panels, strip_all_html_tags, trim_to_length
 from tuning import admin_help
 
 from .blocks import PeopleGroupListBlock, PersonCustomPositionBlock, PersonUrlBlock
@@ -298,7 +301,7 @@ class UniwebArticleTag(TaggedItemBase):
 
 
 class UniwebHomePage(
-    Page, ExtendedMetadataHomePageMixin, MetadataPageMixin, CalendarMixin
+    Page, ExtendedMetadataHomePageMixin, MetadataPageMixin, CalendarMixin, HomepageMixin
 ):
     ### FIELDS
 
@@ -364,6 +367,7 @@ class UniwebHomePage(
             ],
             "nastavení patičky",
         ),
+        FieldPanel("mastodon_feed"),
     ]
 
     menu_panels = [FieldPanel("top_menu")]
@@ -771,7 +775,10 @@ class UniwebPeoplePage(
 
     ### PANELS
 
-    content_panels = Page.content_panels + [FieldPanel("content")]
+    content_panels = Page.content_panels + [
+        FieldPanel("content"),
+        FieldPanel("mastodon_feed"),
+    ]
 
     promote_panels = make_promote_panels()
 
diff --git a/uniweb/templates/uniweb/base.html b/uniweb/templates/uniweb/base.html
index 7f17985382b858ce71d75d7c4f0fd8c3d208afa5..965af5f33204e05fec381f7d893c797d658943a0 100644
--- a/uniweb/templates/uniweb/base.html
+++ b/uniweb/templates/uniweb/base.html
@@ -109,6 +109,7 @@
                 <a href="https://www.youtube.com/user/CeskaPiratskaStrana" class="social-icon "><i class="ico--youtube"></i></a>
                 <a href="https://www.instagram.com/pirati.cz/" class="social-icon "><i class="ico--instagram"></i></a>
                 <a href="https://www.flickr.com/photos/pirati/" class="social-icon "><i class="ico--flickr"></i></a>
+                {% include "shared/mastodon_feed_link_snippet" %}
               </div>
               {% endif %}
             </div>