diff --git a/README.md b/README.md
index f12ebec23dd852f41254d6301cc04c517224e376..d522cdfd7b07e8c2bef1aa3aff2a94645b649981 100644
--- a/README.md
+++ b/README.md
@@ -29,13 +29,11 @@ jako přehled pluginů a rozšíření pro Wagtail.
     ├── senat_campaign  = app na weby kandidátů na senátory
     ...
     ├── majak           = Django projekt s konfigurací Majáku
+    ├── shared          = app se sdílenými static soubory a templaty
     ├── calendar_utils  = app s modelem a utilitami na iCal kalendáře
     ├── search          = app pro fulltext search (default, asi se k ničemu nepoužívá)
     └── users           = app s custom user modelem a SSO, apod.
 
-Appky v sobě mají modely pro stránky a statické soubory a templaty. Momentálně se
-mezi weby nic z toho nesdílí.
-
 ### Kalendáře
 
 Pro práci s kalendáři v iCal formátu je připravena appka `calendar_utils`.
diff --git a/majak/settings/base.py b/majak/settings/base.py
index 078e40445a9a188d5011f09be379897514f598ed..1c6d2a45ced241ce9f6cee5de33c0f8a4c051309 100644
--- a/majak/settings/base.py
+++ b/majak/settings/base.py
@@ -33,6 +33,7 @@ DATABASES["default"]["ATOMIC_REQUESTS"] = True
 INSTALLED_APPS = [
     "senat_campaign",
     "home",
+    "shared",
     "calendar_utils",
     "users",
     "pirates",
diff --git a/senat_campaign/templates/senat_campaign/base.html b/senat_campaign/templates/senat_campaign/base.html
index 1b5c91aedc5806c3fa6c334174c3ba38aa656d95..091d15a07b807ced7b2f095db0cbd77be14e8785 100644
--- a/senat_campaign/templates/senat_campaign/base.html
+++ b/senat_campaign/templates/senat_campaign/base.html
@@ -35,39 +35,26 @@
   <meta property="og:locale" content="cs_CZ" />
   <meta property="og:url" content="{{ page.full_url }}" />
   {# TODO #}
-  <meta property="og:image" content="https://danielhlavacek.cz/pirati/img/og_image.jpg" />
+  <meta property="og:image" content="{% static "shared/img/og_image.jpg" %}" />
   <meta property="og:description" content="{% firstof page.search_description page.perex %}" />
 
   <!-- Favicon -->
-  <link rel="icon" type="image/png" href="{% static "senat_campaign/favicon/favicon-196.png" %}" sizes="196x196">
-  <link rel="icon" type="image/png" href="{% static "senat_campaign/favicon/favicon-128.png" %}" sizes="128x128">
-  <link rel="icon" type="image/png" href="{% static "senat_campaign/favicon/favicon-96.png" %}" sizes="96x96">
-  <link rel="icon" type="image/png" href="{% static "senat_campaign/favicon/favicon-32.png" %}" sizes="32x32">
-  <link rel="icon" type="image/png" href="{% static "senat_campaign/favicon/favicon-16.png" %}" sizes="16x16">
+  <link rel="icon" type="image/png" href="{% static "shared/favicon/favicon-196.png" %}" sizes="196x196">
+  <link rel="icon" type="image/png" href="{% static "shared/favicon/favicon-128.png" %}" sizes="128x128">
+  <link rel="icon" type="image/png" href="{% static "shared/favicon/favicon-96.png" %}" sizes="96x96">
+  <link rel="icon" type="image/png" href="{% static "shared/favicon/favicon-32.png" %}" sizes="32x32">
+  <link rel="icon" type="image/png" href="{% static "shared/favicon/favicon-16.png" %}" sizes="16x16">
 
   <!-- Bootstrap CSS -->
-  <link rel="stylesheet" href="{% static "senat_campaign/vendor/bootstrap-4.4.1/css/bootstrap.min.css" %}">
-  <link rel="stylesheet" href="{% static "senat_campaign/vendor/fancybox/jquery.fancybox.min.css" %}">
+  <link rel="stylesheet" href="{% static "shared/vendor/bootstrap-4.4.1/css/bootstrap.min.css" %}">
+  <link rel="stylesheet" href="{% static "shared/vendor/fancybox/jquery.fancybox.min.css" %}">
 
   <!-- Styles -->
   <link href="{% static "senat_campaign/assets/css/style.css" %}" rel="stylesheet">
   <link href="{% static "senat_campaign/assets/css/icons.css" %}" rel="stylesheet">
 
-  {% if not request.is_preview and page.root_page.matomo_id %}
-  <!-- Matomo -->
-  <script type="text/javascript">
-    var _paq = window._paq || [];
-    _paq.push(['trackPageView']);
-    _paq.push(['enableLinkTracking']);
-    (function() {
-      var u="//matomo.pirati.cz/";
-      _paq.push(['setTrackerUrl', u+'matomo.php']);
-      _paq.push(['setSiteId', '{{ page.root_page.matomo_id }}']);
-      var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0];
-      g.type='text/javascript'; g.async=true; g.defer=true; g.src=u+'matomo.js'; s.parentNode.insertBefore(g,s);
-    })();
-  </script>
-  <!-- End Matomo Code -->
+  {% if page.root_page.matomo_id %}
+    {% include "shared/matomo_snippet.html" with matomo_id=page.root_page.matomo_id %}
   {% endif %}
 </head>
 
@@ -245,10 +232,10 @@
   <!-- /FOOTER -->
 
   <!-- JavaScript libraries -->
-  <script src="{% static "senat_campaign/vendor/jquery/jquery-3.4.1.min.js" %}"></script>
-  <script src="{% static "senat_campaign/vendor/bootstrap-4.4.1/js/bootstrap.min.js" %}"></script>
-  <script src="{% static "senat_campaign/vendor/lazysizes/lazysizes.min.js" %}"></script>
-  <script src="{% static "senat_campaign/vendor/fancybox/jquery.fancybox.min.js" %}"></script>
+  <script src="{% static "shared/vendor/jquery/jquery-3.4.1.min.js" %}"></script>
+  <script src="{% static "shared/vendor/bootstrap-4.4.1/js/bootstrap.min.js" %}"></script>
+  <script src="{% static "shared/vendor/lazysizes/lazysizes.min.js" %}"></script>
+  <script src="{% static "shared/vendor/fancybox/jquery.fancybox.min.js" %}"></script>
   <script src="{% static "senat_campaign/assets/js/scripts.js" %}"></script>
 
 </body>
diff --git a/shared/__init__.py b/shared/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/shared/apps.py b/shared/apps.py
new file mode 100644
index 0000000000000000000000000000000000000000..d4818e15951c99d8b1b1c39a04abadb9faeb25bc
--- /dev/null
+++ b/shared/apps.py
@@ -0,0 +1,5 @@
+from django.apps import AppConfig
+
+
+class SharedConfig(AppConfig):
+    name = "shared"
diff --git a/senat_campaign/static/senat_campaign/favicon/favicon-128.png b/shared/static/shared/favicon/favicon-128.png
similarity index 100%
rename from senat_campaign/static/senat_campaign/favicon/favicon-128.png
rename to shared/static/shared/favicon/favicon-128.png
diff --git a/senat_campaign/static/senat_campaign/favicon/favicon-16.png b/shared/static/shared/favicon/favicon-16.png
similarity index 100%
rename from senat_campaign/static/senat_campaign/favicon/favicon-16.png
rename to shared/static/shared/favicon/favicon-16.png
diff --git a/senat_campaign/static/senat_campaign/favicon/favicon-196.png b/shared/static/shared/favicon/favicon-196.png
similarity index 100%
rename from senat_campaign/static/senat_campaign/favicon/favicon-196.png
rename to shared/static/shared/favicon/favicon-196.png
diff --git a/senat_campaign/static/senat_campaign/favicon/favicon-32.png b/shared/static/shared/favicon/favicon-32.png
similarity index 100%
rename from senat_campaign/static/senat_campaign/favicon/favicon-32.png
rename to shared/static/shared/favicon/favicon-32.png
diff --git a/senat_campaign/static/senat_campaign/favicon/favicon-96.png b/shared/static/shared/favicon/favicon-96.png
similarity index 100%
rename from senat_campaign/static/senat_campaign/favicon/favicon-96.png
rename to shared/static/shared/favicon/favicon-96.png
diff --git a/shared/static/shared/img/og_image.jpg b/shared/static/shared/img/og_image.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..aa779c1f54819e830a2d681b4dcb47560d15dc3a
Binary files /dev/null and b/shared/static/shared/img/og_image.jpg differ
diff --git a/senat_campaign/static/senat_campaign/vendor/bootstrap-4.4.1/css/bootstrap.min.css b/shared/static/shared/vendor/bootstrap-4.4.1/css/bootstrap.min.css
similarity index 100%
rename from senat_campaign/static/senat_campaign/vendor/bootstrap-4.4.1/css/bootstrap.min.css
rename to shared/static/shared/vendor/bootstrap-4.4.1/css/bootstrap.min.css
diff --git a/senat_campaign/static/senat_campaign/vendor/bootstrap-4.4.1/js/bootstrap.min.js b/shared/static/shared/vendor/bootstrap-4.4.1/js/bootstrap.min.js
similarity index 100%
rename from senat_campaign/static/senat_campaign/vendor/bootstrap-4.4.1/js/bootstrap.min.js
rename to shared/static/shared/vendor/bootstrap-4.4.1/js/bootstrap.min.js
diff --git a/senat_campaign/static/senat_campaign/vendor/fancybox/jquery.fancybox.min.css b/shared/static/shared/vendor/fancybox/jquery.fancybox.min.css
similarity index 100%
rename from senat_campaign/static/senat_campaign/vendor/fancybox/jquery.fancybox.min.css
rename to shared/static/shared/vendor/fancybox/jquery.fancybox.min.css
diff --git a/senat_campaign/static/senat_campaign/vendor/fancybox/jquery.fancybox.min.js b/shared/static/shared/vendor/fancybox/jquery.fancybox.min.js
similarity index 100%
rename from senat_campaign/static/senat_campaign/vendor/fancybox/jquery.fancybox.min.js
rename to shared/static/shared/vendor/fancybox/jquery.fancybox.min.js
diff --git a/senat_campaign/static/senat_campaign/vendor/jquery/jquery-3.4.1.min.js b/shared/static/shared/vendor/jquery/jquery-3.4.1.min.js
similarity index 100%
rename from senat_campaign/static/senat_campaign/vendor/jquery/jquery-3.4.1.min.js
rename to shared/static/shared/vendor/jquery/jquery-3.4.1.min.js
diff --git a/senat_campaign/static/senat_campaign/vendor/lazysizes/lazysizes.min.js b/shared/static/shared/vendor/lazysizes/lazysizes.min.js
similarity index 100%
rename from senat_campaign/static/senat_campaign/vendor/lazysizes/lazysizes.min.js
rename to shared/static/shared/vendor/lazysizes/lazysizes.min.js
diff --git a/shared/templates/shared/matomo_snippet.html b/shared/templates/shared/matomo_snippet.html
new file mode 100644
index 0000000000000000000000000000000000000000..9e99cc45a09b1b04c5b53f18f50f8c81d72eef4b
--- /dev/null
+++ b/shared/templates/shared/matomo_snippet.html
@@ -0,0 +1,16 @@
+{% if not request.is_preview %}
+<!-- Matomo -->
+<script type="text/javascript">
+  var _paq = window._paq || [];
+  _paq.push(['trackPageView']);
+  _paq.push(['enableLinkTracking']);
+  (function() {
+    var u="//matomo.pirati.cz/";
+    _paq.push(['setTrackerUrl', u+'matomo.php']);
+    _paq.push(['setSiteId', '{{ matomo_id }}']);
+    var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0];
+    g.type='text/javascript'; g.async=true; g.defer=true; g.src=u+'matomo.js'; s.parentNode.insertBefore(g,s);
+  })();
+</script>
+<!-- End Matomo Code -->
+{% endif %}