diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..eca2a89b04a3e380907aa885e8b227e4611cec55
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,5 @@
+__pycache__/
+.env
+webpack-stats.json
+staticfiles
+node_modules
diff --git a/groups/__init__.py b/groups/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/groups/admin.py b/groups/admin.py
new file mode 100644
index 0000000000000000000000000000000000000000..8c38f3f3dad51e4585f3984282c2a4bec5349c1e
--- /dev/null
+++ b/groups/admin.py
@@ -0,0 +1,3 @@
+from django.contrib import admin
+
+# Register your models here.
diff --git a/groups/apps.py b/groups/apps.py
new file mode 100644
index 0000000000000000000000000000000000000000..86b49bc69390200e161abca3346269d60c54b2f0
--- /dev/null
+++ b/groups/apps.py
@@ -0,0 +1,6 @@
+from django.apps import AppConfig
+
+
+class GroupsConfig(AppConfig):
+    default_auto_field = 'django.db.models.BigAutoField'
+    name = 'groups'
diff --git a/groups/migrations/__init__.py b/groups/migrations/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/groups/models.py b/groups/models.py
new file mode 100644
index 0000000000000000000000000000000000000000..fbab9a6d5e8e818050b04cbb5410e1200dc8b29e
--- /dev/null
+++ b/groups/models.py
@@ -0,0 +1,21 @@
+from django.db import models
+
+# Create your models here.
+
+
+class Group(models.Model):
+    name = models.CharField(
+        max_length=128,
+        verbose_name="Jméno",
+    )
+
+    lectures = models.ManyToManyField(
+        "lectures.Lecture",
+        blank=True,
+        null=True,
+        verbose_name="Události",
+    )
+
+    class Meta:
+        verbose_name = "Skupina"
+        verbose_name_plural = "Skupiny"
diff --git a/groups/tests.py b/groups/tests.py
new file mode 100644
index 0000000000000000000000000000000000000000..7ce503c2dd97ba78597f6ff6e4393132753573f6
--- /dev/null
+++ b/groups/tests.py
@@ -0,0 +1,3 @@
+from django.test import TestCase
+
+# Create your tests here.
diff --git a/groups/views.py b/groups/views.py
new file mode 100644
index 0000000000000000000000000000000000000000..91ea44a218fbd2f408430959283f0419c921093e
--- /dev/null
+++ b/groups/views.py
@@ -0,0 +1,3 @@
+from django.shortcuts import render
+
+# Create your views here.
diff --git a/lectures/__init__.py b/lectures/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/lectures/admin.py b/lectures/admin.py
new file mode 100644
index 0000000000000000000000000000000000000000..8c38f3f3dad51e4585f3984282c2a4bec5349c1e
--- /dev/null
+++ b/lectures/admin.py
@@ -0,0 +1,3 @@
+from django.contrib import admin
+
+# Register your models here.
diff --git a/lectures/apps.py b/lectures/apps.py
new file mode 100644
index 0000000000000000000000000000000000000000..30d62f2847985f5046f071af0616c7d1202ac5cd
--- /dev/null
+++ b/lectures/apps.py
@@ -0,0 +1,6 @@
+from django.apps import AppConfig
+
+
+class LecturesConfig(AppConfig):
+    default_auto_field = 'django.db.models.BigAutoField'
+    name = 'lectures'
diff --git a/lectures/migrations/0001_initial.py b/lectures/migrations/0001_initial.py
new file mode 100644
index 0000000000000000000000000000000000000000..549de6b5571b77807fd889b3f0a7027e4ec043b7
--- /dev/null
+++ b/lectures/migrations/0001_initial.py
@@ -0,0 +1,70 @@
+# Generated by Django 4.1.4 on 2023-04-17 10:56
+
+from django.db import migrations, models
+import django.db.models.deletion
+import markdownx.models
+
+
+class Migration(migrations.Migration):
+
+    initial = True
+
+    dependencies = [
+    ]
+
+    operations = [
+        migrations.CreateModel(
+            name='Lecture',
+            fields=[
+                ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+                ('timestamp', models.DateTimeField(blank=True, null=True, verbose_name='Datum a čas konání')),
+                ('type', models.CharField(choices=[('recommended', 'Doporučené'), ('optional', 'Volitelné')], max_length=11, verbose_name='Typ')),
+                ('name', models.CharField(max_length=128, verbose_name='Název')),
+                ('description', markdownx.models.MarkdownxField(blank=True, help_text='Můžeš použít markdown.', null=True, verbose_name='Popis')),
+            ],
+            options={
+                'verbose_name': 'Lekce',
+                'verbose_name_plural': 'Lekce',
+            },
+        ),
+        migrations.CreateModel(
+            name='Material',
+            fields=[
+                ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+                ('name', models.CharField(max_length=128, verbose_name='Název')),
+                ('link', models.URLField(blank=True, max_length=256, null=True, verbose_name='Odkaz')),
+                ('file', models.FileField(blank=True, null=True, upload_to='', verbose_name='Soubor')),
+                ('event', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='materials', to='lectures.lecture', verbose_name='Událost')),
+            ],
+            options={
+                'verbose_name': 'Materiál',
+                'verbose_name_plural': 'Materiály',
+            },
+        ),
+        migrations.CreateModel(
+            name='LectureRecording',
+            fields=[
+                ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+                ('name', models.CharField(max_length=128, verbose_name='Název')),
+                ('link', models.URLField(blank=True, max_length=256, null=True, verbose_name='Odkaz')),
+                ('event', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='recordings', to='lectures.lecture', verbose_name='Událost')),
+            ],
+            options={
+                'verbose_name': 'Nahrávka',
+                'verbose_name_plural': 'Nahrávky',
+            },
+        ),
+        migrations.CreateModel(
+            name='LectureLector',
+            fields=[
+                ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+                ('name', models.CharField(max_length=128, verbose_name='Jméno')),
+                ('link', models.URLField(blank=True, max_length=256, null=True, verbose_name='Odkaz')),
+                ('event', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='lectors', to='lectures.lecture', verbose_name='Událost')),
+            ],
+            options={
+                'verbose_name': 'Lektor',
+                'verbose_name_plural': 'Lektoři',
+            },
+        ),
+    ]
diff --git a/lectures/migrations/__init__.py b/lectures/migrations/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/lectures/models.py b/lectures/models.py
new file mode 100644
index 0000000000000000000000000000000000000000..81cd2a0163c90d9003b3dbf75ae51760fccff4e3
--- /dev/null
+++ b/lectures/models.py
@@ -0,0 +1,140 @@
+from datetime import timedelta
+
+from django.core.exceptions import ValidationError
+from django.db import models
+from django.utils import timezone
+from markdownx.models import MarkdownxField
+
+# Create your models here.
+
+
+class Lecture(models.Model):
+    timestamp = models.DateTimeField(
+        verbose_name="Datum a čas konání",
+        blank=True,
+        null=True,
+    )  # If undefined, assume this event was in the past
+
+    class TypeChoices(models.TextChoices):
+        RECOMMENDED = "recommended", "Doporučené"
+        OPTIONAL = "optional", "Volitelné"
+
+    type = models.CharField(
+        choices=TypeChoices.choices,
+        max_length=11,
+        verbose_name="Typ",
+    )
+
+    name = models.CharField(
+        max_length=128,
+        verbose_name="Název",
+    )
+
+    description = MarkdownxField(
+        blank=True,
+        null=True,
+        verbose_name="Popis",
+        help_text="Můžeš použít markdown.",
+    )
+
+    @property
+    def is_current(self) -> bool:
+        # On or after the current time, minus 8 hours
+        return self.timestamp >= (timezone.now() - timedelta(hours=8))
+
+    class Meta:
+        verbose_name = "Lekce"
+        verbose_name_plural = verbose_name
+
+
+class LectureLector(models.Model):
+    event = models.ForeignKey(
+        "Lecture",
+        on_delete=models.CASCADE,
+        related_name="lectors",
+        verbose_name="Událost",
+    )
+
+    name = models.CharField(
+        max_length=128,
+        verbose_name="Jméno",
+    )
+
+    link = models.URLField(
+        max_length=256,
+        blank=True,
+        null=True,
+        verbose_name="Odkaz",
+    )
+
+    class Meta:
+        verbose_name = "Lektor"
+        verbose_name_plural = "Lektoři"
+
+
+class LectureRecording(models.Model):
+    event = models.ForeignKey(
+        "Lecture",
+        on_delete=models.CASCADE,
+        related_name="recordings",
+        verbose_name="Událost",
+    )
+
+    name = models.CharField(
+        max_length=128,
+        verbose_name="Název",
+    )
+
+    link = models.URLField(
+        max_length=256,
+        blank=True,
+        null=True,
+        verbose_name="Odkaz",
+    )
+
+    class Meta:
+        verbose_name = "Nahrávka"
+        verbose_name_plural = "Nahrávky"
+
+
+class Material(models.Model):
+    event = models.ForeignKey(
+        "Lecture",
+        on_delete=models.CASCADE,
+        related_name="materials",
+        verbose_name="Událost",
+    )
+
+    name = models.CharField(
+        max_length=128,
+        verbose_name="Název",
+    )
+
+    link = models.URLField(
+        max_length=256,
+        blank=True,
+        null=True,
+        verbose_name="Odkaz",
+    )
+
+    file = models.FileField(
+        blank=True,
+        null=True,
+        verbose_name="Soubor",
+    )
+
+    def clean(self) -> None:
+        BOTH_FILE_AND_LINK_DEFINED_ERROR = (
+            "Definuj prosím pouze odkaz, nebo soubor. "
+            "Nemůžeš mít oboje najednou."
+        )
+
+        if self.file and self.link:
+            raise ValidationError({
+                "link": BOTH_FILE_AND_LINK_DEFINED_ERROR,
+                "file": BOTH_FILE_AND_LINK_DEFINED_ERROR,
+            })
+
+    class Meta:
+        verbose_name = "Materiál"
+        verbose_name_plural = "Materiály"
diff --git a/lectures/tests.py b/lectures/tests.py
new file mode 100644
index 0000000000000000000000000000000000000000..7ce503c2dd97ba78597f6ff6e4393132753573f6
--- /dev/null
+++ b/lectures/tests.py
@@ -0,0 +1,3 @@
+from django.test import TestCase
+
+# Create your tests here.
diff --git a/lectures/views.py b/lectures/views.py
new file mode 100644
index 0000000000000000000000000000000000000000..91ea44a218fbd2f408430959283f0419c921093e
--- /dev/null
+++ b/lectures/views.py
@@ -0,0 +1,3 @@
+from django.shortcuts import render
+
+# Create your views here.
diff --git a/requirements/base.txt b/requirements/base.txt
index cbec214fb556d41312d2fe24cd435631012f0bb9..84cb6bb3b22a1d7da346df9c6f1d5f0585777852 100644
--- a/requirements/base.txt
+++ b/requirements/base.txt
@@ -2,6 +2,7 @@ django==4.1.4
 django-admin-index==2.0.2
 django-admin-interface==0.24.2
 django-database-url==1.0.3
+django-markdownx==4.0.0b1
 django-ordered-model==3.7.1
 psycopg2-binary==2.9.5
 django-webpack-loader==1.8.0
diff --git a/shared/static/shared/base.js b/shared/static/shared/base.js
new file mode 100644
index 0000000000000000000000000000000000000000..d52da305ca4c673c848f91497ca84cbb9df9970f
--- /dev/null
+++ b/shared/static/shared/base.js
@@ -0,0 +1 @@
+(self.webpackChunkucebnice=self.webpackChunkucebnice||[]).push([[348],{208:()=>{}},e=>{e(e.s=208)}]);
\ No newline at end of file
diff --git a/shared/static/shared/runtime.js b/shared/static/shared/runtime.js
new file mode 100644
index 0000000000000000000000000000000000000000..52a82802fa3960a8c24b6bf124d26ab5b5de92dc
--- /dev/null
+++ b/shared/static/shared/runtime.js
@@ -0,0 +1 @@
+(()=>{"use strict";var r,e={},n={};function o(r){var t=n[r];if(void 0!==t)return t.exports;var i=n[r]={exports:{}};return e[r](i,i.exports,o),i.exports}o.m=e,r=[],o.O=(e,n,t,i)=>{if(!n){var a=1/0;for(l=0;l<r.length;l++){for(var[n,t,i]=r[l],s=!0,c=0;c<n.length;c++)(!1&i||a>=i)&&Object.keys(o.O).every((r=>o.O[r](n[c])))?n.splice(c--,1):(s=!1,i<a&&(a=i));if(s){r.splice(l--,1);var f=t();void 0!==f&&(e=f)}}return e}i=i||0;for(var l=r.length;l>0&&r[l-1][2]>i;l--)r[l]=r[l-1];r[l]=[n,t,i]},o.o=(r,e)=>Object.prototype.hasOwnProperty.call(r,e),(()=>{var r={666:0};o.O.j=e=>0===r[e];var e=(e,n)=>{var t,i,[a,s,c]=n,f=0;if(a.some((e=>0!==r[e]))){for(t in s)o.o(s,t)&&(o.m[t]=s[t]);if(c)var l=c(o)}for(e&&e(n);f<a.length;f++)i=a[f],o.o(r,i)&&r[i]&&r[i][0](),r[i]=0;return o.O(l)},n=self.webpackChunkucebnice=self.webpackChunkucebnice||[];n.forEach(e.bind(null,0)),n.push=e.bind(null,n.push.bind(n))})()})();
\ No newline at end of file
diff --git a/shared/static/shared/style.css b/shared/static/shared/style.css
new file mode 100644
index 0000000000000000000000000000000000000000..7958c7a8505e637ccdcbcb34981615e160c303a0
--- /dev/null
+++ b/shared/static/shared/style.css
@@ -0,0 +1,541 @@
+/*
+! tailwindcss v3.3.1 | 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.
+5. Use the user's configured `sans` font-feature-settings by default.
+6. Use the user's configured `sans` font-variation-settings 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: Roboto Condensed, 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 */
+  font-feature-settings: normal;
+  /* 5 */
+  font-variation-settings: normal;
+  /* 6 */
+}
+
+/*
+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;
+}
+
+/* Make elements with the HTML hidden attribute stay hidden by default */
+
+[hidden] {
+  display: none;
+}
+
+html {
+  font-family: "Roboto Condensed", system-ui, sans-serif;
+}
+
+*, ::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:  ;
+}
+
+::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;
+}
+
+.block {
+  display: block;
+}
+
+.flex {
+  display: flex;
+}
+
+.transition {
+  transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, -webkit-backdrop-filter;
+  transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, backdrop-filter;
+  transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, backdrop-filter, -webkit-backdrop-filter;
+  transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
+  transition-duration: 150ms;
+}
diff --git a/ucebnice/settings/base.py b/ucebnice/settings/base.py
index 0715725ce6b052f7d4cd9a63d9fd56a5c2aaccd6..6c0fb6de2afb7bbac2f4e1bf0d7660fdb8e9f94b 100644
--- a/ucebnice/settings/base.py
+++ b/ucebnice/settings/base.py
@@ -58,6 +58,7 @@ INSTALLED_APPS = [
     "shared",
     "oidc",
     "users",
+    "lectures",
 ]
 
 MIDDLEWARE = [