diff --git a/.gitignore b/.gitignore
index 1937f78..5f833c9 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,3 +1,4 @@
release.mk
/release
/local-pkgbuild
+bom.lock
diff --git a/Makefile b/Makefile
index 9e111bc..fbb47a2 100644
--- a/Makefile
+++ b/Makefile
@@ -1,5 +1,6 @@
-.PHONY: all setup regenerate-i18n reskindex web desktop-common linux debian pacman local-pkgbuild local-pkgbuild-install windows windows-portable
-.PHONY: web-release debian-release pacman-release windows-setup-release windows-unpacked-release windows-portable-release windows-release
+.PHONY: all setup regenerate-i18n reskindex web desktop-common linux debian rpm pacman local-pkgbuild local-pkgbuild-install windows windows-portable
+.PHONY: web-release debian-release rpm-release pacman-release windows-setup-release windows-unpacked-release windows-portable-release windows-release
+.PHONY: macos-common macos macos-mas macos-release macos-mas-release icns
.PHONY: clean
CFGDIR ?= configs/sc
@@ -19,6 +20,7 @@ OUT_WEB := $(WEB_OUT)/$(WEB_APP_NAME)-$(WEB_OUT_DIST_VERSION).tar.gz
DESKTOP_OUT := element-desktop/dist
OUT_DEB64 := $(DESKTOP_OUT)/$(DESKTOP_APP_NAME)_$(VERSION)_amd64.deb
+OUT_RPM64 := $(DESKTOP_OUT)/$(DESKTOP_APP_NAME)-$(VERSION).x86_64.rpm
OUT_PAC64 := $(DESKTOP_OUT)/$(DESKTOP_APP_NAME)-$(VERSION).pacman
OUT_APPIMAGE64 := $(DESKTOP_OUT)/$(PRODUCT_NAME)-$(VERSION).AppImage
OUT_TARXZ64 := $(DESKTOP_OUT)/$(DESKTOP_APP_NAME)-$(VERSION).tar.xz
@@ -27,17 +29,34 @@ OUT_WIN64_PORTABLE := $(DESKTOP_OUT)/$(PRODUCT_NAME)\ $(VERSION).exe
OUT_WIN64_BETTER_NAME := $(PRODUCT_NAME)_Setup_v$(VERSION).exe
OUT_WIN64_UNPACKED_BETTER_NAME := $(PRODUCT_NAME)_win-unpacked_v$(VERSION).zip
OUT_WIN64_PORTABLE_BETTER_NAME := $(PRODUCT_NAME)_win-portable_v$(VERSION)
-OUT_MACOS := $(DESKTOP_OUT)/$(PRODUCT_NAME)-$(VERSION).dmg
+OUT_MACOS := $(DESKTOP_OUT)/$(PRODUCT_NAME)-$(VERSION)-universal.dmg
+OUT_MACOS_MAS := $(DESKTOP_OUT)/mas-universal/$(PRODUCT_NAME).app
RELEASE_DIR := release
CURRENT_RELEASE_DIR := $(RELEASE_DIR)/$(VERSION)
+# macOS Codesigning
+CSC_IDENTITY_AUTO_DISCOVERY ?= false
+NOTARIZE_APPLE_ID ?=
+CSC_NAME ?=
-include release.mk
setup:
if [ ! -L "element-desktop/webapp" ]; then ./setup.sh; fi
+element-desktop/build/SchildiChat.xcassets/SchildiChat.iconset: $(wildcard element-desktop/build/SchildiChat.xcassets/SchildiChat.iconset/*)
+
+element-desktop/build/icon.icns: element-desktop/build/SchildiChat.xcassets/SchildiChat.iconset
+ iconutil -c icns -o $@ $<
+
+element-desktop/build/SchildiChat.xcassets/SchildiChatDMG.iconset: $(wildcard element-desktop/build/SchildiChat.xcassets/SchildiChatDMG.iconset/*)
+
+element-desktop/build/dmg.icns: element-desktop/build/SchildiChat.xcassets/SchildiChatDMG.iconset
+ iconutil -c icns -o $@ $<
+
+icns: element-desktop/build/icon.icns element-desktop/build/dmg.icns
+
regenerate-i18n: setup
./regenerate_i18n.sh
@@ -55,26 +74,41 @@ desktop-common: web
$(YARN) --cwd element-desktop run fetch --cfgdir ''
$(YARN) --cwd element-desktop run build:native
+macos-common: web icns
+ $(YARN) --cwd element-desktop run fetch --cfgdir ''
+ $(YARN) --cwd element-desktop run build:native:universal
+
linux: desktop-common
- $(YARN) --cwd element-desktop run build64linux
+ $(YARN) --cwd element-desktop run build:64 --linux deb pacman tar.xz
debian: desktop-common
- $(YARN) --cwd element-desktop run build64deb
+ $(YARN) --cwd element-desktop run build:64 --linux deb
+
+rpm: desktop-common
+ $(YARN) --cwd element-desktop run build:64 --linux rpm
pacman: desktop-common
- $(YARN) --cwd element-desktop run build64pacman
+ $(YARN) --cwd element-desktop run build:64 --linux pacman
appimage: desktop-common
- $(YARN) --cwd element-desktop run build64appimage
+ $(YARN) --cwd element-desktop run build:64 --linux AppImage
windows: desktop-common
- $(YARN) --cwd element-desktop run build64windows
+ $(YARN) --cwd element-desktop run build:64 --windows nsis
windows-portable: desktop-common
- $(YARN) --cwd element-desktop run build64windows-portable
+ $(YARN) --cwd element-desktop run build:64 --windows portable
-macos: desktop-common
- $(YARN) --cwd element-desktop run build --mac dmg -c.mac.identity=null
+macos: macos-common
+ export CSC_IDENTITY_AUTO_DISCOVERY
+ export NOTARIZE_APPLE_ID
+ export CSC_NAME
+ $(YARN) --cwd element-desktop run build:universal --mac dmg
+
+macos-mas: macos-common
+ export NOTARIZE_APPLE_ID
+ export CSC_NAME
+ $(YARN) --cwd element-desktop run build:universal --mac mas
local-pkgbuild: debian
./create_local_pkgbuild.sh $(VERSION) $(DESKTOP_APP_NAME) $(PRODUCT_NAME) $(OUT_DEB64)
@@ -90,6 +124,10 @@ debian-release: debian
mkdir -p $(CURRENT_RELEASE_DIR)
cp $(OUT_DEB64) $(CURRENT_RELEASE_DIR)
+rpm-release: rpm
+ mkdir -p $(CURRENT_RELEASE_DIR)
+ cp $(OUT_RPM64) $(CURRENT_RELEASE_DIR)
+
pacman-release: pacman
mkdir -p $(CURRENT_RELEASE_DIR)
cp $(OUT_PAC64) $(CURRENT_RELEASE_DIR)
@@ -115,6 +153,14 @@ macos-release: macos
mkdir -p $(CURRENT_RELEASE_DIR)
cp $(OUT_MACOS) $(CURRENT_RELEASE_DIR)
+macos-mas-release: macos-mas
+ mkdir -p $(CURRENT_RELEASE_DIR)
+ cp $(OUT_MACOS_MAS) $(CURRENT_RELEASE_DIR)
+
+bom.lock: element-desktop/yarn.lock element-web/yarn.lock matrix-js-sdk/yarn.lock matrix-react-sdk/yarn.lock
+ ./build-bom.sh
+bom: bom.lock
+
clean:
$(YARN) --cwd matrix-js-sdk clean
$(YARN) --cwd matrix-react-sdk clean
@@ -123,3 +169,4 @@ clean:
rm -f element-desktop/webapp
rm -rf element-web/dist
rm -rf local-pkgbuild
+ rm -f bom.lock
diff --git a/README.md b/README.md
index 4f6500d..821ed19 100644
--- a/README.md
+++ b/README.md
@@ -3,7 +3,7 @@
SchildiChat Web/Desktop is a fork of Element [Web](https://github.com/vector-im/element-web)/[Desktop](https://github.com/vector-im/element-desktop).
The most important changes of SchildiChat Web/Desktop compared to Element Web/Desktop are:
-- A unifed chat list for both direct and group chats
+- A unified chat list for both direct and group chats
- Message bubbles
- Bigger items in the room list
- … and more!
@@ -18,7 +18,14 @@ Feel free to [join the discussion on matrix](https://matrix.to/#/#schildichat-we
## Building SchildiChat Web/Desktop
-This particular repo is a wrapper project for element-desktop, element-web, matrix-react-sdk and matrix-js-sdk in order to build SchildiChat Web **and** 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.
+
+
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)
+|-- matrix-react-sdk (most of the development happens here)
+`-- matrix-js-sdk (Matrix client js sdk)
+
### Install dependencies
@@ -57,6 +64,14 @@ $ source .bashrc
brew install tcl rust node gpg vim curl git yarn git make gcc
```
+#### Signed macOS builds
+
+To sign a macOS build set the environment or make variable `CSC_IDENTITY_AUTO_DISCOVERY` to true
+or set `CSC_NAME` to your certificate name or id.
+
+To notarize a build with Apple set `NOTARIZE_APPLE_ID` to your AppleID and set the keychain item
+`NOTARIZE_CREDS` to an App specific AppleID password.
+
### Initial setup
@@ -81,6 +96,7 @@ After that these packages which belong to to their respective make target should
- `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
#### 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`
diff --git a/build-bom.sh b/build-bom.sh
new file mode 100755
index 0000000..4032fa4
--- /dev/null
+++ b/build-bom.sh
@@ -0,0 +1,46 @@
+# /usr/bin/env bash
+cat element-desktop/yarn.lock > bom.lock
+echo "" >> bom.lock
+cat element-web/yarn.lock >> bom.lock
+echo "" >> bom.lock
+cat matrix-js-sdk/yarn.lock >> bom.lock
+echo "" >> bom.lock
+cat matrix-react-sdk/yarn.lock >> bom.lock
+echo "" >> bom.lock
+
+# matrix-seshat
+cat << EOF >> bom.lock
+matrix-seshat@2.3.0:
+ version "2.3.0"
+ resolved "https://github.com/matrix-org/seshat/archive/refs/heads/master.tar.gz"
+ integrity sha512-y4xtZViRX/h0zczl5hiqWyFNK7np0vVujQ/l47g1Mm7B7mDTHAneSSy/d5GADeUIsezZyvT3qKhSCwSSyqS8Xw==
+ dependencies:
+ sqlcipher "~m1"
+ openssl "~1.1.1f"
+
+sqlcipher@m1:
+ version "m1"
+ resolved "https://github.com/SchildiChat/sqlcipher/archive/refs/heads/m1.tar.gz"
+ integrity sha512-1Nk7J0dQyVedFLqnxUJQWrf/VBsUsfC5vAYaHDH3LRbWarfKDGYduZrhdBuzgAF+kMA237HaDt9Tq+CcXV0EJA==
+
+openssl@1.1.1f:
+ version "1.1.1f"
+ resolved "https://www.openssl.org/source/openssl-1.1.1f.tar.gz"
+ integrity sha512-sAvZta1SmPvO7sa7GcGrDBBspc+zEXhJfFi/fg4M8w/MGcIPhOI68xzBJr8kR9Pk+EYduXuvp7149pVhky8ADA==
+EOF
+echo "" >> bom.lock
+
+# keytar
+cat << EOF >> bom.lock
+keytar@^5.6.0:
+ version "5.6.0"
+ resolved "https://github.com/atom/node-keytar/archive/refs/tags/v5.6.0.tar.gz"
+ integrity sha512-dPdXLrm8AlqooT0ZS7y/mYif0DmQXoGGrqomwfl6ugIEHlpL1D+hJYhjyMC00TK924vOGD1a6OhDS2+RKEffXA==
+ dependencies:
+ libsecret "~0.20.3"
+
+libsecret@0.20.3:
+ version "0.20.3"
+ resolved "https://gitlab.gnome.org/GNOME/libsecret/-/archive/0.20.3/libsecret-0.20.3.tar.gz"
+ integrity sha512-tbD1jNKEEW9bPWuyd5YZ68eQjHhXOsy5PseVwleWYMEXgrrPPGnGGrLzSFUXRzNulFceLMeUG49Qr1rnyvfa1A==
+EOF
diff --git a/configs/sc/config.json b/configs/sc/config.json
index dfc32f4..3a229d0 100644
--- a/configs/sc/config.json
+++ b/configs/sc/config.json
@@ -26,5 +26,12 @@
"url": "https://schildi.chat/desktop/privacy",
"text": "Privacy Policy"
}
- ]
+ ],
+ "sc_update_announcement_room": {
+ "room_id_or_alias": "!JwTYjASnrfLEJQGQvt:matrix.org",
+ "via_servers": [
+ "supercable.onl",
+ "spiritcroc.de"
+ ]
+ }
}
diff --git a/deploy/create-github-release.sh b/deploy/create-github-release.sh
index d0cab53..b93f7d5 100755
--- a/deploy/create-github-release.sh
+++ b/deploy/create-github-release.sh
@@ -15,7 +15,7 @@ release_notes_file="/tmp/scrn.md"
owner=SchildiChat
repo=schildichat-desktop
-target=sc
+target=master
# Define variables
GH_API="https://api.github.com"
diff --git a/deploy/update-flathub.sh b/deploy/update-flathub.sh
index da21f06..28f228c 100755
--- a/deploy/update-flathub.sh
+++ b/deploy/update-flathub.sh
@@ -13,7 +13,6 @@ repourl="git@github.com:flathub/chat.schildi.desktop.git"
downloadurl="https://github.com/SchildiChat/schildichat-desktop/releases/download/v${version}/schildichat-desktop_${version}_amd64.deb"
sha256sum=($(sha256sum $debpath))
-debsize=($(wc -c $debpath))
debdate=$(date +%Y-%m-%d -r $debpath)
[ -d "$repopath" ] || git clone $repourl $repopath
@@ -23,20 +22,15 @@ pushd "$repopath" > /dev/null
git fetch
git reset --hard origin/master
-jsonFile="chat.schildi.desktop.json"
-jsonString=$(jq -r "." $jsonFile)
-
+yamlFile="chat.schildi.desktop.yaml"
xmlFile="chat.schildi.desktop.appdata.xml"
-jsonString=$(echo $jsonString | jq -r ".modules[]? |= ((select(.name?==\"schildichat\") | .sources[0].url = \"${downloadurl}\") // .)")
-jsonString=$(echo $jsonString | jq -r ".modules[]? |= ((select(.name?==\"schildichat\") | .sources[0].sha256 = \"${sha256sum}\") // .)")
-jsonString=$(echo $jsonString | jq -r ".modules[]? |= ((select(.name?==\"schildichat\") | .sources[0].size = ${debsize}) // .)")
+sed -i "s|url: .* #SC:url|url: $downloadurl #SC:url|" "$yamlFile"
+sed -i "s|sha256: .* #SC:sha256|sha256: $sha256sum #SC:sha256|" "$yamlFile"
-echo $jsonString | jq --indent 4 "." > $jsonFile
+sed -i "s|^\s\s$| \n |" "$xmlFile"
-sed -i "s|^\s\s$| \n |" $xmlFile
-
-git add $jsonFile $xmlFile
+git add $yamlFile $xmlFile
git commit -m "Bump version to v$version"
git push
diff --git a/element-desktop b/element-desktop
index 820d349..de5f137 160000
--- a/element-desktop
+++ b/element-desktop
@@ -1 +1 @@
-Subproject commit 820d3496094c6396509d048a83b6cb3e99a51fb3
+Subproject commit de5f137d4e37c7527596b4d910cb13a23b090dca
diff --git a/element-web b/element-web
index 37703fb..615ecdc 160000
--- a/element-web
+++ b/element-web
@@ -1 +1 @@
-Subproject commit 37703fbbcdd3b032361efa72ec6a8ae491e428df
+Subproject commit 615ecdc6d663431807884d4bb7c1d66ea684a3c9
diff --git a/flake.lock b/flake.lock
new file mode 100644
index 0000000..7e563d6
--- /dev/null
+++ b/flake.lock
@@ -0,0 +1,26 @@
+{
+ "nodes": {
+ "nixpkgs": {
+ "locked": {
+ "lastModified": 1630504215,
+ "narHash": "sha256-H5pzwo7z3e7ZatwuwWY25oZSejchO+ZH/XtMi8/PXLw=",
+ "owner": "yu-re-ka",
+ "repo": "nixpkgs",
+ "rev": "979e5916df0e6830a2b1ee999632de9a9d2beb23",
+ "type": "github"
+ },
+ "original": {
+ "owner": "NixOS",
+ "repo": "nixpkgs",
+ "type": "github"
+ }
+ },
+ "root": {
+ "inputs": {
+ "nixpkgs": "nixpkgs"
+ }
+ }
+ },
+ "root": "root",
+ "version": 7
+}
diff --git a/flake.nix b/flake.nix
new file mode 100644
index 0000000..cc71b74
--- /dev/null
+++ b/flake.nix
@@ -0,0 +1,29 @@
+{
+ description = "The SchildiChat Matrix client";
+
+ inputs.nixpkgs.url = github:NixOS/nixpkgs;
+
+ outputs = { self, nixpkgs }: let
+ systems = [ "x86_64-linux" "i686-linux" "aarch64-linux" "x86_64-darwin" "aarch64-darwin" ];
+ forAllSystems = f: nixpkgs.lib.genAttrs systems (system: f system);
+
+ overlay = import ./nix/overlay.nix;
+
+ # Memoize nixpkgs for different platforms for efficiency.
+ nixpkgsFor = forAllSystems (system:
+ import nixpkgs {
+ inherit system;
+ overlays = [ overlay ];
+ });
+ in {
+ inherit overlay;
+
+ packages = builtins.mapAttrs (system: pkgs: {
+ inherit (pkgs)
+ schildichat-web
+ schildichat-desktop
+ schildichat-desktop-wayland
+ ;
+ }) nixpkgsFor;
+ };
+}
diff --git a/i18n-overlays/element-desktop/es.json b/i18n-overlays/element-desktop/es.json
new file mode 100644
index 0000000..928eceb
--- /dev/null
+++ b/i18n-overlays/element-desktop/es.json
@@ -0,0 +1,3 @@
+{
+ "Show": "Mostrar"
+}
diff --git a/i18n-overlays/element-desktop/et.json b/i18n-overlays/element-desktop/et.json
new file mode 100644
index 0000000..949f6a3
--- /dev/null
+++ b/i18n-overlays/element-desktop/et.json
@@ -0,0 +1,3 @@
+{
+ "Show": "Näita"
+}
diff --git a/i18n-overlays/element-desktop/eu.json b/i18n-overlays/element-desktop/eu.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/i18n-overlays/element-desktop/eu.json
@@ -0,0 +1 @@
+{}
diff --git a/i18n-overlays/element-desktop/fa.json b/i18n-overlays/element-desktop/fa.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/i18n-overlays/element-desktop/fa.json
@@ -0,0 +1 @@
+{}
diff --git a/i18n-overlays/element-desktop/fr.json b/i18n-overlays/element-desktop/fr.json
new file mode 100644
index 0000000..e611c40
--- /dev/null
+++ b/i18n-overlays/element-desktop/fr.json
@@ -0,0 +1,3 @@
+{
+ "Show": "Afficher"
+}
diff --git a/i18n-overlays/element-desktop/hu.json b/i18n-overlays/element-desktop/hu.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/i18n-overlays/element-desktop/hu.json
@@ -0,0 +1 @@
+{}
diff --git a/i18n-overlays/element-desktop/lt.json b/i18n-overlays/element-desktop/lt.json
new file mode 100644
index 0000000..4eb3e4a
--- /dev/null
+++ b/i18n-overlays/element-desktop/lt.json
@@ -0,0 +1,3 @@
+{
+ "Show": "Rodyti"
+}
diff --git a/i18n-overlays/element-desktop/nb_NO.json b/i18n-overlays/element-desktop/nb_NO.json
new file mode 100644
index 0000000..640dd4a
--- /dev/null
+++ b/i18n-overlays/element-desktop/nb_NO.json
@@ -0,0 +1,3 @@
+{
+ "Show": "Vis"
+}
diff --git a/i18n-overlays/element-desktop/nl.json b/i18n-overlays/element-desktop/nl.json
new file mode 100644
index 0000000..58f6006
--- /dev/null
+++ b/i18n-overlays/element-desktop/nl.json
@@ -0,0 +1,3 @@
+{
+ "Show": "Tonen"
+}
diff --git a/i18n-overlays/element-desktop/pl.json b/i18n-overlays/element-desktop/pl.json
new file mode 100644
index 0000000..b1e2f15
--- /dev/null
+++ b/i18n-overlays/element-desktop/pl.json
@@ -0,0 +1,3 @@
+{
+ "Show": "Pokaż"
+}
diff --git a/i18n-overlays/element-desktop/pt_BR.json b/i18n-overlays/element-desktop/pt_BR.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/i18n-overlays/element-desktop/pt_BR.json
@@ -0,0 +1 @@
+{}
diff --git a/i18n-overlays/element-desktop/ru.json b/i18n-overlays/element-desktop/ru.json
new file mode 100644
index 0000000..cec22f6
--- /dev/null
+++ b/i18n-overlays/element-desktop/ru.json
@@ -0,0 +1,3 @@
+{
+ "Show": "Показать"
+}
diff --git a/i18n-overlays/element-desktop/sk.json b/i18n-overlays/element-desktop/sk.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/i18n-overlays/element-desktop/sk.json
@@ -0,0 +1 @@
+{}
diff --git a/i18n-overlays/element-web/en_EN.json b/i18n-overlays/element-web/en_EN.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/i18n-overlays/element-web/en_EN.json
@@ -0,0 +1 @@
+{}
diff --git a/i18n-overlays/element-web/es.json b/i18n-overlays/element-web/es.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/i18n-overlays/element-web/es.json
@@ -0,0 +1 @@
+{}
diff --git a/i18n-overlays/element-web/et.json b/i18n-overlays/element-web/et.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/i18n-overlays/element-web/et.json
@@ -0,0 +1 @@
+{}
diff --git a/i18n-overlays/element-web/eu.json b/i18n-overlays/element-web/eu.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/i18n-overlays/element-web/eu.json
@@ -0,0 +1 @@
+{}
diff --git a/i18n-overlays/element-web/fa.json b/i18n-overlays/element-web/fa.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/i18n-overlays/element-web/fa.json
@@ -0,0 +1 @@
+{}
diff --git a/i18n-overlays/element-web/fr.json b/i18n-overlays/element-web/fr.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/i18n-overlays/element-web/fr.json
@@ -0,0 +1 @@
+{}
diff --git a/i18n-overlays/element-web/hu.json b/i18n-overlays/element-web/hu.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/i18n-overlays/element-web/hu.json
@@ -0,0 +1 @@
+{}
diff --git a/i18n-overlays/element-web/lt.json b/i18n-overlays/element-web/lt.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/i18n-overlays/element-web/lt.json
@@ -0,0 +1 @@
+{}
diff --git a/i18n-overlays/element-web/nb_NO.json b/i18n-overlays/element-web/nb_NO.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/i18n-overlays/element-web/nb_NO.json
@@ -0,0 +1 @@
+{}
diff --git a/i18n-overlays/element-web/nl.json b/i18n-overlays/element-web/nl.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/i18n-overlays/element-web/nl.json
@@ -0,0 +1 @@
+{}
diff --git a/i18n-overlays/element-web/pl.json b/i18n-overlays/element-web/pl.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/i18n-overlays/element-web/pl.json
@@ -0,0 +1 @@
+{}
diff --git a/i18n-overlays/element-web/pt_BR.json b/i18n-overlays/element-web/pt_BR.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/i18n-overlays/element-web/pt_BR.json
@@ -0,0 +1 @@
+{}
diff --git a/i18n-overlays/element-web/ru.json b/i18n-overlays/element-web/ru.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/i18n-overlays/element-web/ru.json
@@ -0,0 +1 @@
+{}
diff --git a/i18n-overlays/element-web/sk.json b/i18n-overlays/element-web/sk.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/i18n-overlays/element-web/sk.json
@@ -0,0 +1 @@
+{}
diff --git a/i18n-overlays/matrix-react-sdk/cs.json b/i18n-overlays/matrix-react-sdk/cs.json
index f221168..0830b04 100644
--- a/i18n-overlays/matrix-react-sdk/cs.json
+++ b/i18n-overlays/matrix-react-sdk/cs.json
@@ -1,7 +1,13 @@
{
"Enable layout with message bubbles": "Povolit bubliny zpráv",
"Show message bubbles on one side only": "Bubliny zpráv zobrazit pouze na jedné straně",
- "Show message bubbles depending on the width either on both sides or only on one side": "Bubliny zpráv zobrazit v závislosti na šířce stránky buď na obou stranách, nebo pouze na jedné straně.",
+ "Show message bubbles depending on the width either on both sides or only on one side": "Bubliny zpráv zobrazit v závislosti na šířce stránky buď na obou stranách, nebo pouze na jedné straně",
"Message bubbles": "Bubliny zpráv",
- "Normal priority": "Normální priorita"
+ "Normal priority": "Normální priorita",
+ "Message layout": "Vzhled zpráv",
+ "Modern": "Moderní",
+ "Show people and rooms in a combined list": "Zobrazit lidi a místnosti v kombinovaném seznamu",
+ "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"
}
diff --git a/i18n-overlays/matrix-react-sdk/de_DE.json b/i18n-overlays/matrix-react-sdk/de_DE.json
index 0d4dd1b..f7f36b9 100644
--- a/i18n-overlays/matrix-react-sdk/de_DE.json
+++ b/i18n-overlays/matrix-react-sdk/de_DE.json
@@ -103,5 +103,11 @@
"Unable to look up phone number": "Telefonnummer kann nicht gefunden werden",
"The widget will verify your user ID, but won't be able to perform actions for you:": "Das Widget überprüft deine Benutzer-ID, kann jedoch keine Aktionen für dich ausführen:",
"Abort": "Abbrechen",
- "Add existing room": "Existierenden Raum hinzufügen"
+ "Add existing room": "Existierenden Raum hinzufügen",
+ "Message layout": "Nachrichtenlayout",
+ "Modern": "Modern",
+ "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"
}
diff --git a/i18n-overlays/matrix-react-sdk/en_EN.json b/i18n-overlays/matrix-react-sdk/en_EN.json
index 943ae0a..13eda4f 100644
--- a/i18n-overlays/matrix-react-sdk/en_EN.json
+++ b/i18n-overlays/matrix-react-sdk/en_EN.json
@@ -1,7 +1,18 @@
{
- "Enable layout with message bubbles": "Enable layout with message bubbles",
"Show message bubbles on one side only": "Show message bubbles on one side only",
"Show message bubbles depending on the width either on both sides or only on one side": "Show message bubbles depending on the width either on both sides or only on one side",
"Message bubbles": "Message bubbles",
- "Normal priority": "Normal priority"
+ "Normal priority": "Normal priority",
+ "Message layout": "Message layout",
+ "Modern": "Modern",
+ "Show people and rooms in a combined list": "Show people and rooms in a combined list",
+ "Update notifications": "Update notifications",
+ "Do you want to join a room notifying you about new releases? This is especially useful if your platform doesn't support automatic updates for SchildiChat (e.g. Windows and macOS).": "Do you want to join a room notifying you about new releases? This is especially useful if your platform doesn't support automatic updates for SchildiChat (e.g. Windows and macOS).",
+ "Don't ask again": "Don't ask again",
+ "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"
}
diff --git a/i18n-overlays/matrix-react-sdk/es.json b/i18n-overlays/matrix-react-sdk/es.json
new file mode 100644
index 0000000..4db1f36
--- /dev/null
+++ b/i18n-overlays/matrix-react-sdk/es.json
@@ -0,0 +1,7 @@
+{
+ "Show message bubbles on one side only": "mostrar las burbujas de mensajes en un solo lado",
+ "Message bubbles": "Burbujas de mensajes",
+ "Normal priority": "Prioridad normal",
+ "Enable layout with message bubbles": "Activar diseño con mensajes de burbujas",
+ "Show message bubbles depending on the width either on both sides or only on one side": "Mostrar mensajes de burbuja dependiendo del tamaño tanto en ambos lados o solo en un lado"
+}
diff --git a/i18n-overlays/matrix-react-sdk/et.json b/i18n-overlays/matrix-react-sdk/et.json
new file mode 100644
index 0000000..3532664
--- /dev/null
+++ b/i18n-overlays/matrix-react-sdk/et.json
@@ -0,0 +1,7 @@
+{
+ "Enable layout with message bubbles": "Sõnumimullidega paigutuse lubamine",
+ "Show message bubbles on one side only": "Näita sõnumimulle ainult ühel poolel",
+ "Show message bubbles depending on the width either on both sides or only on one side": "Näita sõnumimullid sõltuvalt laiusest kas mõlemal või ainult ühel küljel",
+ "Normal priority": "Tavaline prioriteet",
+ "Message bubbles": "Sõnumimullid"
+}
diff --git a/i18n-overlays/matrix-react-sdk/eu.json b/i18n-overlays/matrix-react-sdk/eu.json
new file mode 100644
index 0000000..fdfdaab
--- /dev/null
+++ b/i18n-overlays/matrix-react-sdk/eu.json
@@ -0,0 +1,7 @@
+{
+ "Show message bubbles on one side only": "Erakutsi mezu burbuilak alde batetik bakarrik",
+ "Message bubbles": "Mezu burbuilak",
+ "Normal priority": "Normala lehentasuna",
+ "Enable layout with message bubbles": "Gaitu diseinua batera mezua burbuilak",
+ "Show message bubbles depending on the width either on both sides or only on one side": "Erakutsi mezu burbuilak arabera zabalera bai, bi aldeetatik edo alde batetik bakarrik"
+}
diff --git a/i18n-overlays/matrix-react-sdk/fa.json b/i18n-overlays/matrix-react-sdk/fa.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/i18n-overlays/matrix-react-sdk/fa.json
@@ -0,0 +1 @@
+{}
diff --git a/i18n-overlays/matrix-react-sdk/fr.json b/i18n-overlays/matrix-react-sdk/fr.json
new file mode 100644
index 0000000..bdab12c
--- /dev/null
+++ b/i18n-overlays/matrix-react-sdk/fr.json
@@ -0,0 +1,9 @@
+{
+ "Show message bubbles on one side only": "Afficher les bulles de message sur un seul côté",
+ "Show message bubbles depending on the width either on both sides or only on one side": "Afficher les bulles de message selon la largeur soit sur un seul côté, soit sur les deux",
+ "Message bubbles": "Bulles de message",
+ "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"
+}
diff --git a/i18n-overlays/matrix-react-sdk/hu.json b/i18n-overlays/matrix-react-sdk/hu.json
new file mode 100644
index 0000000..a048d36
--- /dev/null
+++ b/i18n-overlays/matrix-react-sdk/hu.json
@@ -0,0 +1,7 @@
+{
+ "Enable layout with message bubbles": "Üzenetbuborékos elrendezés engedélyezése",
+ "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"
+}
diff --git a/i18n-overlays/matrix-react-sdk/lt.json b/i18n-overlays/matrix-react-sdk/lt.json
new file mode 100644
index 0000000..cc5bfa9
--- /dev/null
+++ b/i18n-overlays/matrix-react-sdk/lt.json
@@ -0,0 +1,7 @@
+{
+ "Normal priority": "Normalaus prioriteto",
+ "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"
+}
diff --git a/i18n-overlays/matrix-react-sdk/nb_NO.json b/i18n-overlays/matrix-react-sdk/nb_NO.json
new file mode 100644
index 0000000..cd11a91
--- /dev/null
+++ b/i18n-overlays/matrix-react-sdk/nb_NO.json
@@ -0,0 +1,12 @@
+{
+ "Message bubbles": "Meldingsbobler",
+ "Normal priority": "Normal prioritet",
+ "Message layout": "Meldingsvisning",
+ "Modern": "Moderne",
+ "Show people and rooms in a combined list": "Vis folk og rom i kombinert liste",
+ "Update notifications": "Oppdater merknader",
+ "Show message bubbles on one side only": "Vis meldingsbobler kun på én side",
+ "Show message bubbles depending on the width either on both sides or only on one side": "Vis meldingsbobler avhengig av bredden enten på begge sider eller kun på én side",
+ "Don't ask again": "Ikke spør igjen",
+ "Do you want to join a room notifying you about new releases? This is especially useful if your platform doesn't support automatic updates for SchildiChat (e.g. Windows and macOS).": "Ønsker du at et rom skal gi deg merknader om nye utgivelser? Dette er spesielt nyttig hvis din plattform ikke støtter automatiske oppdateringer for SchildiChat (f.eks. Windows og macOS)."
+}
diff --git a/i18n-overlays/matrix-react-sdk/nl.json b/i18n-overlays/matrix-react-sdk/nl.json
new file mode 100644
index 0000000..f98fbac
--- /dev/null
+++ b/i18n-overlays/matrix-react-sdk/nl.json
@@ -0,0 +1,13 @@
+{
+ "Show message bubbles on one side only": "Boodschappenbubbels slechts aan één kant tonen",
+ "Show message bubbles depending on the width either on both sides or only on one side": "Toon berichtbubbels, afhankelijk van de breedte, aan beide zijden of slechts aan één zijde",
+ "Message bubbles": "Boodschap bellen",
+ "Normal priority": "Normale prioriteit",
+ "Enable layout with message bubbles": "Schakel lay-out in met tekstballonnen",
+ "Update notifications": "Update meldingen",
+ "Do you want to join a room notifying you about new releases? This is especially useful if your platform doesn't support automatic updates for SchildiChat (e.g. Windows and macOS).": "Wilt u lid worden van een kamer waarin u wordt geïnformeerd over nieuwe releases? Dit is vooral handig als uw platform geen automatische updates voor SchildiChat ondersteunt (bijv. Windows en macOS).",
+ "Don't ask again": "Niet nogmaals vragen",
+ "Modern": "Modern",
+ "Message layout": "Berichtlayout",
+ "Show people and rooms in a combined list": "Toon personen en kamers in een gecombineerde lijst"
+}
diff --git a/i18n-overlays/matrix-react-sdk/pl.json b/i18n-overlays/matrix-react-sdk/pl.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/i18n-overlays/matrix-react-sdk/pl.json
@@ -0,0 +1 @@
+{}
diff --git a/i18n-overlays/matrix-react-sdk/pt_BR.json b/i18n-overlays/matrix-react-sdk/pt_BR.json
new file mode 100644
index 0000000..bdbad79
--- /dev/null
+++ b/i18n-overlays/matrix-react-sdk/pt_BR.json
@@ -0,0 +1,7 @@
+{
+ "Enable layout with message bubbles": "Habilitar layout com bolhas de mensagem",
+ "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"
+}
diff --git a/i18n-overlays/matrix-react-sdk/ru.json b/i18n-overlays/matrix-react-sdk/ru.json
new file mode 100644
index 0000000..4ef2334
--- /dev/null
+++ b/i18n-overlays/matrix-react-sdk/ru.json
@@ -0,0 +1,13 @@
+{
+ "Message bubbles": "Пузырьки сообщений",
+ "Normal priority": "Нормальный приоритет",
+ "Enable layout with message bubbles": "Включение макета с пузырьками сообщений",
+ "Show message bubbles on one side only": "Показывайте пузырьки с сообщениями только на одной стороне",
+ "Show message bubbles depending on the width either on both sides or only on one side": "Показывать пузырьки сообщений в зависимости от ширины либо с обеих сторон, либо только с одной стороны",
+ "Modern": "Современное",
+ "Message layout": "Оформление сообщений",
+ "Do you want to join a room notifying you about new releases? This is especially useful if your platform doesn't support automatic updates for SchildiChat (e.g. Windows and macOS).": "Вы хотите присоединиться к комнате, уведомляющей вас о новых релизах? Это особенно полезно, если ваша платформа не поддерживает автоматические обновления для SchildiChat (например, Windows и macOS).",
+ "Show people and rooms in a combined list": "Показать людей и комнаты в объединенном списке",
+ "Update notifications": "Уведомления об обновлениях",
+ "Don't ask again": "Не спрашивать больше"
+}
diff --git a/i18n-overlays/matrix-react-sdk/sk.json b/i18n-overlays/matrix-react-sdk/sk.json
new file mode 100644
index 0000000..7b17898
--- /dev/null
+++ b/i18n-overlays/matrix-react-sdk/sk.json
@@ -0,0 +1,7 @@
+{
+ "Enable layout with message bubbles": "Povolenie rozloženia s bublinami správ",
+ "Show message bubbles on one side only": "Zobrazenie bublín správ len na jednej strane",
+ "Show message bubbles depending on the width either on both sides or only on one side": "Zobrazenie bublín správ v závislosti od šírky buď na oboch stranách, alebo len na jednej strane",
+ "Message bubbles": "Bubliny správ",
+ "Normal priority": "Normálna priorita"
+}
diff --git a/matrix-js-sdk b/matrix-js-sdk
index a563025..4bc4575 160000
--- a/matrix-js-sdk
+++ b/matrix-js-sdk
@@ -1 +1 @@
-Subproject commit a563025c04de1b3ee164c4985fe998054fd997f2
+Subproject commit 4bc4575eb65aa68ea8080f5de2072a5949ca8c6d
diff --git a/matrix-react-sdk b/matrix-react-sdk
index 60ac218..55874ea 160000
--- a/matrix-react-sdk
+++ b/matrix-react-sdk
@@ -1 +1 @@
-Subproject commit 60ac2184de12b7705820db02da6c909c6318c92e
+Subproject commit 55874eaa27ac68daa1fd67f739945cf51551f4ef
diff --git a/merge_helpers.sh b/merge_helpers.sh
index a0d4bd4..d9562af 100755
--- a/merge_helpers.sh
+++ b/merge_helpers.sh
@@ -6,6 +6,8 @@ i18n_helper_path="$SCHILDI_ROOT/i18n-helper/index.js"
i18n_path="src/i18n/strings"
i18n_overlay_path="$SCHILDI_ROOT/i18n-overlays"
+yarn=yarnpkg
+
add_upstream() {
if git remote | grep -q upstream; then
echo "Remote named upstream already exists!"
@@ -101,18 +103,24 @@ automatic_i18n_reversion() {
}
automatic_i18n_adjustment() {
- node "$i18n_helper_path" "$SCHILDI_ROOT/matrix-react-sdk/$i18n_path" "$i18n_overlay_path/matrix-react-sdk"
+ # matrix-react-sdk
pushd "$SCHILDI_ROOT/matrix-react-sdk" > /dev/null
+ $yarn i18n
+ node "$i18n_helper_path" "$SCHILDI_ROOT/matrix-react-sdk/$i18n_path" "$i18n_overlay_path/matrix-react-sdk"
apply_i18n_changes "$i18n_path"
popd > /dev/null
- node "$i18n_helper_path" "$SCHILDI_ROOT/element-web/$i18n_path" "$i18n_overlay_path/element-web"
+ # element-web
pushd "$SCHILDI_ROOT/element-web" > /dev/null
+ $yarn i18n
+ node "$i18n_helper_path" "$SCHILDI_ROOT/element-web/$i18n_path" "$i18n_overlay_path/element-web"
apply_i18n_changes "$i18n_path"
popd > /dev/null
- node "$i18n_helper_path" "$SCHILDI_ROOT/element-desktop/$i18n_path" "$i18n_overlay_path/element-desktop"
+ # element-desktop
pushd "$SCHILDI_ROOT/element-desktop" > /dev/null
+ $yarn i18n
+ node "$i18n_helper_path" "$SCHILDI_ROOT/element-desktop/$i18n_path" "$i18n_overlay_path/element-desktop"
apply_i18n_changes "$i18n_path"
popd > /dev/null
}
diff --git a/nix/overlay.nix b/nix/overlay.nix
new file mode 100644
index 0000000..7261941
--- /dev/null
+++ b/nix/overlay.nix
@@ -0,0 +1,17 @@
+final: prev: {
+ cleanSchildichatDesktopSource = src: with final.lib; cleanSourceWith {
+ filter = name: type: cleanSourceFilter name type
+ && !(hasInfix "/node_modules/" name)
+ && !(hasInfix "/nix/" name && hasSuffix ".nix" name)
+ ;
+ inherit src;
+ };
+ schildichat-web = final.callPackage ./schildichat-web.nix {};
+ schildichat-desktop = final.callPackage ./schildichat-desktop.nix {
+ inherit (final.darwin.apple_sdk.frameworks) Security AppKit CoreServices;
+ };
+ schildichat-desktop-wayland = final.callPackage ./schildichat-desktop.nix {
+ inherit (final.darwin.apple_sdk.frameworks) Security AppKit CoreServices;
+ useWayland = true;
+ };
+}
diff --git a/nix/schildichat-desktop.nix b/nix/schildichat-desktop.nix
new file mode 100644
index 0000000..ab1daa4
--- /dev/null
+++ b/nix/schildichat-desktop.nix
@@ -0,0 +1,109 @@
+{ lib
+, stdenv
+, fetchFromGitHub
+, makeWrapper
+, makeDesktopItem
+, mkYarnPackage
+, electron
+, element-desktop # for native modules
+, schildichat-web
+, callPackage
+, Security
+, AppKit
+, CoreServices
+
+, useWayland ? false
+
+, cleanSchildichatDesktopSource
+, schildichat-desktop-src ? ../.
+}:
+
+let
+ packageJSON = schildichat-desktop-src + "/element-desktop/package.json";
+ yarnLock = schildichat-desktop-src + "/element-desktop/yarn.lock";
+
+ package = builtins.fromJSON (builtins.readFile packageJSON);
+
+ pname = "schildichat-desktop";
+ version = package.version;
+
+ executableName = pname;
+
+ electron_exec = if stdenv.isDarwin then "${electron}/Applications/Electron.app/Contents/MacOS/Electron" else "${electron}/bin/electron";
+
+in mkYarnPackage rec {
+ inherit pname version packageJSON;
+
+ src = cleanSchildichatDesktopSource (schildichat-desktop-src + "/element-desktop");
+
+ nativeBuildInputs = [ makeWrapper ];
+
+ inherit (element-desktop) seshat keytar;
+
+ buildPhase = ''
+ runHook preBuild
+
+ export HOME=$(mktemp -d)
+ pushd deps/schildichat-desktop/
+ npx tsc
+ yarn run i18n
+ node ./scripts/copy-res.js
+ popd
+ rm -rf node_modules/matrix-seshat node_modules/keytar
+ ln -s $keytar node_modules/keytar
+ ln -s $seshat node_modules/matrix-seshat
+
+ runHook postBuild
+ '';
+
+ installPhase = ''
+ runHook preInstall
+
+ # resources
+ mkdir -p "$out/share/element"
+ ln -s '${schildichat-web}' "$out/share/element/webapp"
+ cp -r './deps/schildichat-desktop' "$out/share/element/electron"
+ cp -r './deps/schildichat-desktop/res/img' "$out/share/element"
+ rm "$out/share/element/electron/node_modules"
+ cp -r './node_modules' "$out/share/element/electron"
+ cp $out/share/element/electron/lib/i18n/strings/en_EN.json $out/share/element/electron/lib/i18n/strings/en-us.json
+ ln -s $out/share/element/electron/lib/i18n/strings/en{-us,}.json
+
+ # icons
+ for icon in $out/share/element/electron/build/icons/*.png; do
+ mkdir -p "$out/share/icons/hicolor/$(basename $icon .png)/apps"
+ ln -s "$icon" "$out/share/icons/hicolor/$(basename $icon .png)/apps/element.png"
+ done
+
+ # desktop item
+ mkdir -p "$out/share"
+ ln -s "${desktopItem}/share/applications" "$out/share/applications"
+
+ # executable wrapper
+ makeWrapper '${electron_exec}' "$out/bin/${executableName}" \
+ --add-flags "$out/share/element/electron${lib.optionalString useWayland " --enable-features=UseOzonePlatform --ozone-platform=wayland"}"
+
+ runHook postInstall
+ '';
+
+ # Do not attempt generating a tarball for element-web again.
+ # note: `doDist = false;` does not work.
+ distPhase = ''
+ true
+ '';
+
+ # The desktop item properties should be kept in sync with data from upstream:
+ # https://github.com/vector-im/element-desktop/blob/develop/package.json
+ desktopItem = makeDesktopItem {
+ name = "schildichat-desktop";
+ exec = "${executableName} %u";
+ icon = "schildichat";
+ desktopName = "SchildiChat";
+ genericName = "Matrix Client";
+ categories = "Network;InstantMessaging;Chat;";
+ extraEntries = ''
+ StartupWMClass=schildichat
+ MimeType=x-scheme-handler/element;
+ '';
+ };
+}
diff --git a/nix/schildichat-web.nix b/nix/schildichat-web.nix
new file mode 100644
index 0000000..e10071c
--- /dev/null
+++ b/nix/schildichat-web.nix
@@ -0,0 +1,75 @@
+{ stdenv
+, mkYarnModules
+, nodejs
+, cleanSchildichatDesktopSource
+, schildichat-desktop-src ? ../.
+, ...
+}:
+
+let
+ packageJSON = schildichat-desktop-src + "/element-web/package.json";
+ yarnLock = schildichat-desktop-src + "/element-web/yarn.lock";
+
+ package = builtins.fromJSON (builtins.readFile packageJSON);
+
+ pname = "schildichat-web";
+ version = package.version;
+
+ modules = mkYarnModules {
+ name = "${pname}-modules-${version}";
+ inherit pname version packageJSON yarnLock;
+ };
+
+in stdenv.mkDerivation {
+ inherit pname version;
+
+ src = cleanSchildichatDesktopSource schildichat-desktop-src;
+
+ buildInputs = [ nodejs ];
+
+ postPatch = ''
+ patchShebangs .
+ '';
+
+ configurePhase = ''
+ runHook preConfigure
+
+ cp configs/sc/config.json element-web/
+ cp -r ${modules}/node_modules node_modules
+ chmod u+rwX -R node_modules
+ rm -rf node_modules/matrix-react-sdk
+ ln -s $PWD/matrix-react-sdk node_modules/
+ ln -s $PWD/node_modules matrix-react-sdk/
+ ln -s $PWD/node_modules element-web/
+
+ runHook postConfigure
+ '';
+
+ buildPhase = ''
+ runHook preBuild
+
+ pushd matrix-react-sdk
+ node_modules/.bin/reskindex -h ../element-web/src/header
+ popd
+
+ pushd element-web
+ node scripts/copy-res.js
+ node_modules/.bin/reskindex -h ../element-web/src/header
+ node_modules/.bin/webpack --progress --mode production
+ popd
+
+ runHook postBuild
+ '';
+
+ installPhase = ''
+ runHook preInstall
+
+ cp -r element-web/webapp $out
+
+ runHook postInstall
+ '';
+
+ passthru = {
+ inherit modules;
+ };
+}