main
ruff: Fix RUF036 `None` not at the end of the type union.
smokescreen: Document how we enforce proxying in every process.
[manual] Rename Django app from zephyr to zerver.
scheduled_messages: Set read_by_sender for self-DMs using DM group.
alert_words: Use bulk query for case-insensitive word deletion.
async_utils: Skip NoAutoCreateEventLoopPolicy on Python ≥ 3.14.
attachments: Handle attachment deleted during access validation.
ruff: Fix TRY201 Use `raise` without specifying exception name.
avatar_hash: Fix typo.
ruff: Fix UP007 Use `X | Y` for type annotations.
bots: Rename SERVICE_BOT_TYPES to MESSAGE_TRIGGERED_BOT_TYPES.
populate_db: Remove Recipient.PERSONAL naming vestiges.
event_queue: Don't send new message events to unsubscribed guests.
cache_helpers: Use iterators, so we do not keep the full list in memory.
camo: Use constant_time_compare to compare hashes.
channel_folders: Convert ChannelFolderDict to dataclass.
compatibility: Rename is_unsupported_browser to is_banned_browser.
ruff: Fix SIM117 Use a single `with` statement with multiple contexts.
create_user: Stop creating personal recipients.
ruff: Fix UP035 Import from `collections.abc`, `typing` instead.
db: Split reset_queries into a new module zerver.lib.db_connections.
python: Format ISO 8601 times with isoformat.
default streams: Return set instead of a list.
demo orgs: Improve noun list.
demo-orgs: Schedule demo deletion reminder Notification bot DM.
push_registration: Rework using `Device` model.
digest: Fix digest email context generation timing out.
display_recipient: Add a comment on a strange use-case.
drafts: Check that the sender can access the recipients of a DM draft.
email_mirror: Add subject to body when truncated
ruff: Fix RUF059 Unpacked variable is never used.
ruff: Fix TRY401 Redundant exception object included in `logging.exception` call.
email_notifications: Convert inline ![]() images to links.
email_validation: Reject domains that can't be IDNA-encoded.
emoji: Remove get_emoji_url wrapper, use upload_backend directly.
emoji: Match emoji sequences in markdown.
streams: Support per-stream default for push notifications.
events: Handle device events for devices missing from initial state.
bots: Restrict bot_storage endpoints to bot accounts.
export: Update status of RealmExport rows while exporting.
external_accounts: Add Atlassian account ID field type.
populate_db: Add links in topic names.
apps: Provide arm64 app build by default for macOS.
home: Apply narrow_stream desktop-notification override on the client.
i18n: Don't allow languages with less than 5% strings translated.
ruff: Fix RET501 Do not explicitly `return None` in function if it is the only possible return value.
webhooks/heroku: Replace Deploy webhooks with App webhooks.
logging_util: Error-proof against weird exc_info.
email_mirror: Skip overlapping IMAP polls rather than piling up.
tests: Rename the Node tests to *.cjs.
markdown: Don't double-process mentions formatted with a link.
migrations: Drop UserProfile.recipient and personal recipient rows.
direct_messages: Always use DM groups if they exist.
migrate: Clarify variable names in rename_indexes_constraints.
requirements: Upgrade Python requirements.
markdown: Add inline preview support for .mov video files.
ruff: Fix B905 `zip()` without an explicit `strict=` parameter.
signup: Add "airsi.de" as an allowed email domain.
narrow: Bound message-fetch range on the driving usermessage index.
url_decoding: Add `parse_narrow_url`.
ruff: Fix FURB171 Membership test against single-item container.
navigation_views: Add backend for navigation views in left sidebar.
ruff: Fix PYI059 `Generic[]` should always be the last base class.
notifications: Fix AssertionError on moving messages with bot mentions.
settings: Remove PREFER_DIRECT_MESSAGE_GROUP.
onboarding: Replace dict[str, Any] with dataclass.
outgoing_http: Don't try to use non-existent Smokescreen in dev.
outgoing_webhook: Serialize widget_content to JSON string.
parallel: Refactor to provide a callback form.
per_request_cache: Generalize to cache_for_current_request.
presence: Always return modern format from single-user presence API.
ruff: Fix ASYNC230 Async functions should not open files with blocking methods.
push_registration: Match APNs tokens case-insensitively on cleanup.
python: Sort imports with isort.
mypy: Remove use of ValuesQuerySet and QuerySetAny.
queue: Extract mobile_notifications_queue_name helper.
rate_limiter: Update Redis rate limiter to use in-server GCRA.
requirements: Switch from circuitbreaker to pybreaker.
realm: Handle markdown version updates for realm description.
upload: Add wrappers for externally-used backend methods.
scheduled_messages: Migrate to typed_endpoint.
recipient_users: Move check_sender_can_access_recipients into lib.
reminder: Generate accurate `with` topic link.
ruff: Fix LOG004 `.exception()` call outside exception handlers.
request: Use Django 5.2 HttpRequest.get_preferred_type.
rest_api: Add logging for use of the deprecated method parameter.
scheduled_messages: Lock the row when editing to avoid duplicate send.
sync: Truncate simple text custom profile field values when too long.
scim: Add support for Groups.
populate_db: Add an imported user in development database.
semgrep: Enforce use of .iterator() when sensible.
memcached: Enable TCP keepalives on connections to memcached.
soft_deactivation: Serialize per-user reactivation with a row lock.
ruff: Fix UP006 Use `list` instead of `List` for type annotation.
storage: Simplify system bot avatar logic.
codespell: Fix typos caught by codespell.
stream: Add subscriber_count field.
stream_traffic: Make stream_ids optional when fetching info for realm.
streams: Alphabetize stream fields in various dicts/typed dicts.
message_send: Add support to send message with an empty topic name.
auth: Pass `None` as `default_subdomain` to verify the host.
Rename default branch to ‘main’.
requirements: Migrate to uv.
upload: Make upload backend instantiation lazy.
narrow: Rewrite message-fetch query using Django ORM.
timestamp: Add a function to convert datetime to "<time:>" syntax.
requirements: Remove dateutil.
avatar: Add support to generate avatar using Jdenticon.
typed_endpoint: Add error templates for list length errors.
url_decoding: Handle mentions operator in decode_narrow_operand.
url_encoding: Encode * character so that it skips strong em markdown.
help: Make help center canonical location for bots/integrations.
user_counts: Maintain count of workplace and non-workplace users.
user_groups: Handle EVERYONE_ON_INTERNET in permission checks.
user_status: Allow bots with role=admin to change user status.
user_topics: Fix case-insensitive prefetched visibility-policy lookup.
users: Don't expose custom profile fields to spectators.
mattermost_import: Log when processing messages.
custom_profile_fields: Rename internal "select" identifiers.
widget: Refactor widget data to use dataclasses.
realm: Handle plan_type set to a paid plan without Customer.
zcommand: Replace dict[str, Any] with ZCommandResult dataclass.
cache: Use zstd compression level 9 for bmemcached compression.