diff --git a/CHANGELOG.md b/CHANGELOG.md
index b093aa5728..97b1871091 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,32 @@
+## 2.31.0 – 2023-12-08
+
+### Added
+- PHP Hook `filter.language` to allow remote language selection
+
+### Changed
+- Cleaner language detection
+- Get Squire in sync with v2.2.5 and some bugfixes
+- Update French by @Cwpute
+- Squire: drop support for iPod
+
+### Fixed
+- Call to undefined method FolderMyRights()
+ [#1344](https://github.com/the-djmaze/snappymail/issues/1344)
+- NO Mailbox does not exist, or must be subscribed to")
+ [#1354](https://github.com/the-djmaze/snappymail/issues/1354)
+- Flag indicators are added to wrong message by @SergeyMosin
+ [#1347](https://github.com/the-djmaze/snappymail/pull/1347)
+- Squire: issue when using the enter key in a reply window
+ [#1296](https://github.com/the-djmaze/snappymail/issues/1296)
+- Squire: crash on cut/delete range
+
+### Nextcloud
+- Use language as defined in Nextcloud settings
+ [#1293](https://github.com/the-djmaze/snappymail/issues/1293)
+- Plugin Call to undefined method RainLoop\Model\MainAccount::ImapConnectAndLoginHelper()
+- SnappyMail failed due to Nextcloud Symfony polyfill
+
+
## 2.30.0 – 2023-12-04
### Added
diff --git a/README.md b/README.md
index e0cd1daf3f..a4ad2a3835 100644
--- a/README.md
+++ b/README.md
@@ -141,27 +141,27 @@ RainLoop 1.17 vs SnappyMail
|js/* |RainLoop |Snappy |
|--------------- |--------: |--------: |
|admin.js |2.170.153 | 80.467 |
-|app.js |4.207.787 | 407.482 |
+|app.js |4.207.787 | 407.517 |
|boot.js | 868.735 | 4.142 |
-|libs.js | 658.812 | 192.885 |
+|libs.js | 658.812 | 192.287 |
|sieve.js | 0 | 85.085 |
|polyfills.js | 334.608 | 0 |
|serviceworker.js | 0 | 285 |
-|TOTAL |8.240.095 | 770.346 |
+|TOTAL |8.240.095 | 769.783 |
|js/min/* |RainLoop |Snappy |RL gzip |SM gzip |RL brotli |SM brotli |
|--------------- |--------: |--------: |------: |------: |--------: |--------: |
|admin.min.js | 256.831 | 39.328 | 73.606 | 13.191 | 60.877 | 11.815 |
-|app.min.js | 515.367 | 186.025 |139.456 | 63.148 |110.485 | 54.152 |
+|app.min.js | 515.367 | 186.005 |139.456 | 63.143 |110.485 | 54.149 |
|boot.min.js | 84.659 | 2.084 | 26.998 | 1.202 | 23.643 | 1.003 |
-|libs.min.js | 584.772 | 92.854 |180.901 | 34.489 |155.182 | 30.939 |
+|libs.min.js | 584.772 | 93.758 |180.901 | 34.878 |155.182 | 31.291 |
|sieve.min.js | 0 | 41.316 | 0 | 10.364 | 0 | 9.352 |
|polyfills.min.js | 32.837 | 0 | 11.406 | 0 | 10.175 | 0 |
-|TOTAL user |1.217.635 | 280.963 |358.761 | 98.839 |299.485 | 86.094 |
-|TOTAL user+sieve |1.217.635 | 322.279 |358.761 |109.203 |299.485 | 95.446 |
-|TOTAL admin | 959.099 | 134.266 |292.911 | 48.882 |249.877 | 43.757 |
+|TOTAL user |1.217.635 | 281.847 |358.761 | 99.223 |299.485 | 86.443 |
+|TOTAL user+sieve |1.217.635 | 323.163 |358.761 |109.587 |299.485 | 95.795 |
+|TOTAL admin | 959.099 | 135.170 |292.911 | 49.271 |249.877 | 44.109 |
-For a user it is around 70% smaller and faster than traditional RainLoop.
+For a user it is around 69% smaller and faster than traditional RainLoop.
### CSS changes
diff --git a/build/plugins.php b/build/plugins.php
index bf850b802c..d38c84c80c 100755
--- a/build/plugins.php
+++ b/build/plugins.php
@@ -28,10 +28,44 @@
'url',
'version'
];
+/*
+$released = [
+ 'add-x-originating-ip-header',
+ 'avatars',
+ 'black-list',
+ 'change-password',
+ 'change-password-froxlor',
+ 'change-password-hestia',
+ 'change-password-hmailserver',
+ 'change-password-ispconfig',
+ 'change-password-poppassd',
+ 'custom-login-mapping',
+ 'imap-contacts-suggestions',
+ 'kolab',
+ 'ldap-contacts-suggestions',
+ 'ldap-identities',
+ 'ldap-login-mapping',
+ 'ldap-mail-accounts',
+ 'login-external',
+ 'login-external-sso',
+ 'login-override',
+ 'login-register',
+ 'login-remote',
+ 'mailbox-detect',
+ 'nextcloud',
+ 'override-smtp-credentials',
+ 'set-remote-addr',
+ 'snowfall-on-login-screen',
+ 'two-factor-auth',
+ 'view-ics',
+ 'white-list'
+];
+*/
foreach (glob(ROOT_DIR . '/plugins/*', GLOB_NOSORT | GLOB_ONLYDIR) as $dir) {
if (is_file("{$dir}/index.php") && !strpos($dir, '.bak')) {
require "{$dir}/index.php";
$name = basename($dir);
+// if (!in_array($name, $released)) continue;
$class = new ReflectionClass(str_replace('-', '', $name) . 'Plugin');
$manifest_item = [];
foreach ($class->getConstants() as $key => $value) {
diff --git a/integrations/cloudron/DESCRIPTION.md b/integrations/cloudron/DESCRIPTION.md
index 4954957a9f..d9e988cf50 100644
--- a/integrations/cloudron/DESCRIPTION.md
+++ b/integrations/cloudron/DESCRIPTION.md
@@ -1,4 +1,4 @@
-This app packages SnappyMail 2.30.0.
+This app packages SnappyMail 2.31.0.
SnappyMail is a simple, modern, lightweight & fast web-based email client.
diff --git a/integrations/cloudron/Dockerfile b/integrations/cloudron/Dockerfile
index 381aae7793..37f1ac745c 100644
--- a/integrations/cloudron/Dockerfile
+++ b/integrations/cloudron/Dockerfile
@@ -4,7 +4,7 @@ RUN mkdir -p /app/code
WORKDIR /app/code
# If you change the extraction below, be sure to test on scaleway
-VERSION=2.30.0
+VERSION=2.31.0
RUN wget https://github.com/the-djmaze/snappymail/releases/download/v${VERSION}/snappymail-${VERSION}.zip -O /tmp/snappymail.zip && \
unzip /tmp/snappymail.zip -d /app/code && \
rm /tmp/snappymail.zip && \
diff --git a/integrations/nextcloud/snappymail/appinfo/info.xml b/integrations/nextcloud/snappymail/appinfo/info.xml
index ec69ca0b0f..3424ed6c08 100644
--- a/integrations/nextcloud/snappymail/appinfo/info.xml
+++ b/integrations/nextcloud/snappymail/appinfo/info.xml
@@ -3,7 +3,7 @@
snappymail
SnappyMail
SnappyMail Webmail
- 2.30.0
+ 2.31.0
agpl
SnappyMail, RainLoop Team, Nextgen-Networks, Tab Fitts, Nathan Kinkade, Pierre-Alain Bandinelli