diff --git a/.containerignore b/.containerignore new file mode 100644 index 0000000..ae02570 --- /dev/null +++ b/.containerignore @@ -0,0 +1 @@ +release/ \ No newline at end of file diff --git a/.github/workflows/stale.yml b/.github/workflows/stale.yml new file mode 100644 index 0000000..674a67d --- /dev/null +++ b/.github/workflows/stale.yml @@ -0,0 +1,17 @@ +name: 'Close stale issues' +on: + schedule: + - cron: '30 1 * * *' + +jobs: + stale: + runs-on: ubuntu-latest + steps: + - uses: actions/stale@v6 + with: + stale-issue-message: 'This issue is stale because it has been open 150 days with no activity. Remove stale label or comment or this will be closed in 14 days.' + days-before-issue-stale: 150 + days-before-issue-close: 14 + days-before-pr-stale: -1 + days-before-pr-close: -1 + exempt-issue-labels: 'longterm,enhancement,parity-with-android,prio:medium,prio:high,electron issue,encrypted room search,build infrastructure' diff --git a/Containerfile.debian b/Containerfile.debian new file mode 100644 index 0000000..86614ba --- /dev/null +++ b/Containerfile.debian @@ -0,0 +1,28 @@ +ARG NODE_VERSION +FROM docker.io/node:${NODE_VERSION}-bookworm + +RUN apt-get -qq update && apt-get -qq install --no-install-recommends -y \ + curl \ + g++ \ + gcc \ + git \ + jq \ + libarchive-tools \ + libsecret-1-dev \ + libsqlcipher-dev \ + libssl-dev \ + make \ + openssl \ + pkg-config \ + python3 \ + rpm \ + tcl \ + vim +RUN ln -s /usr/bin/python3 /usr/bin/python + +ENV RUSTUP_HOME=/usr/local/rustup \ + CARGO_HOME=/usr/local/cargo \ + PATH=/usr/local/cargo/bin:$PATH +RUN curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y --no-modify-path --profile minimal + +WORKDIR /project diff --git a/Containerfile.fedora b/Containerfile.fedora new file mode 100644 index 0000000..d1074da --- /dev/null +++ b/Containerfile.fedora @@ -0,0 +1,22 @@ +FROM docker.io/fedora:40 + +RUN dnf install -y openssl openssl-devel cargo llvm libsecret libsecret-devel sqlcipher sqlcipher-devel g++ ruby-devel gcc make rpm-build libffi-devel tcl libxcrypt-compat pkgconf perl + +# node setup +ARG NODE_VERSION +RUN mkdir -p /usr/local/n +RUN mkdir -p /usr/local/bin /usr/local/lib /usr/local/include /usr/local/share +RUN curl -L https://raw.githubusercontent.com/tj/n/master/bin/n -o n +RUN bash n ${NODE_VERSION} +RUN npm install -g n +RUN npm install -g yarn +RUN npm install -g node-gyp +RUN gem install --no-user-install --no-document fpm +RUN ln -s /usr/bin/python3 /usr/bin/python + +ENV RUSTUP_HOME=/usr/local/rustup \ + CARGO_HOME=/usr/local/cargo \ + PATH=/usr/local/cargo/bin:$PATH +RUN curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y --no-modify-path --profile minimal + +WORKDIR /project diff --git a/Containerfile.windows b/Containerfile.windows new file mode 100644 index 0000000..0c0776a --- /dev/null +++ b/Containerfile.windows @@ -0,0 +1,13 @@ +ARG CONTAINER_IMAGE_DEBIAN +FROM ${CONTAINER_IMAGE_DEBIAN}:latest + +RUN dpkg --add-architecture i386 && apt-get update && apt-get install --no-install-recommends -y \ + wine \ + wine32 \ + wine64 \ + libwine \ + libwine:i386 \ + fonts-wine \ + zip + +WORKDIR /project \ No newline at end of file diff --git a/FEATURES.md b/FEATURES.md new file mode 100644 index 0000000..05b8736 --- /dev/null +++ b/FEATURES.md @@ -0,0 +1,28 @@ +# Features and changes compared to upstream + +Note that this list may be incomplete or outdated. + + +## General UI + +... TODO Schildi theme? + + +## Chat overview ("room list") + +- Unified room list instead of separating DMs and groups (TODO: setting) +- Do not exclude currently selected room when updating room sort order +- Do not force muted rooms to be sorted at the bottom +- Hide reactions from room previews +- Show unread state of muted rooms +- Increase default visible tiles before collapsing each section +- Include DMs in space unread counts +- Show space overview rather then jumping to last opened room when switching space +- Do not add spaces to recently opened rooms list ("breadcrumbs") + + +## Conversation screen + +- Render captions +- Allow sending freeform reactions +- Less restrictive width limit for rendering text reactions diff --git a/Makefile b/Makefile index fbb47a2..ab3280b 100644 --- a/Makefile +++ b/Makefile @@ -1,16 +1,22 @@ -.PHONY: all setup regenerate-i18n reskindex web desktop-common linux debian rpm pacman local-pkgbuild local-pkgbuild-install windows windows-portable +.PHONY: all setup regenerate-i18n 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 +.PHONY: container-build-debian container-build-fedora container-build-windows +.PHONY: container-web-release container-debian-release container-rpm-release container-appimage-release container-windows-release container-release container-local-pkgbuild +.PHONY: clean undo_setup fixup +.PHONY: fix_yarn_cache CFGDIR ?= configs/sc all: web YARN ?= yarnpkg +CONTAINER_ENGINE ?= podman +NODE_VERSION ?= 22 VERSION := $(shell grep version element-desktop/package.json | sed 's|.*: \"\(.*\)\",|\1|') -WEB_APP_NAME := $(shell grep '"name"' element-web/package.json | head -n 1 | sed 's|.*: \"\(.*\)\",|\1|') +#WEB_APP_NAME := $(shell grep '"name"' element-web/package.json | head -n 1 | sed 's|.*: \"\(.*\)\",|\1|') +WEB_APP_NAME := element DESKTOP_APP_NAME := $(shell grep '"name"' element-desktop/package.json | head -n 1 | sed 's|.*: \"\(.*\)\",|\1|') PRODUCT_NAME := $(shell grep '"productName"' element-desktop/package.json | sed 's|.*: \"\(.*\)\",|\1|') @@ -32,6 +38,10 @@ OUT_WIN64_PORTABLE_BETTER_NAME := $(PRODUCT_NAME)_win-portable_v$(VERSION) OUT_MACOS := $(DESKTOP_OUT)/$(PRODUCT_NAME)-$(VERSION)-universal.dmg OUT_MACOS_MAS := $(DESKTOP_OUT)/mas-universal/$(PRODUCT_NAME).app +CONTAINER_IMAGE_DEBIAN := schildichat-desktop-containerbuild-debian +CONTAINER_IMAGE_FEDORA := schildichat-desktop-containerbuild-fedora +CONTAINER_IMAGE_WINDOWS := schildichat-desktop-containerbuild-windows + RELEASE_DIR := release CURRENT_RELEASE_DIR := $(RELEASE_DIR)/$(VERSION) @@ -43,7 +53,7 @@ CSC_NAME ?= -include release.mk setup: - if [ ! -L "element-desktop/webapp" ]; then ./setup.sh; fi + ./setup.sh element-desktop/build/SchildiChat.xcassets/SchildiChat.iconset: $(wildcard element-desktop/build/SchildiChat.xcassets/SchildiChat.iconset/*) @@ -60,19 +70,15 @@ icns: element-desktop/build/icon.icns element-desktop/build/dmg.icns regenerate-i18n: setup ./regenerate_i18n.sh -reskindex: setup - $(YARN) --cwd matrix-react-sdk reskindex - $(YARN) --cwd element-web reskindex - web: export DIST_VERSION=$(WEB_OUT_DIST_VERSION) -web: setup reskindex +web: setup cp $(CFGDIR)/config.json element-web/ $(YARN) --cwd element-web dist echo "$(VERSION)" > element-web/webapp/version desktop-common: web $(YARN) --cwd element-desktop run fetch --cfgdir '' - $(YARN) --cwd element-desktop run build:native + SQLCIPHER_BUNDLED=1 $(YARN) --cwd element-desktop run build:native macos-common: web icns $(YARN) --cwd element-desktop run fetch --cfgdir '' @@ -157,16 +163,61 @@ macos-mas-release: macos-mas mkdir -p $(CURRENT_RELEASE_DIR) cp $(OUT_MACOS_MAS) $(CURRENT_RELEASE_DIR) +container-build-debian: + $(CONTAINER_ENGINE) build --security-opt seccomp=unconfined --security-opt label=disable -t $(CONTAINER_IMAGE_DEBIAN) -f Containerfile.debian --build-arg NODE_VERSION=$(NODE_VERSION) . + +container-build-fedora: + $(CONTAINER_ENGINE) build --security-opt seccomp=unconfined --security-opt label=disable -t $(CONTAINER_IMAGE_FEDORA) -f Containerfile.fedora --build-arg NODE_VERSION=$(NODE_VERSION) . + +container-build-windows: container-build-debian + $(CONTAINER_ENGINE) build --security-opt seccomp=unconfined --security-opt label=disable -t $(CONTAINER_IMAGE_WINDOWS) -f Containerfile.windows --build-arg CONTAINER_IMAGE_DEBIAN=$(CONTAINER_IMAGE_DEBIAN) . + +container-web-release: container-build-debian + $(CONTAINER_ENGINE) run --rm -ti -v $(PWD):/project --security-opt seccomp=unconfined --security-opt label=disable $(CONTAINER_IMAGE_DEBIAN):latest make web-release + +container-debian-release: container-build-debian + $(CONTAINER_ENGINE) run --rm -ti -v $(PWD):/project --security-opt seccomp=unconfined --security-opt label=disable $(CONTAINER_IMAGE_DEBIAN):latest make debian-release + +container-rpm-release: container-build-fedora + $(CONTAINER_ENGINE) run --rm -ti -v $(PWD):/project --security-opt seccomp=unconfined --security-opt label=disable $(CONTAINER_IMAGE_FEDORA):latest make rpm-release + +container-appimage-release: container-build-debian + $(CONTAINER_ENGINE) run --rm -ti -v $(PWD):/project --security-opt seccomp=unconfined --security-opt label=disable $(CONTAINER_IMAGE_DEBIAN):latest make appimage-release + +container-windows-release: container-build-windows + $(CONTAINER_ENGINE) run --rm -ti -v $(PWD):/project --security-opt seccomp=unconfined --security-opt label=disable $(CONTAINER_IMAGE_WINDOWS):latest make windows-release + +container-release: container-build-windows #container-build-fedora + $(CONTAINER_ENGINE) run --rm -ti -v $(PWD):/project --security-opt seccomp=unconfined --security-opt label=disable $(CONTAINER_IMAGE_WINDOWS):latest make web-release debian-release appimage-release rpm-release windows-setup-release windows-portable-release + #$(CONTAINER_ENGINE) run --rm -ti -v $(PWD):/project --security-opt seccomp=unconfined --security-opt label=disable $(CONTAINER_IMAGE_FEDORA):latest make rpm-release + +linux-container-release: container-build-debian + $(CONTAINER_ENGINE) run --rm -ti -v $(PWD):/project --security-opt seccomp=unconfined --security-opt label=disable $(CONTAINER_IMAGE_DEBIAN):latest make web-release debian-release appimage-release rpm-release + +container-local-pkgbuild: container-build-debian + $(CONTAINER_ENGINE) run --rm -ti -v $(PWD):/project --security-opt seccomp=unconfined --security-opt label=disable $(CONTAINER_IMAGE_DEBIAN):latest make local-pkgbuild + 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 +fix_yarn_cache: + $(YARN) cache list || $(YARN) cache clean + clean: $(YARN) --cwd matrix-js-sdk clean $(YARN) --cwd matrix-react-sdk clean $(YARN) --cwd element-web clean $(YARN) --cwd element-desktop clean - rm -f element-desktop/webapp + rm -f element-desktop/webapp || true rm -rf element-web/dist rm -rf local-pkgbuild rm -f bom.lock + +undo_setup: + rm -rf element-desktop/node_modules element-web/node_modules matrix-react-sdk/node_modules matrix-js-sdk/node_modules i18n-helper/node_modules element-desktop/.hak + +fixup: undo_setup fix_yarn_cache + make setup + make clean + make setup diff --git a/README.md b/README.md index 821ed19..b34abad 100644 --- a/README.md +++ b/README.md @@ -1,25 +1,19 @@ # SchildiChat Web/Desktop -SchildiChat Web/Desktop is a fork of Element [Web](https://github.com/vector-im/element-web)/[Desktop](https://github.com/vector-im/element-desktop). +SchildiChat Web/Desktop is a fork of Element [Web](https://github.com/element-hq/element-web)/[Desktop](https://github.com/element-hq/element-desktop). -The most important changes of SchildiChat Web/Desktop compared to Element Web/Desktop are: -- A unified chat list for both direct and group chats -- Message bubbles -- Bigger items in the room list -- … and more! -Desktop downloads with installation instructions are listed on our website: [https://schildi.chat/desktop](https://schildi.chat/desktop) -Hosted web variant: [https://app.schildi.chat/](https://app.schildi.chat/) -Feel free to [join the discussion on matrix](https://matrix.to/#/#schildichat-web:matrix.org). - - +## Old build instructions, to be revised in the future ## Building SchildiChat Web/Desktop 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)
@@ -33,11 +27,12 @@ This particular repo is a wrapper project for element-desktop, element-web, matr
 
 Since Debian is usually slow to update packages on its stable releases,
 some dependencies might not be recent enough to build SchildiChat.  
-The following are the dependencies required to build SchildiChat Web/Desktop on Debian 10:
+The following are the dependencies required to build SchildiChat Web/Desktop on Debian 11 (bullseye):
 
 ```
-# apt install vim curl git make gcc g++ libsqlcipher-dev pkg-config libsecret-1-dev bsdtar
-# curl -sL https://deb.nodesource.com/setup_14.x | bash -
+# apt install vim curl git make gcc g++ python jq libsqlcipher-dev pkg-config libsecret-1-dev libarchive-tools openssl libssl-dev tcl
+
+# curl -sL https://deb.nodesource.com/setup_16.x | bash -
 # apt update
 # apt install nodejs
 
@@ -75,32 +70,35 @@ To notarize a build with Apple set `NOTARIZE_APPLE_ID` to your AppleID and set t
 
 ### 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 lite --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
-- `macos-mas`: Build a *.pkg for release in the Mac App Store
+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
 
@@ -115,3 +113,13 @@ your-deploy-%: CFGDIR := $(YOUR_CFGDIR)
 your-deploy-web: web
 	rsync --info=progress2 -rup --del element-web/webapp/ you@yourwebserver:/the/folder/served/for/schildi/
 ```
+
+
+# Merge helpers
+
+## Add upstream repo remotes
+
+```
+source merge_helpers.sh
+forall_repos add_upstream
+```
diff --git a/apply_patches.sh b/apply_patches.sh
new file mode 100755
index 0000000..8d581f9
--- /dev/null
+++ b/apply_patches.sh
@@ -0,0 +1,40 @@
+#!/bin/bash
+
+set -e
+
+mydir="$(dirname "$(realpath "$0")")"
+
+print_section() {
+    local msg="$1"
+    echo "##############################################################"
+    echo "# $msg"
+    echo "##############################################################"
+}
+
+pushd "$mydir" > /dev/null
+
+source ./merge_helpers.sh
+
+# Apply our patches
+print_section "Apply patches to matrix-js-sdk"
+apply_patches matrix-js-sdk
+print_section "Apply patches to matrix-react-sdk"
+apply_patches matrix-react-sdk
+#print_section "Apply patches to element-web"
+#apply_patches element-web
+print_section "Apply patches to element-desktop"
+apply_patches element-desktop
+
+# Automatic adjustments
+#print_section "Apply i18n"
+#automatic_i18n_adjustment
+print_section "Apply automatic package adjustments"
+automatic_packagejson_adjustment
+
+# Automatic theme and icon update
+print_section "Apply automatic theme updates"
+./theme.sh y
+print_section "Generate icons"
+./graphics/icon_gen.sh y
+
+popd > /dev/null
diff --git a/bump_release_version.sh b/bump_release_version.sh
new file mode 100755
index 0000000..92b5cac
--- /dev/null
+++ b/bump_release_version.sh
@@ -0,0 +1,29 @@
+#!/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
+
+# Get version string
+get_current_versions
+get_versions_string
+
+# Add everything
+git add -A
+git commit --allow-empty -m "New release v$versions_string"
+git tag -s "v$versions_string" -m "New release v$versions_string"
+
+popd > /dev/null
diff --git a/bump_test_version.sh b/bump_test_version.sh
new file mode 100755
index 0000000..bffb851
--- /dev/null
+++ b/bump_test_version.sh
@@ -0,0 +1,29 @@
+#!/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
+
+# Get version string
+get_current_versions
+get_versions_string
+
+# Add everything
+git add -A
+git commit --allow-empty -m "New test release v$versions_string"
+git tag -s "v$versions_string" -m "New test release v$versions_string"
+
+popd > /dev/null
diff --git a/configs/sc/config.json b/configs/sc/config.json
index 3a229d0..0402a78 100644
--- a/configs/sc/config.json
+++ b/configs/sc/config.json
@@ -1,6 +1,11 @@
 {
     "update_base_url": null,
-    "default_server_name": "matrix.org",
+    "default_server_config": {
+        "m.homeserver": {
+            "base_url": "https://matrix-client.matrix.org",
+            "server_name": "matrix.org"
+        }
+    },
     "brand": "SchildiChat",
     "integrations_ui_url": "https://scalar.vector.im/",
     "integrations_rest_url": "https://scalar.vector.im/api",
@@ -11,10 +16,13 @@
         "https://scalar-staging.vector.im/api",
         "https://scalar-staging.riot.im/scalar/api"
     ],
-    "showLabsSettings": true,
-    "roomDirectory": {
+    "show_labs_settings": true,
+    "room_directory": {
         "servers": [
-            "matrix.org"
+            "matrix.org",
+            "gitter.im",
+            "libera.chat",
+            "schildi.chat"
         ]
     },
     "enable_presence_by_hs_url": {
@@ -27,11 +35,5 @@
             "text": "Privacy Policy"
         }
     ],
-    "sc_update_announcement_room": {
-        "room_id_or_alias": "!JwTYjASnrfLEJQGQvt:matrix.org",
-        "via_servers": [
-            "supercable.onl",
-            "spiritcroc.de"
-        ]
-    }
+    "map_style_url": "https://api.maptiler.com/maps/streets/style.json?key=fU3vlMsMn4Jb6dnEIFsx"
 }
diff --git a/deploy/create-github-release.sh b/deploy/create-github-release.sh
index b93f7d5..63c327c 100755
--- a/deploy/create-github-release.sh
+++ b/deploy/create-github-release.sh
@@ -10,12 +10,16 @@ set -e
 version="$1"
 releasepath="$2"
 
-github_api_token=`cat ~/githubtoken`
+if [ -z "$GITHUB_API_TOKEN" ]; then
+    github_api_token=`cat ~/githubtoken`
+else
+    github_api_token="$GITHUB_API_TOKEN"
+fi
 release_notes_file="/tmp/scrn.md"
 
 owner=SchildiChat
 repo=schildichat-desktop
-target=master
+target=lite
 
 # Define variables
 GH_API="https://api.github.com"
@@ -37,7 +41,7 @@ json_string=`jq -n --arg tag "v$version" --arg target "$target" --arg body "$rel
   name: $tag,
   body: $body,
   draft: true,
-  prerelease: false
+  prerelease: true
 }'`
 # echo "$json_string"
 res=`echo "$json_string" | curl -sH "$AUTH" $GH_REPO/releases -d @-`
diff --git a/deploy/update-aur-bin.sh b/deploy/update-aur-bin.sh
index 81b999d..f5d2213 100755
--- a/deploy/update-aur-bin.sh
+++ b/deploy/update-aur-bin.sh
@@ -21,6 +21,7 @@ git fetch
 git reset --hard origin/master
 
 sed -i "s|^_pkgver=.*$|_pkgver=$version|" PKGBUILD
+sed -i "s|^pkgrel=.*$|pkgrel=1|" PKGBUILD
 sed -i "s|^sha256sums=('.*'$|sha256sums=('$sha256sum'|" PKGBUILD
 
 makepkg --printsrcinfo > .SRCINFO
diff --git a/deploy/update-flathub.sh b/deploy/update-flathub.sh
index 28f228c..7451aec 100755
--- a/deploy/update-flathub.sh
+++ b/deploy/update-flathub.sh
@@ -20,10 +20,13 @@ debdate=$(date +%Y-%m-%d -r $debpath)
 pushd "$repopath" > /dev/null
 
 git fetch
+git checkout master
 git reset --hard origin/master
 
+git checkout -B "release-v$version"
+
 yamlFile="chat.schildi.desktop.yaml"
-xmlFile="chat.schildi.desktop.appdata.xml"
+xmlFile="chat.schildi.desktop.metainfo.xml"
 
 sed -i "s|url: .* #SC:url|url: $downloadurl #SC:url|" "$yamlFile"
 sed -i "s|sha256: .* #SC:sha256|sha256: $sha256sum #SC:sha256|" "$yamlFile"
@@ -33,8 +36,8 @@ sed -i "s|^\s\s$|  \n     /dev/null
 
-echo "Release v$version published on flathub!"
+echo "Release v$version published on flathub, now merge that branch as PR: https://github.com/flathub/chat.schildi.desktop/"
diff --git a/element-desktop b/element-desktop
index de5f137..96aa172 160000
--- a/element-desktop
+++ b/element-desktop
@@ -1 +1 @@
-Subproject commit de5f137d4e37c7527596b4d910cb13a23b090dca
+Subproject commit 96aa1725d46fe9858108eff051711838da2d60fc
diff --git a/element-web b/element-web
index 615ecdc..60754c1 160000
--- a/element-web
+++ b/element-web
@@ -1 +1 @@
-Subproject commit 615ecdc6d663431807884d4bb7c1d66ea684a3c9
+Subproject commit 60754c17d92a1e8d9790dfb476f703949b60ce47
diff --git a/flake.lock b/flake.lock
index 7e563d6..d010aa2 100644
--- a/flake.lock
+++ b/flake.lock
@@ -2,11 +2,11 @@
   "nodes": {
     "nixpkgs": {
       "locked": {
-        "lastModified": 1630504215,
-        "narHash": "sha256-H5pzwo7z3e7ZatwuwWY25oZSejchO+ZH/XtMi8/PXLw=",
-        "owner": "yu-re-ka",
+        "lastModified": 1699380656,
+        "narHash": "sha256-H9kQH3J2Z15Ady3zVQsN/tXv8qnRr+p1B0eUkR1bKfE=",
+        "owner": "NixOS",
         "repo": "nixpkgs",
-        "rev": "979e5916df0e6830a2b1ee999632de9a9d2beb23",
+        "rev": "03e7a22654c44489a0a70ea0e237de3e512cd8a6",
         "type": "github"
       },
       "original": {
diff --git a/flake.nix b/flake.nix
index cc71b74..d621243 100644
--- a/flake.nix
+++ b/flake.nix
@@ -25,5 +25,20 @@
         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/generate_changelog.sh b/generate_changelog.sh
new file mode 100755
index 0000000..1e65601
--- /dev/null
+++ b/generate_changelog.sh
@@ -0,0 +1,61 @@
+#!/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
+
+# Fetch upstream
+forall_repos git fetch origin > /dev/null 2>/dev/null
+forall_repos git fetch upstream > /dev/null 2>/dev/null
+
+(
+    # Add new line below git log: https://unix.stackexchange.com/a/345558
+
+    get_latest_upstream_tag
+    forelement_repos git log --pretty=format:"- %s" "sc" "^$latest_upstream_tag" "^master" \
+        | printf '%s\n' "$(cat)" \
+        | sed "s|Merge tag '\\(.*\\)' into sc.*|Update codebase to Element \1|" \
+        | sed "s|Merge tag '\\(.*\\)' into merge.*|Update codebase to Element \1|"
+
+    get_current_mxsdk_tags
+
+    pushd "matrix-js-sdk" > /dev/null
+    git log --pretty=format:"- %s" "sc" "^$current_mxjssdk_tag" "^master" \
+        | printf '%s\n' "$(cat)" \
+        | grep -v "Merge .*tag"
+    popd > /dev/null
+
+    pushd "matrix-react-sdk" > /dev/null
+    git log --pretty=format:"- %s" "sc" "^$current_mxreactsdk_tag" "^master" \
+        | printf '%s\n' "$(cat)" \
+        | grep -v "Merge .*tag"
+    popd > /dev/null
+) \
+    | grep -v "Automatic i18n reversion" \
+    | grep -v "Automatic package.json reversion" \
+    | grep -v "Merge .*branch" \
+    | grep -v "Automatic theme update" \
+    | grep -v "Automatic package.json adjustment" \
+    | grep -v "Automatic i18n adjustment" \
+    | grep -v "Update version to .*-sc\\..*" \
+    | grep -v "\\.sh" \
+    | grep -v "\\.md" \
+    | grep -v "Added translation using Weblate" \
+    | grep -v "Translated using Weblate" \
+    | grep -v "weblate/sc" \
+    | grep -v "\\[.*merge.*\\]" \
+    | awk '!seen[$0]++' `# https://stackoverflow.com/a/1444448` \
+    || echo "No significant changes since the last stable release"
+
+popd > /dev/null
diff --git a/generate_patches.sh b/generate_patches.sh
new file mode 100755
index 0000000..4a2771d
--- /dev/null
+++ b/generate_patches.sh
@@ -0,0 +1,43 @@
+#!/bin/bash
+
+set -e
+
+mydir="$(dirname "$(realpath "$0")")"
+pushd "$mydir" > /dev/null
+
+source ./merge_helpers.sh
+
+persist_patches() {
+    local repo="$(realpath "$1")"
+    local patch_dir="$SCHILDI_ROOT/patches/$(basename "$1")"
+    if [ ! -d "$repo" ]; then
+        echo "Unknown repo: $repo"
+        return 1
+    fi
+
+    pushd "$repo"
+
+    if [ -d "$patch_dir" ]; then
+        echo "Clearing old patches..."
+        rm "$patch_dir"/*
+    else
+        echo "Creating new patch dir $patch_dir..."
+        mkdir "$patch_dir"
+    fi
+    echo "Creating new patches"
+    git format-patch -k upstream/master.. -o "$patch_dir"
+    echo "Clearing automated commits from patches"
+    find "$patch_dir" -name "*-Automatic-package.json-adjustment.patch" -exec rm {} \;
+    find "$patch_dir" -name "*-Automatic-icon-update.patch" -exec rm {} \;
+    find "$patch_dir" -name "*-Automatic-theme-update.patch" -exec rm {} \;
+    find "$patch_dir" -name "*-Automatic-setup-commit.patch" -exec rm {} \;
+    find "$patch_dir" -name "*-Update-version-to-*.patch" -exec rm {} \;
+    popd
+}
+
+persist_patches element-desktop
+#persist_patches element-web
+persist_patches matrix-react-sdk
+persist_patches matrix-js-sdk
+
+popd > /dev/null
diff --git a/graphics/feature_image.svg b/graphics/feature_image.svg
new file mode 100644
index 0000000..acb9ffc
--- /dev/null
+++ b/graphics/feature_image.svg
@@ -0,0 +1,815 @@
+
+
+  
+    
+      
+      
+    
+    
+      
+      
+      
+      
+      
+    
+    
+      
+      
+      
+      
+      
+    
+    
+      
+      
+      
+      
+      
+    
+    
+      
+      
+      
+      
+      
+    
+    
+      
+      
+      
+      
+      
+    
+    
+      
+      
+      
+      
+      
+    
+    
+    
+      
+      
+      
+      
+      
+    
+    
+      
+      
+      
+      
+      
+    
+    
+      
+      
+      
+      
+      
+    
+    
+      
+      
+      
+      
+      
+    
+    
+      
+      
+      
+      
+      
+    
+    
+      
+      
+      
+      
+      
+    
+    
+      
+      
+      
+      
+      
+    
+    
+      
+      
+      
+      
+      
+    
+    
+      
+      
+      
+      
+      
+    
+    
+      
+      
+      
+      
+      
+    
+    
+      
+      
+      
+      
+      
+    
+    
+      
+      
+      
+      
+      
+    
+  
+  
+  
+    
+      
+        image/svg+xml
+        
+        
+      
+    
+  
+  
+    
+    
+      
+      
+      
+      
+    
+    
+      
+      
+      
+      
+    
+  
+
diff --git a/graphics/feature_image_transparent.svg b/graphics/feature_image_transparent.svg
new file mode 100644
index 0000000..c241206
--- /dev/null
+++ b/graphics/feature_image_transparent.svg
@@ -0,0 +1,784 @@
+
+
+  
+    
+      
+      
+      
+      
+      
+    
+    
+      
+      
+      
+      
+      
+    
+    
+      
+      
+      
+      
+      
+    
+    
+      
+      
+      
+      
+      
+    
+    
+      
+      
+      
+      
+      
+    
+    
+      
+      
+      
+      
+      
+    
+    
+      
+      
+      
+      
+      
+    
+    
+      
+      
+      
+      
+      
+    
+    
+      
+      
+      
+      
+      
+    
+    
+      
+      
+      
+      
+      
+    
+    
+      
+      
+      
+      
+      
+    
+    
+      
+      
+      
+      
+      
+    
+    
+      
+      
+      
+      
+      
+    
+    
+      
+      
+      
+      
+      
+    
+    
+      
+      
+      
+      
+      
+    
+    
+      
+      
+      
+      
+      
+    
+    
+      
+      
+      
+      
+      
+    
+    
+      
+      
+      
+      
+      
+    
+  
+  
+  
+    
+      
+        image/svg+xml
+        
+        
+      
+    
+  
+  
+    
+      
+      
+      
+      
+    
+    
+      
+      
+      
+      
+    
+  
+
diff --git a/graphics/ic_launcher_sc.svg b/graphics/ic_launcher_sc.svg
new file mode 100644
index 0000000..6dee8d6
--- /dev/null
+++ b/graphics/ic_launcher_sc.svg
@@ -0,0 +1,2243 @@
+
+
+  
+    
+      
+        image/svg+xml
+        
+      
+    
+  
+  
+    
+      
+      
+      
+      
+      
+    
+    
+      
+      
+      
+      
+      
+    
+    
+      
+      
+      
+      
+      
+    
+    
+      
+      
+      
+      
+      
+    
+    
+      
+      
+      
+      
+      
+    
+    
+      
+      
+      
+      
+      
+    
+    
+      
+      
+      
+      
+      
+    
+    
+      
+      
+      
+      
+      
+    
+    
+      
+      
+      
+      
+      
+    
+    
+      
+      
+      
+      
+      
+    
+    
+      
+      
+      
+      
+      
+    
+    
+      
+      
+      
+      
+      
+    
+    
+      
+      
+      
+      
+      
+    
+    
+      
+      
+      
+      
+      
+    
+    
+      
+      
+      
+      
+      
+    
+    
+      
+      
+      
+      
+      
+    
+    
+      
+      
+      
+      
+      
+    
+    
+      
+      
+      
+      
+      
+    
+    
+      
+      
+      
+      
+      
+    
+    
+      
+      
+      
+      
+      
+    
+    
+      
+      
+      
+      
+      
+    
+    
+      
+    
+    
+      
+      
+      
+      
+      
+    
+    
+      
+      
+      
+      
+      
+    
+    
+      
+      
+      
+      
+      
+    
+    
+      
+      
+      
+      
+      
+    
+    
+      
+      
+      
+      
+      
+    
+    
+      
+      
+      
+      
+      
+    
+    
+      
+      
+      
+      
+      
+    
+    
+      
+      
+      
+      
+      
+    
+    
+      
+      
+      
+      
+      
+    
+    
+      
+      
+      
+      
+      
+    
+    
+      
+      
+      
+      
+      
+    
+    
+      
+      
+      
+      
+      
+    
+    
+      
+      
+      
+      
+      
+    
+    
+      
+      
+      
+      
+      
+    
+    
+      
+      
+      
+      
+      
+    
+    
+      
+      
+      
+      
+      
+    
+    
+      
+      
+      
+      
+      
+    
+    
+      
+      
+      
+      
+      
+    
+    
+      
+      
+      
+      
+      
+    
+    
+      
+      
+      
+      
+      
+    
+    
+      
+      
+      
+      
+      
+    
+    
+      
+      
+      
+      
+      
+    
+    
+      
+      
+      
+      
+      
+    
+    
+      
+      
+      
+      
+      
+    
+    
+      
+      
+      
+      
+      
+    
+    
+      
+      
+      
+      
+      
+    
+    
+      
+      
+      
+      
+      
+    
+    
+      
+      
+      
+      
+      
+    
+    
+      
+      
+      
+      
+      
+    
+    
+      
+      
+      
+      
+      
+    
+    
+      
+      
+      
+      
+      
+    
+    
+      
+      
+      
+      
+      
+    
+    
+      
+      
+      
+      
+      
+    
+    
+      
+      
+      
+      
+      
+    
+    
+      
+      
+      
+      
+      
+    
+    
+      
+      
+      
+      
+      
+    
+    
+      
+      
+      
+      
+      
+    
+    
+      
+      
+      
+      
+      
+    
+    
+      
+      
+      
+      
+      
+    
+    
+      
+      
+      
+      
+      
+    
+    
+      
+      
+      
+      
+      
+    
+    
+      
+      
+      
+      
+      
+    
+    
+      
+      
+      
+      
+      
+    
+    
+      
+      
+      
+      
+      
+    
+    
+      
+      
+      
+      
+      
+    
+  
+  
+  
+  
+  
+  
+
diff --git a/graphics/icon_gen.sh b/graphics/icon_gen.sh
new file mode 100755
index 0000000..d6938d1
--- /dev/null
+++ b/graphics/icon_gen.sh
@@ -0,0 +1,97 @@
+#!/bin/bash
+
+set -e
+
+mydir="$(dirname "$(realpath "$0")")"
+automatic_commit="$1"
+
+SCHILDI_ROOT="$mydir/.."
+source "$SCHILDI_ROOT/merge_helpers.sh"
+
+if [[ "$automatic_commit" == [Yy]* ]]; then
+    forelement_repos check_clean_git
+fi
+
+
+export_rect() {
+    w="$1"
+    h="$2"
+    in="$3"
+    out="$4"
+    inkscape -w "$w" -h "$h" --export-filename="$out" -C "$in"
+}
+export_square() {
+    size="$1"
+    in="$2"
+    out="$3"
+    export_rect "$1" "$size" "$in" "$out"
+}
+
+repo_dir="$SCHILDI_ROOT/element-web"
+base_out="$repo_dir/res/vector-icons"
+
+for i in 1024 120 150 152 180 24 300 44 48 50 76 88; do
+    export_square "$i" "$mydir/ic_launcher_sc.svg" "$base_out/$i.png"
+done
+
+for i in 114 120 144 152 180 57 60 72 76; do
+    export_square "$i" "$mydir/store_icon.svg" "$base_out/apple-touch-icon-$i.png"
+done
+
+for i in 150 310 70; do
+    export_square "$i" "$mydir/store_icon.svg" "$base_out/mstile-$i.png"
+done
+
+# TODO fix measures of input to have correct measures for export here again
+export_rect 1024 500 "$mydir/feature_image_transparent.svg" "$base_out/1240x600.png"
+export_rect 512 250 "$mydir/feature_image_transparent.svg" "$base_out/620x300.png"
+export_rect 256 125 "$mydir/feature_image.svg" "$base_out/mstile-310x150.png"
+
+magick "$base_out/48.png" "$base_out/favicon.ico"
+rm "$base_out/48.png" # this was only created for favicon.ico
+
+for f in "$base_out"/*.png; do
+    pngcrush -ow "$f"
+done
+
+
+cp "$mydir/ic_launcher_sc.svg" "$repo_dir/res/themes/element/img/logos/element-logo.svg"
+
+
+repo_dir="$SCHILDI_ROOT/element-desktop"
+base_out="$repo_dir/res/img"
+
+export_square 256 "$mydir/ic_launcher_sc.svg" "$base_out/element.png"
+
+magick "$base_out/element.png" "$base_out/element.ico"
+
+for f in "$base_out"/*.png; do
+    pngcrush -ow "$f"
+done
+
+
+
+
+base_out="$repo_dir/build"
+
+for i in 16 24 48 64 96 128 256 512 1024; do
+    export_square "$i" "$mydir/ic_launcher_sc.svg" "$base_out/icons/$i"x"$i.png"
+done
+
+export_square "320" "$mydir/ic_launcher_sc.svg" "$base_out/install-spinner.png"
+pngcrush "$base_out/install-spinner.png"
+magick "$base_out/install-spinner.png" "$base_out/install-spinner.gif"
+rm  "$base_out/install-spinner.png"
+
+magick "$base_out/icons/256x256.png" "$base_out/icon.ico"
+magick "$base_out/icons/1024x1024.png" "$base_out/icon.icns"
+rm "$base_out/icons/1024x1024.png"
+
+for f in "$base_out/icons"/*.png; do
+    pngcrush -ow "$f"
+done
+
+
+if [[ "$automatic_commit" == [Yy]* ]]; then
+    forelement_repos commit_if_dirty "Automatic icon update"
+fi
diff --git a/graphics/store_icon.svg b/graphics/store_icon.svg
new file mode 120000
index 0000000..30278a9
--- /dev/null
+++ b/graphics/store_icon.svg
@@ -0,0 +1 @@
+ic_launcher_sc.svg
\ No newline at end of file
diff --git a/hard_reset_repos.sh b/hard_reset_repos.sh
new file mode 100755
index 0000000..4e17e2a
--- /dev/null
+++ b/hard_reset_repos.sh
@@ -0,0 +1,15 @@
+#!/bin/bash
+
+set -e
+
+mydir="$(dirname "$(realpath "$0")")"
+
+cd "$mydir"
+
+source ./merge_helpers.sh
+
+# Note: this doesn't delete files starting with a dot,
+# and in particular not the '.git' directory, which we
+# want to keep
+forall_repos bash -c 'rm -rf *'
+forall_repos git reset HEAD --hard
diff --git a/i18n-helper/index.js b/i18n-helper/index.js
index f226e47..11e3fc4 100644
--- a/i18n-helper/index.js
+++ b/i18n-helper/index.js
@@ -35,7 +35,13 @@ function writeStrings(p, strings) {
 		let strings = readStrings(p);
 
 		for (const key of Object.keys(strings)) {
-			strings[key] = strings[key].replace(/Element/g, "SchildiChat").replace(/element\.io/g, "schildi.chat");
+			strings[key] = strings[key]
+				.replace(/Element/g, "SchildiChat")
+				.replace(/element\.io/g, "schildi.chat")
+				
+				// It's still Element Call
+				.replace(/SchildiChat Call/g, "Element Call")
+				.replace(/SchildiChat-Call/g, "Element-Call");
 		}
 
 		if (overlayPath) {
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
index 0967ef4..1cb3a76 100644
--- a/i18n-overlays/element-desktop/fa.json
+++ b/i18n-overlays/element-desktop/fa.json
@@ -1 +1,3 @@
-{}
+{
+    "Show": "نشان دادن"
+}
diff --git a/i18n-overlays/element-desktop/hu.json b/i18n-overlays/element-desktop/hu.json
index 0967ef4..8598663 100644
--- a/i18n-overlays/element-desktop/hu.json
+++ b/i18n-overlays/element-desktop/hu.json
@@ -1 +1,3 @@
-{}
+{
+    "Show": "Mutat"
+}
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/ja.json b/i18n-overlays/element-desktop/ja.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/i18n-overlays/element-desktop/ja.json
@@ -0,0 +1 @@
+{}
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/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/tr.json b/i18n-overlays/element-desktop/tr.json
new file mode 100644
index 0000000..f1a952b
--- /dev/null
+++ b/i18n-overlays/element-desktop/tr.json
@@ -0,0 +1,3 @@
+{
+    "Show": "Göster"
+}
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/en_EN.json b/i18n-overlays/element-web/en_EN.json
index 0967ef4..e707661 100644
--- a/i18n-overlays/element-web/en_EN.json
+++ b/i18n-overlays/element-web/en_EN.json
@@ -1 +1,3 @@
-{}
+{
+    "Welcome to SchildiChat": "Welcome to SchildiChat"
+}
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/ja.json b/i18n-overlays/element-web/ja.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/i18n-overlays/element-web/ja.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/tr.json b/i18n-overlays/element-web/tr.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/i18n-overlays/element-web/tr.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 0830b04..a0816fc 100644
--- a/i18n-overlays/matrix-react-sdk/cs.json
+++ b/i18n-overlays/matrix-react-sdk/cs.json
@@ -9,5 +9,47 @@
     "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"
+    "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 Úvodu.",
+    "Show all rooms in Home": "Zobrazit všechny místnosti v Úvodu",
+    "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é",
+    "Enable YouTube embed player": "Povolí vložený přehrávač YouTube",
+    "Collapse additional buttons": "Sbalit další tlačítka",
+    "Home is useful for getting an overview of everything. Keep in mind that disabling it could leave you unable to see certain rooms.": "Úvod je užitečný pro získání přehledu o všem. Mějte na paměti, že její vypnutí může způsobit, že nebudete moci zobrazit některé místnosti.",
+    "Corners": "Rohy",
+    "Round": "Oblé",
+    "Extra round": "Kulaté",
+    "Mixed": "Smíšené",
+    "Sound pack": "Balíček zvuků",
+    "Schildi: Softer sounds for reduced anxiety": "Schildi: Jemnější zvuky pro snížení úzkosti",
+    "Classic: The same sharp sounds as Element": "Klasické: Stejně ostré zvuky jako Element",
+    "React with \"%(reaction)s\"": "Reagovat pomocí \"%(reaction)s\""
 }
diff --git a/i18n-overlays/matrix-react-sdk/de_DE.json b/i18n-overlays/matrix-react-sdk/de_DE.json
index f7f36b9..d7d2ed2 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,47 @@
     "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",
+    "Enable YouTube embed player": "Eingebetteten YouTube-Player aktivieren",
+    "Collapse additional buttons": "Zusätzliche Buttons einklappen",
+    "Round": "Rund",
+    "Mixed": "Gemischt",
+    "Corners": "Ecken",
+    "Extra round": "Extra rund",
+    "Home is useful for getting an overview of everything. Keep in mind that disabling it could leave you unable to see certain rooms.": "Die Startseite hilft dir, einen Überblick über deine Chats zu bekommen. Bedenke, dass die Deaktivierung dazu führen kann, dass du bestimmte Räume nicht sehen kannst.",
+    "Classic: The same sharp sounds as Element": "Klassisch: Die gleichen scharfen Geräusche wie in Element",
+    "Sound pack": "Geräuschpaket",
+    "Schildi: Softer sounds for reduced anxiety": "Schildi: Sanftere Klänge für weniger Angstgefühle"
 }
diff --git a/i18n-overlays/matrix-react-sdk/en_EN.json b/i18n-overlays/matrix-react-sdk/en_EN.json
index 13eda4f..2c59706 100644
--- a/i18n-overlays/matrix-react-sdk/en_EN.json
+++ b/i18n-overlays/matrix-react-sdk/en_EN.json
@@ -11,8 +11,44 @@
     "Don't ask again": "Don't ask again",
     "System": "System",
     "Add custom theme": "Add custom theme",
-    "Add theme": "Add theme",
     "Theme in use": "Theme in use",
     "Light theme": "Light theme",
-    "Dark theme": "Dark 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",
+    "Enable YouTube embed player": "Enable YouTube embed player",
+    "Collapse additional buttons": "Collapse additional buttons",
+    "Home is useful for getting an overview of everything. Keep in mind that disabling it could leave you unable to see certain rooms.": "Home is useful for getting an overview of everything. Keep in mind that disabling it could leave you unable to see certain rooms.",
+    "Corners": "Corners",
+    "Round": "Round",
+    "Extra round": "Extra round",
+    "Mixed": "Mixed",
+    "Sound pack": "Sound pack",
+    "Schildi: Softer sounds for reduced anxiety": "Schildi: Softer sounds for reduced anxiety",
+    "Classic: The same sharp sounds as Element": "Classic: The same sharp sounds as Element",
+    "React with \"%(reaction)s\"": "React with \"%(reaction)s\""
 }
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/hu.json b/i18n-overlays/matrix-react-sdk/hu.json
index a048d36..cde030f 100644
--- a/i18n-overlays/matrix-react-sdk/hu.json
+++ b/i18n-overlays/matrix-react-sdk/hu.json
@@ -3,5 +3,27 @@
     "Show message bubbles on one side only": "Üzenetbuborékok megjelenítése csak az egyik oldalon",
     "Message bubbles": "Üzenet buborékok",
     "Show message bubbles depending on the width either on both sides or only on one side": "Üzenetbuborékok megjelenítése a szélességtől függően mindkét oldalon vagy csak az egyik oldalon",
-    "Normal priority": "Normál prioritás"
+    "Normal priority": "Normál prioritás",
+    "Show people and rooms in a combined list": "Személyek és szobák megjelenítése egy egyesített listában",
+    "Update notifications": "Értesítések frissítése",
+    "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).": "Szeretne csatlakozni olyan szobához, amely értesíti Önt az új megjelenésekről? Ez különösen akkor hasznos, ha az Ön platformja nem támogatja a SchildiChat automatikus frissítéseit (pl. Windows és macOS).",
+    "System": "Rendszer",
+    "Show all rooms in Home": "Az összes szoba megjelenítése a kezdőoldalon",
+    "All rooms you're in will appear in Home.": "Az összes szoba, amelyben tartózkodik, megjelenik a Kezdőlapon.",
+    "Mark as read": "Olvasottnak jelöl",
+    "Enable YouTube embed player": "YouTube beágyazott lejátszó engedélyezése",
+    "Home is useful for getting an overview of everything. Keep in mind that disabling it could leave you unable to see certain rooms.": "A Kezdőlap hasznos ahhoz, hogy mindenről áttekintést kapjunk. Ne feledje, hogy a kikapcsolásával bizonyos szobákat nem fog látni.",
+    "Schildi: Softer sounds for reduced anxiety": "Schildi: Lágyabb hangok a kevesebb stresszért",
+    "Sound pack": "Hangcsomag",
+    "Classic: The same sharp sounds as Element": "Klasszikus: Ugyanazok az éles hangok, mint az Elementnél",
+    "Don't ask again": "Ne kérdezze újra",
+    "Light theme": "Világos téma",
+    "Dark theme": "Sötét téma",
+    "Mark as unread": "Olvasatlannak jelöl",
+    "Collapse additional buttons": "További gombok összecsukása",
+    "Theme": "Téma",
+    "Room list": "Szobák listája",
+    "Font size and typeface": "Betűméret és betűtípus",
+    "Message layout": "Üzenetek elrendezése",
+    "Modern": "Modern"
 }
diff --git a/i18n-overlays/matrix-react-sdk/id.json b/i18n-overlays/matrix-react-sdk/id.json
new file mode 100644
index 0000000..3324b6f
--- /dev/null
+++ b/i18n-overlays/matrix-react-sdk/id.json
@@ -0,0 +1,54 @@
+{
+    "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",
+    "Enable YouTube embed player": "Aktifkan pemain YouTube tersemat",
+    "Collapse additional buttons": "Sembunyikan tombol tambahan",
+    "Home is useful for getting an overview of everything. Keep in mind that disabling it could leave you unable to see certain rooms.": "Beranda berguna untuk mendapatkan ikhtisar segalanya. Menonaktifkan Beranda mungkin dapat membuat Anda tidak dapat melihat beberapa ruangan.",
+    "Corners": "Sudut",
+    "Round": "Bulat",
+    "Extra round": "Ekstra bulat",
+    "Mixed": "Campur",
+    "Sound pack": "Paket suara",
+    "Schildi: Softer sounds for reduced anxiety": "Schildi: Suara lebih lembut untuk mengurangi kecemasan",
+    "Classic: The same sharp sounds as Element": "Klasik: Suara keras yang biasa seperti Element",
+    "React with \"%(reaction)s\"": "Reaksi dengan \"%(reaction)s\""
+}
diff --git a/i18n-overlays/matrix-react-sdk/it.json b/i18n-overlays/matrix-react-sdk/it.json
new file mode 100644
index 0000000..187e9c4
--- /dev/null
+++ b/i18n-overlays/matrix-react-sdk/it.json
@@ -0,0 +1,34 @@
+{
+    "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.)",
+    "Show message bubbles on one side only": "Visualizza bolle messaggi su un lato solo",
+    "Show message bubbles depending on the width either on both sides or only on one side": "Visualizza bolle messaggi in base alla lunghezza di entrambi i lati o di uno solo",
+    "User name color mode": "Modalità colore nome utente",
+    "Room list style": "Stile lista stanze",
+    "Theme": "Tema",
+    "Show all rooms in Home": "Visualizza tutte le stanze nella Home",
+    "All rooms you're in will appear in Home.": "Tutte le stanze in cui partecipi appariranno nella Home.",
+    "For people": "Per le persone",
+    "Room list": "Lista stanze",
+    "Show advanced theme settings": "Visualizza impostazioni avanzate tema",
+    "Mark rooms as unread": "Permetti di segnare le chat come non lette",
+    "Message bubbles": "Bolle messaggi",
+    "Message layout": "Impaginazione messaggi",
+    "Mark as unread": "Segna come non letto",
+    "Uniform": "Uniforme",
+    "Show people in spaces": "Visualizza persone negli spazi",
+    "MXID": "MXID",
+    "In public rooms": "Nelle stanze pubbliche",
+    "In group chats": "Nelle chat di gruppo",
+    "Font size and typeface": "Dimensione e tipo carattere",
+    "Hide advanced theme settings": "Nascondi impostazioni avanzate tema"
+}
diff --git a/i18n-overlays/matrix-react-sdk/ja.json b/i18n-overlays/matrix-react-sdk/ja.json
new file mode 100644
index 0000000..fedc533
--- /dev/null
+++ b/i18n-overlays/matrix-react-sdk/ja.json
@@ -0,0 +1,3 @@
+{
+    "Normal priority": "常優先度"
+}
diff --git a/i18n-overlays/matrix-react-sdk/lt.json b/i18n-overlays/matrix-react-sdk/lt.json
index cc5bfa9..7013517 100644
--- a/i18n-overlays/matrix-react-sdk/lt.json
+++ b/i18n-overlays/matrix-react-sdk/lt.json
@@ -3,5 +3,51 @@
     "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.",
+    "Hide advanced theme settings": "Slėpti išplėstinius temos nustatymus",
+    "Show advanced theme settings": "Rodyti išplėstinius temos nustatymus",
+    "Theme": "Tema",
+    "Font size and typeface": "Šrifto dydis ir raštas",
+    "Show message bubbles depending on the width either on both sides or only on one side": "Rodyti žinučių burbulus, priklausomai nuo pločio, abiejose pusėse arba tik vienoje pusėje",
+    "Sound pack": "Garso paketas",
+    "Schildi: Softer sounds for reduced anxiety": "Schildi: švelnesni garsai sumažintam nerimui",
+    "Classic: The same sharp sounds as Element": "Klasikiniai: Tie patys aštrūs garsai kaip ir Element",
+    "Enable YouTube embed player": "Įgalinti YouTube įterptą grotuvą",
+    "Add custom theme": "Pridėti pasirinktinę temą",
+    "Mark as unread": "Žymėti kaip neskaitytą",
+    "Mark as read": "Žymėti kaip perskaitytą",
+    "User name color mode": "Naudotojo vardo spalvų režimas",
+    "Uniform": "Vienodi",
+    "Show notification badges for People in Spaces": "Rodyti pranešimų ženkliukus žmonėms erdvėse",
+    "Return to the room previously opened in a space": "Grįžti į anksčiau atidarytą kambarį erdvėje",
+    "If disabled, the space overview will be shown when switching to another space.": "Jei išjungta, perjungiant į kitą erdvę bus rodoma erdvės apžvalga.",
+    "Room list style": "Kambarių sąrašo stilius",
+    "Compact: tiny avatar together with name and preview in one line": "Kompaktiška: mažytis avataras kartu su vardu ir peržiūra vienoje eilutėje",
+    "Intermediate: medium sized avatar with single-line preview": "Vidutinis: vidutinio dydžio avataras su vienos eilutės peržiūra",
+    "Roomy: big avatar with two-line preview": "Erdvus: didelis avataras su dviejų eilučių peržiūra",
+    "PowerLevel": "Galios lygis",
+    "For people": "Žmonėms",
+    "Show people in spaces": "Rodyti žmones erdvėse",
+    "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.": "Jei išjungta, vis tiek galite pridėti tiesioginius pokalbius į asmenines erdves. Jei ši funkcija įjungta, automatiškai matysite visus, kurie yra erdvės nariai.",
+    "Mark rooms as unread": "Leisti žymėti pokalbius kaip neskaitytus",
+    "Home is useful for getting an overview of everything. Keep in mind that disabling it could leave you unable to see certain rooms.": "Pradžia yra naudinga, kad galėtumėte viską apžvelgti. Turėkite omenyje, kad ją išjungę galite nematyti tam tikrų kambarių.",
+    "Collapse additional buttons": "Sulankstyti papildomus mygtukus",
+    "Corners": "Kampai",
+    "Round": "Apvalus",
+    "Extra round": "Ypač apvalus",
+    "Mixed": "Mišrus"
 }
diff --git a/i18n-overlays/matrix-react-sdk/nb_NO.json b/i18n-overlays/matrix-react-sdk/nb_NO.json
index cd11a91..e3eb1c6 100644
--- a/i18n-overlays/matrix-react-sdk/nb_NO.json
+++ b/i18n-overlays/matrix-react-sdk/nb_NO.json
@@ -8,5 +8,29 @@
     "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)."
+    "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).",
+    "Hide advanced theme settings": "Skjul avanserte draktinnstillinger",
+    "Show advanced theme settings": "Vis avanserte draktinnstillinger",
+    "Theme": "Drakt",
+    "Room list": "Romliste",
+    "Font size and typeface": "Størrelse på og type skrift",
+    "Sound pack": "Lydpakke",
+    "Schildi: Softer sounds for reduced anxiety": "Schildi: Mykere lyder for mindre angst",
+    "System": "System",
+    "Add custom theme": "Legg til egendefinert drakt",
+    "Theme in use": "Drakt i bruk",
+    "Light theme": "Lys drakt",
+    "Dark theme": "Mørk drakt",
+    "Mark as read": "Marker som lest",
+    "Mark rooms as unread": "Tillat markering av sludringer som uleste",
+    "Mark as unread": "Marker som ulest",
+    "In group chats": "I gruppesludringer",
+    "In public rooms": "I offentlige rom",
+    "For people": "For folk",
+    "Classic: The same sharp sounds as Element": "Klassisk: Samme skarpe lyder som Element",
+    "Collapse additional buttons": "Fold sammen ytterligere knapper",
+    "Corners": "Hjørner",
+    "Round": "Runde",
+    "Extra round": "Ekstra runde",
+    "Mixed": "Blandet"
 }
diff --git a/i18n-overlays/matrix-react-sdk/pt_BR.json b/i18n-overlays/matrix-react-sdk/pt_BR.json
index bdbad79..1b4c8af 100644
--- a/i18n-overlays/matrix-react-sdk/pt_BR.json
+++ b/i18n-overlays/matrix-react-sdk/pt_BR.json
@@ -3,5 +3,43 @@
     "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",
+    "Mark rooms as unread": "Permitir markar conversas como não lidos",
+    "Mark as unread": "Markar como não lido",
+    "Mark as read": "Markar como lido",
+    "Collapse additional buttons": "Recolher botões adicionais"
 }
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 4ef2334..3a8cdac 100644
--- a/i18n-overlays/matrix-react-sdk/ru.json
+++ b/i18n-overlays/matrix-react-sdk/ru.json
@@ -9,5 +9,33 @@
     "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": "Не спрашивать больше"
+    "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..9facd06
--- /dev/null
+++ b/i18n-overlays/matrix-react-sdk/sv.json
@@ -0,0 +1,53 @@
+{
+    "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",
+    "Enable YouTube embed player": "Aktivera inbäddad YouTube-spelare",
+    "Collapse additional buttons": "Dölj ytterligare knappar",
+    "Home is useful for getting an overview of everything. Keep in mind that disabling it could leave you unable to see certain rooms.": "Home är användbart för att få en överblick över allt. Tänk på att om du inaktiverar den kan du inte se vissa rum.",
+    "Round": "Runda",
+    "Extra round": "Extrarunda",
+    "Mixed": "Blandad",
+    "Corners": "Hörn",
+    "Sound pack": "Ljudpaket",
+    "Schildi: Softer sounds for reduced anxiety": "Schildi: Mjukare ljud för minskad ångest",
+    "Classic: The same sharp sounds as Element": "Klassisk: Samma skarpa ljud som Element"
+}
diff --git a/i18n-overlays/matrix-react-sdk/tr.json b/i18n-overlays/matrix-react-sdk/tr.json
new file mode 100644
index 0000000..0856dee
--- /dev/null
+++ b/i18n-overlays/matrix-react-sdk/tr.json
@@ -0,0 +1,48 @@
+{
+    "Show message bubbles on one side only": "Mesaj baloncuklarını yalnızca bir tarafta göster",
+    "Show message bubbles depending on the width either on both sides or only on one side": "Genişliğe bağlı olarak mesaj baloncuklarını her iki tarafta veya sadece bir tarafta göster",
+    "Message bubbles": "Mesaj baloncukları",
+    "Normal priority": "Normal öncelik",
+    "Message layout": "Mesaj düzeni",
+    "Modern": "Modern",
+    "Update notifications": "Güncelleme bildirimleri",
+    "Don't ask again": "Bir daha sorma",
+    "System": "Sistem",
+    "Add custom theme": "Özel tema ekle",
+    "Theme in use": "Tema kullanımda",
+    "Light theme": "Açık tema",
+    "Dark theme": "Koyu tema",
+    "Uniform": "Düzenli",
+    "For people": "İnsanlar için",
+    "In group chats": "Grup sohbetlerinde",
+    "In public rooms": "Halka açık odalarda",
+    "Show people and rooms in a combined list": "Kişileri ve odaları birleşik bir listede göster",
+    "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).": "Yeni sürümler hakkında sizi bilgilendiren bir odaya katılmak ister misiniz? Bu oda özellikle platformunuz SchildiChat için otomatik güncellemeleri desteklemiyorsa (ör. Windows ve macOS) kullanışlıdır.",
+    "If disabled, the space overview will be shown when switching to another space.": "Devre dışı bırakılırsa, başka bir alana geçerken alana ilişkin genel görünüm gösterilir.",
+    "Mark as unread": "Okunmadı olarak işaretle",
+    "User name color mode": "Kullanıcı adı renk modu",
+    "Show people in spaces": "İnsanları alanlarda göster",
+    "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.": "Devre dışı bırakılmışsa, kişisel alanlara direkt mesajlar eklemeye devam edebilirsiniz. Etkinleştirilirse, alana üye olan herkesi otomatik olarak görürsünüz.",
+    "Show notification badges for People in Spaces": "Alanlardaki Kişiler için bildirim rozetlerini göster",
+    "Return to the room previously opened in a space": "Bir alanda daha önce açılmış olan odaya geri dön",
+    "Compact: tiny avatar together with name and preview in one line": "Sıkıştırılmış: tek satırda isim ve önizleme ile birlikte küçük avatar",
+    "Intermediate: medium sized avatar with single-line preview": "Orta: tek satır önizlemeli orta boy avatar",
+    "Roomy: big avatar with two-line preview": "Ferah: iki satırlık önizleme ile büyük avatar",
+    "Room list style": "Oda listesi tarzı",
+    "Hide advanced theme settings": "Gelişmiş tema ayarlarını gizle",
+    "Show all rooms in Home": "Ana sayfadaki tüm odaları göster",
+    "All rooms you're in will appear in Home.": "Bulunduğunuz tüm odalar ana sayfada görünecektir.",
+    "Show advanced theme settings": "Gelişmiş tema ayarlarını göster",
+    "Theme": "Tema",
+    "Font size and typeface": "Yazı tipi boyutu ve yazı karakteri",
+    "Room list": "Oda sıralaması",
+    "Mark rooms as unread": "Sohbetleri okunmamış olarak işaretlemeye izin ver",
+    "Mark as read": "Okundu olarak işaretle",
+    "Enable YouTube embed player": "YouTube gömülü oynatıcıyı etkinleştir",
+    "Collapse additional buttons": "Ek düğmeleri daralt",
+    "Corners": "Köşeler",
+    "Round": "Yuvarlak",
+    "Extra round": "Fazladan yuvarlak",
+    "Mixed": "Karışık",
+    "Home is useful for getting an overview of everything. Keep in mind that disabling it could leave you unable to see certain rooms.": "Ana sayfa, her şeye genel bir bakış elde etmek için kullanışlıdır. Devre dışı bırakıldığında belirli odaları göremeyebileceğinizi unutmayın."
+}
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..e3e332a
--- /dev/null
+++ b/i18n-overlays/matrix-react-sdk/zh_Hans.json
@@ -0,0 +1,54 @@
+{
+    "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),这将非常有用。",
+    "Mark as read": "标记为已读",
+    "Mark rooms as unread": "允许将聊天记录标记为未读",
+    "Mark as unread": "标记为未读",
+    "Home is useful for getting an overview of everything. Keep in mind that disabling it could leave you unable to see certain rooms.": "主页对于概览所有消息来说非常有用。请注意:禁用主页可能会让您无法看到某些房间。",
+    "Enable YouTube embed player": "启用 YouTube 嵌入式播放器",
+    "Collapse additional buttons": "折叠额外的按钮",
+    "Round": "圆角",
+    "React with \"%(reaction)s\"": "与 \"%(reaction)s\" 互动",
+    "Schildi: Softer sounds for reduced anxiety": "Schildi: 舒缓音效以减少焦虑",
+    "Mixed": "混合",
+    "Extra round": "超圆角",
+    "Sound pack": "音频包",
+    "Classic: The same sharp sounds as Element": "Classic: 与 Element 相同的尖锐声音",
+    "Corners": "边缘"
+}
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/local-pkgbuild-template/PKGBUILD b/local-pkgbuild-template/PKGBUILD
index df4c516..ff49e1f 100644
--- a/local-pkgbuild-template/PKGBUILD
+++ b/local-pkgbuild-template/PKGBUILD
@@ -10,7 +10,7 @@ pkgdesc="SchildiChat is a Matrix client based on Element with a more traditional
 arch=('x86_64')
 url="https://schildi.chat"
 license=('Apache')
-depends=('sqlcipher')
+depends=()
 provides=('---appName---')
 conflicts=('---appName---')
 source=("---debName---"
@@ -22,4 +22,5 @@ package() {
   msg2 "Extracting the data.tar.xz..."
   bsdtar -xf data.tar.xz -C "$pkgdir/"
   install -Dm755 "${srcdir}"/---appName---.sh "${pkgdir}"/usr/bin/---appName---
+  sed -i 's|^Exec=.*|Exec=/usr/bin/---appName--- %u|' "${pkgdir}"/usr/share/applications/---appName---.desktop
 }
diff --git a/matrix-js-sdk b/matrix-js-sdk
index 4bc4575..6390182 160000
--- a/matrix-js-sdk
+++ b/matrix-js-sdk
@@ -1 +1 @@
-Subproject commit 4bc4575eb65aa68ea8080f5de2072a5949ca8c6d
+Subproject commit 63901825c14da3ec6f59017d2696ad98be91d2e0
diff --git a/matrix-react-sdk b/matrix-react-sdk
index 55874ea..16fe0fe 160000
--- a/matrix-react-sdk
+++ b/matrix-react-sdk
@@ -1 +1 @@
-Subproject commit 55874eaa27ac68daa1fd67f739945cf51551f4ef
+Subproject commit 16fe0fe8d0068e4c5da3fa5516c5578d2ffaabc7
diff --git a/merge_helpers.sh b/merge_helpers.sh
index d9562af..d80ff9e 100755
--- a/merge_helpers.sh
+++ b/merge_helpers.sh
@@ -1,6 +1,10 @@
 #!/bin/bash
 
-SCHILDI_ROOT="$(dirname "$(realpath "$0")")"
+if [ -z "$SCHILDI_ROOT" ]; then
+    SCHILDI_ROOT="$(dirname "$(realpath "$0")")"
+fi
+
+branch=${BRANCH:-"lite"}
 
 i18n_helper_path="$SCHILDI_ROOT/i18n-helper/index.js"
 i18n_path="src/i18n/strings"
@@ -10,16 +14,16 @@ yarn=yarnpkg
 
 add_upstream() {
     if git remote | grep -q upstream; then
-        echo "Remote named upstream already exists!"
-        return 1
+        echo "Remote named upstream already exists, deleting..."
+        git remote remove upstream
     fi
     local sc_remote="$(git remote -v|grep origin|grep fetch|sed 's|.*\t\(.*\) (fetch)|\1|')"
-    if echo "$sc_remote" | grep -q matrix; then
+    if echo "$sc_remote" | grep -q matrix-js-sdk; then
         # matrix.org repo
         local upstream_remote="$(echo "$sc_remote" | sed 's|SchildiChat|matrix-org|')"
-    elif echo "$sc_remote" | grep -q element; then
+    elif echo "$sc_remote" | grep -q "element\\|matrix-react-sdk"; then
         # vector-im repo
-        local upstream_remote="$(echo "$sc_remote" | sed 's|SchildiChat|vector-im|')"
+        local upstream_remote="$(echo "$sc_remote" | sed 's|SchildiChat|element-hq|')"
     else
         echo "Don't know upstream repo for $sc_remote"
         return 1
@@ -30,23 +34,24 @@ add_upstream() {
 }
 
 forall_repos() {
-    pushd "$SCHILDI_ROOT/matrix-js-sdk"
-    "$@"
-    popd
-    pushd "$SCHILDI_ROOT/matrix-react-sdk"
-    "$@"
-    popd
-    pushd "$SCHILDI_ROOT/element-web"
-    "$@"
-    popd
-    pushd "$SCHILDI_ROOT/element-desktop"
-    "$@"
-    popd
+    for repo in "matrix-js-sdk" "matrix-react-sdk" "element-web" "element-desktop"; do
+        pushd "$SCHILDI_ROOT/$repo" > /dev/null
+        "$@"
+        popd > /dev/null
+    done
+}
+
+forelement_repos() {
+    for repo in "element-web" "element-desktop"; do
+        pushd "$SCHILDI_ROOT/$repo" > /dev/null
+        "$@"
+        popd > /dev/null
+    done
 }
 
 ensure_yes() {
     read -e -p "$1 [y/N] " choice
-    
+
     if [[ "$choice" != [Yy]* ]]; then
         exit 1
     fi
@@ -70,9 +75,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"
+    git checkout "$revision" -- "$i18n_path"
 
     if [[ "$skip_commit" != [Yy]* ]]; then
         git commit -m "Automatic i18n reversion" || true
@@ -89,16 +95,23 @@ 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
 }
 
@@ -124,3 +137,165 @@ automatic_i18n_adjustment() {
     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]}"
+
+    # both zero means the initial version after a merge
+    if [[ ${versions[1]} -eq 0 || ${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="../overlay/$(basename "$PWD")/package.json"
+
+    # see: https://stackoverflow.com/a/24904276
+    new_content=`jq -s '.[0] * .[1]' "$orig_path" "$overlay_path" | sed 's|  |    |g'`
+
+    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
+
+    forelement_repos apply_packagejson_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)"
+}
+
+apply_patches() {
+    local repo="$(realpath "$1")"
+    local patch_dir="$SCHILDI_ROOT/patches/$(basename "$1")"
+    if [ ! -d "$repo" ]; then
+        echo "Unknown repo: $repo"
+        return 1
+    fi
+    if [ ! -d "$patch_dir" ]; then
+        echo "No patches found at $patch_dir"
+        return 1
+    fi
+    pushd "$repo"
+    for patch in "$patch_dir"/*; do
+        echo "Applying $patch to $repo..."
+        git am "$patch" || on_apply_patch_fail_try_original_commit "$patch" "$repo"
+    done
+    popd
+}
+
+on_apply_patch_fail_try_original_commit() {
+    local patch="$1"
+    local repo="$2"
+    local orig_commit="$(head -n 1 "$patch"|sed 's|From ||;s| .*||')"
+    echo "Applying $patch failed, trying with original commit $orig_commit..."
+    git am --abort
+    git cherry-pick "$orig_commit" || on_apply_patch_fail "$patch" "$repo" "$orig_commit"
+}
+
+on_apply_patch_fail() {
+    local patch="$1"
+    local repo="$2"
+    local orig_commit="$3"
+    echo "----------------------------------"
+    echo "Applying patch failed, please commit manually!"
+    echo "Patch: $patch"
+    echo "Repo: $repo"
+    echo "Original commit: $(head -n 1 "$patch"|sed 's|From ||;s| .*||')"
+    echo "----------------------------------"
+    read -p "Press enter after committing resolved conflicts: "
+}
+
+commit_if_dirty() {
+    local message="$1"
+    # see: https://devops.stackexchange.com/a/5443
+    git add -A
+    git diff-index --quiet HEAD || git commit -m "$message"
+}
diff --git a/merge_upstream.sh b/merge_upstream.sh
index db2b383..79b3f5b 100755
--- a/merge_upstream.sh
+++ b/merge_upstream.sh
@@ -3,36 +3,57 @@
 set -e
 
 mydir="$(dirname "$(realpath "$0")")"
-branch=${BRANCH:-"sc"}
+
+# Update patches?
+if [ "$1" = "-u" ]; then
+    keep_patches=0
+    shift
+else
+    keep_patches=1
+fi
 
 pushd "$mydir" > /dev/null
 
 source ./merge_helpers.sh
 
-# Check branch
-check_branch $branch
-forall_repos check_branch $branch
+# Persist current state
+if [ "$keep_patches" = 0 ]; then
+    ./generate_patches.sh
+fi
 
-# Ensure clean git state
-forall_repos check_clean_git
+# Abandon all local submodule state
+forall_repos git reset --hard
+git submodule update -f --recursive
 
-# Automatic i18n reversion
-automatic_i18n_reversion
-
-# Merge
+# Fetch upstream
 forall_repos git fetch upstream
-forall_repos git merge upstream/master
+
+# Check if specific version to merge passed
+if [ -z "$1" ]; then
+    get_latest_upstream_tag
+else
+    latest_upstream_tag="$1"
+fi
+
+sc_branch_name="sc_$latest_upstream_tag"
+
+forelement_repos git checkout "$latest_upstream_tag" -B "$sc_branch_name"
+
+get_current_mxsdk_tags
+
+pushd "matrix-js-sdk" > /dev/null
+git checkout "$current_mxjssdk_tag" -B "$sc_branch_name"
+popd > /dev/null
+
+pushd "matrix-react-sdk" > /dev/null
+git checkout "$current_mxreactsdk_tag" -B "$sc_branch_name"
+popd > /dev/null
 
 # Refresh environment
 make clean
 make setup
+forall_repos commit_if_dirty "Automatic setup commit"
 
-# Automatic i18n adjustment
-automatic_i18n_adjustment
-
-# Automatic theme update
-pushd "matrix-react-sdk" > /dev/null
-./theme.sh
-popd > /dev/null
+./apply_patches.sh
 
 popd > /dev/null
diff --git a/nix/overlay.nix b/nix/overlay.nix
index 7261941..8c763e7 100644
--- a/nix/overlay.nix
+++ b/nix/overlay.nix
@@ -6,7 +6,8 @@ final: prev: {
     ;
     inherit src;
   };
-  schildichat-web = final.callPackage ./schildichat-web.nix {};
+  schildichat-web = final.callPackage ./schildichat-web.nix {
+  };
   schildichat-desktop = final.callPackage ./schildichat-desktop.nix {
     inherit (final.darwin.apple_sdk.frameworks) Security AppKit CoreServices;
   };
diff --git a/overlay/element-desktop/package.json b/overlay/element-desktop/package.json
new file mode 100644
index 0000000..f8d8434
--- /dev/null
+++ b/overlay/element-desktop/package.json
@@ -0,0 +1,10 @@
+{
+  "name": "schildichat-desktop-alpha",
+  "productName": "SchildiChatAlpha",
+  "description": "A Matrix Client based on Element with some changes and tweaks",
+  "author": "SchildiChat",
+  "repository": {
+    "url": "https://github.com/SchildiChat/schildichat-desktop"
+  },
+  "homepage": "https://schildi.chat/"
+}
diff --git a/overlay/element-web/package.json b/overlay/element-web/package.json
new file mode 100644
index 0000000..35e873a
--- /dev/null
+++ b/overlay/element-web/package.json
@@ -0,0 +1,8 @@
+{
+  "name": "schildichat-web-alpha",
+  "description": "A Matrix Client based on Element with some changes and tweaks",
+  "author": "SchildiChat",
+  "repository": {
+    "url": "https://github.com/SchildiChat/schildichat-desktop"
+  }
+}
diff --git a/patches/element-desktop/0002-Add-back-schildi-fetch-package.ts-modifications.patch b/patches/element-desktop/0002-Add-back-schildi-fetch-package.ts-modifications.patch
new file mode 100644
index 0000000..61764fe
--- /dev/null
+++ b/patches/element-desktop/0002-Add-back-schildi-fetch-package.ts-modifications.patch
@@ -0,0 +1,62 @@
+From e326039d1acbc5da0cdd95dc235646202264d3c3 Mon Sep 17 00:00:00 2001
+From: SpiritCroc 
+Date: Sat, 2 Dec 2023 12:57:26 +0100
+Subject: Add back schildi fetch-package.ts modifications
+
+---
+ scripts/fetch-package.ts | 14 ++++++++++----
+ 1 file changed, 10 insertions(+), 4 deletions(-)
+
+diff --git a/scripts/fetch-package.ts b/scripts/fetch-package.ts
+index 54da3f3..354f039 100644
+--- a/scripts/fetch-package.ts
++++ b/scripts/fetch-package.ts
+@@ -55,6 +55,7 @@ async function main(): Promise {
+     let filename: string | undefined;
+     let url: string | undefined;
+     let setVersion = false;
++    const sc = true;
+ 
+     while (process.argv.length > 2) {
+         switch (process.argv[2]) {
+@@ -83,7 +84,9 @@ async function main(): Promise {
+         process.argv.shift();
+     }
+ 
+-    if (targetVersion === undefined) {
++    if (sc) {
++        // nothing
++    } else if (targetVersion === undefined) {
+         targetVersion = "v" + riotDesktopPackageJson.version;
+     } else if (targetVersion !== "develop") {
+         setVersion = true; // version was specified
+@@ -93,7 +96,7 @@ async function main(): Promise {
+         filename = "develop.tar.gz";
+         url = DEVELOP_TGZ_URL;
+         verify = false; // develop builds aren't signed
+-    } else if (targetVersion.includes("://")) {
++    } else if (targetVersion?.includes("://")) {
+         filename = targetVersion.substring(targetVersion.lastIndexOf("/") + 1);
+         url = targetVersion;
+         verify = false; // manually verified
+@@ -145,12 +148,15 @@ async function main(): Promise {
+     }
+ 
+     let haveDeploy = false;
+-    let expectedDeployDir = path.join(deployDir, path.basename(filename).replace(/\.tar\.gz/, ""));
++    let expectedDeployDir = sc ? "../element-web/webapp" : path.join(deployDir, path.basename(filename).replace(/\.tar\.gz/, ""));
+     try {
+         await fs.opendir(expectedDeployDir);
+         console.log(expectedDeployDir + "already exists");
+         haveDeploy = true;
+-    } catch (e) {}
++    } catch (e) {
++        console.log("Not a valid webapp dir: " + expectedDeployDir, e);
++        return 1;
++    }
+ 
+     if (!haveDeploy) {
+         const outPath = path.join(pkgDir, filename);
+-- 
+2.47.0
+
diff --git a/patches/matrix-js-sdk/0001-Add-fields-for-media-caption-support.patch b/patches/matrix-js-sdk/0001-Add-fields-for-media-caption-support.patch
new file mode 100644
index 0000000..70aff3f
--- /dev/null
+++ b/patches/matrix-js-sdk/0001-Add-fields-for-media-caption-support.patch
@@ -0,0 +1,56 @@
+From 63901825c14da3ec6f59017d2696ad98be91d2e0 Mon Sep 17 00:00:00 2001
+From: SpiritCroc 
+Date: Thu, 9 May 2024 09:21:21 +0200
+Subject: Add fields for media caption support
+
+---
+ src/@types/media.ts | 12 ++++++++++++
+ 1 file changed, 12 insertions(+)
+
+diff --git a/src/@types/media.ts b/src/@types/media.ts
+index 1128b40d3..d85526642 100644
+--- a/src/@types/media.ts
++++ b/src/@types/media.ts
+@@ -189,6 +189,9 @@ export interface FileContent extends BaseContent {
+      * One of: [m.file].
+      */
+     msgtype: MsgType.File;
++
++    format?: string;
++    formatted_body?: string;
+ }
+ 
+ /**
+@@ -205,6 +208,9 @@ export interface ImageContent extends BaseContent {
+      * One of: [m.image].
+      */
+     msgtype: MsgType.Image;
++
++    format?: string;
++    formatted_body?: string;
+ }
+ 
+ /**
+@@ -221,6 +227,9 @@ export interface AudioContent extends BaseContent {
+      * One of: [m.audio].
+      */
+     msgtype: MsgType.Audio;
++
++    format?: string;
++    formatted_body?: string;
+ }
+ 
+ /**
+@@ -237,6 +246,9 @@ export interface VideoContent extends BaseContent {
+      * One of: [m.video].
+      */
+     msgtype: MsgType.Video;
++
++    format?: string;
++    formatted_body?: string;
+ }
+ 
+ /**
+-- 
+2.47.0
+
diff --git a/patches/matrix-react-sdk/0001-Disable-sticky-rooms.patch b/patches/matrix-react-sdk/0001-Disable-sticky-rooms.patch
new file mode 100644
index 0000000..f8f0dce
--- /dev/null
+++ b/patches/matrix-react-sdk/0001-Disable-sticky-rooms.patch
@@ -0,0 +1,29 @@
+From 913772283fd2b9f682a11a594061a6a1189b7869 Mon Sep 17 00:00:00 2001
+From: SpiritCroc 
+Date: Tue, 18 Jan 2022 13:28:22 +0100
+Subject: Disable sticky rooms
+
+---
+ src/stores/room-list/algorithms/Algorithm.ts | 6 ++++--
+ 1 file changed, 4 insertions(+), 2 deletions(-)
+
+diff --git a/src/stores/room-list/algorithms/Algorithm.ts b/src/stores/room-list/algorithms/Algorithm.ts
+index c3450d70cf..e296676149 100644
+--- a/src/stores/room-list/algorithms/Algorithm.ts
++++ b/src/stores/room-list/algorithms/Algorithm.ts
+@@ -159,8 +159,10 @@ export class Algorithm extends EventEmitter {
+         this.recalculateActiveCallRooms(tagId);
+     }
+ 
+-    private updateStickyRoom(val: Room | null): void {
+-        this.doUpdateStickyRoom(val);
++    private updateStickyRoom(val: Room) {
++        // Schildi: we don't want it sticky
++        this.doUpdateStickyRoom(null);
++        //this.doUpdateStickyRoom(val);
+         this._lastStickyRoom = null; // clear to indicate we're done changing
+     }
+ 
+-- 
+2.47.0
+
diff --git a/patches/matrix-react-sdk/0002-Bring-back-unified-room-list.patch b/patches/matrix-react-sdk/0002-Bring-back-unified-room-list.patch
new file mode 100644
index 0000000..81bd614
--- /dev/null
+++ b/patches/matrix-react-sdk/0002-Bring-back-unified-room-list.patch
@@ -0,0 +1,263 @@
+From e2045dd5dcbd82f7b5c4f98d89b258cc304d3e26 Mon Sep 17 00:00:00 2001
+From: SpiritCroc 
+Date: Sun, 5 May 2024 10:12:17 +0200
+Subject: Bring back unified room list
+
+Remaining TODO:
+- Hook up setting to UI again (better with own SC-specific screen?)
+
+Co-authored-by: su-ex 
+---
+ src/components/views/rooms/RoomList.tsx      | 39 +++++++++++++++++++-
+ src/settings/Settings.tsx                    |  8 ++++
+ src/stores/room-list/RoomListStore.ts        | 19 +++++++++-
+ src/stores/room-list/algorithms/Algorithm.ts | 20 ++++++++--
+ src/stores/room-list/models.ts               |  2 +
+ 5 files changed, 83 insertions(+), 5 deletions(-)
+
+diff --git a/src/components/views/rooms/RoomList.tsx b/src/components/views/rooms/RoomList.tsx
+index e27b2ca03f..311a54d9d8 100644
+--- a/src/components/views/rooms/RoomList.tsx
++++ b/src/components/views/rooms/RoomList.tsx
+@@ -72,11 +72,13 @@ interface IState {
+     sublists: ITagMap;
+     currentRoomId?: string;
+     suggestedRooms: ISuggestedRoom[];
++    unifiedRoomList: boolean;
+ }
+ 
+ export const TAG_ORDER: TagID[] = [
+     DefaultTagID.Invite,
+     DefaultTagID.Favourite,
++    DefaultTagID.Unified,
+     DefaultTagID.DM,
+     DefaultTagID.Untagged,
+     DefaultTagID.Conference,
+@@ -89,6 +91,7 @@ export const TAG_ORDER: TagID[] = [
+     // but we'd have to make sure that rooms you weren't in were hidden.
+ ];
+ const ALWAYS_VISIBLE_TAGS: TagID[] = [DefaultTagID.DM, DefaultTagID.Untagged];
++const ALWAYS_VISIBLE_UNIFIED_TAGS: TagID[] = [DefaultTagID.Unified];
+ 
+ interface ITagAesthetics {
+     sectionLabel: TranslationKey;
+@@ -366,6 +369,17 @@ const UntaggedAuxButton: React.FC = ({ tabIndex }) => {
+     return null;
+ };
+ 
++const UnifiedAuxButton: React.FC = (iAuxButtonProps: IAuxButtonProps) => {
++    return (
++        <>
++            {/* eslint-disable-next-line new-cap */}
++            {DmAuxButton(iAuxButtonProps)}
++            {/* eslint-disable-next-line new-cap */}
++            {UntaggedAuxButton(iAuxButtonProps)}
++        
++    );
++};
++
+ const TAG_AESTHETICS: TagAestheticsMap = {
+     [DefaultTagID.Invite]: {
+         sectionLabel: _td("action|invites_list"),
+@@ -383,6 +397,12 @@ const TAG_AESTHETICS: TagAestheticsMap = {
+         defaultHidden: false,
+         AuxButtonComponent: DmAuxButton,
+     },
++    [DefaultTagID.Unified]: {
++        sectionLabel: _td("Normal priority"),
++        isInvite: false,
++        defaultHidden: false,
++        AuxButtonComponent: UnifiedAuxButton,
++    },
+     [DefaultTagID.Conference]: {
+         sectionLabel: _td("voip|metaspace_video_rooms|conference_room_section"),
+         isInvite: false,
+@@ -421,6 +441,7 @@ const TAG_AESTHETICS: TagAestheticsMap = {
+ 
+ export default class RoomList extends React.PureComponent {
+     private dispatcherRef?: string;
++    private readonly unifiedRoomListWatcherRef: string;
+     private treeRef = createRef();
+ 
+     public static contextType = MatrixClientContext;
+@@ -432,7 +453,14 @@ export default class RoomList extends React.PureComponent {
+         this.state = {
+             sublists: {},
+             suggestedRooms: SpaceStore.instance.suggestedRooms,
++            unifiedRoomList: SettingsStore.getValue("unifiedRoomList"),
+         };
++
++        this.unifiedRoomListWatcherRef = SettingsStore.watchSetting(
++            "unifiedRoomList",
++            null,
++            this.onUnifiedRoomListChange,
++        );
+     }
+ 
+     public componentDidMount(): void {
+@@ -447,9 +475,16 @@ export default class RoomList extends React.PureComponent {
+         SpaceStore.instance.off(UPDATE_SUGGESTED_ROOMS, this.updateSuggestedRooms);
+         RoomListStore.instance.off(LISTS_UPDATE_EVENT, this.updateLists);
+         if (this.dispatcherRef) defaultDispatcher.unregister(this.dispatcherRef);
++        SettingsStore.unwatchSetting(this.unifiedRoomListWatcherRef);
+         SdkContextClass.instance.roomViewStore.off(UPDATE_EVENT, this.onRoomViewStoreUpdate);
+     }
+ 
++    private onUnifiedRoomListChange = (): void => {
++        this.setState({
++            unifiedRoomList: SettingsStore.getValue("unifiedRoomList"),
++        });
++    };
++
+     private onRoomViewStoreUpdate = (): void => {
+         this.setState({
+             currentRoomId: SdkContextClass.instance.roomViewStore.getRoomId() ?? undefined,
+@@ -590,7 +625,9 @@ export default class RoomList extends React.PureComponent {
+             const aesthetics = TAG_AESTHETICS[orderedTagId];
+             if (!aesthetics) throw new Error(`Tag ${orderedTagId} does not have aesthetics`);
+ 
+-            let alwaysVisible = ALWAYS_VISIBLE_TAGS.includes(orderedTagId);
++            let alwaysVisible = (
++                this.state.unifiedRoomList ? ALWAYS_VISIBLE_UNIFIED_TAGS : ALWAYS_VISIBLE_TAGS
++            ).includes(orderedTagId);
+             if (
+                 (this.props.activeSpace === MetaSpace.Favourites && orderedTagId !== DefaultTagID.Favourite) ||
+                 (this.props.activeSpace === MetaSpace.People && orderedTagId !== DefaultTagID.DM) ||
+diff --git a/src/settings/Settings.tsx b/src/settings/Settings.tsx
+index 76bb109cac..7aea53ceea 100644
+--- a/src/settings/Settings.tsx
++++ b/src/settings/Settings.tsx
+@@ -191,6 +191,14 @@ export interface IFeature extends Omit, "isFeature"> {
+ export type ISetting = IBaseSetting | IFeature;
+ 
+ export const SETTINGS: { [setting: string]: ISetting } = {
++    // SC settings start
++    "unifiedRoomList": {
++        supportedLevels: LEVELS_ACCOUNT_SETTINGS,
++        displayName: _td("Show people and rooms in a combined list"),
++        default: true,
++        controller: new ReloadOnChangeController(),
++    },
++    // SC settings end
+     "feature_video_rooms": {
+         isFeature: true,
+         labsGroup: LabGroup.VoiceAndVideo,
+diff --git a/src/stores/room-list/RoomListStore.ts b/src/stores/room-list/RoomListStore.ts
+index 53377e0a01..381187b85c 100644
+--- a/src/stores/room-list/RoomListStore.ts
++++ b/src/stores/room-list/RoomListStore.ts
+@@ -500,6 +500,9 @@ export class RoomListStoreClass extends AsyncStoreWithClient implements
+                 this.setAndPersistListOrder(tag, listOrder);
+             }
+         }
++
++        // SC: Unified list for DMs and groups
++        this.algorithm.setUnifiedRoomList(SettingsStore.getValue("unifiedRoomList"));
+     }
+ 
+     private onAlgorithmListUpdated = (forceUpdate: boolean): void => {
+@@ -613,7 +616,21 @@ export class RoomListStoreClass extends AsyncStoreWithClient implements
+      */
+     public getTagsForRoom(room: Room): TagID[] {
+         const algorithmTags = this.algorithm.getTagsForRoom(room);
+-        if (!algorithmTags) return [DefaultTagID.Untagged];
++        if (!algorithmTags) {
++            if (SettingsStore.getValue("unifiedRoomList")) {
++                return [DefaultTagID.Unified];
++            } else {
++                return [DefaultTagID.Untagged];
++            }
++        }
++        const dmTagIndex = algorithmTags.indexOf(DefaultTagID.DM);
++        if (dmTagIndex !== -1) {
++            algorithmTags[dmTagIndex] = DefaultTagID.Unified;
++        }
++        const untaggedTagIndex = algorithmTags.indexOf(DefaultTagID.Untagged);
++        if (untaggedTagIndex !== -1) {
++            algorithmTags[untaggedTagIndex] = DefaultTagID.Unified;
++        }
+         return algorithmTags;
+     }
+ 
+diff --git a/src/stores/room-list/algorithms/Algorithm.ts b/src/stores/room-list/algorithms/Algorithm.ts
+index e296676149..06147137b3 100644
+--- a/src/stores/room-list/algorithms/Algorithm.ts
++++ b/src/stores/room-list/algorithms/Algorithm.ts
+@@ -75,6 +75,7 @@ export class Algorithm extends EventEmitter {
+      * Set to true to suspend emissions of algorithm updates.
+      */
+     public updatesInhibited = false;
++    private unifiedRoomList: boolean = true;
+ 
+     public start(): void {
+         CallStore.instance.on(CallStoreEvent.ConnectedCalls, this.onConnectedCalls);
+@@ -106,6 +107,10 @@ export class Algorithm extends EventEmitter {
+         return this._cachedRooms;
+     }
+ 
++    public setUnifiedRoomList(unifiedRoomList: boolean): void {
++        this.unifiedRoomList = unifiedRoomList;
++    }
++
+     /**
+      * Awaitable version of the sticky room setter.
+      * @param val The new room to sticky.
+@@ -513,7 +518,10 @@ export class Algorithm extends EventEmitter {
+             }
+ 
+             if (!inTag) {
+-                if (DMRoomMap.shared().getUserIdForRoomId(room.roomId)) {
++                if (this.unifiedRoomList) {
++                    // SC: Unified room list for DMs and groups
++                    newTags[DefaultTagID.Unified].push(room);
++                } else if (DMRoomMap.shared().getUserIdForRoomId(room.roomId)) {
+                     newTags[DefaultTagID.DM].push(room);
+                 } else {
+                     newTags[DefaultTagID.Untagged].push(room);
+@@ -557,7 +565,13 @@ export class Algorithm extends EventEmitter {
+             tags.push(...this.getTagsOfJoinedRoom(room));
+         }
+ 
+-        if (!tags.length) tags.push(DefaultTagID.Untagged);
++        if (!tags.length) {
++            if (this.unifiedRoomList) {
++                tags.push(DefaultTagID.Unified);
++            } else {
++                tags.push(DefaultTagID.Untagged);
++            }
++        }
+ 
+         return tags;
+     }
+@@ -567,7 +581,7 @@ export class Algorithm extends EventEmitter {
+ 
+         if (tags.length === 0) {
+             // Check to see if it's a DM if it isn't anything else
+-            if (DMRoomMap.shared().getUserIdForRoomId(room.roomId)) {
++            if (DMRoomMap.shared().getUserIdForRoomId(room.roomId) && !this.unifiedRoomList) {
+                 tags = [DefaultTagID.DM];
+             }
+         }
+diff --git a/src/stores/room-list/models.ts b/src/stores/room-list/models.ts
+index 50cecda665..8efc2d040d 100644
+--- a/src/stores/room-list/models.ts
++++ b/src/stores/room-list/models.ts
+@@ -13,6 +13,7 @@ export enum DefaultTagID {
+     LowPriority = "m.lowpriority",
+     Favourite = "m.favourite",
+     DM = "im.vector.fake.direct",
++    Unified = "chat.schildi.fake.unified",
+     Conference = "im.vector.fake.conferences",
+     ServerNotice = "m.server_notice",
+     Suggested = "im.vector.fake.suggested",
+@@ -21,6 +22,7 @@ export enum DefaultTagID {
+ export const OrderedDefaultTagIDs = [
+     DefaultTagID.Invite,
+     DefaultTagID.Favourite,
++    DefaultTagID.Unified,
+     DefaultTagID.DM,
+     DefaultTagID.Conference,
+     DefaultTagID.Untagged,
+-- 
+2.47.0
+
diff --git a/patches/matrix-react-sdk/0003-Don-t-sort-muted-rooms-to-bottom-I-still-want-to-see.patch b/patches/matrix-react-sdk/0003-Don-t-sort-muted-rooms-to-bottom-I-still-want-to-see.patch
new file mode 100644
index 0000000..2363d5b
--- /dev/null
+++ b/patches/matrix-react-sdk/0003-Don-t-sort-muted-rooms-to-bottom-I-still-want-to-see.patch
@@ -0,0 +1,25 @@
+From 1d3847da55e91dfc5e555e69fbadcbc1d033a8d9 Mon Sep 17 00:00:00 2001
+From: SpiritCroc 
+Date: Sun, 17 Dec 2023 11:11:58 +0100
+Subject: Don't sort muted rooms to bottom, I still want to see them.
+
+---
+ .../room-list/algorithms/list-ordering/OrderingAlgorithm.ts     | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/src/stores/room-list/algorithms/list-ordering/OrderingAlgorithm.ts b/src/stores/room-list/algorithms/list-ordering/OrderingAlgorithm.ts
+index 67ee1ca084..67dcaa3855 100644
+--- a/src/stores/room-list/algorithms/list-ordering/OrderingAlgorithm.ts
++++ b/src/stores/room-list/algorithms/list-ordering/OrderingAlgorithm.ts
+@@ -38,7 +38,7 @@ export abstract class OrderingAlgorithm {
+     }
+ 
+     public get isMutedToBottom(): boolean {
+-        return this.sortingAlgorithm === SortAlgorithm.Recent;
++        return this.sortingAlgorithm === SortAlgorithm.Recent && false;
+     }
+ 
+     /**
+-- 
+2.47.0
+
diff --git a/patches/matrix-react-sdk/0004-Add-support-for-rendering-captions-in-media-messages.patch b/patches/matrix-react-sdk/0004-Add-support-for-rendering-captions-in-media-messages.patch
new file mode 100644
index 0000000..f097ae4
--- /dev/null
+++ b/patches/matrix-react-sdk/0004-Add-support-for-rendering-captions-in-media-messages.patch
@@ -0,0 +1,104 @@
+From ac0fb82339fc580da9db60c183a39d72e6fba3ea Mon Sep 17 00:00:00 2001
+From: Tulir Asokan 
+Date: Tue, 12 Jul 2022 15:34:57 +0300
+Subject: Add support for rendering captions in media messages
+
+---
+ src/components/views/messages/IBodyProps.ts    |  2 ++
+ src/components/views/messages/MessageEvent.tsx | 15 +++++++++++++++
+ src/components/views/messages/TextualBody.tsx  | 11 +++++++++++
+ src/utils/FileUtils.ts                         |  4 +++-
+ 4 files changed, 31 insertions(+), 1 deletion(-)
+
+diff --git a/src/components/views/messages/IBodyProps.ts b/src/components/views/messages/IBodyProps.ts
+index e48ba96b56..3caeff225c 100644
+--- a/src/components/views/messages/IBodyProps.ts
++++ b/src/components/views/messages/IBodyProps.ts
+@@ -51,4 +51,6 @@ export interface IBodyProps {
+     // Set to `true` to disable interactions (e.g. video controls) and to remove controls from the tab order.
+     // This may be useful when displaying a preview of the event.
+     inhibitInteraction?: boolean;
++
++    OrigBodyType?: React.ComponentType>;
+ }
+diff --git a/src/components/views/messages/MessageEvent.tsx b/src/components/views/messages/MessageEvent.tsx
+index 1a5d09e415..bfe908aacc 100644
+--- a/src/components/views/messages/MessageEvent.tsx
++++ b/src/components/views/messages/MessageEvent.tsx
+@@ -175,6 +175,15 @@ export default class MessageEvent extends React.Component implements IMe
+             }
+         }
+ 
++        // @ts-ignore
++        const hasCaption = [MsgType.Image, MsgType.File, MsgType.Audio, MsgType.Video].includes(msgtype)
++            && content.filename && content.filename !== content.body;
++        let OrigBodyType;
++        if (hasCaption) {
++            OrigBodyType = BodyType
++            BodyType = CaptionBody
++        }
++
+         if (SettingsStore.getValue("feature_mjolnir")) {
+             const key = `mx_mjolnir_render_${this.props.mxEvent.getRoomId()}__${this.props.mxEvent.getId()}`;
+             const allowRender = localStorage.getItem(key) === "true";
+@@ -208,7 +217,13 @@ export default class MessageEvent extends React.Component implements IMe
+                 getRelationsForEvent={this.props.getRelationsForEvent}
+                 isSeeingThroughMessageHiddenForModeration={this.props.isSeeingThroughMessageHiddenForModeration}
+                 inhibitInteraction={this.props.inhibitInteraction}
++                OrigBodyType={OrigBodyType}
+             />
+         ) : null;
+     }
+ }
++
++const CaptionBody: React.FunctionComponent>}> = ({OrigBodyType, ...props}) => (
++ ++ ++
) +diff --git a/src/components/views/messages/TextualBody.tsx b/src/components/views/messages/TextualBody.tsx +index 8b7bfb9a5a..a8890303f8 100644 +--- a/src/components/views/messages/TextualBody.tsx ++++ b/src/components/views/messages/TextualBody.tsx +@@ -557,6 +557,9 @@ export default class TextualBody extends React.Component { + const isNotice = content.msgtype === MsgType.Notice; + const isEmote = content.msgtype === MsgType.Emote; + ++ // @ts-ignore ++ const isCaption = [MsgType.Image, MsgType.File, MsgType.Audio, MsgType.Video].includes(content.msgtype); ++ + const willHaveWrapper = + this.props.replacingEventId || this.props.isSeeingThroughMessageHiddenForModeration || isEmote; + +@@ -635,6 +638,14 @@ export default class TextualBody extends React.Component { + + ); + } ++ if (isCaption) { ++ return ( ++
++ { body } ++ { widgets } ++
++ ); ++ } + return ( +
+ {body} +diff --git a/src/utils/FileUtils.ts b/src/utils/FileUtils.ts +index 194cb31d20..0c0aec2138 100644 +--- a/src/utils/FileUtils.ts ++++ b/src/utils/FileUtils.ts +@@ -38,7 +38,9 @@ export function presentableTextForFile( + shortened = false, + ): string { + let text = fallbackText; +- if (content.body?.length) { ++ if (content.filename?.length) { ++ text = content.filename ++ } else if (content.body?.length) { + // The content body should be the name of the file including a + // file extension. + text = content.body; +-- +2.47.0 + diff --git a/patches/matrix-react-sdk/0005-Don-t-preview-reactions.patch b/patches/matrix-react-sdk/0005-Don-t-preview-reactions.patch new file mode 100644 index 0000000..b935d6e --- /dev/null +++ b/patches/matrix-react-sdk/0005-Don-t-preview-reactions.patch @@ -0,0 +1,29 @@ +From 0f0f80d270be5c88b0b762b51fe570c11b0bea7f Mon Sep 17 00:00:00 2001 +From: SpiritCroc +Date: Thu, 14 Dec 2023 10:32:10 +0100 +Subject: Don't preview reactions + +--- + src/stores/room-list/MessagePreviewStore.ts | 2 ++ + 1 file changed, 2 insertions(+) + +diff --git a/src/stores/room-list/MessagePreviewStore.ts b/src/stores/room-list/MessagePreviewStore.ts +index e0e06ec980..7ee27f8402 100644 +--- a/src/stores/room-list/MessagePreviewStore.ts ++++ b/src/stores/room-list/MessagePreviewStore.ts +@@ -57,10 +57,12 @@ const PREVIEWS: Record< + isState: false, + previewer: new StickerEventPreview(), + }, ++ /* + "m.reaction": { + isState: false, + previewer: new ReactionEventPreview(), + }, ++ */ + [M_POLL_START.name]: { + isState: false, + previewer: new PollStartEventPreview(), +-- +2.47.0 + diff --git a/patches/matrix-react-sdk/0006-Hide-the-mute-notification-state-the-same-way-as-the.patch b/patches/matrix-react-sdk/0006-Hide-the-mute-notification-state-the-same-way-as-the.patch new file mode 100644 index 0000000..eafb725 --- /dev/null +++ b/patches/matrix-react-sdk/0006-Hide-the-mute-notification-state-the-same-way-as-the.patch @@ -0,0 +1,30 @@ +From bc49b8d30cf7e0da038fac992ee2ff04c9dc91aa Mon Sep 17 00:00:00 2001 +From: SpiritCroc +Date: Wed, 17 Nov 2021 12:50:25 +0100 +Subject: Hide the "mute" notification state the same way as the other states + +This can get in the way of the "marked as unread" icon otherwise. +Furthermore, I didn't really like it showing there persistently either +way. +--- + src/components/views/rooms/RoomTile.tsx | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +diff --git a/src/components/views/rooms/RoomTile.tsx b/src/components/views/rooms/RoomTile.tsx +index 93fb42f447..09df8eaac9 100644 +--- a/src/components/views/rooms/RoomTile.tsx ++++ b/src/components/views/rooms/RoomTile.tsx +@@ -304,7 +304,9 @@ export class RoomTile extends React.PureComponent { + + // Only show the icon by default if the room is overridden to muted. + // TODO: [FTUE Notifications] Probably need to detect global mute state +- mx_RoomTile_notificationsButton_show: state === RoomNotifState.Mute, ++ //mx_RoomTile_notificationsButton_show: state === RoomNotifState.Mute, ++ // SchildiChat: never show the icon by default. This gets in the way of the "marked as unread" icon. ++ mx_RoomTile_notificationsButton_show: false, + }); + + return ( +-- +2.47.0 + diff --git a/patches/matrix-react-sdk/0007-Allow-muted-rooms-to-render-as-unread.patch b/patches/matrix-react-sdk/0007-Allow-muted-rooms-to-render-as-unread.patch new file mode 100644 index 0000000..dd98773 --- /dev/null +++ b/patches/matrix-react-sdk/0007-Allow-muted-rooms-to-render-as-unread.patch @@ -0,0 +1,25 @@ +From 10b23f715bf5115715dca07676ca467a6433c9c9 Mon Sep 17 00:00:00 2001 +From: SpiritCroc +Date: Fri, 10 May 2024 18:58:32 +0200 +Subject: Allow muted rooms to render as unread + +--- + src/RoomNotifs.ts | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/src/RoomNotifs.ts b/src/RoomNotifs.ts +index cc027c9682..c4c31a51cb 100644 +--- a/src/RoomNotifs.ts ++++ b/src/RoomNotifs.ts +@@ -255,7 +255,7 @@ export function determineUnreadState( + return { symbol: "!", count: 1, level: NotificationLevel.Highlight }; + } + +- if (getRoomNotifsState(room.client, room.roomId) === RoomNotifState.Mute) { ++ if (false && getRoomNotifsState(room.client, room.roomId) === RoomNotifState.Mute) { + return { symbol: null, count: 0, level: NotificationLevel.None }; + } + +-- +2.47.0 + diff --git a/patches/matrix-react-sdk/0008-Increase-default-visible-tiles.patch b/patches/matrix-react-sdk/0008-Increase-default-visible-tiles.patch new file mode 100644 index 0000000..e2d8e51 --- /dev/null +++ b/patches/matrix-react-sdk/0008-Increase-default-visible-tiles.patch @@ -0,0 +1,25 @@ +From 641cd216c155318e35eabef30761613706e36c87 Mon Sep 17 00:00:00 2001 +From: SpiritCroc +Date: Sun, 30 Aug 2020 15:33:01 +0200 +Subject: Increase default visible tiles + +--- + src/stores/room-list/ListLayout.ts | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/src/stores/room-list/ListLayout.ts b/src/stores/room-list/ListLayout.ts +index ff60309e08..275b6d330b 100644 +--- a/src/stores/room-list/ListLayout.ts ++++ b/src/stores/room-list/ListLayout.ts +@@ -74,7 +74,7 @@ export class ListLayout { + + public get defaultVisibleTiles(): number { + // This number is what "feels right", and mostly subject to design's opinion. +- return 8; ++ return 50; + } + + public tilesWithPadding(n: number, paddingPx: number): number { +-- +2.47.0 + diff --git a/patches/matrix-react-sdk/0009-Bring-back-showSpaceDMBadges-setting-force-enabled-f.patch b/patches/matrix-react-sdk/0009-Bring-back-showSpaceDMBadges-setting-force-enabled-f.patch new file mode 100644 index 0000000..7ef1a39 --- /dev/null +++ b/patches/matrix-react-sdk/0009-Bring-back-showSpaceDMBadges-setting-force-enabled-f.patch @@ -0,0 +1,92 @@ +From 2203554625f7c8d924981b3cd03b1389dc6873d9 Mon Sep 17 00:00:00 2001 +From: su-ex +Date: Sun, 26 May 2024 10:43:36 +0200 +Subject: Bring back showSpaceDMBadges setting, force-enabled for now + +TODO settings UI + +Co-authored-by: SpiritCroc +--- + src/settings/Settings.tsx | 5 +++++ + src/stores/spaces/SpaceStore.ts | 25 +++++++++++++++++++++++++ + 2 files changed, 30 insertions(+) + +diff --git a/src/settings/Settings.tsx b/src/settings/Settings.tsx +index 7aea53ceea..b668c65dfd 100644 +--- a/src/settings/Settings.tsx ++++ b/src/settings/Settings.tsx +@@ -198,6 +198,11 @@ export const SETTINGS: { [setting: string]: ISetting } = { + default: true, + controller: new ReloadOnChangeController(), + }, ++ "Spaces.showSpaceDMBadges": { ++ displayName: _td("Show notification badges for People in Spaces"), ++ supportedLevels: LEVELS_ACCOUNT_SETTINGS, ++ default: true, ++ }, + // SC settings end + "feature_video_rooms": { + isFeature: true, +diff --git a/src/stores/spaces/SpaceStore.ts b/src/stores/spaces/SpaceStore.ts +index 90358f3310..60df05478a 100644 +--- a/src/stores/spaces/SpaceStore.ts ++++ b/src/stores/spaces/SpaceStore.ts +@@ -154,9 +154,17 @@ export class SpaceStoreClass extends AsyncStoreWithClient { + /** Whether the feature flag is set for MSC3946 */ + private _msc3946ProcessDynamicPredecessor: boolean = SettingsStore.getValue("feature_dynamic_room_predecessors"); + ++ // SC start ++ private _showSpaceDMBadges = true; ++ // SC end ++ + public constructor() { + super(defaultDispatcher, {}); + ++ // SC start ++ SettingsStore.monitorSetting("Spaces.showSpaceDMBadges", null); ++ // SC end ++ + SettingsStore.monitorSetting("Spaces.allRoomsInHome", null); + SettingsStore.monitorSetting("Spaces.enabledMetaSpaces", null); + SettingsStore.monitorSetting("Spaces.showPeopleInSpace", null); +@@ -192,6 +200,10 @@ export class SpaceStoreClass extends AsyncStoreWithClient { + return this._allRoomsInHome; + } + ++ public get showSpaceDMBadges(): boolean { // SC ++ return this._showSpaceDMBadges; ++ } ++ + public setActiveRoomInSpace(space: SpaceKey): void { + if (!isMetaSpace(space) && !this.matrixClient?.getRoom(space)?.isSpaceRoom()) return; + if (space !== this.activeSpace) this.setActiveSpace(space, false); +@@ -701,6 +713,10 @@ export class SpaceStoreClass extends AsyncStoreWithClient { + + if (room.isSpaceRoom() || !flattenedRoomsForSpace.has(room.roomId)) return false; + ++ if (this.showSpaceDMBadges) { // SC ++ return true; ++ } ++ + if (dmBadgeSpace && DMRoomMap.shared().getUserIdForRoomId(room.roomId)) { + return s === dmBadgeSpace; + } +@@ -1277,6 +1293,15 @@ export class SpaceStoreClass extends AsyncStoreWithClient { + break; + } + ++ case "Spaces.showSpaceDMBadges": { // SC ++ const newValue = SettingsStore.getValue("Spaces.showSpaceDMBadges"); ++ if (this.showSpaceDMBadges !== newValue) { ++ this._showSpaceDMBadges = newValue; ++ this.rebuildSpaceHierarchy(); // rebuild everything ++ } ++ break; ++ } ++ + case "Spaces.enabledMetaSpaces": { + const newValue = SettingsStore.getValue("Spaces.enabledMetaSpaces"); + const enabledMetaSpaces = metaSpaceOrder.filter((k) => newValue[k]); +-- +2.47.0 + diff --git a/patches/matrix-react-sdk/0010-Squashed-Freeform-reactions-from-tadzik-freeform-rea.patch b/patches/matrix-react-sdk/0010-Squashed-Freeform-reactions-from-tadzik-freeform-rea.patch new file mode 100644 index 0000000..a281def --- /dev/null +++ b/patches/matrix-react-sdk/0010-Squashed-Freeform-reactions-from-tadzik-freeform-rea.patch @@ -0,0 +1,134 @@ +From 961ee28392810973057a0c8af410e1067a15547a Mon Sep 17 00:00:00 2001 +From: SpiritCroc +Date: Wed, 29 May 2024 19:32:42 +0200 +Subject: Squashed: Freeform reactions from tadzik/freeform-reactions-upstream +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +commit 9eea56b0080db3720efa49b457707bcde3be6474 +Merge: 06f81c9662 8570f16e31 +Author: Tadeusz Sośnierz +Date: Tue Jun 20 09:57:19 2023 +0200 + + Merge branch 'develop' into tadzik/freeform-reactions-upstream + +commit 06f81c9662fbe033b4eac859d7e14e0ab24a6e91 +Merge: ad4fef85b1 0d6a550c33 +Author: Michael Telatynski <7t3chguy@gmail.com> +Date: Wed Aug 31 09:06:49 2022 +0100 + + Merge branch 'develop' into tadzik/freeform-reactions + +commit ad4fef85b160087b8017b9ae9cf9aebfd5348f41 +Merge: 689b57c0b9 5aae974e93 +Author: Tadeusz Sośnierz +Date: Sun Aug 28 10:11:48 2022 +0200 + + Merge branch 'develop' into tadzik/freeform-reactions + +commit 689b57c0b91e12907a8dbc3fac3ed10302a11e4a +Author: Tadeusz Sośnierz +Date: Fri May 20 10:35:06 2022 +0200 + + Fix conflict resolution fail in EmojiPicker + +commit 70a8e212b748584949b37bc99b72acffce2fd148 +Merge: 215df55f13 a0cdc93642 +Author: Tadeusz Sośnierz +Date: Fri May 20 10:25:17 2022 +0200 + + Merge branch 'develop' into tadzik/freeform-reactions-upstream + +commit 215df55f13162bdc8eb13da5219763c56f560dd0 +Author: Tadeusz Sośnierz +Date: Tue Aug 17 16:30:06 2021 +0200 + + Disable freeform emoji reactions in the message composer + +commit 6bb8263007e077d22929fcc1fb439d94a4f15c6f +Author: Tadeusz Sośnierz +Date: Tue Aug 17 12:12:28 2021 +0200 + + Add more typing to EmojiPicker + +commit b2a1728318a8a5496345797995c1ec09ae3f88e6 +Author: Tadeusz Sośnierz +Date: Tue Aug 17 11:52:35 2021 +0200 + + Make free-form reaction button translatable + +commit f4adaf00b805baba454fbceb41cc5c081ec886a7 +Author: Tadeusz Sośnierz +Date: Tue Aug 17 11:29:22 2021 +0200 + + Allow sending free-form reactions + + Signed-off-by: Tadeusz Sośnierz +--- + src/components/views/emojipicker/EmojiPicker.tsx | 15 +++++++++++++++ + .../views/emojipicker/ReactionPicker.tsx | 1 + + 2 files changed, 16 insertions(+) + +diff --git a/src/components/views/emojipicker/EmojiPicker.tsx b/src/components/views/emojipicker/EmojiPicker.tsx +index 4806ad4216..7d4a4353e2 100644 +--- a/src/components/views/emojipicker/EmojiPicker.tsx ++++ b/src/components/views/emojipicker/EmojiPicker.tsx +@@ -17,6 +17,7 @@ import Header from "./Header"; + import Search from "./Search"; + import Preview from "./Preview"; + import QuickReactions from "./QuickReactions"; ++import AccessibleButton from '../elements/AccessibleButton'; + import Category, { CategoryKey, ICategory } from "./Category"; + import { filterBoolean } from "../../../utils/arrays"; + import { +@@ -37,6 +38,7 @@ export const EMOJIS_PER_ROW = 8; + const ZERO_WIDTH_JOINER = "\u200D"; + + interface IProps { ++ allowUnlisted?: boolean; + selectedEmojis?: Set; + onChoose(unicode: string): boolean; + onFinished(): void; +@@ -341,6 +343,10 @@ class EmojiPicker extends React.Component { + } + }; + ++ private reactWith = (reaction: string): void => { ++ this.props.onChoose(reaction); ++ }; ++ + private static categoryHeightForEmojiCount(count: number): number { + if (count === 0) { + return 0; +@@ -396,6 +402,15 @@ class EmojiPicker extends React.Component { + return categoryElement; + })} + ++ { ++ (this.props.allowUnlisted && this.state.filter) && ++ this.reactWith(this.state.filter)} ++ > ++ { _t('React with "%(reaction)s"', { reaction: this.state.filter }) } ++ ++ } + {this.state.previewEmoji ? ( + + ) : ( +diff --git a/src/components/views/emojipicker/ReactionPicker.tsx b/src/components/views/emojipicker/ReactionPicker.tsx +index 2c2eb442a0..62bfd2ea0f 100644 +--- a/src/components/views/emojipicker/ReactionPicker.tsx ++++ b/src/components/views/emojipicker/ReactionPicker.tsx +@@ -123,6 +123,7 @@ class ReactionPicker extends React.Component { + public render(): React.ReactNode { + return ( + +Date: Sat, 22 Apr 2023 12:15:18 +0200 +Subject: Allow reactions to take more space + +--- + res/css/views/messages/_ReactionsRowButton.pcss | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/res/css/views/messages/_ReactionsRowButton.pcss b/res/css/views/messages/_ReactionsRowButton.pcss +index f2e3885de4..2a8bb9224e 100644 +--- a/res/css/views/messages/_ReactionsRowButton.pcss ++++ b/res/css/views/messages/_ReactionsRowButton.pcss +@@ -14,6 +14,7 @@ Please see LICENSE files in the repository root for full details. + background-color: $secondary-hairline-color; + user-select: none; + align-items: center; ++ max-width: calc(100% - 40px);; + + &:hover { + border-color: $quinary-content; +@@ -29,7 +30,6 @@ Please see LICENSE files in the repository root for full details. + } + + .mx_ReactionsRowButton_content { +- max-width: 100px; + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; +-- +2.47.0 + diff --git a/patches/matrix-react-sdk/0012-On-space-switch-don-t-automatically-show-last-opened.patch b/patches/matrix-react-sdk/0012-On-space-switch-don-t-automatically-show-last-opened.patch new file mode 100644 index 0000000..b224046 --- /dev/null +++ b/patches/matrix-react-sdk/0012-On-space-switch-don-t-automatically-show-last-opened.patch @@ -0,0 +1,79 @@ +From b43bf7e8a183f36e30e9b79e3fc2dcd14afc6823 Mon Sep 17 00:00:00 2001 +From: su-ex +Date: Thu, 30 May 2024 14:35:16 +0200 +Subject: On space switch don't automatically show last opened room + +--- + src/components/structures/MatrixChat.tsx | 18 +++++++++++++++++- + src/settings/Settings.tsx | 6 ++++++ + src/stores/spaces/SpaceStore.ts | 1 + + 3 files changed, 24 insertions(+), 1 deletion(-) + +diff --git a/src/components/structures/MatrixChat.tsx b/src/components/structures/MatrixChat.tsx +index 1726c8462d..150f29d0b8 100644 +--- a/src/components/structures/MatrixChat.tsx ++++ b/src/components/structures/MatrixChat.tsx +@@ -1448,7 +1448,15 @@ export default class MatrixChat extends React.PureComponent { + if (this.screenAfterLogin && this.screenAfterLogin.screen) { + this.showScreen(this.screenAfterLogin.screen, this.screenAfterLogin.params); + this.screenAfterLogin = undefined; +- } else if (localStorage && localStorage.getItem("mx_last_room_id")) { ++ } else if ( ++ !SettingsStore.getValue("Spaces.returnToPreviouslyOpenedRoom") && ++ localStorage && ++ localStorage.getItem("mx_active_space") && ++ localStorage.getItem("mx_active_space")[0] === "!" ++ ) { ++ // SC: Show the last viewed space ++ this.viewLastSpace(); ++ } else if (SettingsStore.getValue("Spaces.returnToPreviouslyOpenedRoom") && localStorage && localStorage.getItem("mx_last_room_id")) { + // Before defaulting to directory, show the last viewed room + this.viewLastRoom(); + } else { +@@ -1460,6 +1468,14 @@ export default class MatrixChat extends React.PureComponent { + } + } + ++ private viewLastSpace(): void { // SC ++ // SC-ToDo: Make this work for meta spaces ++ dis.dispatch({ ++ action: Action.ViewRoom, ++ room_id: localStorage.getItem("mx_active_space"), ++ }); ++ } ++ + private viewLastRoom(): void { + dis.dispatch({ + action: Action.ViewRoom, +diff --git a/src/settings/Settings.tsx b/src/settings/Settings.tsx +index b668c65dfd..be4433e1bc 100644 +--- a/src/settings/Settings.tsx ++++ b/src/settings/Settings.tsx +@@ -203,6 +203,12 @@ export const SETTINGS: { [setting: string]: ISetting } = { + supportedLevels: LEVELS_ACCOUNT_SETTINGS, + default: true, + }, ++ "Spaces.returnToPreviouslyOpenedRoom": { ++ displayName: _td("Return to the room previously opened in a space"), ++ description: _td("If disabled, the space overview will be shown when switching to another space."), ++ supportedLevels: LEVELS_ACCOUNT_SETTINGS, ++ default: false, ++ }, + // SC settings end + "feature_video_rooms": { + isFeature: true, +diff --git a/src/stores/spaces/SpaceStore.ts b/src/stores/spaces/SpaceStore.ts +index 60df05478a..0be7ba190a 100644 +--- a/src/stores/spaces/SpaceStore.ts ++++ b/src/stores/spaces/SpaceStore.ts +@@ -265,6 +265,7 @@ export class SpaceStoreClass extends AsyncStoreWithClient { + // else if the last viewed room in this space is joined then view that + // else view space home or home depending on what is being clicked on + if ( ++ SettingsStore.getValue("Spaces.returnToPreviouslyOpenedRoom") && + roomId && + cliSpace?.getMyMembership() !== KnownMembership.Invite && + this.matrixClient.getRoom(roomId)?.getMyMembership() === KnownMembership.Join && +-- +2.47.0 + diff --git a/patches/matrix-react-sdk/0013-Exclude-spaces-from-breadcrumbs.patch b/patches/matrix-react-sdk/0013-Exclude-spaces-from-breadcrumbs.patch new file mode 100644 index 0000000..49b0d89 --- /dev/null +++ b/patches/matrix-react-sdk/0013-Exclude-spaces-from-breadcrumbs.patch @@ -0,0 +1,24 @@ +From 3aa2246c56ae3e5b7703003ef785d6e3ad77b844 Mon Sep 17 00:00:00 2001 +From: SpiritCroc +Date: Tue, 9 Aug 2022 09:32:19 +0200 +Subject: Exclude spaces from breadcrumbs + +--- + src/stores/BreadcrumbsStore.ts | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/src/stores/BreadcrumbsStore.ts b/src/stores/BreadcrumbsStore.ts +index 9859f24015..957b54286c 100644 +--- a/src/stores/BreadcrumbsStore.ts ++++ b/src/stores/BreadcrumbsStore.ts +@@ -137,6 +137,7 @@ export class BreadcrumbsStore extends AsyncStoreWithClient { + } + + private async appendRoom(room: Room): Promise { ++ if (room.isSpaceRoom()) return; + let updated = false; + const rooms = (this.state.rooms || []).slice(); // cheap clone + const msc3946ProcessDynamicPredecessor = SettingsStore.getValue("feature_dynamic_room_predecessors"); +-- +2.47.0 + diff --git a/patches/matrix-react-sdk/0014-Stop-the-search-bar-wobble.patch b/patches/matrix-react-sdk/0014-Stop-the-search-bar-wobble.patch new file mode 100644 index 0000000..e4b33fc --- /dev/null +++ b/patches/matrix-react-sdk/0014-Stop-the-search-bar-wobble.patch @@ -0,0 +1,24 @@ +From 288aa3cf8e56a4ca60810eac98fb6f692b154f61 Mon Sep 17 00:00:00 2001 +From: SpiritCroc +Date: Mon, 19 Aug 2024 20:27:33 +0200 +Subject: Stop the search bar wobble + +--- + res/css/_common.pcss | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/res/css/_common.pcss b/res/css/_common.pcss +index 05a3dac067..7861af6381 100644 +--- a/res/css/_common.pcss ++++ b/res/css/_common.pcss +@@ -181,6 +181,7 @@ input[type="search"].mx_textinput_icon { + padding-left: 36px; + background-repeat: no-repeat; + background-position: 10px center; ++ min-height: 33px; + } + + /* FIXME THEME - Tint by CSS rather than referencing a duplicate asset */ +-- +2.47.0 + diff --git a/patches/matrix-react-sdk/0015-Import-SC-compound-theme-overrides.patch b/patches/matrix-react-sdk/0015-Import-SC-compound-theme-overrides.patch new file mode 100644 index 0000000..d823f0d --- /dev/null +++ b/patches/matrix-react-sdk/0015-Import-SC-compound-theme-overrides.patch @@ -0,0 +1,34 @@ +From a4bca41b7371c42499fd8c805482066514a9edc2 Mon Sep 17 00:00:00 2001 +From: SpiritCroc +Date: Sun, 13 Oct 2024 11:23:54 +0200 +Subject: Import SC compound theme overrides + +--- + res/css/_common.pcss | 1 + + res/css/sc-cpd-overrides.css | 1 + + 2 files changed, 2 insertions(+) + create mode 120000 res/css/sc-cpd-overrides.css + +diff --git a/res/css/_common.pcss b/res/css/_common.pcss +index 7861af6381..f7a660a339 100644 +--- a/res/css/_common.pcss ++++ b/res/css/_common.pcss +@@ -11,6 +11,7 @@ Please see LICENSE files in the repository root for full details. + + @import url("@vector-im/compound-design-tokens/assets/web/css/compound-design-tokens.css") layer(compound); + @import url("@vector-im/compound-web/dist/style.css"); ++@import "./sc-cpd-overrides.css"; + @import "./_font-sizes.pcss"; + @import "./_animations.pcss"; + @import "./_spacing.pcss"; +diff --git a/res/css/sc-cpd-overrides.css b/res/css/sc-cpd-overrides.css +new file mode 120000 +index 0000000000..532e96fddc +--- /dev/null ++++ b/res/css/sc-cpd-overrides.css +@@ -0,0 +1 @@ ++../../../res/css/sc-cpd-overrides.css +\ No newline at end of file +-- +2.47.0 + diff --git a/patches/matrix-react-sdk/0016-No-damn-avatar-background-in-room-list.patch b/patches/matrix-react-sdk/0016-No-damn-avatar-background-in-room-list.patch new file mode 100644 index 0000000..2fa7d3a --- /dev/null +++ b/patches/matrix-react-sdk/0016-No-damn-avatar-background-in-room-list.patch @@ -0,0 +1,26 @@ +From fc577303d8c2d290f1c17e13deaf442822af68a1 Mon Sep 17 00:00:00 2001 +From: su-ex +Date: Tue, 7 Sep 2021 19:41:52 +0200 +Subject: No damn avatar background in room list + +--- + src/components/structures/BackdropPanel.tsx | 3 +++ + 1 file changed, 3 insertions(+) + +diff --git a/src/components/structures/BackdropPanel.tsx b/src/components/structures/BackdropPanel.tsx +index 80c21235cc..a9c464f4b2 100644 +--- a/src/components/structures/BackdropPanel.tsx ++++ b/src/components/structures/BackdropPanel.tsx +@@ -13,6 +13,9 @@ interface IProps { + } + + export const BackdropPanel: React.FC = ({ backgroundImage, blurMultiplier }) => { ++ // SC: no damn avatar background in room list ++ return null; ++ + if (!backgroundImage) return null; + + const styles: CSSProperties = {}; +-- +2.47.0 + diff --git a/patches/matrix-react-sdk/0017-No-red-messages-in-1-1-chats-Close-SchildiChat-schil.patch b/patches/matrix-react-sdk/0017-No-red-messages-in-1-1-chats-Close-SchildiChat-schil.patch new file mode 100644 index 0000000..b81a35b --- /dev/null +++ b/patches/matrix-react-sdk/0017-No-red-messages-in-1-1-chats-Close-SchildiChat-schil.patch @@ -0,0 +1,29 @@ +From e4a7ea01c2fd9f7d67660402c20bfdc5969f28c4 Mon Sep 17 00:00:00 2001 +From: su-ex +Date: Tue, 22 Dec 2020 19:16:28 +0100 +Subject: No red messages in 1:1 chats Close SchildiChat/schildichat-desktop#13 + +--- + src/components/views/rooms/EventTile.tsx | 6 ++++++ + 1 file changed, 6 insertions(+) + +diff --git a/src/components/views/rooms/EventTile.tsx b/src/components/views/rooms/EventTile.tsx +index 746cceabd8..3e5879f7ad 100644 +--- a/src/components/views/rooms/EventTile.tsx ++++ b/src/components/views/rooms/EventTile.tsx +@@ -685,6 +685,12 @@ export class UnwrappedEventTile extends React.Component + return false; + } + ++ // don't show highlights in 1:1 rooms ++ const room = cli.getRoom(this.props.mxEvent.getRoomId()); ++ if (room && room.currentState.getJoinedMemberCount() === 2) { ++ return false; ++ } ++ + return !!(actions?.tweaks.highlight || previousActions?.tweaks.highlight); + } + +-- +2.47.0 + diff --git a/patches/matrix-react-sdk/0018-Always-apply-corner-radius-to-all-edges-of-the-bubbl.patch b/patches/matrix-react-sdk/0018-Always-apply-corner-radius-to-all-edges-of-the-bubbl.patch new file mode 100644 index 0000000..76d5935 --- /dev/null +++ b/patches/matrix-react-sdk/0018-Always-apply-corner-radius-to-all-edges-of-the-bubbl.patch @@ -0,0 +1,61 @@ +From a37ca889b832578a9201a5b45b059f58eb781bc5 Mon Sep 17 00:00:00 2001 +From: SpiritCroc +Date: Sun, 13 Oct 2024 13:26:16 +0200 +Subject: Always apply corner radius to all edges of the bubble + +--- + res/css/views/rooms/_EventBubbleTile.pcss | 10 ++++++---- + 1 file changed, 6 insertions(+), 4 deletions(-) + +diff --git a/res/css/views/rooms/_EventBubbleTile.pcss b/res/css/views/rooms/_EventBubbleTile.pcss +index ec443c44de..8e0f3cf1b6 100644 +--- a/res/css/views/rooms/_EventBubbleTile.pcss ++++ b/res/css/views/rooms/_EventBubbleTile.pcss +@@ -277,6 +277,8 @@ Please see LICENSE files in the repository root for full details. + margin-inline: var(--EventTile_bubble_line-margin-inline-start) var(--EventTile_bubble_line-margin-inline-end); + border-top-left-radius: var(--cornerRadius); + border-top-right-radius: var(--cornerRadius); ++ border-bottom-left-radius: var(--cornerRadius); ++ border-bottom-right-radius: var(--cornerRadius); + + /* the selector here is quite weird because timestamps can appear linked & unlinked and in different places */ + /* in the DOM depending on the specific rendering context */ +@@ -371,7 +373,7 @@ Please see LICENSE files in the repository root for full details. + } + + &.mx_EventTile_continuation[data-self="false"] .mx_EventTile_line { +- border-top-left-radius: 0; ++ //border-top-left-radius: 0; + + .mx_MImageBody .mx_MImageBody_thumbnail_container, + .mx_MVideoBody .mx_MVideoBody_container, +@@ -379,7 +381,7 @@ Please see LICENSE files in the repository root for full details. + .mx_MediaBody, + .mx_MLocationBody_map, + .mx_MBeaconBody { +- border-top-left-radius: 0; ++ //border-top-left-radius: 0; + } + } + &.mx_EventTile_lastInSection[data-self="false"] .mx_EventTile_line { +@@ -396,7 +398,7 @@ Please see LICENSE files in the repository root for full details. + } + + &.mx_EventTile_continuation[data-self="true"] .mx_EventTile_line { +- border-top-right-radius: 0; ++ //border-top-right-radius: 0; + + .mx_MImageBody .mx_MImageBody_thumbnail_container, + .mx_MVideoBody .mx_MVideoBody_container, +@@ -404,7 +406,7 @@ Please see LICENSE files in the repository root for full details. + .mx_MediaBody, + .mx_MLocationBody_map, + .mx_MBeaconBody { +- border-top-right-radius: 0; ++ //border-top-right-radius: 0; + } + } + &.mx_EventTile_lastInSection[data-self="true"] .mx_EventTile_line { +-- +2.47.0 + diff --git a/patches/matrix-react-sdk/0019-Always-show-timestamps-by-default.patch b/patches/matrix-react-sdk/0019-Always-show-timestamps-by-default.patch new file mode 100644 index 0000000..8abccc6 --- /dev/null +++ b/patches/matrix-react-sdk/0019-Always-show-timestamps-by-default.patch @@ -0,0 +1,25 @@ +From 57942189da5f80069ee4b03dc2fbeb24ce6b4f7b Mon Sep 17 00:00:00 2001 +From: SpiritCroc +Date: Sun, 13 Oct 2024 13:53:07 +0200 +Subject: Always show timestamps by default + +--- + src/settings/Settings.tsx | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/src/settings/Settings.tsx b/src/settings/Settings.tsx +index be4433e1bc..1052bca0c9 100644 +--- a/src/settings/Settings.tsx ++++ b/src/settings/Settings.tsx +@@ -662,7 +662,7 @@ export const SETTINGS: { [setting: string]: ISetting } = { + "alwaysShowTimestamps": { + supportedLevels: LEVELS_ACCOUNT_SETTINGS, + displayName: _td("settings|always_show_message_timestamps"), +- default: false, ++ default: true, + }, + "userTimezone": { + supportedLevels: LEVELS_DEVICE_ONLY_SETTINGS, +-- +2.47.0 + diff --git a/patches/matrix-react-sdk/0021-Enable-custom-emote-rendering-by-default.patch b/patches/matrix-react-sdk/0021-Enable-custom-emote-rendering-by-default.patch new file mode 100644 index 0000000..2db22df --- /dev/null +++ b/patches/matrix-react-sdk/0021-Enable-custom-emote-rendering-by-default.patch @@ -0,0 +1,25 @@ +From 47bcb08e971256fe94a0b07fb553b75400e648ed Mon Sep 17 00:00:00 2001 +From: SpiritCroc +Date: Thu, 17 Oct 2024 19:40:51 +0200 +Subject: Enable custom emote rendering by default + +--- + src/settings/Settings.tsx | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/src/settings/Settings.tsx b/src/settings/Settings.tsx +index 1052bca0c9..f5fcb5d7a5 100644 +--- a/src/settings/Settings.tsx ++++ b/src/settings/Settings.tsx +@@ -514,7 +514,7 @@ export const SETTINGS: { [setting: string]: ISetting } = { + description: _td("labs|render_reaction_images_description"), + supportedLevels: LEVELS_DEVICE_ONLY_SETTINGS_WITH_CONFIG_PRIORITISED, + supportedLevelsAreOrdered: true, +- default: false, ++ default: true, + }, + /** + * With the transition to Compound we are moving to a base font size +-- +2.47.0 + diff --git a/patches/matrix-react-sdk/0022-Don-t-symlink-css-to-fix-Windows-native-build.patch b/patches/matrix-react-sdk/0022-Don-t-symlink-css-to-fix-Windows-native-build.patch new file mode 100644 index 0000000..124a69c --- /dev/null +++ b/patches/matrix-react-sdk/0022-Don-t-symlink-css-to-fix-Windows-native-build.patch @@ -0,0 +1,32 @@ +From 16fe0fe8d0068e4c5da3fa5516c5578d2ffaabc7 Mon Sep 17 00:00:00 2001 +From: SpiritCroc +Date: Sun, 20 Oct 2024 17:00:19 +0200 +Subject: Don't symlink css to fix Windows-native build + +--- + .gitignore | 2 ++ + res/css/sc-cpd-overrides.css | 1 - + 2 files changed, 2 insertions(+), 1 deletion(-) + delete mode 120000 res/css/sc-cpd-overrides.css + +diff --git a/.gitignore b/.gitignore +index 3137cd555b..5345301b97 100644 +--- a/.gitignore ++++ b/.gitignore +@@ -1,3 +1,5 @@ ++res/css/sc-*.css ++ + /.npmrc + /*.log + package-lock.json +diff --git a/res/css/sc-cpd-overrides.css b/res/css/sc-cpd-overrides.css +deleted file mode 120000 +index 532e96fddc..0000000000 +--- a/res/css/sc-cpd-overrides.css ++++ /dev/null +@@ -1 +0,0 @@ +-../../../res/css/sc-cpd-overrides.css +\ No newline at end of file +-- +2.47.0 + diff --git a/push_current_sc_branches.sh b/push_current_sc_branches.sh new file mode 100755 index 0000000..7a34314 --- /dev/null +++ b/push_current_sc_branches.sh @@ -0,0 +1,40 @@ +#!/bin/bash + +set -e + +mydir="$(dirname "$(realpath "$0")")" +pushd "$mydir" > /dev/null + +source ./merge_helpers.sh + +get_branch_of() { + local repo="$1" + pushd "$repo" > /dev/null + local b=`git branch --show-current` + if [[ "$b" = sc_v* ]]; then + echo "$b" + else + >&2 echo "Unexpected branch name for $repo: $b" + exit 1 + fi + popd > /dev/null +} + +b_js=`get_branch_of matrix-js-sdk` +b_react=`get_branch_of matrix-react-sdk` +b_web=`get_branch_of element-web` +b_desktop=`get_branch_of element-desktop` + +if [ "$b_js" != "$b_react" ] || [ "$b_react" != "$b_web" ] || [ "$b_web" != "$b_desktop" ]; then + echo "Detected branch name mismatch!" + echo "js-sdk: $b_js" + echo "react-sdk: $b_react" + echo "element-web: $b_web" + echo "element-desktop: $b_desktop" + exit 1 +fi + +branch="$b_js" + +echo "Pushing to all repos: $branch" +forall_repos git push --set-upstream origin "$branch" "$@" 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 diff --git a/res/css/sc-cpd-overrides.css b/res/css/sc-cpd-overrides.css new file mode 100644 index 0000000..a9987b0 --- /dev/null +++ b/res/css/sc-cpd-overrides.css @@ -0,0 +1,174 @@ +/* + * Upstream file for reference: + * - Dark: https://github.com/element-hq/compound-design-tokens/blob/main/assets/web/css/cpd-theme-dark-base.css + * - Light: https://github.com/element-hq/compound-design-tokens/blob/main/assets/web/css/cpd-theme-light-base.css + */ + +.cpd-theme-dark.cpd-theme-dark { + --cpd-color-text-primary: rgba(255, 255, 255, 0.9); + --cpd-color-text-secondary: rgba(255, 255, 255, 0.65); + /* TODO? + --cpd-color-alpha-green-1400: hsla(152, 88%, 94%, 0.96); + --cpd-color-alpha-green-1300: hsla(152, 93%, 88%, 0.91); + --cpd-color-alpha-green-1200: hsla(156, 97%, 76%, 0.83); + --cpd-color-alpha-green-1100: hsla(162, 98%, 57%, 0.74); + --cpd-color-alpha-green-1000: hsla(163, 99%, 55%, 0.65); + --cpd-color-alpha-green-900: hsla(164, 98%, 53%, 0.58); + --cpd-color-alpha-green-800: hsl(168, 100%, 24%, 1); + --cpd-color-alpha-green-700: hsl(165, 100%, 18%, 1); + --cpd-color-alpha-green-600: hsl(162, 100%, 14%, 1); + --cpd-color-alpha-green-500: hsl(160, 100%, 12%, 1); + --cpd-color-alpha-green-400: hsl(155, 100%, 9%, 1); + --cpd-color-alpha-green-300: hsl(151, 100%, 7%, 1); + --cpd-color-alpha-green-200: hsl(147, 100%, 6%, 1); + --cpd-color-alpha-green-100: hsl(144, 100%, 6%, 1); + + --cpd-color-alpha-gray-1400: hsla(214, 78%, 98%, 0.95); + --cpd-color-alpha-gray-1300: hsla(213, 73%, 97%, 0.89); + --cpd-color-alpha-gray-1200: hsla(215, 74%, 96%, 0.79); + --cpd-color-alpha-gray-1100: hsla(215, 92%, 95%, 0.68); + --cpd-color-alpha-gray-1000: hsla(213, 93%, 94%, 0.61); + --cpd-color-alpha-gray-900: hsla(211, 94%, 94%, 0.54); + --cpd-color-alpha-gray-800: hsla(216, 100%, 94%, 0.41); + --cpd-color-alpha-gray-700: hsla(213, 85%, 95%, 0.27); + --cpd-color-alpha-gray-600: hsla(225, 46%, 95%, 0.2); + --cpd-color-alpha-gray-500: hsla(214, 41%, 97%, 0.15); + --cpd-color-alpha-gray-400: hsla(270, 37%, 93%, 0.1); + --cpd-color-alpha-gray-200: hsla(286, 31%, 82%, 0.04); + --cpd-color-alpha-gray-100: hsla(214, 10%, 86%, 0.02); + */ + /* Hover of room list items, search bar bg, space icon bg */ + --cpd-color-alpha-gray-300: rgba(255, 255, 255, 0.06); + + /* TODO more accent variants? */ + --cpd-color-green-1400: #F1F8E9; + --cpd-color-green-1300: #DCEDC8; + --cpd-color-green-1200: #C5E1A5; + --cpd-color-green-1100: #AED581; + --cpd-color-green-1000: #9CCC65; + --cpd-color-green-900: #8BC34A; + --cpd-color-green-800: #8BC34A; + --cpd-color-green-700: #8BC34A; + --cpd-color-green-600: #8BC34A; + --cpd-color-green-500: #8BC34A; + --cpd-color-green-400: #689F38; + --cpd-color-green-300: #33691E; + --cpd-color-green-200: #33691E; + --cpd-color-green-100: #33691E; + + /* TODO + --cpd-color-red-1400: #ffe9e6; + --cpd-color-red-1300: #ffd4cd; + --cpd-color-red-1200: #ffaea4; + --cpd-color-red-1100: #ff877c; + --cpd-color-red-1000: #ff665d; + --cpd-color-red-900: #fd3e3c; + --cpd-color-red-800: #d1212a; + --cpd-color-red-700: #9f0d1e; + --cpd-color-red-600: #830009; + --cpd-color-red-500: #710000; + --cpd-color-red-400: #590000; + --cpd-color-red-300: #470000; + --cpd-color-red-200: #3e0000; + --cpd-color-red-100: #370000; + */ + + --cpd-color-gray-1400: #eeeeee; + --cpd-color-gray-1300: #e0e0e0; + --cpd-color-gray-1200: #b3b3b3; + --cpd-color-gray-1100: #aaaaaa; + --cpd-color-gray-1000: #9e9e9e; + --cpd-color-gray-900: #808080; + --cpd-color-gray-800: #757575; + --cpd-color-gray-700: #424242; + --cpd-color-gray-600: #424242; + --cpd-color-gray-500: #424242; + --cpd-color-gray-400: #303030; + --cpd-color-gray-300: #212121; + --cpd-color-gray-200: #212121; + --cpd-color-gray-100: #171717; + --cpd-color-theme-bg: #171717; +} + +.cpd-theme-light.cpd-theme-light { + /* TODO? + --cpd-color-alpha-gray-1400: hsla(223, 64%, 2%, 0.9); + --cpd-color-alpha-gray-1300: hsla(225, 57%, 3%, 0.84); + --cpd-color-alpha-gray-1200: hsla(213, 73%, 3%, 0.77); + --cpd-color-alpha-gray-1100: hsla(215, 74%, 5%, 0.71); + --cpd-color-alpha-gray-1000: hsla(218, 79%, 6%, 0.66); + --cpd-color-alpha-gray-900: hsla(213, 83%, 7%, 0.61); + --cpd-color-alpha-gray-800: hsla(213, 87%, 9%, 0.5); + --cpd-color-alpha-gray-700: hsla(215, 96%, 10%, 0.35); + --cpd-color-alpha-gray-600: hsla(212, 97%, 12%, 0.26); + --cpd-color-alpha-gray-500: hsla(212, 87%, 15%, 0.2); + --cpd-color-alpha-gray-400: hsla(213, 90%, 20%, 0.12); + --cpd-color-alpha-gray-300: hsla(216, 89%, 18%, 0.06); + --cpd-color-alpha-gray-200: hsla(200, 41%, 36%, 0.04); + --cpd-color-alpha-gray-100: hsla(210, 48%, 41%, 0.02); + + --cpd-color-alpha-green-1400: hsl(149, 100%, 7%, 1); + --cpd-color-alpha-green-1300: hsl(157, 100%, 10%, 1); + --cpd-color-alpha-green-1200: hsl(162, 100%, 14%, 1); + --cpd-color-alpha-green-1100: hsl(165, 100%, 18%, 1); + --cpd-color-alpha-green-1000: hsl(166, 100%, 21%, 1); + --cpd-color-alpha-green-900: hsl(168, 100%, 24%, 1); + --cpd-color-alpha-green-800: hsl(166, 100%, 30%, 1); + --cpd-color-alpha-green-700: hsla(163, 99%, 38%, 0.96); + --cpd-color-alpha-green-600: hsla(156, 99%, 36%, 0.56); + --cpd-color-alpha-green-500: hsla(154, 96%, 37%, 0.41); + --cpd-color-alpha-green-400: hsla(151, 93%, 37%, 0.23); + --cpd-color-alpha-green-300: hsla(150, 100%, 36%, 0.11); + --cpd-color-alpha-green-200: hsla(150, 79%, 41%, 0.06); + --cpd-color-alpha-green-100: hsla(156, 79%, 41%, 0.03); + */ + + /* TODO accent variants? */ + --cpd-color-green-1400: #33691E; + --cpd-color-green-1300: #33691E; + --cpd-color-green-1200: #33691E; + --cpd-color-green-1100: #33691E; + --cpd-color-green-1000: #33691E; + --cpd-color-green-900: #33691E; + --cpd-color-green-800: #33691E; + --cpd-color-green-700: #8BC34A; + --cpd-color-green-600: #8BC34A; + --cpd-color-green-500: #8BC34A; + --cpd-color-green-400: #8BC34A; + --cpd-color-green-300: #C5E1A5; + --cpd-color-green-200: #DCEDC8; + --cpd-color-green-100: #F1F8E9; + + /* TODO + --cpd-color-red-1400: #450000; + --cpd-color-red-1300: #620000; + --cpd-color-red-1200: #850006; + --cpd-color-red-1100: #a4041d; + --cpd-color-red-1000: #bc0f22; + --cpd-color-red-900: #d51928; + --cpd-color-red-800: #ff3d3d; + --cpd-color-red-700: #ff8c81; + --cpd-color-red-600: #ffafa5; + --cpd-color-red-500: #ffc5bc; + --cpd-color-red-400: #ffdfda; + --cpd-color-red-300: #ffefec; + --cpd-color-red-200: #fff7f6; + --cpd-color-red-100: #fffaf9; + */ + + --cpd-color-gray-1400: #212121; + --cpd-color-gray-1300: #212121; + --cpd-color-gray-1200: #424242; + --cpd-color-gray-1100: #424242; + --cpd-color-gray-1000: #616161; + --cpd-color-gray-900: #616161; + --cpd-color-gray-800: #808080; + --cpd-color-gray-700: #b3b3b3; + --cpd-color-gray-600: #b3b3b3; + --cpd-color-gray-500: #cdd3da; + --cpd-color-gray-400: #e0e0e0; + --cpd-color-gray-300: #f5f5f5; + --cpd-color-gray-200: #f5f5f5; + --cpd-color-gray-100: #fafafa; + --cpd-color-theme-bg: #ffffff; +} diff --git a/setup.sh b/setup.sh index 98aabe1..65e945a 100755 --- a/setup.sh +++ b/setup.sh @@ -25,9 +25,15 @@ popd pushd element-desktop $yarn install -ln -s ../element-web/webapp ./ || true +# Seshat: compare https://github.com/element-hq/element-desktop/blob/develop/docs/native-node-modules.md#adding-seshat-for-search-in-e2e-encrypted-rooms +$yarn add matrix-seshat +#$yarn add electron-build-env +#$yarn run electron-build-env -- --electron "$electron_version" -- neon build matrix-seshat --release popd pushd i18n-helper $yarn install popd + +# CSS overrides +cp res/css/* matrix-react-sdk/res/css/ diff --git a/theme.sh b/theme.sh new file mode 100755 index 0000000..2255068 --- /dev/null +++ b/theme.sh @@ -0,0 +1,189 @@ +#!/bin/bash + +set -e +shopt -s globstar + +mydir="$(dirname "$(realpath "$0")")" +automatic_commit="$1" + +pushd "$mydir/matrix-react-sdk" > /dev/null + +if [[ "$automatic_commit" == [Yy]* ]]; then + # Require clean git state + uncommitted=`git status --porcelain` + if [ ! -z "$uncommitted" ]; then + echo "Uncommitted changes are present, please commit first!" + exit 1 + fi +fi + +M_ACCENT="#8bc34a" +M_ACCENT_DEC="139, 195, 74" +M_ACCENT_DARK="#33691e" +M_ACCENT_LIGHT="#dcedc8" +M_ALERT="#e53935" +M_LINK="#368bd6" + +replace_colors() { + local f="$1" + if [[ "$f" =~ "dark" ]]; then + echo "Replacing colors (dark) for $f..." + BG_ACCENT="$M_ACCENT_DARK" + CODEBLOCK_BORDER_COLOR="#121212" + CODEBLOCK_BACKGROUND_COLOR="#121212" + PILL_COLOR="rgba(255, 255, 255, 0.15)" + PILL_HOVER_COLOR="rgba(255, 255, 255, 0.18)" + PRESENCE_OFFLINE="#e0e0e0" # not applied because not existing specifically for dark + MESSAGE_BUBBLE_BACKGROUND="#424242" + MESSAGE_BUBBLE_BACKGROUND_SELF="#303030" + MESSAGE_BUBBLE_BACKGROUND_SELECTED="#212121" + ROOMLIST_BG_COLOR="#303030" + SPACELIST_BG_COLOR="#424242" + else + echo "Replacing colors (light) for $f..." + BG_ACCENT="$M_ACCENT_LIGHT" + CODEBLOCK_BORDER_COLOR="#00000010" + CODEBLOCK_BACKGROUND_COLOR="#00000010" + PILL_COLOR="rgba(0, 0, 0, 0.13)" + PILL_HOVER_COLOR="rgba(0, 0, 0, 0.1)" + PRESENCE_OFFLINE="#bdbdbd" # for light this should actually be darker + MESSAGE_BUBBLE_BACKGROUND="#eeeeee" + MESSAGE_BUBBLE_BACKGROUND_SELF="#f1f8e9" + MESSAGE_BUBBLE_BACKGROUND_SELECTED="#e0e0e0" + ROOMLIST_BG_COLOR="#eeeeee" + SPACELIST_BG_COLOR="#fafafa" + fi + # Neutral colors + sed -i 's|#15171b|#212121|gi' "$f" + sed -i 's|#15191E|#212121|gi' "$f" + sed -i 's|#2e2f32|#212121|gi' "$f" + sed -i 's|#232f32|#212121|gi' "$f" + sed -i 's|#27303a|#212121|gi' "$f" + sed -i 's|#17191C|#212121|gi' "$f" + sed -i 's|#181b21|#303030|gi' "$f" + sed -i 's|#1A1D23|#303030|gi' "$f" + sed -i 's|#20252B|#303030|gi' "$f" + sed -i 's|#20252c|#303030|gi' "$f" + sed -i 's|#21262c|#383838|gi' "$f" # selection/hover color + sed -i 's|#238cf5|#303030|gi' "$f" + sed -i 's|#25271F|#303030|gi' "$f" + sed -i 's|#272c35|#303030|gi' "$f" + sed -i 's|#2a3039|#303030|gi' "$f" + sed -i 's|#343a46|#424242|gi' "$f" + sed -i 's|#3c4556|#424242|gi' "$f" + sed -i 's|#3d3b39|#424242|gi' "$f" + sed -i 's|#45474a|#424242|gi' "$f" + sed -i 's|#454545|#424242|gi' "$f" + sed -i 's|#2e3649|#424242|gi' "$f" + sed -i 's|#4e5054|#424242|gi' "$f" + sed -i 's|#394049|#424242|gi' "$f" + sed -i 's|#3e444c|#424242|gi' "$f" + sed -i 's|#61708b|#616161|gi' "$f" + sed -i 's|#616b7f|#616161|gi' "$f" + sed -i 's|#5c6470|#616161|gi' "$f" + sed -i 's|#545a66|#616161|gi' "$f" # pill hover bg color + sed -i 's|#737D8C|#757575|gi' "$f" + sed -i 's|#6F7882|#757575|gi' "$f" + sed -i 's|#91A1C0|#757575|gi' "$f" # icon in button color + sed -i 's|#8D99A5|#808080|gi' "$f" + sed -i 's|#8E99A4|#808080|gi' "$f" # maybe use #9e9e9e instead + sed -i 's|#8D97A5|#808080|gi' "$f" + sed -i 's|#a2a2a2|#9e9e9e|gi' "$f" + sed -i 's|#9fa9ba|#aaaaaa|gi' "$f" # maybe use #9e9e9e instead + sed -i 's|#acacac|#aaaaaa|gi' "$f" # maybe use #9e9e9e instead + sed -i 's|#B9BEC6|#b3b3b3|gi' "$f" # maybe use #bdbdbd instead + sed -i 's|#a1b2d1|#b3b3b3|gi' "$f" + sed -i 's|#A9B2BC|#b3b3b3|gi' "$f" + sed -i 's|#C1C6CD|#bdbdbd|gi' "$f" + sed -i 's|#c1c9d6|#bdbdbd|gi' "$f" + sed -i 's|#c8c8cd|#cccccc|gi' "$f" # maybe use #bdbdbd instead + # sed -i 's|#dddddd|#e0e0e0|gi' "$f" # really? + sed -i 's|#e7e7e7|#e0e0e0|gi' "$f" + sed -i 's|#e3e8f0|#e0e0e0|gi' "$f" + sed -i 's|#e9e9e9|#e0e0e0|gi' "$f" + sed -i 's|#e9edf1|#e0e0e0|gi' "$f" + sed -i 's|#e8eef5|#e0e0e0|gi' "$f" + sed -i 's|#deddfd|#e0e0e0|gi' "$f" # $location-live-secondary-color, what to use really? + sed -i 's|#edf3ff|#eeeeee|gi' "$f" + sed -i 's|#f4f6fa|#f5f5f5|gi' "$f" + sed -i 's|#f6f7f8|#f5f5f5|gi' "$f" + sed -i 's|#f2f5f8|#f5f5f5|gi' "$f" + sed -i 's|#f5f8fa|#f5f5f5|gi' "$f" + sed -i 's|#f3f8fd|#fafafa|gi' "$f" + sed -i 's|rgba(33, 38, 34,|rgba(48, 48, 48,|gi' "$f" + sed -i 's|rgba(33, 38, 44,|rgba(48, 48, 48,|gi' "$f" + sed -i 's|rgba(34, 38, 46,|rgba(48, 48, 48,|gi' "$f" + sed -i 's|rgba(38, 39, 43,|rgba(48, 48, 48,|gi' "$f" + sed -i 's|rgba(38, 40, 45,|rgba(48, 48, 48,|gi' "$f" + sed -i 's|rgba(46, 48, 51,|rgba(48, 48, 48,|gi' "$f" + sed -i 's|rgba(92, 100, 112,|rgba(97, 97, 97,|gi' "$f" + sed -i 's|rgba(141, 151, 165,|rgba(144, 144, 144,|gi' "$f" + sed -i 's|rgba(242, 245, 248,|rgba(248, 248, 248,|gi' "$f" + + sed -i "s|\\(\$event-highlight-bg-color: \\).*;|\\1transparent;|gi" "$f" + sed -i "s|\\(\$preview-widget-bar-color: \\).*;|\\1#bdbdbd;|gi" "$f" + sed -i "s|\\(\$blockquote-bar-color: \\).*;|\\1#bdbdbd;|gi" "$f" + sed -i "s|\\(\$pill-bg-color: \\).*;|\\1$PILL_COLOR;|gi" "$f" + sed -i "s|\\(\$pill-hover-bg-color: \\).*;|\\1$PILL_HOVER_COLOR;|gi" "$f" + + sed -i "s|\\(\$inlinecode-border-color: \\).*;|\\1$CODEBLOCK_BORDER_COLOR;|gi" "$f" + sed -i "s|\\(\$inlinecode-background-color: \\).*;|\\1$CODEBLOCK_BACKGROUND_COLOR;|gi" "$f" + sed -i "s|\\(\$codeblock-background-color: \\).*;|\\1$CODEBLOCK_BACKGROUND_COLOR;|gi" "$f" + + sed -i "s|\\(\$presence-offline: \\).*;|\\1$PRESENCE_OFFLINE;|gi" "$f" + + sed -i "s|\\(\$roomlist-bg-color: \\).*;|\\1$ROOMLIST_BG_COLOR;|gi" "$f" + sed -i "s|\\(\$spacePanel-bg-color: \\).*;|\\1$SPACELIST_BG_COLOR;|gi" "$f" + + # Accent colors + sed -i "s|#368bd6|$M_ACCENT|gi" "$f" + sed -i "s|#ac3ba8|$M_ACCENT|gi" "$f" + sed -i "s|#0DBD8B|$M_ACCENT|gi" "$f" + sed -i "s|#e64f7a|$M_ACCENT|gi" "$f" + sed -i "s|#ff812d|$M_ACCENT|gi" "$f" + sed -i "s|#2dc2c5|$M_ACCENT|gi" "$f" + sed -i "s|#5c56f5|$M_ACCENT|gi" "$f" + sed -i "s|#74d12c|$M_ACCENT|gi" "$f" + sed -i "s|#76CFA6|$M_ACCENT|gi" "$f" + sed -i "s|#03b381|$M_ACCENT|gi" "$f" + sed -i "s|rgba(3, 179, 129,|rgba($M_ACCENT_DEC,|gi" "$f" + sed -i "s|#03b381|$M_ACCENT|gi" "$f" + sed -i "s|#FF5B55|$M_ALERT|gi" "$f" + sed -i "s|\\(\$accent-alt: \\).*;|\\1$M_LINK;|gi" "$f" + #sed -i "s|\\(\$accent-darker: \\).*;|\\1$M_ACCENT_DARK;|gi" "$f" + sed -i "s|\\(\$roomtile-default-badge-bg-color: \\).*;|\\1$M_ACCENT;|gi" "$f" + #sed -i "s|\\(\$input-focused-border-color: \\).*;|\\1\$accent;|gi" "$f" # not existing anymore, need replacement? + sed -i "s|\\(\$reaction-row-button-selected-bg-color: \\).*;|\\1$BG_ACCENT;|gi" "$f" + + # e2e colors + sed -i "s|\\(\$e2e-verified-color: \\).*;|\\1$M_ACCENT;|gi" "$f" + sed -i "s|\\(\$e2e-unknown-color: \\).*;|\\1#ffc107;|gi" "$f" + sed -i "s|\\(\$e2e-unverified-color: \\).*;|\\1#ffc107;|gi" "$f" + sed -i "s|\\(\$e2e-warning-color: \\).*;|\\1$M_ALERT;|gi" "$f" + + # Message bubbles + sed -i "s|\\(\$eventbubble-self-bg: \\).*;|\$eventbubble-self-bg: $MESSAGE_BUBBLE_BACKGROUND_SELF;|gi" "$f" + sed -i "s|\\(\$eventbubble-others-bg: \\).*;|\$eventbubble-others-bg: $MESSAGE_BUBBLE_BACKGROUND;|gi" "$f" + sed -i "s|\\(\$eventbubble-bg-hover: \\).*;|\$eventbubble-bg-hover: $MESSAGE_BUBBLE_BACKGROUND_SELECTED;|gi" "$f" + #sed -i "s|\\(\$eventbubble-reply-color: \\).*;$||gi" "$f" +} + +replace_colors res/themes/light/css/light.pcss +replace_colors res/themes/light/css/_light.pcss +replace_colors res/themes/legacy-light/css/legacy-light.pcss +replace_colors res/themes/legacy-light/css/_legacy-light.pcss +replace_colors res/themes/dark/css/dark.pcss +replace_colors res/themes/dark/css/_dark.pcss +replace_colors res/themes/legacy-dark/css/legacy-dark.pcss +replace_colors res/themes/legacy-dark/css/_legacy-dark.pcss +for f in res/**/*.svg; do + replace_colors "$f" +done + +if [[ "$automatic_commit" == [Yy]* ]]; then + # see: https://devops.stackexchange.com/a/5443 + git add -A + git diff-index --quiet HEAD || git commit -m "Automatic theme update" +fi + +popd > /dev/null