diff --git a/main/migrations/0001_initial.py b/main/migrations/0001_initial.py
new file mode 100644
index 0000000000000000000000000000000000000000..700ebf80872067eb2019ac41ca9bd1eb77cb18b6
--- /dev/null
+++ b/main/migrations/0001_initial.py
@@ -0,0 +1,286 @@
+# Generated by Django 4.0.4 on 2022-08-10 11:39
+
+import django.db.models.deletion
+import wagtail.blocks
+import wagtail.fields
+import wagtailmetadata.models
+from django.db import migrations, models
+
+import shared.models
+
+
+class Migration(migrations.Migration):
+
+    initial = True
+
+    dependencies = [
+        ("wagtailcore", "0069_log_entry_jsonfield"),
+        ("wagtailimages", "0024_index_image_file_hash"),
+    ]
+
+    operations = [
+        migrations.CreateModel(
+            name="MainHomePage",
+            fields=[
+                (
+                    "page_ptr",
+                    models.OneToOneField(
+                        auto_created=True,
+                        on_delete=django.db.models.deletion.CASCADE,
+                        parent_link=True,
+                        primary_key=True,
+                        serialize=False,
+                        to="wagtailcore.page",
+                    ),
+                ),
+                (
+                    "menu",
+                    wagtail.fields.StreamField(
+                        [
+                            (
+                                "menu_item",
+                                wagtail.blocks.StructBlock(
+                                    [
+                                        (
+                                            "title",
+                                            wagtail.blocks.CharBlock(
+                                                label="Titulek", required=True
+                                            ),
+                                        ),
+                                        (
+                                            "page",
+                                            wagtail.blocks.PageChooserBlock(
+                                                label="Stránka", required=False
+                                            ),
+                                        ),
+                                        (
+                                            "link",
+                                            wagtail.blocks.URLBlock(
+                                                label="Odkaz", required=False
+                                            ),
+                                        ),
+                                    ]
+                                ),
+                            ),
+                            (
+                                "menu_parent",
+                                wagtail.blocks.StructBlock(
+                                    [
+                                        (
+                                            "title",
+                                            wagtail.blocks.CharBlock(
+                                                label="Titulek", required=True
+                                            ),
+                                        ),
+                                        (
+                                            "menu_items",
+                                            wagtail.blocks.ListBlock(
+                                                wagtail.blocks.StructBlock(
+                                                    [
+                                                        (
+                                                            "title",
+                                                            wagtail.blocks.CharBlock(
+                                                                label="Titulek",
+                                                                required=True,
+                                                            ),
+                                                        ),
+                                                        (
+                                                            "page",
+                                                            wagtail.blocks.PageChooserBlock(
+                                                                label="Stránka",
+                                                                required=False,
+                                                            ),
+                                                        ),
+                                                        (
+                                                            "link",
+                                                            wagtail.blocks.URLBlock(
+                                                                label="Odkaz",
+                                                                required=False,
+                                                            ),
+                                                        ),
+                                                    ]
+                                                )
+                                            ),
+                                        ),
+                                    ]
+                                ),
+                            ),
+                        ],
+                        blank=True,
+                        use_json_field=None,
+                        verbose_name="Menu",
+                    ),
+                ),
+                (
+                    "title_suffix",
+                    models.CharField(
+                        blank=True,
+                        help_text="Umožňuje přidat příponu k základnímu titulku stránky. Pokud je např. titulek stránky pojmenovaný 'Kontakt' a do přípony vyplníte 'MS Pardubice | Piráti', výsledný titulek bude 'Kontakt | MS Pardubice | Piráti'. Pokud příponu nevyplníte, použije se název webu.",
+                        max_length=100,
+                        null=True,
+                        verbose_name="Přípona titulku stránky",
+                    ),
+                ),
+                (
+                    "matomo_id",
+                    models.IntegerField(
+                        blank=True,
+                        null=True,
+                        verbose_name="Matomo ID pro sledování návštěvnosti",
+                    ),
+                ),
+                (
+                    "footer",
+                    wagtail.fields.StreamField(
+                        [
+                            (
+                                "item",
+                                wagtail.blocks.StructBlock(
+                                    [
+                                        (
+                                            "position",
+                                            wagtail.blocks.CharBlock(
+                                                label="Název pozice", required=False
+                                            ),
+                                        ),
+                                        (
+                                            "person",
+                                            wagtail.blocks.PageChooserBlock(
+                                                label="Osoba",
+                                                page_type=[
+                                                    "district.DistrictPersonPage"
+                                                ],
+                                            ),
+                                        ),
+                                    ]
+                                ),
+                            )
+                        ],
+                        blank=True,
+                        use_json_field=None,
+                        verbose_name="Kontaktní boxy",
+                    ),
+                ),
+                (
+                    "search_image",
+                    models.ForeignKey(
+                        blank=True,
+                        null=True,
+                        on_delete=django.db.models.deletion.SET_NULL,
+                        related_name="+",
+                        to="wagtailimages.image",
+                        verbose_name="Search image",
+                    ),
+                ),
+            ],
+            options={
+                "verbose_name": "HomePage pirati.cz",
+            },
+            bases=(
+                "wagtailcore.page",
+                wagtailmetadata.models.WagtailImageMetadataMixin,
+                models.Model,
+            ),
+        ),
+        migrations.CreateModel(
+            name="MainContactPage",
+            fields=[
+                (
+                    "page_ptr",
+                    models.OneToOneField(
+                        auto_created=True,
+                        on_delete=django.db.models.deletion.CASCADE,
+                        parent_link=True,
+                        primary_key=True,
+                        serialize=False,
+                        to="wagtailcore.page",
+                    ),
+                ),
+                (
+                    "contact_people",
+                    wagtail.fields.StreamField(
+                        [
+                            (
+                                "item",
+                                wagtail.blocks.StructBlock(
+                                    [
+                                        (
+                                            "position",
+                                            wagtail.blocks.CharBlock(
+                                                label="Název pozice", required=False
+                                            ),
+                                        ),
+                                        (
+                                            "person",
+                                            wagtail.blocks.PageChooserBlock(
+                                                label="Osoba",
+                                                page_type=[
+                                                    "district.DistrictPersonPage"
+                                                ],
+                                            ),
+                                        ),
+                                    ]
+                                ),
+                            )
+                        ],
+                        blank=True,
+                        use_json_field=None,
+                        verbose_name="Kontaktní osoby",
+                    ),
+                ),
+                (
+                    "contact_boxes",
+                    wagtail.fields.StreamField(
+                        [
+                            (
+                                "item",
+                                wagtail.blocks.StructBlock(
+                                    [
+                                        (
+                                            "position",
+                                            wagtail.blocks.CharBlock(
+                                                label="Název pozice", required=False
+                                            ),
+                                        ),
+                                        (
+                                            "person",
+                                            wagtail.blocks.PageChooserBlock(
+                                                label="Osoba",
+                                                page_type=[
+                                                    "district.DistrictPersonPage"
+                                                ],
+                                            ),
+                                        ),
+                                    ]
+                                ),
+                            )
+                        ],
+                        blank=True,
+                        use_json_field=None,
+                        verbose_name="Kontaktní boxy",
+                    ),
+                ),
+                ("text", wagtail.fields.RichTextField(blank=True, verbose_name="Text")),
+                (
+                    "search_image",
+                    models.ForeignKey(
+                        blank=True,
+                        null=True,
+                        on_delete=django.db.models.deletion.SET_NULL,
+                        related_name="+",
+                        to="wagtailimages.image",
+                        verbose_name="Search image",
+                    ),
+                ),
+            ],
+            options={
+                "verbose_name": "Kontakty",
+            },
+            bases=(
+                shared.models.SubpageMixin,
+                wagtailmetadata.models.WagtailImageMetadataMixin,
+                "wagtailcore.page",
+                models.Model,
+            ),
+        ),
+    ]
diff --git a/main/models.py b/main/models.py
index b3ca1b523f9ac2602fd4e726f2606a87715951fa..44e3c1a24bc29e8a7560012018fff2d35b3c81e1 100644
--- a/main/models.py
+++ b/main/models.py
@@ -31,12 +31,15 @@ class MainHomePage(MenuMixin, ExtendedMetadataHomePageMixin, MetadataPageMixin,
         blank=True,
     )
 
+    content_panels = Page.content_panels + []
+
     settings_panels = [FieldPanel("matomo_id")]
 
     ### EDIT HANDLERS
 
     edit_handler = TabbedInterface(
         [
+            ObjectList(content_panels, heading="Obsah"),
             ObjectList(settings_panels, heading="Nastavení"),
             ObjectList(MenuMixin.menu_panels, heading="Menu"),
         ]
diff --git a/main/static/main/css/styles.css b/main/static/main/css/styles.css
new file mode 100644
index 0000000000000000000000000000000000000000..4b053d2aa4620d42417eefa3486ab3163111817b
--- /dev/null
+++ b/main/static/main/css/styles.css
@@ -0,0 +1,601 @@
+/*
+! tailwindcss v3.1.8 | MIT License | https://tailwindcss.com
+*/
+
+/*
+1. Prevent padding and border from affecting element width. (https://github.com/mozdevs/cssremedy/issues/4)
+2. Allow adding a border to an element by just adding a border-width. (https://github.com/tailwindcss/tailwindcss/pull/116)
+*/
+
+*,
+::before,
+::after {
+  box-sizing: border-box;
+  /* 1 */
+  border-width: 0;
+  /* 2 */
+  border-style: solid;
+  /* 2 */
+  border-color: #e5e7eb;
+  /* 2 */
+}
+
+::before,
+::after {
+  --tw-content: '';
+}
+
+/*
+1. Use a consistent sensible line-height in all browsers.
+2. Prevent adjustments of font size after orientation changes in iOS.
+3. Use a more readable tab size.
+4. Use the user's configured `sans` font-family by default.
+*/
+
+html {
+  line-height: 1.5;
+  /* 1 */
+  -webkit-text-size-adjust: 100%;
+  /* 2 */
+  -moz-tab-size: 4;
+  /* 3 */
+  -o-tab-size: 4;
+     tab-size: 4;
+  /* 3 */
+  font-family: ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
+  /* 4 */
+}
+
+/*
+1. Remove the margin in all browsers.
+2. Inherit line-height from `html` so users can set them as a class directly on the `html` element.
+*/
+
+body {
+  margin: 0;
+  /* 1 */
+  line-height: inherit;
+  /* 2 */
+}
+
+/*
+1. Add the correct height in Firefox.
+2. Correct the inheritance of border color in Firefox. (https://bugzilla.mozilla.org/show_bug.cgi?id=190655)
+3. Ensure horizontal rules are visible by default.
+*/
+
+hr {
+  height: 0;
+  /* 1 */
+  color: inherit;
+  /* 2 */
+  border-top-width: 1px;
+  /* 3 */
+}
+
+/*
+Add the correct text decoration in Chrome, Edge, and Safari.
+*/
+
+abbr:where([title]) {
+  -webkit-text-decoration: underline dotted;
+          text-decoration: underline dotted;
+}
+
+/*
+Remove the default font size and weight for headings.
+*/
+
+h1,
+h2,
+h3,
+h4,
+h5,
+h6 {
+  font-size: inherit;
+  font-weight: inherit;
+}
+
+/*
+Reset links to optimize for opt-in styling instead of opt-out.
+*/
+
+a {
+  color: inherit;
+  text-decoration: inherit;
+}
+
+/*
+Add the correct font weight in Edge and Safari.
+*/
+
+b,
+strong {
+  font-weight: bolder;
+}
+
+/*
+1. Use the user's configured `mono` font family by default.
+2. Correct the odd `em` font sizing in all browsers.
+*/
+
+code,
+kbd,
+samp,
+pre {
+  font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;
+  /* 1 */
+  font-size: 1em;
+  /* 2 */
+}
+
+/*
+Add the correct font size in all browsers.
+*/
+
+small {
+  font-size: 80%;
+}
+
+/*
+Prevent `sub` and `sup` elements from affecting the line height in all browsers.
+*/
+
+sub,
+sup {
+  font-size: 75%;
+  line-height: 0;
+  position: relative;
+  vertical-align: baseline;
+}
+
+sub {
+  bottom: -0.25em;
+}
+
+sup {
+  top: -0.5em;
+}
+
+/*
+1. Remove text indentation from table contents in Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=999088, https://bugs.webkit.org/show_bug.cgi?id=201297)
+2. Correct table border color inheritance in all Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=935729, https://bugs.webkit.org/show_bug.cgi?id=195016)
+3. Remove gaps between table borders by default.
+*/
+
+table {
+  text-indent: 0;
+  /* 1 */
+  border-color: inherit;
+  /* 2 */
+  border-collapse: collapse;
+  /* 3 */
+}
+
+/*
+1. Change the font styles in all browsers.
+2. Remove the margin in Firefox and Safari.
+3. Remove default padding in all browsers.
+*/
+
+button,
+input,
+optgroup,
+select,
+textarea {
+  font-family: inherit;
+  /* 1 */
+  font-size: 100%;
+  /* 1 */
+  font-weight: inherit;
+  /* 1 */
+  line-height: inherit;
+  /* 1 */
+  color: inherit;
+  /* 1 */
+  margin: 0;
+  /* 2 */
+  padding: 0;
+  /* 3 */
+}
+
+/*
+Remove the inheritance of text transform in Edge and Firefox.
+*/
+
+button,
+select {
+  text-transform: none;
+}
+
+/*
+1. Correct the inability to style clickable types in iOS and Safari.
+2. Remove default button styles.
+*/
+
+button,
+[type='button'],
+[type='reset'],
+[type='submit'] {
+  -webkit-appearance: button;
+  /* 1 */
+  background-color: transparent;
+  /* 2 */
+  background-image: none;
+  /* 2 */
+}
+
+/*
+Use the modern Firefox focus style for all focusable elements.
+*/
+
+:-moz-focusring {
+  outline: auto;
+}
+
+/*
+Remove the additional `:invalid` styles in Firefox. (https://github.com/mozilla/gecko-dev/blob/2f9eacd9d3d995c937b4251a5557d95d494c9be1/layout/style/res/forms.css#L728-L737)
+*/
+
+:-moz-ui-invalid {
+  box-shadow: none;
+}
+
+/*
+Add the correct vertical alignment in Chrome and Firefox.
+*/
+
+progress {
+  vertical-align: baseline;
+}
+
+/*
+Correct the cursor style of increment and decrement buttons in Safari.
+*/
+
+::-webkit-inner-spin-button,
+::-webkit-outer-spin-button {
+  height: auto;
+}
+
+/*
+1. Correct the odd appearance in Chrome and Safari.
+2. Correct the outline style in Safari.
+*/
+
+[type='search'] {
+  -webkit-appearance: textfield;
+  /* 1 */
+  outline-offset: -2px;
+  /* 2 */
+}
+
+/*
+Remove the inner padding in Chrome and Safari on macOS.
+*/
+
+::-webkit-search-decoration {
+  -webkit-appearance: none;
+}
+
+/*
+1. Correct the inability to style clickable types in iOS and Safari.
+2. Change font properties to `inherit` in Safari.
+*/
+
+::-webkit-file-upload-button {
+  -webkit-appearance: button;
+  /* 1 */
+  font: inherit;
+  /* 2 */
+}
+
+/*
+Add the correct display in Chrome and Safari.
+*/
+
+summary {
+  display: list-item;
+}
+
+/*
+Removes the default spacing and border for appropriate elements.
+*/
+
+blockquote,
+dl,
+dd,
+h1,
+h2,
+h3,
+h4,
+h5,
+h6,
+hr,
+figure,
+p,
+pre {
+  margin: 0;
+}
+
+fieldset {
+  margin: 0;
+  padding: 0;
+}
+
+legend {
+  padding: 0;
+}
+
+ol,
+ul,
+menu {
+  list-style: none;
+  margin: 0;
+  padding: 0;
+}
+
+/*
+Prevent resizing textareas horizontally by default.
+*/
+
+textarea {
+  resize: vertical;
+}
+
+/*
+1. Reset the default placeholder opacity in Firefox. (https://github.com/tailwindlabs/tailwindcss/issues/3300)
+2. Set the default placeholder color to the user's configured gray 400 color.
+*/
+
+input::-moz-placeholder, textarea::-moz-placeholder {
+  opacity: 1;
+  /* 1 */
+  color: #9ca3af;
+  /* 2 */
+}
+
+input::placeholder,
+textarea::placeholder {
+  opacity: 1;
+  /* 1 */
+  color: #9ca3af;
+  /* 2 */
+}
+
+/*
+Set the default cursor for buttons.
+*/
+
+button,
+[role="button"] {
+  cursor: pointer;
+}
+
+/*
+Make sure disabled buttons don't get the pointer cursor.
+*/
+
+:disabled {
+  cursor: default;
+}
+
+/*
+1. Make replaced elements `display: block` by default. (https://github.com/mozdevs/cssremedy/issues/14)
+2. Add `vertical-align: middle` to align replaced elements more sensibly by default. (https://github.com/jensimmons/cssremedy/issues/14#issuecomment-634934210)
+   This can trigger a poorly considered lint error in some tools but is included by design.
+*/
+
+img,
+svg,
+video,
+canvas,
+audio,
+iframe,
+embed,
+object {
+  display: block;
+  /* 1 */
+  vertical-align: middle;
+  /* 2 */
+}
+
+/*
+Constrain images and videos to the parent width and preserve their intrinsic aspect ratio. (https://github.com/mozdevs/cssremedy/issues/14)
+*/
+
+img,
+video {
+  max-width: 100%;
+  height: auto;
+}
+
+*, ::before, ::after {
+  --tw-border-spacing-x: 0;
+  --tw-border-spacing-y: 0;
+  --tw-translate-x: 0;
+  --tw-translate-y: 0;
+  --tw-rotate: 0;
+  --tw-skew-x: 0;
+  --tw-skew-y: 0;
+  --tw-scale-x: 1;
+  --tw-scale-y: 1;
+  --tw-pan-x:  ;
+  --tw-pan-y:  ;
+  --tw-pinch-zoom:  ;
+  --tw-scroll-snap-strictness: proximity;
+  --tw-ordinal:  ;
+  --tw-slashed-zero:  ;
+  --tw-numeric-figure:  ;
+  --tw-numeric-spacing:  ;
+  --tw-numeric-fraction:  ;
+  --tw-ring-inset:  ;
+  --tw-ring-offset-width: 0px;
+  --tw-ring-offset-color: #fff;
+  --tw-ring-color: rgb(59 130 246 / 0.5);
+  --tw-ring-offset-shadow: 0 0 #0000;
+  --tw-ring-shadow: 0 0 #0000;
+  --tw-shadow: 0 0 #0000;
+  --tw-shadow-colored: 0 0 #0000;
+  --tw-blur:  ;
+  --tw-brightness:  ;
+  --tw-contrast:  ;
+  --tw-grayscale:  ;
+  --tw-hue-rotate:  ;
+  --tw-invert:  ;
+  --tw-saturate:  ;
+  --tw-sepia:  ;
+  --tw-drop-shadow:  ;
+  --tw-backdrop-blur:  ;
+  --tw-backdrop-brightness:  ;
+  --tw-backdrop-contrast:  ;
+  --tw-backdrop-grayscale:  ;
+  --tw-backdrop-hue-rotate:  ;
+  --tw-backdrop-invert:  ;
+  --tw-backdrop-opacity:  ;
+  --tw-backdrop-saturate:  ;
+  --tw-backdrop-sepia:  ;
+}
+
+::-webkit-backdrop {
+  --tw-border-spacing-x: 0;
+  --tw-border-spacing-y: 0;
+  --tw-translate-x: 0;
+  --tw-translate-y: 0;
+  --tw-rotate: 0;
+  --tw-skew-x: 0;
+  --tw-skew-y: 0;
+  --tw-scale-x: 1;
+  --tw-scale-y: 1;
+  --tw-pan-x:  ;
+  --tw-pan-y:  ;
+  --tw-pinch-zoom:  ;
+  --tw-scroll-snap-strictness: proximity;
+  --tw-ordinal:  ;
+  --tw-slashed-zero:  ;
+  --tw-numeric-figure:  ;
+  --tw-numeric-spacing:  ;
+  --tw-numeric-fraction:  ;
+  --tw-ring-inset:  ;
+  --tw-ring-offset-width: 0px;
+  --tw-ring-offset-color: #fff;
+  --tw-ring-color: rgb(59 130 246 / 0.5);
+  --tw-ring-offset-shadow: 0 0 #0000;
+  --tw-ring-shadow: 0 0 #0000;
+  --tw-shadow: 0 0 #0000;
+  --tw-shadow-colored: 0 0 #0000;
+  --tw-blur:  ;
+  --tw-brightness:  ;
+  --tw-contrast:  ;
+  --tw-grayscale:  ;
+  --tw-hue-rotate:  ;
+  --tw-invert:  ;
+  --tw-saturate:  ;
+  --tw-sepia:  ;
+  --tw-drop-shadow:  ;
+  --tw-backdrop-blur:  ;
+  --tw-backdrop-brightness:  ;
+  --tw-backdrop-contrast:  ;
+  --tw-backdrop-grayscale:  ;
+  --tw-backdrop-hue-rotate:  ;
+  --tw-backdrop-invert:  ;
+  --tw-backdrop-opacity:  ;
+  --tw-backdrop-saturate:  ;
+  --tw-backdrop-sepia:  ;
+}
+
+::backdrop {
+  --tw-border-spacing-x: 0;
+  --tw-border-spacing-y: 0;
+  --tw-translate-x: 0;
+  --tw-translate-y: 0;
+  --tw-rotate: 0;
+  --tw-skew-x: 0;
+  --tw-skew-y: 0;
+  --tw-scale-x: 1;
+  --tw-scale-y: 1;
+  --tw-pan-x:  ;
+  --tw-pan-y:  ;
+  --tw-pinch-zoom:  ;
+  --tw-scroll-snap-strictness: proximity;
+  --tw-ordinal:  ;
+  --tw-slashed-zero:  ;
+  --tw-numeric-figure:  ;
+  --tw-numeric-spacing:  ;
+  --tw-numeric-fraction:  ;
+  --tw-ring-inset:  ;
+  --tw-ring-offset-width: 0px;
+  --tw-ring-offset-color: #fff;
+  --tw-ring-color: rgb(59 130 246 / 0.5);
+  --tw-ring-offset-shadow: 0 0 #0000;
+  --tw-ring-shadow: 0 0 #0000;
+  --tw-shadow: 0 0 #0000;
+  --tw-shadow-colored: 0 0 #0000;
+  --tw-blur:  ;
+  --tw-brightness:  ;
+  --tw-contrast:  ;
+  --tw-grayscale:  ;
+  --tw-hue-rotate:  ;
+  --tw-invert:  ;
+  --tw-saturate:  ;
+  --tw-sepia:  ;
+  --tw-drop-shadow:  ;
+  --tw-backdrop-blur:  ;
+  --tw-backdrop-brightness:  ;
+  --tw-backdrop-contrast:  ;
+  --tw-backdrop-grayscale:  ;
+  --tw-backdrop-hue-rotate:  ;
+  --tw-backdrop-invert:  ;
+  --tw-backdrop-opacity:  ;
+  --tw-backdrop-saturate:  ;
+  --tw-backdrop-sepia:  ;
+}
+
+.static {
+  position: static;
+}
+
+.my-40 {
+  margin-top: 10rem;
+  margin-bottom: 10rem;
+}
+
+.mb-8 {
+  margin-bottom: 2rem;
+}
+
+.block {
+  display: block;
+}
+
+.flex {
+  display: flex;
+}
+
+.flex-col {
+  flex-direction: column;
+}
+
+.items-center {
+  align-items: center;
+}
+
+.bg-black {
+  --tw-bg-opacity: 1;
+  background-color: rgb(0 0 0 / var(--tw-bg-opacity));
+}
+
+.text-4xl {
+  font-size: 2.25rem;
+  line-height: 2.5rem;
+}
+
+.text-2xl {
+  font-size: 1.5rem;
+  line-height: 2rem;
+}
+
+.text-5xl {
+  font-size: 3rem;
+  line-height: 1;
+}
diff --git a/main/tailwind/.gitignore b/main/tailwind/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..d5f19d89b308d36ee9e27b912015b0f75ec2f03f
--- /dev/null
+++ b/main/tailwind/.gitignore
@@ -0,0 +1,2 @@
+node_modules
+package-lock.json
diff --git a/main/tailwind/input.css b/main/tailwind/input.css
new file mode 100644
index 0000000000000000000000000000000000000000..b5c61c956711f981a41e95f7fcf0038436cfbb22
--- /dev/null
+++ b/main/tailwind/input.css
@@ -0,0 +1,3 @@
+@tailwind base;
+@tailwind components;
+@tailwind utilities;
diff --git a/main/tailwind/package.json b/main/tailwind/package.json
new file mode 100644
index 0000000000000000000000000000000000000000..2971f1d326b0f7575862125e219b8b10acbbf106
--- /dev/null
+++ b/main/tailwind/package.json
@@ -0,0 +1,17 @@
+{
+  "name": "tailwind",
+  "version": "1.0.0",
+  "description": "",
+  "main": "tailwind.config.js",
+  "dependencies": {},
+  "devDependencies": {
+    "tailwindcss": "^3.1.8"
+  },
+  "scripts": {
+    "build": "tailwindcss -i ./input.css -o ../static/main/css/styles.css",
+    "watch": "tailwindcss -i ./input.css -o ../static/main/css/styles.css --watch"
+  },
+  "keywords": [],
+  "author": "",
+  "license": "ISC"
+}
diff --git a/main/tailwind/tailwind.config.js b/main/tailwind/tailwind.config.js
new file mode 100644
index 0000000000000000000000000000000000000000..02580239c9f0510f6e4066232a59066fcdb5e8be
--- /dev/null
+++ b/main/tailwind/tailwind.config.js
@@ -0,0 +1,7 @@
+module.exports = {
+  content: ["../templates/**/*.html"],
+  theme: {
+    extend: {},
+  },
+  plugins: [],
+}
diff --git a/main/templates/main/base.html b/main/templates/main/base.html
index 13356618a615ae6ed34cda956f29dea271cb8d70..3027648b7244713fa186456d1097962c4a9cc5fb 100644
--- a/main/templates/main/base.html
+++ b/main/templates/main/base.html
@@ -2,29 +2,29 @@
 <!doctype html>
 <html lang="cs">
 <head>
-  <!-- Meta -->
-  <meta charset="utf-8">
-  <meta name="viewport" content="width=device-width" />
-  {% meta_tags %}
-  {% if settings.MAJAK_ENV == "test" %}
-    <meta name="robots" content="noindex, nofollow">
-  {% endif %}
+    <!-- Meta -->
+    <meta charset="utf-8">
+    <meta name="viewport" content="width=device-width"/>
+    {% meta_tags %}
+    {% if settings.MAJAK_ENV == "test" %}
+        <meta name="robots" content="noindex, nofollow">
+    {% endif %}
 
-  <!-- Favicon -->
-  {% include "shared/favicon_snippet.html" %}
+    <!-- Favicon -->
+    {% include "shared/favicon_snippet.html" %}
 
-  <!-- Styles -->
- <script src="https://cdn.tailwindcss.com"></script>
+    <!-- Styles -->
+    <link rel="stylesheet" href="{% static 'main/css/styles.css' %}">
 
-  {% block styles %}{% endblock styles %}
+    {% block styles %}{% endblock styles %}
 
-  {% if page.root_page.matomo_id %}
-    {% include "shared/matomo_snippet.html" with matomo_id=page.root_page.matomo_id %}
-  {% endif %}
+    {% if page.root_page.matomo_id %}
+        {% include "shared/matomo_snippet.html" with matomo_id=page.root_page.matomo_id %}
+    {% endif %}
 </head>
 
 <body>
-  {% block content %}{% endblock content %}
-  {% block scripts %}{% endblock scripts %}
+{% block content %}{% endblock content %}
+{% block scripts %}{% endblock scripts %}
 </body>
 </html>
diff --git a/main/templates/main/includes/newsletter_block.html b/main/templates/main/includes/layout/header.html
similarity index 100%
rename from main/templates/main/includes/newsletter_block.html
rename to main/templates/main/includes/layout/header.html
diff --git a/main/templates/main/main_home_page.html b/main/templates/main/main_home_page.html
new file mode 100644
index 0000000000000000000000000000000000000000..46fb4f82d83bb538a2374c5a29c9487e6b88d5ba
--- /dev/null
+++ b/main/templates/main/main_home_page.html
@@ -0,0 +1,4 @@
+{% extends "main/base.html" %}
+
+{% block content %}
+{% endblock %}
diff --git a/majak/settings/base.py b/majak/settings/base.py
index cccc86814e3ae279948d9049d17f602275722d46..e1e42cb733a1c9fa9b9133007738382a249f3bb9 100644
--- a/majak/settings/base.py
+++ b/majak/settings/base.py
@@ -37,6 +37,7 @@ INSTALLED_APPS = [
     "districts",
     "senate",
     "donate",
+    "main",
     "senat_campaign",
     "uniweb",
     "district",