diff --git a/Makefile b/Makefile
index febfdd2ed4de13d7ce5cfe8d707d797b572983fb..3de72d5792e9268b6e81b460d953e6862bc1660f 100644
--- a/Makefile
+++ b/Makefile
@@ -54,3 +54,8 @@ run.prod: migrate collectstatic
 run.debug: migrate
 	DEBUG=1 $(POETRY_RUN_MANAGE) runserver_plus 0.0.0.0:8000
 
+release: VERSION := `$(POETRY_RUN) python -c 'import tomli; print(tomli.load(open("pyproject.toml", "rb"))["tool"]["poetry"]["version"])'`
+release:
+	git tag ${VERSION}
+	git push origin ${VERSION}
+	@echo "Release '${VERSION}' tagged and pushed successfully."
diff --git a/fixtures/program/category.json b/fixtures/program/category.json
new file mode 100644
index 0000000000000000000000000000000000000000..7dd5d90b3fc1edbd2fbb16e6acae841c0c129d39
--- /dev/null
+++ b/fixtures/program/category.json
@@ -0,0 +1,82 @@
+[
+  {
+    "model": "program.category",
+    "pk": 1,
+    "fields": {
+      "name": "Interkulturell",
+      "slug": "interkulturell",
+      "is_active": true,
+      "description": ""
+    }
+  },
+  {
+    "model": "program.category",
+    "pk": 2,
+    "fields": {
+      "name": "Lokalbezug",
+      "slug": "lokalbezug",
+      "is_active": true,
+      "description": ""
+    }
+  },
+  {
+    "model": "program.category",
+    "pk": 3,
+    "fields": {
+      "name": "Minderheiten",
+      "slug": "minderheiten",
+      "is_active": true,
+      "description": ""
+    }
+  },
+  {
+    "model": "program.category",
+    "pk": 4,
+    "fields": {
+      "name": "Wiederholung",
+      "slug": "wiederholung",
+      "is_active": true,
+      "description": ""
+    }
+  },
+  {
+    "model": "program.category",
+    "pk": 5,
+    "fields": {
+      "name": "Mehr-/Fremdsprachig",
+      "slug": "mehr-fremdsprachig",
+      "is_active": true,
+      "description": ""
+    }
+  },
+  {
+    "model": "program.category",
+    "pk": 6,
+    "fields": {
+      "name": "Frauenschwerpunkt",
+      "slug": "frauenschwerpunkt",
+      "is_active": true,
+      "description": ""
+    }
+  },
+  {
+    "model": "program.category",
+    "pk": 7,
+    "fields": {
+      "name": "Österreichische Musik",
+      "slug": "osterreichische-musik",
+      "is_active": true,
+      "description": ""
+    }
+  },
+  {
+    "model": "program.category",
+    "pk": 8,
+    "fields": {
+      "name": "Sendungsübernahme",
+      "slug": "sendungsubernahme",
+      "is_active": true,
+      "description": ""
+    }
+  }
+]
diff --git a/fixtures/program/fundingcategory.json b/fixtures/program/fundingcategory.json
new file mode 100644
index 0000000000000000000000000000000000000000..a8c71fb09406f6a5c402202b110c5e5abbd89568
--- /dev/null
+++ b/fixtures/program/fundingcategory.json
@@ -0,0 +1,11 @@
+[
+  {
+    "model": "program.fundingcategory",
+    "pk": 1,
+    "fields": {
+      "name": "Standard",
+      "slug": "standard",
+      "is_active": true
+    }
+  }
+]
diff --git a/fixtures/program/host.json b/fixtures/program/host.json
new file mode 100644
index 0000000000000000000000000000000000000000..18650306cc0991ed875c47f82a7de5f8ae617ab0
--- /dev/null
+++ b/fixtures/program/host.json
@@ -0,0 +1,15 @@
+[
+  {
+    "model": "program.host",
+    "pk": 1,
+    "fields": {
+      "name": "Musikredaktion",
+      "is_active": true,
+      "email": "",
+      "biography": "",
+      "image": null,
+      "created_at": "2000-06-01 00:00Z",
+      "created_by": "loaddata"
+    }
+  }
+]
diff --git a/fixtures/program/language.json b/fixtures/program/language.json
new file mode 100644
index 0000000000000000000000000000000000000000..a1b5447bccc8e0af6e7b9c3b0ca3dd2ea2974183
--- /dev/null
+++ b/fixtures/program/language.json
@@ -0,0 +1,386 @@
+[
+  {
+    "model": "program.language",
+    "pk": 1,
+    "fields": {
+      "name": "Deutsch",
+      "is_active": true
+    }
+  },
+  {
+    "model": "program.language",
+    "pk": 2,
+    "fields": {
+      "name": "Englisch",
+      "is_active": true
+    }
+  },
+  {
+    "model": "program.language",
+    "pk": 3,
+    "fields": {
+      "name": "Spanisch",
+      "is_active": true
+    }
+  },
+  {
+    "model": "program.language",
+    "pk": 4,
+    "fields": {
+      "name": "Polnisch",
+      "is_active": true
+    }
+  },
+  {
+    "model": "program.language",
+    "pk": 5,
+    "fields": {
+      "name": "Farsi",
+      "is_active": true
+    }
+  },
+  {
+    "model": "program.language",
+    "pk": 6,
+    "fields": {
+      "name": "Französisch",
+      "is_active": true
+    }
+  },
+  {
+    "model": "program.language",
+    "pk": 7,
+    "fields": {
+      "name": "Slowenisch",
+      "is_active": true
+    }
+  },
+  {
+    "model": "program.language",
+    "pk": 8,
+    "fields": {
+      "name": "Persisch",
+      "is_active": true
+    }
+  },
+  {
+    "model": "program.language",
+    "pk": 9,
+    "fields": {
+      "name": "Arabisch",
+      "is_active": true
+    }
+  },
+  {
+    "model": "program.language",
+    "pk": 10,
+    "fields": {
+      "name": "Türkisch",
+      "is_active": true
+    }
+  },
+  {
+    "model": "program.language",
+    "pk": 11,
+    "fields": {
+      "name": "Japanisch",
+      "is_active": true
+    }
+  },
+  {
+    "model": "program.language",
+    "pk": 12,
+    "fields": {
+      "name": "Italienisch",
+      "is_active": true
+    }
+  },
+  {
+    "model": "program.language",
+    "pk": 13,
+    "fields": {
+      "name": "Tschechisch",
+      "is_active": true
+    }
+  },
+  {
+    "model": "program.language",
+    "pk": 14,
+    "fields": {
+      "name": "Russisch",
+      "is_active": true
+    }
+  },
+  {
+    "model": "program.language",
+    "pk": 15,
+    "fields": {
+      "name": "Chinesisch",
+      "is_active": true
+    }
+  },
+  {
+    "model": "program.language",
+    "pk": 16,
+    "fields": {
+      "name": "Ungarisch",
+      "is_active": true
+    }
+  },
+  {
+    "model": "program.language",
+    "pk": 17,
+    "fields": {
+      "name": "Serbisch",
+      "is_active": true
+    }
+  },
+  {
+    "model": "program.language",
+    "pk": 18,
+    "fields": {
+      "name": "Portugiesisch",
+      "is_active": true
+    }
+  },
+  {
+    "model": "program.language",
+    "pk": 19,
+    "fields": {
+      "name": "Kroatisch",
+      "is_active": true
+    }
+  },
+  {
+    "model": "program.language",
+    "pk": 20,
+    "fields": {
+      "name": "Albanisch",
+      "is_active": true
+    }
+  },
+  {
+    "model": "program.language",
+    "pk": 21,
+    "fields": {
+      "name": "Dari",
+      "is_active": true
+    }
+  },
+  {
+    "model": "program.language",
+    "pk": 22,
+    "fields": {
+      "name": "Bosnisch",
+      "is_active": true
+    }
+  },
+  {
+    "model": "program.language",
+    "pk": 23,
+    "fields": {
+      "name": "Kurdisch",
+      "is_active": true
+    }
+  },
+  {
+    "model": "program.language",
+    "pk": 24,
+    "fields": {
+      "name": "Aserbaidschanisch",
+      "is_active": true
+    }
+  },
+  {
+    "model": "program.language",
+    "pk": 25,
+    "fields": {
+      "name": "Slowakisch",
+      "is_active": true
+    }
+  },
+  {
+    "model": "program.language",
+    "pk": 26,
+    "fields": {
+      "name": "Niederländisch",
+      "is_active": true
+    }
+  },
+  {
+    "model": "program.language",
+    "pk": 27,
+    "fields": {
+      "name": "Bulgarisch",
+      "is_active": true
+    }
+  },
+  {
+    "model": "program.language",
+    "pk": 28,
+    "fields": {
+      "name": "Somali",
+      "is_active": true
+    }
+  },
+  {
+    "model": "program.language",
+    "pk": 29,
+    "fields": {
+      "name": "Tschetschenisch",
+      "is_active": true
+    }
+  },
+  {
+    "model": "program.language",
+    "pk": 30,
+    "fields": {
+      "name": "Dänisch",
+      "is_active": true
+    }
+  },
+  {
+    "model": "program.language",
+    "pk": 31,
+    "fields": {
+      "name": "Rumänisch",
+      "is_active": true
+    }
+  },
+  {
+    "model": "program.language",
+    "pk": 32,
+    "fields": {
+      "name": "Thai",
+      "is_active": true
+    }
+  },
+  {
+    "model": "program.language",
+    "pk": 33,
+    "fields": {
+      "name": "Finnisch",
+      "is_active": true
+    }
+  },
+  {
+    "model": "program.language",
+    "pk": 34,
+    "fields": {
+      "name": "Romanes",
+      "is_active": true
+    }
+  },
+  {
+    "model": "program.language",
+    "pk": 35,
+    "fields": {
+      "name": "Griechisch",
+      "is_active": true
+    }
+  },
+  {
+    "model": "program.language",
+    "pk": 36,
+    "fields": {
+      "name": "Singhalesisch",
+      "is_active": true
+    }
+  },
+  {
+    "model": "program.language",
+    "pk": 37,
+    "fields": {
+      "name": "Urdu",
+      "is_active": true
+    }
+  },
+  {
+    "model": "program.language",
+    "pk": 38,
+    "fields": {
+      "name": "Estnisch",
+      "is_active": true
+    }
+  },
+  {
+    "model": "program.language",
+    "pk": 39,
+    "fields": {
+      "name": "Mazedonisch",
+      "is_active": true
+    }
+  },
+  {
+    "model": "program.language",
+    "pk": 40,
+    "fields": {
+      "name": "Hebräisch",
+      "is_active": true
+    }
+  },
+  {
+    "model": "program.language",
+    "pk": 41,
+    "fields": {
+      "name": "Schwedisch",
+      "is_active": true
+    }
+  },
+  {
+    "model": "program.language",
+    "pk": 42,
+    "fields": {
+      "name": "Lithauisch",
+      "is_active": true
+    }
+  },
+  {
+    "model": "program.language",
+    "pk": 43,
+    "fields": {
+      "name": "Jiddisch",
+      "is_active": true
+    }
+  },
+  {
+    "model": "program.language",
+    "pk": 44,
+    "fields": {
+      "name": "Isländisch",
+      "is_active": true
+    }
+  },
+  {
+    "model": "program.language",
+    "pk": 45,
+    "fields": {
+      "name": "Litauisch",
+      "is_active": true
+    }
+  },
+  {
+    "model": "program.language",
+    "pk": 46,
+    "fields": {
+      "name": "Amharisch",
+      "is_active": true
+    }
+  },
+  {
+    "model": "program.language",
+    "pk": 47,
+    "fields": {
+      "name": "Norwegisch",
+      "is_active": true
+    }
+  },
+  {
+    "model": "program.language",
+    "pk": 48,
+    "fields": {
+      "name": "Koreanisch",
+      "is_active": true
+    }
+  }
+]
diff --git a/fixtures/program/licensetype.json b/fixtures/program/licensetype.json
new file mode 100644
index 0000000000000000000000000000000000000000..93d21d5b035e83a694332b0fb35afb1cf4044249
--- /dev/null
+++ b/fixtures/program/licensetype.json
@@ -0,0 +1,66 @@
+[
+  {
+    "model": "program.licensetype",
+    "pk": 1,
+    "fields": {
+      "name": "Public Domain",
+      "type": "cc-0"
+    }
+  },
+  {
+    "model": "program.licensetype",
+    "pk": 2,
+    "fields": {
+      "name": "Creative Commons Attribution",
+      "type": "cc-by"
+    }
+  },
+  {
+    "model": "program.licensetype",
+    "pk": 3,
+    "fields": {
+      "name": "Creative Commons Attribution-ShareAlike",
+      "type": "cc-by-sa"
+    }
+  },
+  {
+    "model": "program.licensetype",
+    "pk": 4,
+    "fields": {
+      "name": "Creative Commons Attribution-NonCommercial",
+      "type": "cc-by-nc"
+    }
+  },
+  {
+    "model": "program.licensetype",
+    "pk": 5,
+    "fields": {
+      "name": "Creative Commons Attribution-NonCommercial-ShareAlike",
+      "type": "cc-by-nc-sa"
+    }
+  },
+  {
+    "model": "program.licensetype",
+    "pk": 6,
+    "fields": {
+      "name": "Creative Commons Attribution-NoDerivatives",
+      "type": "cc-by-nd"
+    }
+  },
+  {
+    "model": "program.licensetype",
+    "pk": 7,
+    "fields": {
+      "name": "Creative Commons Attribution-NonCommercial-NoDerivatives",
+      "type": "cc-by-nc-nd"
+    }
+  },
+  {
+    "model": "program.licensetype",
+    "pk": 8,
+    "fields": {
+      "name": "All Rights Reserved",
+      "type": "all-rights-reserved"
+    }
+  }
+]
\ No newline at end of file
diff --git a/fixtures/program/linktype.json b/fixtures/program/linktype.json
new file mode 100644
index 0000000000000000000000000000000000000000..059627a6656c1677a55de54db6bd2532983e04d5
--- /dev/null
+++ b/fixtures/program/linktype.json
@@ -0,0 +1,106 @@
+[
+  {
+    "model": "program.linktype",
+    "pk": 1,
+    "fields": {
+      "name": "Website",
+      "type": "website"
+    }
+  },
+  {
+    "model": "program.linktype",
+    "pk": 2,
+    "fields": {
+      "name": "CBA",
+      "type": "cba"
+    }
+  },
+  {
+    "model": "program.linktype",
+    "pk": 3,
+    "fields": {
+      "name": "Freie Radios Online",
+      "type": "freie-radios-online"
+    }
+  },
+  {
+    "model": "program.linktype",
+    "pk": 4,
+    "fields": {
+      "name": "Funkwhale",
+      "type": "funkwhale"
+    }
+  },
+  {
+    "model": "program.linktype",
+    "pk": 5,
+    "fields": {
+      "name": "Mixcloud",
+      "type": "mixcloud"
+    }
+  },
+  {
+    "model": "program.linktype",
+    "pk": 6,
+    "fields": {
+      "name": "SoundCloud",
+      "type": "soundcloud"
+    }
+  },
+  {
+    "model": "program.linktype",
+    "pk": 7,
+    "fields": {
+      "name": "Internet Archive (archive.org)",
+      "type": "internet-archive"
+    }
+  },
+  {
+    "model": "program.linktype",
+    "pk": 8,
+    "fields": {
+      "name": "YouTube",
+      "type": "youTube"
+    }
+  },
+  {
+    "model": "program.linktype",
+    "pk": 9,
+    "fields": {
+      "name": "Spotify",
+      "type": "spotify"
+    }
+  },
+  {
+    "model": "program.linktype",
+    "pk": 10,
+    "fields": {
+      "name": "Instagram",
+      "type": "instagram"
+    }
+  },
+  {
+    "model": "program.linktype",
+    "pk": 11,
+    "fields": {
+      "name": "Facebook",
+      "type": "facebook"
+    }
+  },
+  {
+    "model": "program.linktype",
+    "pk": 12,
+    "fields": {
+      "name": "Twitter",
+      "type": "twitter"
+    }
+  },
+  {
+    "model": "program.linktype",
+    "pk": 13,
+    "fields": {
+      "name": "Mastodon",
+      "type": "mastodon"
+    }
+  }
+]
diff --git a/fixtures/program/musicfocus.json b/fixtures/program/musicfocus.json
new file mode 100644
index 0000000000000000000000000000000000000000..f85c89981088f1f40a429437c514331000b211f4
--- /dev/null
+++ b/fixtures/program/musicfocus.json
@@ -0,0 +1,92 @@
+[
+  {
+    "model": "program.musicfocus",
+    "pk": 1,
+    "fields": {
+      "name": "Jazz",
+      "slug": "jazz",
+      "is_active": true
+    }
+  },
+  {
+    "model": "program.musicfocus",
+    "pk": 2,
+    "fields": {
+      "name": "Volksmusik/Folk",
+      "slug": "volksmusik-folk",
+      "is_active": true
+    }
+  },
+  {
+    "model": "program.musicfocus",
+    "pk": 3,
+    "fields": {
+      "name": "Experimentelle Musik",
+      "slug": "expermentelle-musik",
+      "is_active": true
+    }
+  },
+  {
+    "model": "program.musicfocus",
+    "pk": 4,
+    "fields": {
+      "name": "Rock/Indie",
+      "slug": "rock-indie",
+      "is_active": true
+    }
+  },
+  {
+    "model": "program.musicfocus",
+    "pk": 5,
+    "fields": {
+      "name": "Metal/Hardrock",
+      "slug": "metal-hardrock",
+      "is_active": true
+    }
+  },
+  {
+    "model": "program.musicfocus",
+    "pk": 6,
+    "fields": {
+      "name": "Electronic",
+      "slug": "electronic",
+      "is_active": true
+    }
+  },
+  {
+    "model": "program.musicfocus",
+    "pk": 7,
+    "fields": {
+      "name": "Klassik",
+      "slug": "klassik",
+      "is_active": true
+    }
+  },
+  {
+    "model": "program.musicfocus",
+    "pk": 8,
+    "fields": {
+      "name": "Oldies",
+      "slug": "oldies",
+      "is_active": true
+    }
+  },
+  {
+    "model": "program.musicfocus",
+    "pk": 9,
+    "fields": {
+      "name": "Reggae/Ska",
+      "slug": "reggae-ska",
+      "is_active": true
+    }
+  },
+  {
+    "model": "program.musicfocus",
+    "pk": 10,
+    "fields": {
+      "name": "Hiphop",
+      "slug": "hiphop",
+      "is_active": true
+    }
+  }
+]
diff --git a/fixtures/program/show.json b/fixtures/program/show.json
new file mode 100644
index 0000000000000000000000000000000000000000..597026872db92c22c309727ae0f7671cf6eccacc
--- /dev/null
+++ b/fixtures/program/show.json
@@ -0,0 +1,32 @@
+[
+  {
+    "model": "program.show",
+    "pk": 1,
+    "fields": {
+      "predecessor": null,
+      "type": 3,
+      "funding_category": 1,
+      "name": "Musikprogramm",
+      "slug": "musikprogramm",
+      "image": null,
+      "logo": null,
+      "short_description": "Unmoderiertes Musikprogramm",
+      "description": "Unmoderiertes Musikprogramm",
+      "email": "musikredaktion@helsinki.at",
+      "cba_series_id": null,
+      "default_playlist_id": null,
+      "is_active": true,
+      "is_public": false,
+      "hosts": [
+        1
+      ],
+      "owners": [],
+      "language": [],
+      "category": [],
+      "topic": [],
+      "music_focus": [],
+      "created_at": "2000-06-01 00:00Z",
+      "created_by": "loaddata"
+    }
+  }
+]
diff --git a/fixtures/program/topic.json b/fixtures/program/topic.json
new file mode 100644
index 0000000000000000000000000000000000000000..0aec75a3cba0a5d1815e04148f6d75e9c8bf0589
--- /dev/null
+++ b/fixtures/program/topic.json
@@ -0,0 +1,47 @@
+[
+  {
+    "model": "program.topic",
+    "pk": 1,
+    "fields": {
+      "name": "Politik/Gesellschaft",
+      "slug": "politik-gesellschaft",
+      "is_active": true
+    }
+  },
+  {
+    "model": "program.topic",
+    "pk": 2,
+    "fields": {
+      "name": "Natur/Klima/Tiere",
+      "slug": "natur-klima-tiere",
+      "is_active": true
+    }
+  },
+  {
+    "model": "program.topic",
+    "pk": 3,
+    "fields": {
+      "name": "Kultur/Kunst",
+      "slug": "kultur-kunst",
+      "is_active": true
+    }
+  },
+  {
+    "model": "program.topic",
+    "pk": 4,
+    "fields": {
+      "name": "Soziales",
+      "slug": "soziales",
+      "is_active": true
+    }
+  },
+  {
+    "model": "program.topic",
+    "pk": 5,
+    "fields": {
+      "name": "Wissenschaft/Philosophie",
+      "slug": "wissenschaft-philosophie",
+      "is_active": true
+    }
+  }
+]
diff --git a/fixtures/program/type.json b/fixtures/program/type.json
new file mode 100644
index 0000000000000000000000000000000000000000..2ca58399a8810e77d88cf09348ae11978fb53dc8
--- /dev/null
+++ b/fixtures/program/type.json
@@ -0,0 +1,65 @@
+[
+  {
+    "model": "program.type",
+    "pk": 1,
+    "fields": {
+      "name": "Talk",
+      "slug": "talk",
+      "is_active": true
+    }
+  },
+  {
+    "model": "program.type",
+    "pk": 2,
+    "fields": {
+      "name": "Musiksendung",
+      "slug": "musiksendung",
+      "is_active": true
+    }
+  },
+  {
+    "model": "program.type",
+    "pk": 3,
+    "fields": {
+      "name": "Unmoderiertes Musikprogramm",
+      "slug": "unmoderiertes-musikprogramm",
+      "is_active": true
+    }
+  },
+  {
+    "model": "program.type",
+    "pk": 4,
+    "fields": {
+      "name": "Feature/Magazin",
+      "slug": "feature-magazin",
+      "is_active": true
+    }
+  },
+  {
+    "model": "program.type",
+    "pk": 5,
+    "fields": {
+      "name": "Experimentell",
+      "slug": "experimentell",
+      "is_active": true
+    }
+  },
+  {
+    "model": "program.type",
+    "pk": 6,
+    "fields": {
+      "name": "Hörspiel/Literatur",
+      "slug": "horspiel-literatur",
+      "is_active": true
+    }
+  },
+  {
+    "model": "program.type",
+    "pk": 7,
+    "fields": {
+      "name": "Vortrag/Diskussion",
+      "slug": "vortrag-diskussion",
+      "is_active": true
+    }
+  }
+]