Skip to content

🔖(minor) release version 0.3.0#562

Merged
jbpenrath merged 3 commits into
mainfrom
release/0.3.0
Feb 25, 2026
Merged

🔖(minor) release version 0.3.0#562
jbpenrath merged 3 commits into
mainfrom
release/0.3.0

Conversation

@jbpenrath
Copy link
Copy Markdown
Contributor

@jbpenrath jbpenrath commented Feb 24, 2026

Upgrade to 0.3.0

Added

Changed

Fixed

Security

Summary by CodeRabbit

  • New Features

    • Help center button config, recipient throttling, webhook logging, mailbox export/PST import, multi-column signature editor, storage metrics API, conditional Outbox, stronger DNS checks, print in message menu, composer autofocus options, arm64 Docker support, website contact widget, image blocks in templates.
  • Bug Fixes & Security

    • Orphan attachment cleanup, combobox cursor fix, mobile panel behavior, improved thread closing, IDOR and XSS hardening.
  • Chores

    • Release bumped to 0.3.0, streamlined localization workflow and expanded translations (NL/RU/UK).

@jbpenrath jbpenrath requested a review from sylvinus February 24, 2026 14:31
@coderabbitai
Copy link
Copy Markdown

coderabbitai Bot commented Feb 24, 2026

📝 Walkthrough

Walkthrough

Release prep: bumped package versions to 0.3.0, removed two i18n pre-generation steps from the Crowdin download workflow, updated CHANGELOG for 0.3.0, and applied multiple locale additions/removals across Dutch, Russian, and Ukrainian files.

Changes

Cohort / File(s) Summary
Version bumps
src/backend/pyproject.toml, src/mta-in/pyproject.toml, src/mta-out/pyproject.toml, src/frontend/package.json, src/e2e/package.json
All project/module versions updated from 0.2.0 → 0.3.0. No logic changes.
CI workflow
.github/workflows/crowdin_download.yml
Removed two steps that pre-generated backend POT and ran make i18n-compile; CrowdIn download and PR creation remain.
Release notes
CHANGELOG.md
Added 0.3.0 Unreleased section (dated 2026-02-24) with extensive added/changed/fixed/security entries and updated comparison links.
Locales — Dutch
src/frontend/public/locales/common/nl-NL.json
Removed many empty translation keys (deleted ~172 lines); no new non-empty translations.
Locales — Russian
src/frontend/public/locales/common/ru-RU.json
Added and updated ~40 UI translation keys (2-column layout, image blocks, delivery statuses, help center, etc.); removed some legacy/empty entries.
Locales — Ukrainian
src/frontend/public/locales/common/uk-UA.json
Added/updated ~30+ translation keys aligning with RU changes, adjusted mailbox message wrappers and loading/error strings; removed some deprecated keys.

Estimated code review effort

🎯 2 (Simple) | ⏱️ ~10 minutes

Possibly related PRs

Suggested reviewers

  • sdemagny
  • sylvinus

Poem

🐰 I hopped through files with joyful cheer,
Bumped versions, pruned a step or two,
Locales polished, changelog clear,
A small clean hop to 0.3.0 — woo!

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The PR title clearly and concisely describes the main change: releasing version 0.3.0. It is specific, relevant to the changeset, and highlights the primary objective.
Linked Issues check ✅ Passed The PR meets the objectives from issue #540: it includes version bump to 0.3.0, translation updates for error messages, workflow modifications, and all related changelog entries documenting the new features and changes across multiple subsystems.
Out of Scope Changes check ✅ Passed All changes align with the PR objectives: version bumps across all manifests, changelog documentation, workflow cleanup, and localization updates for the 0.3.0 release. No unrelated or out-of-scope modifications detected.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch release/0.3.0

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@jbpenrath jbpenrath force-pushed the release/0.3.0 branch 6 times, most recently from 9ec632c to 5ac310f Compare February 24, 2026 15:57
We recently remove backend translation but this script
still tries to create a empty django.pot in an folder that
does not existe anymore and compile .mo files
Update translated files with new translations
Added
- Add configurable help center button in header #537
- Add outbound message recipients throttling #506
- Add webhook and logging for selfchecks, replacing pushgateway #550
- Add mailbox export in mbox format with labels #553
- Add PST import support and streaming for mbox #544
- Add denylist for personal mailbox prefixes #540
- Add multi-column layout block for signature editor #551
- Add celery task events for worker monitoring #549
- Add image block in template, signature and message composers
- Add storage usage metrics API endpoint #538
- Add conditional outbox folder
- Add stronger DNS checks with configurable records #522
- Add print button in messages context menu #518
- Add autofocus option to message, template and signature composers
- Add arm64 platform support for Docker image builds #554

Changed
- Replace queue-based save/send orchestration with async promise ref
- Use display_name for labels and auto-unfold active parents #547
- Optimize MessageTemplate serialization and body handling #545
- Defer HTML/text body export to send/save time
- Add composer tools (text color, side menu and drag block handle)
- Improve outbox wording #539
- Replace nginx with Caddy for frontend reverse proxy and Scalingo deployment #556
- Replace MinIO with RustFS for object storage in development #556
- Migrate Python packaging from Poetry to uv #556
- Standardize and rename Makefile targets #556
- Remove Django i18n and backend translation catalogs #556

Fixed
- Delete orphan attachments when removed from draft #532
- Fix cursor position when clicking in combobox input #534
- Close left panel when clicking active folder on mobile
- Close thread after send only if needed

Security
- Prevent IDOR on ThreadAccess thread and mailbox fields #557
- Add defense in-depth for XSS vulnerabilities #520
Copy link
Copy Markdown

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 5

🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@CHANGELOG.md`:
- Line 33: Update the changelog sentence that currently reads "Update the Drive
third party api logic..." by replacing the phrase "third party api" with the
correctly hyphenated and capitalized "third-party API" so the entry becomes
"Update the Drive third-party API logic..." (locate the exact string "Update the
Drive third party api logic" in CHANGELOG.md and make the substitution).
- Line 44: Update the changelog entry "Upgrade Python to 3.14 `#556`" to state
Python 3.13 instead (e.g., "Upgrade Python to 3.13 `#556`"), since project
components like src/mta-out, src/backend, and src/mta-in target requires-python
= ">=3.13,<4.0"; ensure the corrected text replaces the 3.14 mention exactly in
that entry.

In `@src/frontend/public/locales/common/ru-RU.json`:
- Around line 20-21: The pluralization keys "{{count}} messages imported_one"
and "{{count}} messages imported_other" currently have the same Russian string;
update the "_one" variant to use the nominative/accusative singular form:
replace the value for "{{count}} messages imported_one" with "Импортировано
{{count}} сообщение" so singular (n=1) is correct while leaving "{{count}}
messages imported_other" as the genitive plural "Импортировано {{count}}
сообщений".

In `@src/frontend/public/locales/common/uk-UA.json`:
- Line 374: Update the Ukrainian translation for the key "Personal mailboxes
cannot be created when identity synchronization is disabled." to include the
missing qualifier for "identity" (e.g., use "синхронізації ідентичностей" or
"синхронізації ідентичності" / "синхронізації особистості") so it accurately
mirrors the English phrase; locate that exact key in
src/frontend/public/locales/common/uk-UA.json and replace the current value "Не
можна створювати особисті поштові скриньки, коли синхронізація відключена." with
a version that explicitly mentions identity synchronization.
- Around line 20-21: The two plural keys "{{count}} messages imported_one" and
"{{count}} messages imported_other" currently share the same Ukrainian string;
update the "_one" variant to the correct singular/genitive form so the
translations differ: change the value for "{{count}} messages imported_one" to
"Імпортовано {{count}} повідомлення" while keeping "{{count}} messages
imported_other" as "Імпортовано {{count}} повідомлень" to reflect Ukrainian
pluralization rules.

ℹ️ Review info

Configuration used: defaults

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 5ac310f and eb58da7.

⛔ Files ignored due to path filters (5)
  • src/backend/uv.lock is excluded by !**/*.lock
  • src/e2e/package-lock.json is excluded by !**/package-lock.json
  • src/frontend/package-lock.json is excluded by !**/package-lock.json
  • src/mta-in/uv.lock is excluded by !**/*.lock
  • src/mta-out/uv.lock is excluded by !**/*.lock
📒 Files selected for processing (10)
  • .github/workflows/crowdin_download.yml
  • CHANGELOG.md
  • src/backend/pyproject.toml
  • src/e2e/package.json
  • src/frontend/package.json
  • src/frontend/public/locales/common/nl-NL.json
  • src/frontend/public/locales/common/ru-RU.json
  • src/frontend/public/locales/common/uk-UA.json
  • src/mta-in/pyproject.toml
  • src/mta-out/pyproject.toml
💤 Files with no reviewable changes (2)
  • .github/workflows/crowdin_download.yml
  • src/frontend/public/locales/common/nl-NL.json
🚧 Files skipped from review as they are similar to previous changes (4)
  • src/backend/pyproject.toml
  • src/e2e/package.json
  • src/frontend/package.json
  • src/mta-in/pyproject.toml

Comment thread CHANGELOG.md
### Changed

- Bump keycloak to 26.5.3 #543
- **❗ BREAKING**: Update the Drive third party api logic to comply with the new Drive logic. Messages now interops with [Drive >= 0.13.0](https://github.com/suitenumerique/drive/releases/tag/v0.13.0)
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

Hyphenate "third-party" as a compound modifier.

"third party api" → "third-party API" (both the hyphen and capitalisation of the acronym).

✏️ Proposed fix
-- **❗ BREAKING**: Update the Drive third party api logic to comply with the new Drive logic. Messages now interops with [Drive >= 0.13.0](...)
+- **❗ BREAKING**: Update the Drive third-party API logic to comply with the new Drive logic. Messages now interops with [Drive >= 0.13.0](...)
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
- **❗ BREAKING**: Update the Drive third party api logic to comply with the new Drive logic. Messages now interops with [Drive >= 0.13.0](https://github.com/suitenumerique/drive/releases/tag/v0.13.0)
- **❗ BREAKING**: Update the Drive third-party API logic to comply with the new Drive logic. Messages now interops with [Drive >= 0.13.0](https://github.com/suitenumerique/drive/releases/tag/v0.13.0)
🧰 Tools
🪛 LanguageTool

[grammar] ~33-~33: Use a hyphen to join words.
Context: ...- ❗ BREAKING: Update the Drive third party api logic to comply with the new D...

(QB_NEW_EN_HYPHEN)

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@CHANGELOG.md` at line 33, Update the changelog sentence that currently reads
"Update the Drive third party api logic..." by replacing the phrase "third party
api" with the correctly hyphenated and capitalized "third-party API" so the
entry becomes "Update the Drive third-party API logic..." (locate the exact
string "Update the Drive third party api logic" in CHANGELOG.md and make the
substitution).

Comment thread CHANGELOG.md
Comment on lines +20 to +21
"{{count}} messages imported_one": "Импортировано {{count}} сообщений",
"{{count}} messages imported_other": "Импортировано {{count}} сообщений",
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

Same plural form issue as uk-UA: _one and _other are identical.

For Russian, n=1 requires the nominative/accusative singular "сообщение", not the genitive plural "сообщений".

✏️ Proposed fix
-  "{{count}} messages imported_one": "Импортировано {{count}} сообщений",
+  "{{count}} messages imported_one": "Импортировано {{count}} сообщение",
   "{{count}} messages imported_other": "Импортировано {{count}} сообщений",
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
"{{count}} messages imported_one": "Импортировано {{count}} сообщений",
"{{count}} messages imported_other": "Импортировано {{count}} сообщений",
"{{count}} messages imported_one": "Импортировано {{count}} сообщение",
"{{count}} messages imported_other": "Импортировано {{count}} сообщений",
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/frontend/public/locales/common/ru-RU.json` around lines 20 - 21, The
pluralization keys "{{count}} messages imported_one" and "{{count}} messages
imported_other" currently have the same Russian string; update the "_one"
variant to use the nominative/accusative singular form: replace the value for
"{{count}} messages imported_one" with "Импортировано {{count}} сообщение" so
singular (n=1) is correct while leaving "{{count}} messages imported_other" as
the genitive plural "Импортировано {{count}} сообщений".

Comment on lines +20 to +21
"{{count}} messages imported_one": "Імпортовано {{count}} повідомлень",
"{{count}} messages imported_other": "Імпортовано {{count}} повідомлень",
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

Plural forms _one and _other have identical Ukrainian translations.

Ukrainian distinguishes at least two forms here: _one (count = 1) should use the genitive singular form ("повідомлення"), while _other keeps the genitive plural ("повідомлень"). Both currently use "повідомлень".

✏️ Proposed fix
-  "{{count}} messages imported_one": "Імпортовано {{count}} повідомлень",
+  "{{count}} messages imported_one": "Імпортовано {{count}} повідомлення",
   "{{count}} messages imported_other": "Імпортовано {{count}} повідомлень",
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
"{{count}} messages imported_one": "Імпортовано {{count}} повідомлень",
"{{count}} messages imported_other": "Імпортовано {{count}} повідомлень",
"{{count}} messages imported_one": "Імпортовано {{count}} повідомлення",
"{{count}} messages imported_other": "Імпортовано {{count}} повідомлень",
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/frontend/public/locales/common/uk-UA.json` around lines 20 - 21, The two
plural keys "{{count}} messages imported_one" and "{{count}} messages
imported_other" currently share the same Ukrainian string; update the "_one"
variant to the correct singular/genitive form so the translations differ: change
the value for "{{count}} messages imported_one" to "Імпортовано {{count}}
повідомлення" while keeping "{{count}} messages imported_other" as "Імпортовано
{{count}} повідомлень" to reflect Ukrainian pluralization rules.

"Password reset successfully!": "Пароль успішно скинуто!",
"Personal mailbox": "Особиста скринька",
"Personal mailboxes cannot be created when identity synchronization is disabled.": "Особисті поштові скриньки не можуть бути створені, коли синхронізацію ідентифікації вимкнено.",
"Personal mailboxes cannot be created when identity synchronization is disabled.": "Не можна створювати особисті поштові скриньки, коли синхронізація відключена.",
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

Translation drops "identity" from "identity synchronization".

The English reads "identity synchronization is disabled" but the Ukrainian renders as "синхронізація відключена" (omitting "ідентичності" / "особистості"). Consider adding the qualifier for accuracy.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/frontend/public/locales/common/uk-UA.json` at line 374, Update the
Ukrainian translation for the key "Personal mailboxes cannot be created when
identity synchronization is disabled." to include the missing qualifier for
"identity" (e.g., use "синхронізації ідентичностей" or "синхронізації
ідентичності" / "синхронізації особистості") so it accurately mirrors the
English phrase; locate that exact key in
src/frontend/public/locales/common/uk-UA.json and replace the current value "Не
можна створювати особисті поштові скриньки, коли синхронізація відключена." with
a version that explicitly mentions identity synchronization.

@jbpenrath jbpenrath merged commit eb58da7 into main Feb 25, 2026
14 checks passed
@jbpenrath jbpenrath deleted the release/0.3.0 branch February 25, 2026 09:03
@coderabbitai coderabbitai Bot mentioned this pull request Mar 5, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant