Veyra 1.26.5

Release pack published: 22.07.2026

Windows

Android

iOS

Linux

macOS

Release notes

Release 1.26.5

Notes («Заметки») now sync between own devices
- Device sync never carried the Notes self-chat (field report): notes, note attachments and note edits/deletes were stored locally without a sync-journal event, and mutation dispatch exited on the "no peer" branch before journaling. Notes are now journaled as canonical message_out / mutation events under the account's OWN public key — exactly how the self conversation is addressed everywhere else — and the replay side locates the Notes chat by chat MEMBERSHIP (the sibling's chat lives under its own self-contact id; a contact row is no longer required, though it remains a fallback that can create the chat). Replayed notes arrive already 'read'. Pre-fix notes were never journaled and stay device-local (ratified journal rule: history exists from the version that writes it).

---
Version history

Version 1.26.4
Auth screens polish; stale import flag ate the password field; contacts empty state
- CRITICAL (desktop, multi-profile): cancelling the backup-file picker after "Импорт профиля" on the profile selector left the import-into-new-profile flag set forever — every later profile unlock then rendered the brand tagline and a "back to profiles" link with NO password field and NO button. The flag is now reset when the picker is cancelled and when reading the picked file fails.
- Auth headers: the create-profile screen is titled "Добавить профиль" (was "Создание профиля"), and the import flow shows "Импорт профиля" instead of the brand tagline.
- Import mode hints ("привязать"/"восстановить") now say «сетевой идентификатор» instead of «сетевую идентичность» (all 20 locales use the identifier term).

Version 1.26.3
Debug builds: opt-level 1 (the real fix for slow media crypto)
- The 1.26.2 per-package opt-level overrides barely moved the needle (field: the 942 MB video still opened in 5-7 s on the debug APK, ~3 MB/s streaming). Host bench proved why: RustCrypto's generic cipher cores monomorphize into the application crate and compile at its opt-level, so optimizing the dependency crates gives 7.5 → 11 MB/s only. [profile.dev] opt-level = 1 puts the same bench at 804 MB/s (release: ~2 GB/s) while keeping debug asserts and usable debuginfo. Release builds unchanged — they were always fast; the slow media path only ever affected debug installs.

Version 1.26.2
Veyra.exe binary name; desktop "Close" menu item; fast crypto in debug builds
- Windows: the installed executable is now Veyra.exe instead of veyra-messenger.exe (mainBinaryName in tauri.conf.json — tauri v2 keeps the cargo crate name unless overridden). Applies to the NSIS install, the portable exe and the Linux binary; buildall collection paths, run-test-clients.cmd and BUILD.md updated.
- Debug builds: the chunked-attachment AEAD ran at ~2-3 MB/s under opt-level 0 (field: the 942 MB video on the debug APK buffered for tens of seconds — ~75 ms per 256 KB chunk; release builds are fast). Crypto crates (chacha20/poly1305/aead/cipher and friends) are now compiled with opt-level 3 in the dev profile.
- Desktop hamburger menu: new "Закрыть" item that fully quits the app (same path as the tray "Выйти", bypassing close-to-tray). Reason: Ubuntu's stock GNOME shows no tray icon, so after closing the window with the X the app kept running with no reachable way to open or stop it. New quit_app command; the quitting flag moved to a process-wide static so both exits share it. Locales ×20.

Version 1.26.1
Versioning: explicit Android versionCode, N-limit raised to 9999/year
- Versioning scheme refinement (ratified same day): tauri's own versionCode derivation (major*1e6 + minor*1e3 + patch) capped <N> at 999 per year — too tight at the observed change pace. The year+month alternative (1.267.x) was rejected: October–December produce a 4-digit minor and a versionCode that DECREASES into January, which Google Play refuses. Instead bundle.android.versionCode is now set explicitly in tauri.conf.json as major*1_000_000 + YY*10_000 + N (1.26.1 → 1260001), lifting the limit to <N> ≤ 9999/year while the version string stays 1.<YY>.<N>. Every version bump must update the field alongside the version; the buildall APK check recomputes the formula from the version string and fails the build on a forgotten or wrong versionCode (plus a hard stop at N > 9999, which would collide with the next year). AGENTS.md updated.

Version 1.26.0
First stable release; new versioning scheme; Android video streaming
- Versioning scheme (ratified 2026-07-22): versions are now 1.<YY>.<N> — major 1 never changes without an explicit user decision, <YY> is the current year (26), <N> increments on every code change with a mandatory changelog entry and resets to 0 each new year. The 1.0.0-rc.x line ends here: the build is fully functional and field-verified, so the RC suffix is dropped. (Compatible with Apple / Google / Microsoft version rules; Android versionCode becomes 1_000_000 + YY*1000 + N via tauri's formula, so <N> must stay ≤ 999 within a year.) The never-released 1.0.0-rc.2 work below ships as part of this version.
- Android: large videos now play. The WebView media pipeline cannot stream over the intercepted veyra-media scheme (it stalls after the first capped 206 window — a 942 MB field transfer looped forever on bytes=1048576- and died with a media error), and wry materializes intercepted response bodies whole, so serving the full remainder would OOM. Video (and video-poster probing) on Android now streams from an in-process loopback HTTP server (127.0.0.1:<random port>, new media_server.rs): honest Content-Range over the whole requested span with the body written in 1 MB decrypted slices as the player reads. Loopback is reachable by other apps on the device, so every request requires a per-process 128-bit token and an unlocked profile; plaintext exists only in RAM, one slice at a time. Release builds get a network-security-config permitting cleartext to 127.0.0.1 only; images and desktop/iOS keep the custom protocol.
- Android: the next round's exact alarm is now armed already at round OPEN (safety net), not only in the release tail. Night #9 showed AsusFreezer freezing the process mid-round before the tail hand-off ran, leaving no armed alarm — delivery holes up to 79 min until an outside thaw. The tail hand-off re-arms the same PendingIntent with the same target, so the healthy path is unchanged (one alarm, same cadence).