diff --git a/.gitignore b/.gitignore index 1937f78..5f833c9 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ release.mk /release /local-pkgbuild +bom.lock diff --git a/Makefile b/Makefile index 22f3951..fbb47a2 100644 --- a/Makefile +++ b/Makefile @@ -1,5 +1,6 @@ -.PHONY: all setup regenerate-i18n reskindex web desktop-common linux debian pacman local-pkgbuild local-pkgbuild-install windows windows-portable -.PHONY: web-release debian-release pacman-release windows-setup-release windows-unpacked-release windows-portable-release windows-release +.PHONY: all setup regenerate-i18n reskindex web desktop-common linux debian rpm pacman local-pkgbuild local-pkgbuild-install windows windows-portable +.PHONY: web-release debian-release rpm-release pacman-release windows-setup-release windows-unpacked-release windows-portable-release windows-release +.PHONY: macos-common macos macos-mas macos-release macos-mas-release icns .PHONY: clean CFGDIR ?= configs/sc @@ -19,6 +20,7 @@ OUT_WEB := $(WEB_OUT)/$(WEB_APP_NAME)-$(WEB_OUT_DIST_VERSION).tar.gz DESKTOP_OUT := element-desktop/dist OUT_DEB64 := $(DESKTOP_OUT)/$(DESKTOP_APP_NAME)_$(VERSION)_amd64.deb +OUT_RPM64 := $(DESKTOP_OUT)/$(DESKTOP_APP_NAME)-$(VERSION).x86_64.rpm OUT_PAC64 := $(DESKTOP_OUT)/$(DESKTOP_APP_NAME)-$(VERSION).pacman OUT_APPIMAGE64 := $(DESKTOP_OUT)/$(PRODUCT_NAME)-$(VERSION).AppImage OUT_TARXZ64 := $(DESKTOP_OUT)/$(DESKTOP_APP_NAME)-$(VERSION).tar.xz @@ -27,17 +29,34 @@ OUT_WIN64_PORTABLE := $(DESKTOP_OUT)/$(PRODUCT_NAME)\ $(VERSION).exe OUT_WIN64_BETTER_NAME := $(PRODUCT_NAME)_Setup_v$(VERSION).exe OUT_WIN64_UNPACKED_BETTER_NAME := $(PRODUCT_NAME)_win-unpacked_v$(VERSION).zip OUT_WIN64_PORTABLE_BETTER_NAME := $(PRODUCT_NAME)_win-portable_v$(VERSION) -OUT_MACOS := $(DESKTOP_OUT)/$(PRODUCT_NAME)-$(VERSION).dmg +OUT_MACOS := $(DESKTOP_OUT)/$(PRODUCT_NAME)-$(VERSION)-universal.dmg +OUT_MACOS_MAS := $(DESKTOP_OUT)/mas-universal/$(PRODUCT_NAME).app RELEASE_DIR := release CURRENT_RELEASE_DIR := $(RELEASE_DIR)/$(VERSION) +# macOS Codesigning +CSC_IDENTITY_AUTO_DISCOVERY ?= false +NOTARIZE_APPLE_ID ?= +CSC_NAME ?= -include release.mk setup: if [ ! -L "element-desktop/webapp" ]; then ./setup.sh; fi +element-desktop/build/SchildiChat.xcassets/SchildiChat.iconset: $(wildcard element-desktop/build/SchildiChat.xcassets/SchildiChat.iconset/*) + +element-desktop/build/icon.icns: element-desktop/build/SchildiChat.xcassets/SchildiChat.iconset + iconutil -c icns -o $@ $< + +element-desktop/build/SchildiChat.xcassets/SchildiChatDMG.iconset: $(wildcard element-desktop/build/SchildiChat.xcassets/SchildiChatDMG.iconset/*) + +element-desktop/build/dmg.icns: element-desktop/build/SchildiChat.xcassets/SchildiChatDMG.iconset + iconutil -c icns -o $@ $< + +icns: element-desktop/build/icon.icns element-desktop/build/dmg.icns + regenerate-i18n: setup ./regenerate_i18n.sh @@ -55,26 +74,41 @@ desktop-common: web $(YARN) --cwd element-desktop run fetch --cfgdir '' $(YARN) --cwd element-desktop run build:native +macos-common: web icns + $(YARN) --cwd element-desktop run fetch --cfgdir '' + $(YARN) --cwd element-desktop run build:native:universal + linux: desktop-common - $(YARN) --cwd element-desktop run build64 --linux deb pacman tar.xz + $(YARN) --cwd element-desktop run build:64 --linux deb pacman tar.xz debian: desktop-common - $(YARN) --cwd element-desktop run build64 --linux deb pacman tar.xz + $(YARN) --cwd element-desktop run build:64 --linux deb + +rpm: desktop-common + $(YARN) --cwd element-desktop run build:64 --linux rpm pacman: desktop-common - $(YARN) --cwd element-desktop run build64 --linux pacman + $(YARN) --cwd element-desktop run build:64 --linux pacman appimage: desktop-common - $(YARN) --cwd element-desktop run build64 --linux AppImage + $(YARN) --cwd element-desktop run build:64 --linux AppImage windows: desktop-common - $(YARN) --cwd element-desktop run build64 --windows nsis + $(YARN) --cwd element-desktop run build:64 --windows nsis windows-portable: desktop-common - $(YARN) --cwd element-desktop run build64 --windows portable + $(YARN) --cwd element-desktop run build:64 --windows portable -macos: desktop-common - $(YARN) --cwd element-desktop run build --mac dmg -c.mac.identity=null +macos: macos-common + export CSC_IDENTITY_AUTO_DISCOVERY + export NOTARIZE_APPLE_ID + export CSC_NAME + $(YARN) --cwd element-desktop run build:universal --mac dmg + +macos-mas: macos-common + export NOTARIZE_APPLE_ID + export CSC_NAME + $(YARN) --cwd element-desktop run build:universal --mac mas local-pkgbuild: debian ./create_local_pkgbuild.sh $(VERSION) $(DESKTOP_APP_NAME) $(PRODUCT_NAME) $(OUT_DEB64) @@ -90,6 +124,10 @@ debian-release: debian mkdir -p $(CURRENT_RELEASE_DIR) cp $(OUT_DEB64) $(CURRENT_RELEASE_DIR) +rpm-release: rpm + mkdir -p $(CURRENT_RELEASE_DIR) + cp $(OUT_RPM64) $(CURRENT_RELEASE_DIR) + pacman-release: pacman mkdir -p $(CURRENT_RELEASE_DIR) cp $(OUT_PAC64) $(CURRENT_RELEASE_DIR) @@ -115,6 +153,14 @@ macos-release: macos mkdir -p $(CURRENT_RELEASE_DIR) cp $(OUT_MACOS) $(CURRENT_RELEASE_DIR) +macos-mas-release: macos-mas + mkdir -p $(CURRENT_RELEASE_DIR) + cp $(OUT_MACOS_MAS) $(CURRENT_RELEASE_DIR) + +bom.lock: element-desktop/yarn.lock element-web/yarn.lock matrix-js-sdk/yarn.lock matrix-react-sdk/yarn.lock + ./build-bom.sh +bom: bom.lock + clean: $(YARN) --cwd matrix-js-sdk clean $(YARN) --cwd matrix-react-sdk clean @@ -123,3 +169,4 @@ clean: rm -f element-desktop/webapp rm -rf element-web/dist rm -rf local-pkgbuild + rm -f bom.lock diff --git a/README.md b/README.md index 771daef..4fde8f7 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,7 @@ SchildiChat Web/Desktop is a fork of Element [Web](https://github.com/vector-im/element-web)/[Desktop](https://github.com/vector-im/element-desktop). The most important changes of SchildiChat Web/Desktop compared to Element Web/Desktop are: -- A unifed chat list for both direct and group chats +- A unified chat list for both direct and group chats - Message bubbles - Bigger items in the room list - … and more! @@ -20,6 +20,9 @@ Feel free to [join the discussion on matrix](https://matrix.to/#/#schildichat-we This particular repo is a wrapper project for element-desktop, element-web, matrix-react-sdk and matrix-js-sdk. It's the recommended starting point to build SchildiChat for Web **and** Desktop. +The `master` branch contains the latest release. +Development happens in the `sc` branch, which might be **broken at any time**! +
schildichat-desktop <-- this repo (recommended starting point to build SchildiChat for Web and Desktop)
 |-- element-desktop (electron wrapper)
 |-- element-web ("skin" for matrix-react-sdk)
@@ -64,34 +67,46 @@ $ source .bashrc
 brew install tcl rust node gpg vim curl git yarn git make gcc
 ```
 
+#### Signed macOS builds
+
+To sign a macOS build set the environment or make variable `CSC_IDENTITY_AUTO_DISCOVERY` to true
+or set `CSC_NAME` to your certificate name or id.
+
+To notarize a build with Apple set `NOTARIZE_APPLE_ID` to your AppleID and set the keychain item
+`NOTARIZE_CREDS` to an App specific AppleID password.  
+
 
 ### Initial setup
 
+As already noted above, **`master` contains the latest release** and **`sc` is the development branch**!
+
 ```
-git clone --recurse-submodules https://github.com/SchildiChat/schildichat-desktop.git
+git clone -b master --recurse-submodules https://github.com/SchildiChat/schildichat-desktop.git
 cd schildichat-desktop
 make setup # optional step if using the other make targets
 ```
 
 ### Create release builds
 
-Those are the builds distributed via GitHub releases.
-
 ```
 # The single make targets are explained below
-make [{web|debian|windows-setup|windows-portable|macos}-release]
+make {web|debian|windows-setup|windows-portable|macos|...}-release
 ```
 
-After that these packages which belong to to their respective make target should appear in release/\/:
-- `web`: _schildichat-web-\.tar.gz_: archive that can be unpacked and served by a **web** server (copy `config.sample.json` to `config.json` and adjust the [configuration](https://github.com/SchildiChat/element-web/blob/sc/docs/config.md) to your likings)
-- `debian`: file ready for installation on a **Debian Linux** (based) system via `dpkg -i schildichat-desktop__amd64.deb`
-- `windows-setup`: _SchildiChat_Setup_v\.exe_: file ready for **installation** on a **Windows** system
-- `windows-portable`: _SchildiChat_win-portable_v\.zip_: **portable** version for a **Windows** system – take SchildiChat together with your login data around with you (the archive contains a readme with **instructions** and **notes**)
-- `macos`: Build a *.dmg for macOS
+After that these packages which belong to their respective make target should appear in release/\/.
 
-#### Additional make targets not used for GitHub releases
-- `pacman`: file ready for installation on an **Arch Linux** (based) system via `pacman -U schildichat-desktop-.pacman`
+#### Builds distributed via GitHub releases
+- `web`: _schildichat-web-\.tar.gz_: Archive that can be unpacked and served by a **web** server (copy `config.sample.json` to `config.json` and adjust the [configuration](https://github.com/SchildiChat/element-web/blob/sc/docs/config.md) to your likings)
+- `debian`: File ready for installation on a **Debian Linux** (based) system via `dpkg -i schildichat-desktop__amd64.deb`
+- `windows-setup`: _SchildiChat_Setup_v\.exe_: File ready for **installation** on a **Windows** system
+- `windows-portable`: _SchildiChat_win-portable_v\.zip_: **Portable** version for a **Windows** system – take SchildiChat together with your login data around with you (the archive contains a readme with **instructions** and **notes**)
+- `macos`: Build a *.dmg for **macOS**
+
+#### Additional `{...}-release` targets not used for GitHub releases
+- `pacman`: File ready for installation on an **Arch Linux** (based) system via `pacman -U schildichat-desktop-.pacman`
+- `rpm`: Build a *.rpm for Linux
 - `windows-unpacked`: _SchildiChat_win-unpacked_v\.zip_: **unpacked** archive for a **Windows** system
+- `macos-mas`: Build a *.pkg for release in the Mac App Store
 
 ### Build SchildiChat Web and deploy it directly to your web server
 
diff --git a/build-bom.sh b/build-bom.sh
new file mode 100755
index 0000000..4032fa4
--- /dev/null
+++ b/build-bom.sh
@@ -0,0 +1,46 @@
+# /usr/bin/env bash
+cat element-desktop/yarn.lock > bom.lock
+echo "" >> bom.lock
+cat element-web/yarn.lock >> bom.lock
+echo "" >> bom.lock
+cat matrix-js-sdk/yarn.lock >> bom.lock
+echo "" >> bom.lock
+cat matrix-react-sdk/yarn.lock >> bom.lock
+echo "" >> bom.lock
+
+# matrix-seshat
+cat << EOF >> bom.lock
+matrix-seshat@2.3.0:
+  version "2.3.0"
+  resolved "https://github.com/matrix-org/seshat/archive/refs/heads/master.tar.gz"
+  integrity sha512-y4xtZViRX/h0zczl5hiqWyFNK7np0vVujQ/l47g1Mm7B7mDTHAneSSy/d5GADeUIsezZyvT3qKhSCwSSyqS8Xw==
+  dependencies:
+    sqlcipher "~m1"
+    openssl "~1.1.1f"
+
+sqlcipher@m1:
+  version "m1"
+  resolved "https://github.com/SchildiChat/sqlcipher/archive/refs/heads/m1.tar.gz"
+  integrity sha512-1Nk7J0dQyVedFLqnxUJQWrf/VBsUsfC5vAYaHDH3LRbWarfKDGYduZrhdBuzgAF+kMA237HaDt9Tq+CcXV0EJA==
+
+openssl@1.1.1f:
+  version "1.1.1f"
+  resolved "https://www.openssl.org/source/openssl-1.1.1f.tar.gz"
+  integrity sha512-sAvZta1SmPvO7sa7GcGrDBBspc+zEXhJfFi/fg4M8w/MGcIPhOI68xzBJr8kR9Pk+EYduXuvp7149pVhky8ADA==
+EOF
+echo "" >> bom.lock
+
+# keytar
+cat << EOF >> bom.lock
+keytar@^5.6.0:
+  version "5.6.0"
+  resolved "https://github.com/atom/node-keytar/archive/refs/tags/v5.6.0.tar.gz"
+  integrity sha512-dPdXLrm8AlqooT0ZS7y/mYif0DmQXoGGrqomwfl6ugIEHlpL1D+hJYhjyMC00TK924vOGD1a6OhDS2+RKEffXA==
+  dependencies:
+    libsecret "~0.20.3"
+
+libsecret@0.20.3:
+  version "0.20.3"
+  resolved "https://gitlab.gnome.org/GNOME/libsecret/-/archive/0.20.3/libsecret-0.20.3.tar.gz"
+  integrity sha512-tbD1jNKEEW9bPWuyd5YZ68eQjHhXOsy5PseVwleWYMEXgrrPPGnGGrLzSFUXRzNulFceLMeUG49Qr1rnyvfa1A==
+EOF
diff --git a/bump_release_version.sh b/bump_release_version.sh
new file mode 100755
index 0000000..fc69cf7
--- /dev/null
+++ b/bump_release_version.sh
@@ -0,0 +1,20 @@
+#!/bin/bash
+
+set -e
+
+mydir="$(dirname "$(realpath "$0")")"
+
+pushd "$mydir" > /dev/null
+
+source ./merge_helpers.sh
+
+# Check branch
+check_branch $branch
+forall_repos check_branch $branch
+
+# Ensure clean git state
+forall_repos check_clean_git
+
+bump_release_version
+
+popd > /dev/null
diff --git a/bump_test_version.sh b/bump_test_version.sh
new file mode 100755
index 0000000..35c3efc
--- /dev/null
+++ b/bump_test_version.sh
@@ -0,0 +1,20 @@
+#!/bin/bash
+
+set -e
+
+mydir="$(dirname "$(realpath "$0")")"
+
+pushd "$mydir" > /dev/null
+
+source ./merge_helpers.sh
+
+# Check branch
+check_branch $branch
+forall_repos check_branch $branch
+
+# Ensure clean git state
+forall_repos check_clean_git
+
+bump_test_version
+
+popd > /dev/null
diff --git a/deploy/create-github-release.sh b/deploy/create-github-release.sh
index d0cab53..b93f7d5 100755
--- a/deploy/create-github-release.sh
+++ b/deploy/create-github-release.sh
@@ -15,7 +15,7 @@ release_notes_file="/tmp/scrn.md"
 
 owner=SchildiChat
 repo=schildichat-desktop
-target=sc
+target=master
 
 # Define variables
 GH_API="https://api.github.com"
diff --git a/deploy/update-flathub.sh b/deploy/update-flathub.sh
index da21f06..31c4ce5 100755
--- a/deploy/update-flathub.sh
+++ b/deploy/update-flathub.sh
@@ -13,7 +13,6 @@ repourl="git@github.com:flathub/chat.schildi.desktop.git"
 
 downloadurl="https://github.com/SchildiChat/schildichat-desktop/releases/download/v${version}/schildichat-desktop_${version}_amd64.deb"
 sha256sum=($(sha256sum $debpath))
-debsize=($(wc -c $debpath))
 debdate=$(date +%Y-%m-%d -r $debpath)
 
 [ -d "$repopath" ] || git clone $repourl $repopath
@@ -23,20 +22,15 @@ pushd "$repopath" > /dev/null
 git fetch
 git reset --hard origin/master
 
-jsonFile="chat.schildi.desktop.json"
-jsonString=$(jq -r "." $jsonFile)
+yamlFile="chat.schildi.desktop.yaml"
+xmlFile="chat.schildi.desktop.metainfo.xml"
 
-xmlFile="chat.schildi.desktop.appdata.xml"
+sed -i "s|url: .* #SC:url|url: $downloadurl #SC:url|" "$yamlFile"
+sed -i "s|sha256: .* #SC:sha256|sha256: $sha256sum #SC:sha256|" "$yamlFile"
 
-jsonString=$(echo $jsonString | jq -r ".modules[]? |= ((select(.name?==\"schildichat\") | .sources[0].url = \"${downloadurl}\") // .)")
-jsonString=$(echo $jsonString | jq -r ".modules[]? |= ((select(.name?==\"schildichat\") | .sources[0].sha256 = \"${sha256sum}\") // .)")
-jsonString=$(echo $jsonString | jq -r ".modules[]? |= ((select(.name?==\"schildichat\") | .sources[0].size = ${debsize}) // .)")
+sed -i "s|^\s\s$|  \n    |" "$xmlFile"
 
-echo $jsonString | jq --indent 4 "." > $jsonFile
-
-sed -i "s|^\s\s$|  \n    |" $xmlFile
-
-git add $jsonFile $xmlFile
+git add $yamlFile $xmlFile
 git commit -m "Bump version to v$version"
 
 git push
diff --git a/element-desktop b/element-desktop
index 634aaf7..981210c 160000
--- a/element-desktop
+++ b/element-desktop
@@ -1 +1 @@
-Subproject commit 634aaf77f51b86bb15ae99c1ef26cf4ddcf68e24
+Subproject commit 981210ca0ad0f837db9be9f4e2279abc162b6484
diff --git a/element-web b/element-web
index 6c6ee98..7807594 160000
--- a/element-web
+++ b/element-web
@@ -1 +1 @@
-Subproject commit 6c6ee98eb98faebfdf9f88dd8dc73464e07ff2bf
+Subproject commit 780759464826720559e78059f4bf8586a785bb47
diff --git a/flake.lock b/flake.lock
new file mode 100644
index 0000000..271a3d0
--- /dev/null
+++ b/flake.lock
@@ -0,0 +1,26 @@
+{
+  "nodes": {
+    "nixpkgs": {
+      "locked": {
+        "lastModified": 1633901457,
+        "narHash": "sha256-GNJLwKENqEA4xlzkWI76VLHBAua4LUIlTeeiH4FR7Gc=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "f358794824b4595d77fec93732485d329ed7b0e0",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "root": {
+      "inputs": {
+        "nixpkgs": "nixpkgs"
+      }
+    }
+  },
+  "root": "root",
+  "version": 7
+}
diff --git a/flake.nix b/flake.nix
new file mode 100644
index 0000000..d621243
--- /dev/null
+++ b/flake.nix
@@ -0,0 +1,44 @@
+{
+  description = "The SchildiChat Matrix client";
+
+  inputs.nixpkgs.url = github:NixOS/nixpkgs;
+
+  outputs = { self, nixpkgs }: let
+    systems = [ "x86_64-linux" "i686-linux" "aarch64-linux" "x86_64-darwin" "aarch64-darwin" ];
+    forAllSystems = f: nixpkgs.lib.genAttrs systems (system: f system);
+
+    overlay = import ./nix/overlay.nix;
+
+    # Memoize nixpkgs for different platforms for efficiency.
+    nixpkgsFor = forAllSystems (system:
+      import nixpkgs {
+        inherit system;
+        overlays = [ overlay ];
+      });
+  in {
+    inherit overlay;
+
+    packages = builtins.mapAttrs (system: pkgs: {
+      inherit (pkgs)
+        schildichat-web
+        schildichat-desktop
+        schildichat-desktop-wayland
+      ;
+    }) nixpkgsFor;
+
+    defaultPackage = forAllSystems (system: self.packages.${system}.schildichat-desktop);
+
+    apps = forAllSystems(system: {
+      schildichat-desktop = {
+        type = "app";
+        program = "${self.packages.${system}.schildichat-desktop}/bin/schildichat-desktop";
+      };
+      schildichat-desktop-wayland = {
+        type = "app";
+        program = "${self.packages.${system}.schildichat-desktop-wayland}/bin/schildichat-desktop";
+      };
+    });
+
+    defaultApp = forAllSystems (system: self.apps.${system}.schildichat-desktop);
+  };
+}
diff --git a/i18n-overlays/element-desktop/bg.json b/i18n-overlays/element-desktop/bg.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/i18n-overlays/element-desktop/bg.json
@@ -0,0 +1 @@
+{}
diff --git a/i18n-overlays/element-desktop/fa.json b/i18n-overlays/element-desktop/fa.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/i18n-overlays/element-desktop/fa.json
@@ -0,0 +1 @@
+{}
diff --git a/i18n-overlays/element-desktop/id.json b/i18n-overlays/element-desktop/id.json
new file mode 100644
index 0000000..79c1ad7
--- /dev/null
+++ b/i18n-overlays/element-desktop/id.json
@@ -0,0 +1,3 @@
+{
+    "Show": "Tampilkan"
+}
diff --git a/i18n-overlays/element-desktop/it.json b/i18n-overlays/element-desktop/it.json
new file mode 100644
index 0000000..e147bd9
--- /dev/null
+++ b/i18n-overlays/element-desktop/it.json
@@ -0,0 +1,3 @@
+{
+    "Show": "Visualizza"
+}
diff --git a/i18n-overlays/element-desktop/nb_NO.json b/i18n-overlays/element-desktop/nb_NO.json
new file mode 100644
index 0000000..640dd4a
--- /dev/null
+++ b/i18n-overlays/element-desktop/nb_NO.json
@@ -0,0 +1,3 @@
+{
+    "Show": "Vis"
+}
diff --git a/i18n-overlays/element-desktop/nl.json b/i18n-overlays/element-desktop/nl.json
index 0967ef4..58f6006 100644
--- a/i18n-overlays/element-desktop/nl.json
+++ b/i18n-overlays/element-desktop/nl.json
@@ -1 +1,3 @@
-{}
+{
+    "Show": "Tonen"
+}
diff --git a/i18n-overlays/element-desktop/pl.json b/i18n-overlays/element-desktop/pl.json
new file mode 100644
index 0000000..b1e2f15
--- /dev/null
+++ b/i18n-overlays/element-desktop/pl.json
@@ -0,0 +1,3 @@
+{
+    "Show": "Pokaż"
+}
diff --git a/i18n-overlays/element-desktop/pt_BR.json b/i18n-overlays/element-desktop/pt_BR.json
index 0967ef4..928eceb 100644
--- a/i18n-overlays/element-desktop/pt_BR.json
+++ b/i18n-overlays/element-desktop/pt_BR.json
@@ -1 +1,3 @@
-{}
+{
+    "Show": "Mostrar"
+}
diff --git a/i18n-overlays/element-desktop/ro.json b/i18n-overlays/element-desktop/ro.json
new file mode 100644
index 0000000..b358cc2
--- /dev/null
+++ b/i18n-overlays/element-desktop/ro.json
@@ -0,0 +1,3 @@
+{
+    "Show": "Arată"
+}
diff --git a/i18n-overlays/element-desktop/ru.json b/i18n-overlays/element-desktop/ru.json
index 0967ef4..cec22f6 100644
--- a/i18n-overlays/element-desktop/ru.json
+++ b/i18n-overlays/element-desktop/ru.json
@@ -1 +1,3 @@
-{}
+{
+    "Show": "Показать"
+}
diff --git a/i18n-overlays/element-desktop/sv.json b/i18n-overlays/element-desktop/sv.json
new file mode 100644
index 0000000..97bf809
--- /dev/null
+++ b/i18n-overlays/element-desktop/sv.json
@@ -0,0 +1,3 @@
+{
+    "Show": "Visa"
+}
diff --git a/i18n-overlays/element-desktop/vi.json b/i18n-overlays/element-desktop/vi.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/i18n-overlays/element-desktop/vi.json
@@ -0,0 +1 @@
+{}
diff --git a/i18n-overlays/element-desktop/zh_Hans.json b/i18n-overlays/element-desktop/zh_Hans.json
new file mode 100644
index 0000000..7377015
--- /dev/null
+++ b/i18n-overlays/element-desktop/zh_Hans.json
@@ -0,0 +1,3 @@
+{
+    "Show": "显示"
+}
diff --git a/i18n-overlays/element-desktop/zh_Hant.json b/i18n-overlays/element-desktop/zh_Hant.json
new file mode 100644
index 0000000..ad1129c
--- /dev/null
+++ b/i18n-overlays/element-desktop/zh_Hant.json
@@ -0,0 +1,3 @@
+{
+    "Show": "顯示"
+}
diff --git a/i18n-overlays/element-web/bg.json b/i18n-overlays/element-web/bg.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/i18n-overlays/element-web/bg.json
@@ -0,0 +1 @@
+{}
diff --git a/i18n-overlays/element-web/fa.json b/i18n-overlays/element-web/fa.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/i18n-overlays/element-web/fa.json
@@ -0,0 +1 @@
+{}
diff --git a/i18n-overlays/element-web/id.json b/i18n-overlays/element-web/id.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/i18n-overlays/element-web/id.json
@@ -0,0 +1 @@
+{}
diff --git a/i18n-overlays/element-web/it.json b/i18n-overlays/element-web/it.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/i18n-overlays/element-web/it.json
@@ -0,0 +1 @@
+{}
diff --git a/i18n-overlays/element-web/nb_NO.json b/i18n-overlays/element-web/nb_NO.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/i18n-overlays/element-web/nb_NO.json
@@ -0,0 +1 @@
+{}
diff --git a/i18n-overlays/element-web/pl.json b/i18n-overlays/element-web/pl.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/i18n-overlays/element-web/pl.json
@@ -0,0 +1 @@
+{}
diff --git a/i18n-overlays/element-web/ro.json b/i18n-overlays/element-web/ro.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/i18n-overlays/element-web/ro.json
@@ -0,0 +1 @@
+{}
diff --git a/i18n-overlays/element-web/sv.json b/i18n-overlays/element-web/sv.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/i18n-overlays/element-web/sv.json
@@ -0,0 +1 @@
+{}
diff --git a/i18n-overlays/element-web/vi.json b/i18n-overlays/element-web/vi.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/i18n-overlays/element-web/vi.json
@@ -0,0 +1 @@
+{}
diff --git a/i18n-overlays/element-web/zh_Hans.json b/i18n-overlays/element-web/zh_Hans.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/i18n-overlays/element-web/zh_Hans.json
@@ -0,0 +1 @@
+{}
diff --git a/i18n-overlays/element-web/zh_Hant.json b/i18n-overlays/element-web/zh_Hant.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/i18n-overlays/element-web/zh_Hant.json
@@ -0,0 +1 @@
+{}
diff --git a/i18n-overlays/matrix-react-sdk/bg.json b/i18n-overlays/matrix-react-sdk/bg.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/i18n-overlays/matrix-react-sdk/bg.json
@@ -0,0 +1 @@
+{}
diff --git a/i18n-overlays/matrix-react-sdk/cs.json b/i18n-overlays/matrix-react-sdk/cs.json
index 6e5e273..f9fa215 100644
--- a/i18n-overlays/matrix-react-sdk/cs.json
+++ b/i18n-overlays/matrix-react-sdk/cs.json
@@ -6,5 +6,39 @@
     "Normal priority": "Normální priorita",
     "Message layout": "Vzhled zpráv",
     "Modern": "Moderní",
-    "Show people and rooms in a combined list": "Zobrazit lidi a místnosti v kombinovaném seznamu"
+    "Show people and rooms in a combined list": "Zobrazit lidi a místnosti v kombinovaném seznamu",
+    "Update notifications": "Aktualizace oznámení",
+    "Do you want to join a room notifying you about new releases? This is especially useful if your platform doesn't support automatic updates for SchildiChat (e.g. Windows and macOS).": "Chcete se připojit k místnosti, která vás bude informovat o nových verzích? To je užitečné zejména v případě, že vaše platforma nepodporuje automatické aktualizace SchildiChatu (např. Windows a macOS).",
+    "Don't ask again": "Neptat se znovu",
+    "System": "Systém",
+    "Light theme": "Světlý motiv",
+    "Dark theme": "Tmavý motiv",
+    "Add custom theme": "Přidat vlastní motiv",
+    "Theme in use": "Používaný motiv",
+    "User name color mode": "Barevný režim uživatelského jména",
+    "Uniform": "Jednotný",
+    "PowerLevel": "Úroveň oprávnění",
+    "MXID": "MXID",
+    "In group chats": "Ve skupinových chatech",
+    "In public rooms": "Ve veřejných místnostech",
+    "All rooms you're in will appear in Home.": "Všechny místnosti, ve kterých se nacházíte, se zobrazí v domovském zobrazení.",
+    "Show all rooms in Home": "Ukázat všechny místnosti v domovském zobrazení",
+    "Show people in spaces": "Ukázat lidi v prostorech",
+    "Show notification badges for People in Spaces": "Zobrazit odznaky oznámení pro Lidé v prostorech",
+    "Return to the room previously opened in a space": "Návrat do dříve otevřené místnosti v prostoru",
+    "If disabled, the space overview will be shown when switching to another space.": "Pokud je vypnuto, zobrazí se při přepnutí do jiného prostoru přehled prostorů.",
+    "For people": "Pro osoby",
+    "If disabled, you can still add Direct Messages to Personal Spaces. If enabled, you'll automatically see everyone who is a member of the Space.": "Pokud je zakázáno, můžete stále přidávat chaty s lidmi do osobních prostorů. Pokud je povoleno, automaticky se zobrazí všichni, kteří jsou členy daného prostoru.",
+    "Intermediate: medium sized avatar with single-line preview": "Střední: středně velký avatar s jednořádkovým náhledem",
+    "Roomy: big avatar with two-line preview": "Prostorný: velký avatar s dvouřádkovým náhledem",
+    "Room list style": "Styl seznamu místností",
+    "Compact: tiny avatar together with name and preview in one line": "Kompaktní: malý avatar spolu se jménem a náhledem v jednom řádku",
+    "Show advanced theme settings": "Zobrazit pokročilá nastavení motivu",
+    "Theme": "Motiv",
+    "Room list": "Seznam místností",
+    "Font size and typeface": "Velikost a typ písma",
+    "Hide advanced theme settings": "Skrýt pokročilá nastavení motivu",
+    "Mark rooms as unread": "Povolit označování chatů jako nepřečtených",
+    "Mark as unread": "Označit jako nepřečtené",
+    "Mark as read": "Označit jako přečtené"
 }
diff --git a/i18n-overlays/matrix-react-sdk/de_DE.json b/i18n-overlays/matrix-react-sdk/de_DE.json
index f7f36b9..e65cb3d 100644
--- a/i18n-overlays/matrix-react-sdk/de_DE.json
+++ b/i18n-overlays/matrix-react-sdk/de_DE.json
@@ -86,7 +86,7 @@
     "Enable experimental, compact IRC style layout": "Kompaktes, experimentelles Layout im IRC-Stil aktivieren",
     "Enable layout with message bubbles": "Layout mit Sprechblasen aktivieren",
     "Show message bubbles on one side only": "Sprechblasen nur auf einer Seite anzeigen",
-    "Show message bubbles depending on the width either on both sides or only on one side": "Sprechblasen abhänging von der Breite auf beiden Seiten oder nur einer Seite anzeigen",
+    "Show message bubbles depending on the width either on both sides or only on one side": "Sprechblasen abhängig von der Breite auf beiden Seiten oder nur einer Seite anzeigen",
     "%(brand)s can't securely cache encrypted messages locally while running in a web browser. Use %(brand)s Desktop for encrypted messages to appear in search results.": "%(brand)s kann verschlüsselte Nachrichten nicht sicher während der Ausführung im Browser durchsuchen. Benutze %(brand)s Desktop, um verschlüsselte Nachrichten in den Suchergebnissen angezeigt zu bekommen.",
     "Use default": "Standardeinstellungen benutzen",
     "Your firewall or anti-virus is blocking the request.": "Deine Firewall oder dein Antivirenprogramm blockiert die Anfrage.",
@@ -109,5 +109,37 @@
     "Show people and rooms in a combined list": "Personen und Räume in einer gemeinsamen Liste anzeigen",
     "Update notifications": "Updatebenachrichtigungen",
     "Do you want to join a room notifying you about new releases? This is especially useful if your platform doesn't support automatic updates for SchildiChat (e.g. Windows and macOS).": "Möchtest du einem Raum beitreten, der dich über neue Updates informiert? Das ist besonders nützlich, wenn deine Plattform keine automatischen Updates für SchildiChat unterstützt (z. B. Windows und macOS).",
-    "Don't ask again": "Nicht erneut fragen"
+    "Don't ask again": "Nicht erneut fragen",
+    "Light theme": "Helles Design",
+    "Dark theme": "Dunkles Design",
+    "System": "System",
+    "Add custom theme": "Benutzerdefiniertes Design hinzufügen",
+    "Theme in use": "Design in Verwendung",
+    "Uniform": "Einfarbig",
+    "PowerLevel": "Berechtigungslevel",
+    "MXID": "MXID",
+    "In direct chats": "In direkten Chats",
+    "In group chats": "In Gruppenchats",
+    "Show all rooms in Home": "Alle Räume auf der Startseite zeigen",
+    "Show notification badges for People in Spaces": "Benachrichtigungssymbol für Personen in Spaces zeigen",
+    "Return to the room previously opened in a space": "In den zuvor geöffneten Raum in einem Space zurückkehren",
+    "If disabled, the space overview will be shown when switching to another space.": "Wenn deaktiviert, wird die Space-Übersicht beim Wechsel zu einem anderen Space angezeigt.",
+    "User name color mode": "Farbmodus der Benutzernamen",
+    "In public rooms": "In öffentlichen Räumen",
+    "All rooms you're in will appear in Home.": "Alle Räume, in denen du dich befindest, werden auf der Startseite angezeigt.",
+    "Show people in spaces": "Personen in Spaces anzeigen",
+    "If disabled, you can still add Direct Messages to Personal Spaces. If enabled, you'll automatically see everyone who is a member of the Space.": "Falls deaktiviert, kannst du trotzdem Direktnachrichten in privaten Spaces hinzufügen. Falls aktiviert, wirst du alle Mitglieder des Spaces sehen.",
+    "For people": "Für Personen",
+    "Intermediate: medium sized avatar with single-line preview": "Zwischending: mittelgroßer Avatar mit einer einzeiligen Vorschau",
+    "Roomy: big avatar with two-line preview": "Geräumig: großer Avatar mit einer zweizeiligen Vorschau",
+    "Room list style": "Stil der Raumliste",
+    "Compact: tiny avatar together with name and preview in one line": "Kompakt: winziger Avatar zusammen mit dem Namen und der Vorschau in einer Zeile",
+    "Hide advanced theme settings": "Erweiterte Designeinstellungen ausblenden",
+    "Theme": "Design",
+    "Room list": "Raumliste",
+    "Font size and typeface": "Schriftgröße und Schriftart",
+    "Show advanced theme settings": "Erweiterte Designeinstellungen anzeigen",
+    "Mark rooms as unread": "Erlaube Chats als ungelesen zu markieren",
+    "Mark as read": "Als gelesen markieren",
+    "Mark as unread": "Als ungelesen markieren"
 }
diff --git a/i18n-overlays/matrix-react-sdk/en_EN.json b/i18n-overlays/matrix-react-sdk/en_EN.json
index 01203c6..4ec4a1e 100644
--- a/i18n-overlays/matrix-react-sdk/en_EN.json
+++ b/i18n-overlays/matrix-react-sdk/en_EN.json
@@ -8,5 +8,36 @@
     "Show people and rooms in a combined list": "Show people and rooms in a combined list",
     "Update notifications": "Update notifications",
     "Do you want to join a room notifying you about new releases? This is especially useful if your platform doesn't support automatic updates for SchildiChat (e.g. Windows and macOS).": "Do you want to join a room notifying you about new releases? This is especially useful if your platform doesn't support automatic updates for SchildiChat (e.g. Windows and macOS).",
-    "Don't ask again": "Don't ask again"
+    "Don't ask again": "Don't ask again",
+    "System": "System",
+    "Add custom theme": "Add custom theme",
+    "Theme in use": "Theme in use",
+    "Light theme": "Light theme",
+    "Dark theme": "Dark theme",
+    "User name color mode": "User name color mode",
+    "Uniform": "Uniform",
+    "PowerLevel": "PowerLevel",
+    "MXID": "MXID",
+    "For people": "For people",
+    "In group chats": "In group chats",
+    "In public rooms": "In public rooms",
+    "Show all rooms in Home": "Show all rooms in Home",
+    "All rooms you're in will appear in Home.": "All rooms you're in will appear in Home.",
+    "Show people in spaces": "Show people in spaces",
+    "If disabled, you can still add Direct Messages to Personal Spaces. If enabled, you'll automatically see everyone who is a member of the Space.": "If disabled, you can still add Direct Messages to Personal Spaces. If enabled, you'll automatically see everyone who is a member of the Space.",
+    "Show notification badges for People in Spaces": "Show notification badges for People in Spaces",
+    "Return to the room previously opened in a space": "Return to the room previously opened in a space",
+    "If disabled, the space overview will be shown when switching to another space.": "If disabled, the space overview will be shown when switching to another space.",
+    "Compact: tiny avatar together with name and preview in one line": "Compact: tiny avatar together with name and preview in one line",
+    "Intermediate: medium sized avatar with single-line preview": "Intermediate: medium sized avatar with single-line preview",
+    "Roomy: big avatar with two-line preview": "Roomy: big avatar with two-line preview",
+    "Room list style": "Room list style",
+    "Hide advanced theme settings": "Hide advanced theme settings",
+    "Show advanced theme settings": "Show advanced theme settings",
+    "Theme": "Theme",
+    "Room list": "Room list",
+    "Font size and typeface": "Font size and typeface",
+    "Mark rooms as unread": "Allow marking chats as unread",
+    "Mark as unread": "Mark as unread",
+    "Mark as read": "Mark as read"
 }
diff --git a/i18n-overlays/matrix-react-sdk/fa.json b/i18n-overlays/matrix-react-sdk/fa.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/i18n-overlays/matrix-react-sdk/fa.json
@@ -0,0 +1 @@
+{}
diff --git a/i18n-overlays/matrix-react-sdk/fr.json b/i18n-overlays/matrix-react-sdk/fr.json
index bdab12c..07a15dc 100644
--- a/i18n-overlays/matrix-react-sdk/fr.json
+++ b/i18n-overlays/matrix-react-sdk/fr.json
@@ -5,5 +5,24 @@
     "Normal priority": "Priorité normale",
     "Message layout": "Disposition des messages",
     "Modern": "Moderne",
-    "Show people and rooms in a combined list": "Afficher les personnes et les salons dans une liste combinée"
+    "Show people and rooms in a combined list": "Afficher les personnes et les salons dans une liste combinée",
+    "Update notifications": "Mettre à jour les notifications",
+    "Do you want to join a room notifying you about new releases? This is especially useful if your platform doesn't support automatic updates for SchildiChat (e.g. Windows and macOS).": "Souhaitez-vous rejoindre un salon vous notifiant à propos des nouvelles versions ? Cela est surtout utile si votre plateforme ne supporte pas les mises à jour automatiques pour SchildiChat (par ex. Windows et macOS).",
+    "Don't ask again": "Ne plus demander",
+    "System": "Système",
+    "Add custom theme": "Ajouter un thème personnalisé",
+    "Theme in use": "Thème utilisé",
+    "Light theme": "Thème lumineux",
+    "Dark theme": "Thème sombre",
+    "Uniform": "Uniforme",
+    "MXID": "MXID",
+    "In group chats": "Dans les chats de groupe",
+    "In public rooms": "Dans les salons publiques",
+    "All rooms you're in will appear in Home.": "Tous les salons dans lesquels vous êtes apparaîtront dans Accueil",
+    "Show people in spaces": "Afficher les personnes dans les espaces",
+    "Show notification badges for People in Spaces": "Afficher les badges de notifications pour les Personnes dans les Espaces",
+    "User name color mode": "Mode de couleur des noms d'utilisateur",
+    "If disabled, you can still add Direct Messages to Personal Spaces. If enabled, you'll automatically see everyone who is a member of the Space.": "Si désactivé, vous pouvez toujours ajouter Messages Directs à votre Espace Personnel. Si activé, vous verrez automatiquement toutes les personnes qui sont membres de l'Espace.",
+    "For people": "Pour les personnes",
+    "Show all rooms in Home": "Afficher tous les salons dans Accueil"
 }
diff --git a/i18n-overlays/matrix-react-sdk/id.json b/i18n-overlays/matrix-react-sdk/id.json
new file mode 100644
index 0000000..1e42805
--- /dev/null
+++ b/i18n-overlays/matrix-react-sdk/id.json
@@ -0,0 +1,43 @@
+{
+    "Normal priority": "Prioritas normal",
+    "Message layout": "Tata letak pesan",
+    "Modern": "Modern",
+    "Show people and rooms in a combined list": "Tampilkan pengguna dan ruangan di daftar gabungan",
+    "Don't ask again": "Jangan tanya lagi",
+    "System": "Sistem",
+    "Add custom theme": "Tambahkan tema kustom",
+    "Theme in use": "Tema digunakan",
+    "Light theme": "Tema terang",
+    "Dark theme": "Tema gelap",
+    "User name color mode": "Mode warna nama pengguna",
+    "Uniform": "Seragam",
+    "PowerLevel": "TingkatDaya",
+    "MXID": "MXID",
+    "In group chats": "Di grup",
+    "In public rooms": "Di ruangan publik",
+    "Show all rooms in Home": "Tampilkan semua ruangan di Beranda",
+    "All rooms you're in will appear in Home.": "Semua ruangan yang Anda bergabung akan ditampilkan di Beranda.",
+    "Show notification badges for People in Spaces": "Tampilkan lencana pemberitahuan untuk Orang di Space",
+    "Show people in spaces": "Tampilkan orang di space",
+    "For people": "Untuk orang-orang",
+    "Return to the room previously opened in a space": "Kembali ke ruangan yang sebelumnya dibuka di sebuah space",
+    "If disabled, the space overview will be shown when switching to another space.": "Jika dinonaktifkan, ikhtisar space akan ditampilkan saat ganti ke space yang lain.",
+    "Compact: tiny avatar together with name and preview in one line": "Kecil: avatar kecil dengan nama dan tampilan di satu baris",
+    "Roomy: big avatar with two-line preview": "Luas: avatar besar dengan tampilan dua baris",
+    "Room list style": "Gaya daftar ruangan",
+    "Hide advanced theme settings": "Sembunyikan pengaturan tema lanjutan",
+    "Show advanced theme settings": "Tampilkan pengaturan tema lanjutan",
+    "Theme": "Tema",
+    "Room list": "Daftar ruangan",
+    "Font size and typeface": "Ukuran fon dan jenis huruf",
+    "Show message bubbles on one side only": "Tampilkan gelembung pesan di satu sisi saja",
+    "Show message bubbles depending on the width either on both sides or only on one side": "Tampilkan gelembung pesan tergantung pada lebarnya baik di kedua sisi atau hanya di satu sisi",
+    "Message bubbles": "Gelembung pesan",
+    "Update notifications": "Notifikasi peningkatan",
+    "Do you want to join a room notifying you about new releases? This is especially useful if your platform doesn't support automatic updates for SchildiChat (e.g. Windows and macOS).": "Apakah Anda ingin bergabung ke ruangan yang memberitahu Anda tentang rilis yang baru? Ini sangat berguna jika platform Anda tidak mendukung pembaruan otomatis untuk SchildiChat (mis. Windows dan macOS).",
+    "If disabled, you can still add Direct Messages to Personal Spaces. If enabled, you'll automatically see everyone who is a member of the Space.": "Jika dinonaktifkan, Anda masih dapat menambahkan Pesan Langsung ke Space Personal. Jika diaktifkan, Anda akan otomatis melihat semua orang yang juga ada di Spacenya.",
+    "Intermediate: medium sized avatar with single-line preview": "Sedang: avatar sedang dengan tampilan satu baris",
+    "Mark rooms as unread": "Perbolehkan menandai obrolan sebagai dibaca",
+    "Mark as unread": "Tandai sebagai belum dibaca",
+    "Mark as read": "Tandai sebagai dibaca"
+}
diff --git a/i18n-overlays/matrix-react-sdk/it.json b/i18n-overlays/matrix-react-sdk/it.json
new file mode 100644
index 0000000..72a5b3a
--- /dev/null
+++ b/i18n-overlays/matrix-react-sdk/it.json
@@ -0,0 +1,13 @@
+{
+    "Modern": "Moderno",
+    "Show people and rooms in a combined list": "Visualizza persone e stanze in una lista combinata",
+    "Update notifications": "Aggiorna notifiche",
+    "Don't ask again": "Non chiedere di nuovo",
+    "System": "Sistema",
+    "Add custom theme": "Aggiungi tema personalizzato",
+    "Theme in use": "Tema in uso",
+    "Light theme": "Tema chiaro",
+    "Dark theme": "Tema scuro",
+    "Normal priority": "Priorità normale",
+    "Do you want to join a room notifying you about new releases? This is especially useful if your platform doesn't support automatic updates for SchildiChat (e.g. Windows and macOS).": "Vuoi entrare in una stanza che ti notificherà riguardo nuove release? Sarebbe comodo particolarmente se la tua piattaforma non supporta aggiornamenti automatici (Come per esempio Windows o MacOS.)"
+}
diff --git a/i18n-overlays/matrix-react-sdk/lt.json b/i18n-overlays/matrix-react-sdk/lt.json
index cc5bfa9..2b32484 100644
--- a/i18n-overlays/matrix-react-sdk/lt.json
+++ b/i18n-overlays/matrix-react-sdk/lt.json
@@ -3,5 +3,19 @@
     "Modern": "Modernus",
     "Message bubbles": "Žinučių burbulai",
     "Message layout": "Žinučių išdėstymas",
-    "Show people and rooms in a combined list": "Asmenų ir kambarių rodymas bendrame sąraše"
+    "Show people and rooms in a combined list": "Asmenų ir kambarių rodymas bendrame sąraše",
+    "Room list": "Kambarių sąrašas",
+    "Show message bubbles on one side only": "Rodyti žinučių burbulus tik vienoje pusėje",
+    "Update notifications": "Atnaujinimų pranešimai",
+    "Do you want to join a room notifying you about new releases? This is especially useful if your platform doesn't support automatic updates for SchildiChat (e.g. Windows and macOS).": "Ar jūs norite prisijungti prie kambario kuris praneš jums apie atnaujinimus? Tai yra labai naudinga jei jūsų platforma nepalaiko automatinių SchildiChat atnaujinimų (pvz. Windows ir macOS).",
+    "Don't ask again": "Nebeklausti",
+    "System": "Sistema",
+    "Theme in use": "Tema naudojama",
+    "Light theme": "Šviesi tema",
+    "Dark theme": "Tamsi tema",
+    "MXID": "MXID",
+    "In group chats": "Pokalbių grupėse",
+    "In public rooms": "Viešuose kambariuose",
+    "Show all rooms in Home": "Rodyti visus kambarius Pradžioje",
+    "All rooms you're in will appear in Home.": "Visi kambariai kuriuose esate bus rodomi Pradžioje."
 }
diff --git a/i18n-overlays/matrix-react-sdk/nb_NO.json b/i18n-overlays/matrix-react-sdk/nb_NO.json
new file mode 100644
index 0000000..cd11a91
--- /dev/null
+++ b/i18n-overlays/matrix-react-sdk/nb_NO.json
@@ -0,0 +1,12 @@
+{
+    "Message bubbles": "Meldingsbobler",
+    "Normal priority": "Normal prioritet",
+    "Message layout": "Meldingsvisning",
+    "Modern": "Moderne",
+    "Show people and rooms in a combined list": "Vis folk og rom i kombinert liste",
+    "Update notifications": "Oppdater merknader",
+    "Show message bubbles on one side only": "Vis meldingsbobler kun på én side",
+    "Show message bubbles depending on the width either on both sides or only on one side": "Vis meldingsbobler avhengig av bredden enten på begge sider eller kun på én side",
+    "Don't ask again": "Ikke spør igjen",
+    "Do you want to join a room notifying you about new releases? This is especially useful if your platform doesn't support automatic updates for SchildiChat (e.g. Windows and macOS).": "Ønsker du at et rom skal gi deg merknader om nye utgivelser? Dette er spesielt nyttig hvis din plattform ikke støtter automatiske oppdateringer for SchildiChat (f.eks. Windows og macOS)."
+}
diff --git a/i18n-overlays/matrix-react-sdk/nl.json b/i18n-overlays/matrix-react-sdk/nl.json
index 55a235e..f98fbac 100644
--- a/i18n-overlays/matrix-react-sdk/nl.json
+++ b/i18n-overlays/matrix-react-sdk/nl.json
@@ -3,5 +3,11 @@
     "Show message bubbles depending on the width either on both sides or only on one side": "Toon berichtbubbels, afhankelijk van de breedte, aan beide zijden of slechts aan één zijde",
     "Message bubbles": "Boodschap bellen",
     "Normal priority": "Normale prioriteit",
-    "Enable layout with message bubbles": "Schakel lay-out in met tekstballonnen"
+    "Enable layout with message bubbles": "Schakel lay-out in met tekstballonnen",
+    "Update notifications": "Update meldingen",
+    "Do you want to join a room notifying you about new releases? This is especially useful if your platform doesn't support automatic updates for SchildiChat (e.g. Windows and macOS).": "Wilt u lid worden van een kamer waarin u wordt geïnformeerd over nieuwe releases? Dit is vooral handig als uw platform geen automatische updates voor SchildiChat ondersteunt (bijv. Windows en macOS).",
+    "Don't ask again": "Niet nogmaals vragen",
+    "Modern": "Modern",
+    "Message layout": "Berichtlayout",
+    "Show people and rooms in a combined list": "Toon personen en kamers in een gecombineerde lijst"
 }
diff --git a/i18n-overlays/matrix-react-sdk/pl.json b/i18n-overlays/matrix-react-sdk/pl.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/i18n-overlays/matrix-react-sdk/pl.json
@@ -0,0 +1 @@
+{}
diff --git a/i18n-overlays/matrix-react-sdk/pt_BR.json b/i18n-overlays/matrix-react-sdk/pt_BR.json
index bdbad79..c27b526 100644
--- a/i18n-overlays/matrix-react-sdk/pt_BR.json
+++ b/i18n-overlays/matrix-react-sdk/pt_BR.json
@@ -3,5 +3,39 @@
     "Message bubbles": "Bolhas de mensagens",
     "Normal priority": "Prioridade normal",
     "Show message bubbles on one side only": "Mostrar bolhas de mensagem em apenas um lado",
-    "Show message bubbles depending on the width either on both sides or only on one side": "Mostrar bolhas de mensagem dependendo da largura de ambos os lados ou somente de um lado"
+    "Show message bubbles depending on the width either on both sides or only on one side": "Mostrar bolhas de mensagem dependendo da largura de ambos os lados ou somente de um lado",
+    "Hide advanced theme settings": "Ocultar configurações de tema avançadas",
+    "Show advanced theme settings": "Mostrar configurações de tema avançadas",
+    "Theme": "Tema",
+    "Room list": "Lista de salas",
+    "Font size and typeface": "Tamanho da fonte e tipo de letra",
+    "Message layout": "Layout da mensagem",
+    "Modern": "Moderno",
+    "Show people and rooms in a combined list": "Mostrar pessoas e salas em uma lista combinada",
+    "Update notifications": "Atualizar notificações",
+    "Do you want to join a room notifying you about new releases? This is especially useful if your platform doesn't support automatic updates for SchildiChat (e.g. Windows and macOS).": "Você quer participar numa sala para ser notificado sobre novos lançamentos? Isto é especialmente útil se a sua plataforma não suportar atualizações automáticas para SchildiChat (tipo Windows e macOS).",
+    "Don't ask again": "Não pergunte novamente",
+    "System": "Sistema",
+    "Add custom theme": "Adicionar tema personalizado",
+    "Theme in use": "Tema em uso",
+    "Dark theme": "Tema escuro",
+    "Light theme": "Tema claro",
+    "Uniform": "comum",
+    "PowerLevel": "Nível de poder",
+    "MXID": "MXID",
+    "In group chats": "Em conversas de grupo",
+    "In public rooms": "Em salas públicas",
+    "All rooms you're in will appear in Home.": "Todos as salas em que você estiver aparecerão em Início.",
+    "Show all rooms in Home": "Mostrar todos as salas em Início",
+    "Show people in spaces": "Mostrar as pessoas em espaços",
+    "Show notification badges for People in Spaces": "Mostrar símbolo de notificação para Pessoas em Espaços",
+    "Return to the room previously opened in a space": "Retornar à sala previamente aberta em um espaço",
+    "If disabled, the space overview will be shown when switching to another space.": "Se desativado, a visão geral do espaço será mostrada ao mudar para outro espaço.",
+    "For people": "Para pessoas",
+    "User name color mode": "Modo de cor baseado em nome do usuário",
+    "If disabled, you can still add Direct Messages to Personal Spaces. If enabled, you'll automatically see everyone who is a member of the Space.": "Se estiver desativado, você ainda pode adicionar Mensagens Diretas aos Espaços Pessoais. Se ativado, você verá automaticamente todos os que são membros do Espaço.",
+    "Compact: tiny avatar together with name and preview in one line": "Compacto: avatar minúsculo junto com o nome e visualização em uma linha",
+    "Intermediate: medium sized avatar with single-line preview": "Intermédio: avatar de tamanho médio com visualização de uma linha",
+    "Roomy: big avatar with two-line preview": "Amplo: grande avatar com visualização em duas linhas",
+    "Room list style": "Estilo da lista de salas"
 }
diff --git a/i18n-overlays/matrix-react-sdk/ro.json b/i18n-overlays/matrix-react-sdk/ro.json
new file mode 100644
index 0000000..08e7981
--- /dev/null
+++ b/i18n-overlays/matrix-react-sdk/ro.json
@@ -0,0 +1,28 @@
+{
+    "Show message bubbles on one side only": "Arata bulele mesajelor pe o singură parte",
+    "Show message bubbles depending on the width either on both sides or only on one side": "Arată bulele mesajelor bazat fie pe lățimea ambelor părți sau o singură parte",
+    "Message bubbles": "Bulele mesajelor",
+    "Normal priority": "Prioritate normală",
+    "Message layout": "Așezarea mesajului",
+    "Modern": "Modern",
+    "Show people and rooms in a combined list": "Arată persoanele și camerele într-o listă combinată",
+    "Update notifications": "Actualizează notificările",
+    "Don't ask again": "Nu întreba din nou",
+    "System": "Sistem",
+    "Add custom theme": "Adaugă o temă proprie",
+    "Theme in use": "Temă în folosință",
+    "Light theme": "Temă luminoasă",
+    "Dark theme": "Temă întunecată",
+    "Uniform": "Uniform",
+    "In group chats": "În chaturile de grup",
+    "In public rooms": "În camerele publice",
+    "All rooms you're in will appear in Home.": "Toate camerele în care te afli vor apărea în Pagina principala",
+    "Show people in spaces": "Arată persoanele în spații",
+    "Show notification badges for People in Spaces": "Arată simboluri de notificare pentru Persoanele din Spații",
+    "Return to the room previously opened in a space": "Întoarce-te spre camera deschisă ultima oară într-un spațiu",
+    "If disabled, the space overview will be shown when switching to another space.": "Dacă e dezactivat, se va arăta vederea de ansamblu a spațiului când schimbi pe alt spațiu.",
+    "For people": "Pentru persoane",
+    "User name color mode": "Modul culorilor utilizatorilor",
+    "Show all rooms in Home": "Arată toate camerele în Pagina principală",
+    "If disabled, you can still add Direct Messages to Personal Spaces. If enabled, you'll automatically see everyone who is a member of the Space.": "Dacă e dezactivat, încă poți adăuga Mesaje Directe în Spații Personale. Dacă e activat, vei vedea toți membrii Spațiului automat."
+}
diff --git a/i18n-overlays/matrix-react-sdk/ru.json b/i18n-overlays/matrix-react-sdk/ru.json
index b49d3e2..3a8cdac 100644
--- a/i18n-overlays/matrix-react-sdk/ru.json
+++ b/i18n-overlays/matrix-react-sdk/ru.json
@@ -3,5 +3,39 @@
     "Normal priority": "Нормальный приоритет",
     "Enable layout with message bubbles": "Включение макета с пузырьками сообщений",
     "Show message bubbles on one side only": "Показывайте пузырьки с сообщениями только на одной стороне",
-    "Show message bubbles depending on the width either on both sides or only on one side": "Показывать пузырьки сообщений в зависимости от ширины либо с обеих сторон, либо только с одной стороны"
+    "Show message bubbles depending on the width either on both sides or only on one side": "Показывать пузырьки сообщений в зависимости от ширины либо с обеих сторон, либо только с одной стороны",
+    "Modern": "Современное",
+    "Message layout": "Оформление сообщений",
+    "Do you want to join a room notifying you about new releases? This is especially useful if your platform doesn't support automatic updates for SchildiChat (e.g. Windows and macOS).": "Вы хотите присоединиться к комнате, уведомляющей вас о новых релизах? Это особенно полезно, если ваша платформа не поддерживает автоматические обновления для SchildiChat (например, Windows и macOS).",
+    "Show people and rooms in a combined list": "Показать людей и комнаты в объединенном списке",
+    "Update notifications": "Уведомления об обновлениях",
+    "Don't ask again": "Не спрашивать больше",
+    "Hide advanced theme settings": "Скрыть расширенные настройки темы",
+    "Show advanced theme settings": "Показать расширенные настройки темы",
+    "Theme": "Тема",
+    "Room list": "Список комнат",
+    "Font size and typeface": "Размер и начертание шрифта",
+    "Light theme": "Светлая тема",
+    "Dark theme": "Тёмная тема",
+    "System": "Система",
+    "Add custom theme": "Добавить пользовательскую тему",
+    "Theme in use": "Используемая тема",
+    "In group chats": "В групповых чатах",
+    "In public rooms": "В публичных комнатах",
+    "PowerLevel": "Уровень прав",
+    "MXID": "MXID",
+    "Show all rooms in Home": "Показать все комнаты в Начале",
+    "Show notification badges for People in Spaces": "Показывать значки уведомлений для людей в пространствах",
+    "Return to the room previously opened in a space": "Возврат в комнату, ранее открытую в пространстве",
+    "If disabled, the space overview will be shown when switching to another space.": "Если отключить, то при переключении на другое пространство будет отображаться обзор пространства.",
+    "Uniform": "Одинаковый",
+    "All rooms you're in will appear in Home.": "Все комнаты, в которых вы находитесь, будут отображаться в Начале.",
+    "Show people in spaces": "Показать людей в пространствах",
+    "If disabled, you can still add Direct Messages to Personal Spaces. If enabled, you'll automatically see everyone who is a member of the Space.": "Если этот параметр отключен, вы по-прежнему можете добавлять личные сообщения в личные пространства. Если включено, вы будете автоматически видеть всех, кто является членом пространства.",
+    "Compact: tiny avatar together with name and preview in one line": "Компактный: крошечный аватар вместе с именем и превью в одной строке",
+    "User name color mode": "Имя пользователя цветовой режим",
+    "For people": "Для людей",
+    "Room list style": "Стиль списка комнат",
+    "Intermediate: medium sized avatar with single-line preview": "Средний: аватар среднего размера с однострочным превью",
+    "Roomy: big avatar with two-line preview": "Вместительный: большой аватар с двухстрочным превью"
 }
diff --git a/i18n-overlays/matrix-react-sdk/sv.json b/i18n-overlays/matrix-react-sdk/sv.json
new file mode 100644
index 0000000..8990c52
--- /dev/null
+++ b/i18n-overlays/matrix-react-sdk/sv.json
@@ -0,0 +1,43 @@
+{
+    "Message bubbles": "Meddelandebubblor",
+    "Normal priority": "Normal prioritet",
+    "Message layout": "Meddelande layout",
+    "Modern": "Modern",
+    "Show people and rooms in a combined list": "Visa personer och rum i en kombinerad lista",
+    "Update notifications": "Uppdatera meddelanden",
+    "Don't ask again": "Fråga inte igen",
+    "System": "System",
+    "Add custom theme": "Lägg till anpassat tema",
+    "Theme in use": "Tema i bruk",
+    "Light theme": "Ljus tema",
+    "Dark theme": "Mörkt tema",
+    "Show message bubbles on one side only": "Visa meddelandebubblor bara på ena sidan",
+    "Show message bubbles depending on the width either on both sides or only on one side": "Visa meddelandebubblor beroende på bredden antingen på båda sidor eller bara på ena sidan",
+    "Do you want to join a room notifying you about new releases? This is especially useful if your platform doesn't support automatic updates for SchildiChat (e.g. Windows and macOS).": "Vill du gå med i ett rum som informerar dig om nya utgåvor? Detta är särskilt användbart om din plattform inte stöder automatiska uppdateringar för SchildiChat (t.ex.Windows och macOS).",
+    "Uniform": "Enhetlig",
+    "PowerLevel": "PowerLevel",
+    "MXID": "MXID",
+    "In group chats": "I gruppchattar",
+    "In public rooms": "I offentliga rum",
+    "Show all rooms in Home": "Visa alla rum i Home",
+    "Show people in spaces": "Visa människor i Spaces",
+    "If disabled, you can still add Direct Messages to Personal Spaces. If enabled, you'll automatically see everyone who is a member of the Space.": "Om den är inaktiverad kan du fortfarande lägga till direktmeddelanden till personliga utrymmen. Om den är aktiverad ser du automatiskt alla som är medlem i Space.",
+    "Show notification badges for People in Spaces": "Visa meddelandemärken för personer in Spaces",
+    "Return to the room previously opened in a space": "Återgå till rummet som tidigare öppnats i ett Space",
+    "If disabled, the space overview will be shown when switching to another space.": "Om den är inaktiverad visas utrymmeöversikten när du byter till ett annat utrymme.",
+    "For people": "För folk",
+    "User name color mode": "Användarnamns färgläge",
+    "All rooms you're in will appear in Home.": "Alla rum du befinner dig i visas i Home.",
+    "Show advanced theme settings": "Visa avancerade temainställningar",
+    "Theme": "tema",
+    "Room list": "Rumslista",
+    "Font size and typeface": "Teckenstorlek och typsnitt",
+    "Hide advanced theme settings": "Dölj avancerade temainställningar",
+    "Compact: tiny avatar together with name and preview in one line": "Kompakt: liten avatar tillsammans med namn och förhandsvisning på en rad",
+    "Intermediate: medium sized avatar with single-line preview": "Medel: medelstor avatar med enradig förhandsvisning",
+    "Roomy: big avatar with two-line preview": "Rymlig: stor avatar med förhandsvisning med två rader",
+    "Room list style": "Rumslista stil",
+    "Mark as unread": "markera som oläst",
+    "Mark as read": "markera som läst",
+    "Mark rooms as unread": "Tillåt att chattar markeras som olästa"
+}
diff --git a/i18n-overlays/matrix-react-sdk/vi.json b/i18n-overlays/matrix-react-sdk/vi.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/i18n-overlays/matrix-react-sdk/vi.json
@@ -0,0 +1 @@
+{}
diff --git a/i18n-overlays/matrix-react-sdk/zh_Hans.json b/i18n-overlays/matrix-react-sdk/zh_Hans.json
new file mode 100644
index 0000000..280875e
--- /dev/null
+++ b/i18n-overlays/matrix-react-sdk/zh_Hans.json
@@ -0,0 +1,40 @@
+{
+    "Message bubbles": "消息气泡",
+    "Normal priority": "正常优先级",
+    "Message layout": "消息布局",
+    "Modern": "现代",
+    "Show people and rooms in a combined list": "使用组合列表显示所有人员和房间",
+    "Update notifications": "更新通知",
+    "Don't ask again": "不再询问",
+    "System": "系统",
+    "Add custom theme": "添加自定义主题",
+    "Theme in use": "当前主题",
+    "User name color mode": "用户名颜色模式",
+    "Light theme": "浅色主题",
+    "Dark theme": "深色主题",
+    "Uniform": "单色",
+    "In group chats": "群聊",
+    "For people": "私聊",
+    "All rooms you're in will appear in Home.": "你加入的所有聊天室都会显示在主页。",
+    "In public rooms": "公共聊天室",
+    "Show people in spaces": "显示空间中的人",
+    "Show all rooms in Home": "在主页显示所有聊天室",
+    "If disabled, you can still add Direct Messages to Personal Spaces. If enabled, you'll automatically see everyone who is a member of the Space.": "如果禁用,你仍可以将私聊添加至个人空间。若启用,你将自动看见空间中的每位成员。",
+    "Show notification badges for People in Spaces": "为空间中的人显示通知标志",
+    "PowerLevel": "根据权限等级自动设定",
+    "MXID": "根据 Matrix ID 自动设定",
+    "Return to the room previously opened in a space": "返回先前在空间中打开的聊天室",
+    "If disabled, the space overview will be shown when switching to another space.": "如果禁用,切换到其他空间时将显示空间概览。",
+    "Compact: tiny avatar together with name and preview in one line": "紧凑:在一行中包含小头像、用户名和消息预览",
+    "Intermediate: medium sized avatar with single-line preview": "中等:中等大小头像,用户名与消息预览在头像旁以单行宽度分列",
+    "Roomy: big avatar with two-line preview": "宽敞:大尺寸头像,用户名与消息预览在头像旁以双行宽度分列",
+    "Hide advanced theme settings": "隐藏高级主题设置",
+    "Show advanced theme settings": "显示高级主题设置",
+    "Theme": "主题",
+    "Room list": "聊天室列表",
+    "Font size and typeface": "字号与字型",
+    "Show message bubbles on one side only": "仅在一侧显示消息气泡",
+    "Room list style": "聊天室列表样式",
+    "Show message bubbles depending on the width either on both sides or only on one side": "根据窗口大小智能切换消息气泡的显示样式",
+    "Do you want to join a room notifying you about new releases? This is especially useful if your platform doesn't support automatic updates for SchildiChat (e.g. Windows and macOS).": "您想加入一个用来通知版本更新的房间吗?如果您的平台不支持自动更新 SchildiChat(例如 Windows 和 macOS),这将非常有用。"
+}
diff --git a/i18n-overlays/matrix-react-sdk/zh_Hant.json b/i18n-overlays/matrix-react-sdk/zh_Hant.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/i18n-overlays/matrix-react-sdk/zh_Hant.json
@@ -0,0 +1 @@
+{}
diff --git a/matrix-js-sdk b/matrix-js-sdk
index 4c57908..b3aa5e5 160000
--- a/matrix-js-sdk
+++ b/matrix-js-sdk
@@ -1 +1 @@
-Subproject commit 4c5790814efa63139caa7ea1e08d9ebdf4ddb844
+Subproject commit b3aa5e524ea88940d37050ef2bd5c2d6bc029023
diff --git a/matrix-react-sdk b/matrix-react-sdk
index c93fdd2..15b9ad8 160000
--- a/matrix-react-sdk
+++ b/matrix-react-sdk
@@ -1 +1 @@
-Subproject commit c93fdd2be8a094726a2da7769ddac499bff1994b
+Subproject commit 15b9ad85533136b11cfb70d269ba383ee55d898a
diff --git a/merge_helpers.sh b/merge_helpers.sh
index 791d1f6..8c97abf 100755
--- a/merge_helpers.sh
+++ b/merge_helpers.sh
@@ -2,6 +2,8 @@
 
 SCHILDI_ROOT="$(dirname "$(realpath "$0")")"
 
+branch=${BRANCH:-"sc"}
+
 i18n_helper_path="$SCHILDI_ROOT/i18n-helper/index.js"
 i18n_path="src/i18n/strings"
 i18n_overlay_path="$SCHILDI_ROOT/i18n-overlays"
@@ -30,18 +32,31 @@ add_upstream() {
 }
 
 forall_repos() {
-    pushd "$SCHILDI_ROOT/matrix-js-sdk"
+    pushd "$SCHILDI_ROOT/matrix-js-sdk" > /dev/null
     "$@"
-    popd
-    pushd "$SCHILDI_ROOT/matrix-react-sdk"
+    popd > /dev/null
+
+    pushd "$SCHILDI_ROOT/matrix-react-sdk" > /dev/null
     "$@"
-    popd
-    pushd "$SCHILDI_ROOT/element-web"
+    popd > /dev/null
+
+    pushd "$SCHILDI_ROOT/element-web" > /dev/null
     "$@"
-    popd
-    pushd "$SCHILDI_ROOT/element-desktop"
+    popd > /dev/null
+
+    pushd "$SCHILDI_ROOT/element-desktop" > /dev/null
     "$@"
-    popd
+    popd > /dev/null
+}
+
+forelement_repos() {
+    pushd "$SCHILDI_ROOT/element-web" > /dev/null
+    "$@"
+    popd > /dev/null
+
+    pushd "$SCHILDI_ROOT/element-desktop" > /dev/null
+    "$@"
+    popd > /dev/null
 }
 
 ensure_yes() {
@@ -70,11 +85,10 @@ check_clean_git() {
 
 revert_i18n_changes() {
     local i18n_path="$1"
-    local skip_commit="$2"
+    local revision="$2"
+    local skip_commit="$3"
 
-    git checkout upstream/master -- "$i18n_path"
-
-    $yarn i18n
+    git checkout "$revision" -- "$i18n_path"
 
     if [[ "$skip_commit" != [Yy]* ]]; then
         git commit -m "Automatic i18n reversion" || true
@@ -91,32 +105,161 @@ apply_i18n_changes() {
 automatic_i18n_reversion() {
     local skip_commit="$1"
 
+    local current_upstream_tag
+    get_current_upstream_tag
+
+    local current_mxjssdk_tag
+    local current_mxreactsdk_tag
+    get_current_mxsdk_tags
+
     pushd "$SCHILDI_ROOT/matrix-react-sdk" > /dev/null
-    revert_i18n_changes "$i18n_path" $skip_commit
+    revert_i18n_changes "$i18n_path" "$current_mxreactsdk_tag" "$skip_commit"
     popd > /dev/null
 
     pushd "$SCHILDI_ROOT/element-web" > /dev/null
-    revert_i18n_changes "$i18n_path" $skip_commit
+    revert_i18n_changes "$i18n_path" "$current_upstream_tag" "$skip_commit"
     popd > /dev/null
 
     pushd "$SCHILDI_ROOT/element-desktop" > /dev/null
-    revert_i18n_changes "$i18n_path" $skip_commit
+    revert_i18n_changes "$i18n_path" "$current_upstream_tag" "$skip_commit"
     popd > /dev/null
 }
 
 automatic_i18n_adjustment() {
-    node "$i18n_helper_path" "$SCHILDI_ROOT/matrix-react-sdk/$i18n_path" "$i18n_overlay_path/matrix-react-sdk"
+    # matrix-react-sdk
     pushd "$SCHILDI_ROOT/matrix-react-sdk" > /dev/null
+    $yarn i18n
+    node "$i18n_helper_path" "$SCHILDI_ROOT/matrix-react-sdk/$i18n_path" "$i18n_overlay_path/matrix-react-sdk"
     apply_i18n_changes "$i18n_path"
     popd > /dev/null
 
-    node "$i18n_helper_path" "$SCHILDI_ROOT/element-web/$i18n_path" "$i18n_overlay_path/element-web"
+    # element-web
     pushd "$SCHILDI_ROOT/element-web" > /dev/null
+    $yarn i18n
+    node "$i18n_helper_path" "$SCHILDI_ROOT/element-web/$i18n_path" "$i18n_overlay_path/element-web"
     apply_i18n_changes "$i18n_path"
     popd > /dev/null
 
-    node "$i18n_helper_path" "$SCHILDI_ROOT/element-desktop/$i18n_path" "$i18n_overlay_path/element-desktop"
+    # element-desktop
     pushd "$SCHILDI_ROOT/element-desktop" > /dev/null
+    $yarn i18n
+    node "$i18n_helper_path" "$SCHILDI_ROOT/element-desktop/$i18n_path" "$i18n_overlay_path/element-desktop"
     apply_i18n_changes "$i18n_path"
     popd > /dev/null
 }
+
+get_current_versions() {
+    local version=`cat "$SCHILDI_ROOT/element-web/package.json" | jq .version -r`
+    if [[ "$version" =~ ([0-9\.]*)(-sc\.([0-9]+)(\.test.([0-9]+))?)? ]]; then
+        upstream="${BASH_REMATCH[1]}"
+        release="${BASH_REMATCH[3]}"
+        test="${BASH_REMATCH[5]}"
+    fi
+
+    versions=("${upstream:-"0.0.1"}" "${release:-"0"}" "${test:-"0"}")
+}
+
+get_versions_string() {
+    versions_string="${versions[0]}-sc.${versions[1]}"
+
+    if [[ ${versions[2]} -gt 0 ]]; then
+        versions_string+=".test.${versions[2]}"
+    fi
+}
+
+write_version() {
+    local file="$1"
+    local versions_string
+    get_versions_string
+
+    new_content=`jq --arg version "$versions_string" '.version = $version' "$file"`
+    echo "$new_content" > "$file"
+
+    git add "$file"
+    git commit -m "Update version to $versions_string" || true
+}
+
+bump_test_version() {
+    local versions
+    get_current_versions
+    
+    # increment test version
+    versions[2]=$((versions[2] + 1))
+
+    forelement_repos write_version "package.json"
+}
+
+bump_release_version() {
+    local versions
+    get_current_versions
+    
+    # increment release version
+    versions[1]=$((versions[1] + 1))
+    
+    # set test version to 0
+    versions[2]=0
+
+    forelement_repos write_version "package.json"
+}
+
+revert_packagejson_changes() {
+    local path="$1"
+    local revision="$2"
+    local skip_commit="$3"
+
+    git checkout "$revision" -- "$path"
+
+    if [[ "$skip_commit" != [Yy]* ]]; then
+        git commit -m "Automatic package.json reversion" || true
+    fi
+}
+
+apply_packagejson_overlay() {
+    local orig_path="$1"
+    local overlay_path="$2"
+
+    # see: https://stackoverflow.com/a/24904276
+    new_content=`jq -s '.[0] * .[1]' "$orig_path" "$overlay_path"`
+
+    echo "$new_content" > "$orig_path"
+    git add "$orig_path"
+    git commit -m "Automatic package.json adjustment" || true
+}
+
+automatic_packagejson_reversion() {
+    local skip_commit="$1"
+
+    local current_upstream_tag
+    get_current_upstream_tag
+
+    forelement_repos revert_packagejson_changes "package.json" "$current_upstream_tag" "$skip_commit"
+}
+
+automatic_packagejson_adjustment() {
+    local versions
+    get_current_versions
+    
+    # every build after a merge is a new test build
+    versions[2]=$((versions[2] + 1))
+
+    forelement_repos apply_packagejson_overlay "package.json" "overlay-package.json"
+    forelement_repos write_version "package.json"
+}
+
+get_latest_upstream_tag() {
+    pushd "$SCHILDI_ROOT/element-web" > /dev/null
+    git fetch upstream
+    latest_upstream_tag=`git for-each-ref --sort=creatordate --format '%(refname) %(creatordate)' refs/tags | sed -nr 's|refs/tags/(v[0-9]+(\.[0-9]+(\.[0-9]+)?)?) .*|\1|p' | tail -n 1`
+    popd > /dev/null
+}
+
+get_current_upstream_tag() {
+    local versions
+    get_current_versions
+    current_upstream_tag="v${versions[0]}"
+}
+
+get_current_mxsdk_tags() {
+    current_mxreactsdk_tag="v$(cat "$SCHILDI_ROOT/element-web/package.json" | jq '.dependencies["matrix-react-sdk"]' -r)"
+    current_mxjssdk_tag="v$(cat "$SCHILDI_ROOT/element-web/package.json" | jq '.dependencies["matrix-js-sdk"]' -r)"
+}
diff --git a/merge_upstream.sh b/merge_upstream.sh
index db2b383..c3fef9c 100755
--- a/merge_upstream.sh
+++ b/merge_upstream.sh
@@ -3,7 +3,6 @@
 set -e
 
 mydir="$(dirname "$(realpath "$0")")"
-branch=${BRANCH:-"sc"}
 
 pushd "$mydir" > /dev/null
 
@@ -16,19 +15,34 @@ forall_repos check_branch $branch
 # Ensure clean git state
 forall_repos check_clean_git
 
-# Automatic i18n reversion
-automatic_i18n_reversion
-
-# Merge
+# Fetch upstream
 forall_repos git fetch upstream
-forall_repos git merge upstream/master
+
+# Automatic reversions
+automatic_i18n_reversion
+automatic_packagejson_reversion
+
+# Merge upstream
+get_latest_upstream_tag
+forelement_repos git merge "$latest_upstream_tag"
+
+get_current_mxsdk_tags
+
+pushd "matrix-js-sdk" > /dev/null
+git merge "$current_mxjssdk_tag"
+popd > /dev/null
+
+pushd "matrix-react-sdk" > /dev/null
+git merge "$current_mxreactsdk_tag"
+popd > /dev/null
 
 # Refresh environment
 make clean
 make setup
 
-# Automatic i18n adjustment
+# Automatic adjustments
 automatic_i18n_adjustment
+automatic_packagejson_adjustment
 
 # Automatic theme update
 pushd "matrix-react-sdk" > /dev/null
diff --git a/nix/overlay.nix b/nix/overlay.nix
new file mode 100644
index 0000000..8c763e7
--- /dev/null
+++ b/nix/overlay.nix
@@ -0,0 +1,18 @@
+final: prev: {
+  cleanSchildichatDesktopSource = src: with final.lib; cleanSourceWith {
+    filter = name: type: cleanSourceFilter name type
+      && !(hasInfix "/node_modules/" name)
+      && !(hasInfix "/nix/" name && hasSuffix ".nix" name)
+    ;
+    inherit src;
+  };
+  schildichat-web = final.callPackage ./schildichat-web.nix {
+  };
+  schildichat-desktop = final.callPackage ./schildichat-desktop.nix {
+    inherit (final.darwin.apple_sdk.frameworks) Security AppKit CoreServices;
+  };
+  schildichat-desktop-wayland = final.callPackage ./schildichat-desktop.nix {
+    inherit (final.darwin.apple_sdk.frameworks) Security AppKit CoreServices;
+    useWayland = true;
+  };
+}
diff --git a/nix/schildichat-desktop.nix b/nix/schildichat-desktop.nix
new file mode 100644
index 0000000..ab1daa4
--- /dev/null
+++ b/nix/schildichat-desktop.nix
@@ -0,0 +1,109 @@
+{ lib
+, stdenv
+, fetchFromGitHub
+, makeWrapper
+, makeDesktopItem
+, mkYarnPackage
+, electron
+, element-desktop # for native modules
+, schildichat-web
+, callPackage
+, Security
+, AppKit
+, CoreServices
+
+, useWayland ? false
+
+, cleanSchildichatDesktopSource
+, schildichat-desktop-src ? ../.
+}:
+
+let
+  packageJSON = schildichat-desktop-src + "/element-desktop/package.json";
+  yarnLock = schildichat-desktop-src + "/element-desktop/yarn.lock";
+
+  package = builtins.fromJSON (builtins.readFile packageJSON);
+
+  pname = "schildichat-desktop";
+  version = package.version;
+
+  executableName = pname;
+
+  electron_exec = if stdenv.isDarwin then "${electron}/Applications/Electron.app/Contents/MacOS/Electron" else "${electron}/bin/electron";
+
+in mkYarnPackage rec {
+  inherit pname version packageJSON;
+
+  src = cleanSchildichatDesktopSource (schildichat-desktop-src + "/element-desktop");
+
+  nativeBuildInputs = [ makeWrapper ];
+
+  inherit (element-desktop) seshat keytar;
+
+  buildPhase = ''
+    runHook preBuild
+
+    export HOME=$(mktemp -d)
+    pushd deps/schildichat-desktop/
+    npx tsc
+    yarn run i18n
+    node ./scripts/copy-res.js
+    popd
+    rm -rf node_modules/matrix-seshat node_modules/keytar
+    ln -s $keytar node_modules/keytar
+    ln -s $seshat node_modules/matrix-seshat
+
+    runHook postBuild
+  '';
+
+  installPhase = ''
+    runHook preInstall
+
+    # resources
+    mkdir -p "$out/share/element"
+    ln -s '${schildichat-web}' "$out/share/element/webapp"
+    cp -r './deps/schildichat-desktop' "$out/share/element/electron"
+    cp -r './deps/schildichat-desktop/res/img' "$out/share/element"
+    rm "$out/share/element/electron/node_modules"
+    cp -r './node_modules' "$out/share/element/electron"
+    cp $out/share/element/electron/lib/i18n/strings/en_EN.json $out/share/element/electron/lib/i18n/strings/en-us.json
+    ln -s $out/share/element/electron/lib/i18n/strings/en{-us,}.json
+
+    # icons
+    for icon in $out/share/element/electron/build/icons/*.png; do
+      mkdir -p "$out/share/icons/hicolor/$(basename $icon .png)/apps"
+      ln -s "$icon" "$out/share/icons/hicolor/$(basename $icon .png)/apps/element.png"
+    done
+
+    # desktop item
+    mkdir -p "$out/share"
+    ln -s "${desktopItem}/share/applications" "$out/share/applications"
+
+    # executable wrapper
+    makeWrapper '${electron_exec}' "$out/bin/${executableName}" \
+      --add-flags "$out/share/element/electron${lib.optionalString useWayland " --enable-features=UseOzonePlatform --ozone-platform=wayland"}"
+
+    runHook postInstall
+  '';
+
+  # Do not attempt generating a tarball for element-web again.
+  # note: `doDist = false;` does not work.
+  distPhase = ''
+    true
+  '';
+
+  # The desktop item properties should be kept in sync with data from upstream:
+  # https://github.com/vector-im/element-desktop/blob/develop/package.json
+  desktopItem = makeDesktopItem {
+    name = "schildichat-desktop";
+    exec = "${executableName} %u";
+    icon = "schildichat";
+    desktopName = "SchildiChat";
+    genericName = "Matrix Client";
+    categories = "Network;InstantMessaging;Chat;";
+    extraEntries = ''
+      StartupWMClass=schildichat
+      MimeType=x-scheme-handler/element;
+    '';
+  };
+}
diff --git a/nix/schildichat-web.nix b/nix/schildichat-web.nix
new file mode 100644
index 0000000..e10071c
--- /dev/null
+++ b/nix/schildichat-web.nix
@@ -0,0 +1,75 @@
+{ stdenv
+, mkYarnModules
+, nodejs
+, cleanSchildichatDesktopSource
+, schildichat-desktop-src ? ../.
+, ...
+}:
+
+let
+  packageJSON = schildichat-desktop-src + "/element-web/package.json";
+  yarnLock = schildichat-desktop-src + "/element-web/yarn.lock";
+
+  package = builtins.fromJSON (builtins.readFile packageJSON);
+
+  pname = "schildichat-web";
+  version = package.version;
+
+  modules = mkYarnModules {
+    name = "${pname}-modules-${version}";
+    inherit pname version packageJSON yarnLock;
+  };
+
+in stdenv.mkDerivation {
+  inherit pname version;
+
+  src = cleanSchildichatDesktopSource schildichat-desktop-src;
+
+  buildInputs = [ nodejs ];
+
+  postPatch = ''
+    patchShebangs .
+  '';
+
+  configurePhase = ''
+    runHook preConfigure
+
+    cp configs/sc/config.json element-web/
+    cp -r ${modules}/node_modules node_modules
+    chmod u+rwX -R node_modules
+    rm -rf node_modules/matrix-react-sdk
+    ln -s $PWD/matrix-react-sdk node_modules/
+    ln -s $PWD/node_modules matrix-react-sdk/
+    ln -s $PWD/node_modules element-web/
+
+    runHook postConfigure
+  '';
+
+  buildPhase = ''
+    runHook preBuild
+
+    pushd matrix-react-sdk
+    node_modules/.bin/reskindex -h ../element-web/src/header
+    popd
+
+    pushd element-web
+    node scripts/copy-res.js
+    node_modules/.bin/reskindex -h ../element-web/src/header
+    node_modules/.bin/webpack --progress --mode production
+    popd
+
+    runHook postBuild
+  '';
+
+  installPhase = ''
+    runHook preInstall
+
+    cp -r element-web/webapp $out
+
+    runHook postInstall
+  '';
+
+  passthru = {
+    inherit modules;
+  };
+}
diff --git a/publish_release.sh b/publish_release.sh
new file mode 100755
index 0000000..cd5874c
--- /dev/null
+++ b/publish_release.sh
@@ -0,0 +1,31 @@
+#!/bin/bash
+
+set -e
+
+mydir="$(dirname "$(realpath "$0")")"
+
+pushd "$mydir" > /dev/null
+
+source ./merge_helpers.sh
+
+# Check branch
+check_branch $branch
+forall_repos check_branch $branch
+
+# Ensure clean git state
+forall_repos check_clean_git
+
+git fetch origin
+git branch -D master || true
+git checkout -b master --track origin/master
+git merge --ff-only sc
+git push
+git checkout sc
+forall_repos git fetch origin
+forall_repos git branch -D master || true
+forall_repos git checkout -b master --track origin/master
+forall_repos git merge --ff-only sc
+forall_repos git push
+forall_repos git checkout sc
+
+popd > /dev/null
diff --git a/regenerate_i18n.sh b/regenerate_i18n.sh
index 8c13ab6..1e6c300 100755
--- a/regenerate_i18n.sh
+++ b/regenerate_i18n.sh
@@ -9,6 +9,9 @@ pushd "$mydir" > /dev/null
 
 source ./merge_helpers.sh
 
+# Fetch to get upstream strings for current version
+forall_repos git fetch upstream
+
 # Check branch
 check_branch $branch
 forall_repos check_branch $branch