Last Updated: April 4, 2026 (v1.1.8.1) Current Release Line: 1.1.8.x
This document is organized as a chronological release timeline first, followed by a forward-looking roadmap.
| Metric | Status |
|---|---|
| Current Version | 1.1.8.1 |
| XEPs Implemented | ~78 |
| Languages | 47 (DE/FR/ES 100%) |
| Build Status | Clean |
| GTK/libadwaita | GTK4 4.14, libadwaita 1.5 |
- Windows database reset race condition: Delete + restart combined into single sequential batch file — reset now works reliably
- Windows factory reset: Same fix applied
- AppImage CI: Removed unsupported
--no-netflag from appimagetool (continuous build doesn't support it) - 2 commits
- Cross-platform sound notifications: GStreamer playbin on Windows with 4 bundled WAV GResource files; Linux libcanberra unchanged
- GStreamer MF warm-up: Background thread pre-loads MF/WASAPI2/codec DLLs at startup — video recording ~2s instead of ~8s
- Missing gio plugin: Added to update_dist.sh for resource:// URI playback
- Video bitrate: 1500→800 kbps for mobile, REMB 256→800
- Debug cleanup: 18 TIMING warnings removed, voice_processor g_warning→g_debug
- AppImage: --no-net for appimagetool
- 7 commits, ~15 files changed
- Audio/Video device preferences: New preferences page with persistent mic/speaker/camera selection
- Device deduplication: Filters duplicate WASAPI2 devices on Windows
- GStreamer pipeline linking performance: TEMPLATE_CAPS, NO_RECONFIGURE, PadLinkCheck.NOTHING — significantly faster on Windows
- WASAPI2 audio fixes: S16LE capsfilter, audioresample in all paths, VoiceProcessor skip
- Video send bitrate fix: Initial 1500kbps (was 256), floor 256kbps — REMB chicken-egg fix
- DMA-BUF TOCTOU race: Pin memory during deep copy to prevent PipeWire SIGSEGV
- Video message improvements: Blocking pad probes for fast stop, cached H.264 encoder, 640×480@24fps
- OMEMO partial MUC delivery: Send succeeds even when some participants unreachable
- SOCKS5 proxy overhaul: Tor/SOCKS5 coexistence, HTTP proxy bypass
- Windows CI: Added gst-plugins-ugly + cantarell-fonts
- 62 commits, 43 files changed, 20+ crash fixes
- Echo probe null dereference (voice_processor.vala): SIGSEGV when
echo_probe == nullinstart()— safe conditional added - SRTP crypto_session destroy race (stream.vala): nulled before EOS → incoming packets hit null decryptor. Reordered.
- RTP/RTCP EOS null crash (stream.vala): EOS callbacks after send pads nulled. Null guards added.
- Video caps.get_size() crash (video_widget.vala): out-of-bounds when caps empty. Size check added.
- EOS timeout too short (audio_recorder.vala): 500ms→3000ms for MP4 faststart rewrite
- Windows H.264 encoder (video_recorder.vala):
mfh264encadded as first fallback - Tor DNS anonymity leak (stream_connect.vala): SRV lookups done locally before Tor proxy — ISP sees target server. Fixed: skip SRV when
proxy_type=="tor" - is_transitioning deadlock (tor_manager.vala): exception in start/stop_tor prevents future toggles. try-finally added.
- lyrebird.exe zombie (tor_controller.vala): Windows pluggable transport not killed on restart. taskkill added.
- Quieter startup: 39×
message()→debug()for less noise - URL display fix: body-only URLs shown as clickable text instead of broken file offers
- 11 files changed, 9 bugs fixed (5 CRITICAL, 3 HIGH, 1 Windows-specific)
- Font rendering:
gtk-font-nameset to "Segoe UI 10",gtk-hint-font-metricsenabled, fontconfigfonts.confwith Windows font aliases, avatar letter font fixed - GDK surface assertions:
get_realized()guards at 6 critical motion-event code paths (conversation_view, chat_text_view, chat_input/view, file_image_widget, video_player_widget) - Systray menu: Replaced ugly GDI owner-drawn painting with native
MF_STRINGitems — Windows renders with Segoe UI, ClearType, DPI, dark mode support - Portable ZIP fixes: GDK-Pixbuf loaders path, loaders.cache portable paths, missing CI packages (glib-networking, icon themes)
- Window buttons: CSD close/minimize on the left, MQTT plugin enabled in CI
- Icon fixes: hicolor index.theme preserved, encryption/mark icons restored after avatar refactor
- MUC reactions: Fixed reactions lost after restart/reconnect (occupant→JID mapping)
- Build: abseil nullability patch, unused variable warnings, const annotations
- 80+ commits, 50+ files changed
- finish_post_unlock():
this.hold()at start,this.release()at end — prevents GApplication from quitting during the entire unlock→main transition - Debug messages: Strategic
message()calls at every step of the transition for Windows diagnostics - 1 file changed
- Windows exit-after-unlock: Reordered
finish_post_unlock()—activate()FIRST (creates MainWindow), THENunlock_parent.close(). Removedhold()/release(). Fixes silent app exit on Windows (GitHub #18 revisited) - libevent DLL naming: Added
libevent-7.dllvariants toupdate_dist.sh(MSYS2 renamed DLLs) - webrtc trace_event.h: Auto-patch
#include <cstdint>for GCC 13+ compatibility (affects all modern distros) - BUILD.md: Added
libomemo-c-develto zypper, updated libomemo-c note (rallep71 fork), libcanberra install example - 5 files changed
- LC_ALL env var: Set working locale in
LC_ALLsoGtk.init()doesn't re-fail - LOCPATH removed: Was breaking
locale-archiveresolution on openSUSE/Fedora - BUILD.md: Corrected 3 openSUSE package names, added
ci-build-deps.shwarning, optionallibcanberra-develnote - 2 commits, 5 files changed
- Windows startup crash:
hold()/release()aroundunlock_parent.close()→activate()transition to prevent GApplication use_count race (GitHub #18) - DBUS_SESSION_BUS_ADDRESS:
"nul"→""for safer behavior - libevent DLL: Added monolithic
libevent-2-1-7.dllto Windows dist - SCRAM channel binding: Distinct
channel_binding_failedsignal → proper error message instead of "Wrong password" when server lacks -PLUS mechanisms - Locale fallback: Graceful fallback chain before
Gtk.init()for openSUSE/custom locales - GTK_IM_MODULE: Only unsets GTK3-only modules (
cedilla,xim); leaves ibus/fcitx5 alone - AppImage: LOCPATH export + conservative IM module handling in AppRun
- BUILD.md: Added openSUSE Tumbleweed/Leap
zypper installsection - 10 files changed
- CRITICAL FIX: System CA cert probe was inside
#if WINDOWS— moved outside so it runs on ALL platforms - Docs: CA cert sections added to BUILD.md and DEBUG.md
- 1 commit, 3 files changed
- In-app language selector: Settings → General → Appearance — 48 languages, AdwComboRow, dual persistence (DB + plaintext file for early startup)
- DE/FR/ES translations 100%: 140 new translations across main/omemo/openpgp
- 53 .po file fixes: 7 fatal msgfmt errors + 46 silent duplicate msgstr entries removed across 14 files
- AppImage SSL on openSUSE/Fedora/Alpine: Probe 6 distro CA cert paths in AppRun + main.vala + MQTT client
- 3 commits, 30 files changed
- systray_win32.c:
MAKEINTRESOURCEW(32512)stattIDI_APPLICATION— UNICODE-Inkompatibilität in MSYS2 MINGW64
- meson.build fix: Added
cc = meson.get_compiler('c')before Windows block —cc.find_library('shell32')/cc.find_library('user32')failed on fresh CI builds
- Video SIGSEGV fix: Reordered detach() teardown —
set_state(NULL)beforeremove_output/unlink, added queue element, fixed error path leaks - 12 null-pointer guards: HashMap
has_key()checks +call_state == nullguards across call_window_controller and call_window - Audio pipeline hardening: audiomixer latency=20ms, output_queue 50ms time-based, drop-on-latency=true, audiorate tolerance=40ms
- WebRTC AGC tuning: Consistent kFixedDigital mode (no more kAdaptiveDigital override), 9dB gain, -6dBFS target, kLow noise suppression
- Dialpad performance: Pipeline pre-warm on show, persistent across open/close, 80ms debounce
- Audio settings popover: Always shown (removed single-device hide logic), volume sliders always accessible
- Windows Systray: Full Shell_NotifyIcon implementation (left-click toggle, right-click status menu). Missing DLLs added.
- CI: Node.js 24 forced in all workflows, custom GitHub Pages workflow
- 4 commits, 22 files changed, 588 insertions, 73 deletions
- Retraction (XEP-0424): Desktop notification retraction, empty ID rejection, dead null-check removal,
ContentItem.is_own()consolidation (6 copies → 1 helper) - Chat window: O(1) highlight via
main.pick(), mutex deadlock fix, tile cache LRU (max 100), truncation text fix, reactions i18n,decrypt_to_temp()extraction, typo fix - Audio widget: Position reset on stop, download timeout race fix,
_disposedguard in callbacks, null duration guard - Video widget: Preview timeout race fix, paintable flicker fix, temp file leak fix, seek throttle fix
- Windows Systray (GitHub Issue #18): Full Shell_NotifyIcon implementation replacing stub. C helper (systray_win32.c/h) + VAPI bridge. Left-click toggles window, right-click context menu with status selection (Online/Away/Busy/N/A) + Quit. Meson wiring for shell32/user32.
- Windows DLLs (GitHub Issue #18): Added 5 missing DLLs to update_dist.sh: libnpth-0, libprotobuf-c-1, libcjson-1, libevent_core/extra
- CI/Build: Lyrebird download retry+gzip validation in windows-build.yml and ci-build-deps.sh. Custom GitHub Pages workflow replacing auto-generated one.
FORCE_JAVASCRIPT_ACTIONS_TO_NODE24env var in all workflows (Node.js 20 deprecation June 2026). - i18n: Chinese (Simplified) and Kabyle translation updates via Weblate
- Location Sharing (XEP-0080): GeoClue2 integration with manual fallback, 256×256 OSM map preview with red marker, Google Maps route planner on click, accuracy warning when >1km, meson build option
location-sharing - Tor WebTunnel/lyrebird: Pluggable transport support for censorship circumvention, Windows cross-compilation
- i18n audit: 25 hardcoded strings wrapped in
_(), 8 Tor settings, OMEMO strings, Channel→Group rename, location strings — DE/EN/ES/FR complete - MQTT fixes: 60% CPU menu rendering fix, retained message flood fix, 7 HA Discovery bugs, plugin interference with calls/transfers, clickable menu structure with navigation
- Performance:
mallopt()heap fragmentation fix, video frame texture release, PresenceManager signal guard - OMEMO: SG_ERR_NO_SESSION warning suppressed during video calls
- CI/Build: GitHub Actions Node.js 24, Windows
#if WINDOWSguard, Flatpak lyrebird build fix, release automation fixes - Docs: BUILD.md Location Sharing section, GeoClue2 deps in all lists, golang-go build dep
- 37 commits, major areas: location (10), MQTT (10), i18n (5), perf (3), Tor (3), CI (4), docs (2)
- MQTT Binary Transfer: Magic-byte detection for 17 formats (images, audio, video, documents), saved to temp file, forwarded via HTTP Upload
- MQTT Stream Detection: M3U/PLS playlist parsing, stream URL extraction with validation
- Security audit fixes: extract_local_path whitelisted to /tmp/dinox-mqtt-*, temp file cleanup, 10MB binary limit, BMP/MP3 false positive fixes, UTF-8 safe DB truncation, HTML detection fix, M3U line cap, U+FFFD stripping
- Redundant code: detect_binary_type() hoisted to single call per message
- 1 commit, 14 files changed, 1354 insertions(+), 32 deletions(-)
- MQTT Bridge fixes: OMEMO encryption respected, rate limit 2s→200ms, freetext echo filter, bridged messages visible in bot, enable/disable switch per rule
- Plugin i18n: tor-manager, bot-features, MQTT plugin strings now translatable (515→1277 strings)
- Translations: DE/FR/ES for 780+ new plugin strings; MQTT "Topic" mistranslation fixed in DE/FR/ES
- Code audit: 5 duplicate code blocks eliminated (escape_json, finish_post_unlock, decrypt_to_temp, looks_like_svg_file, MQTT DB helpers)
- Weblate: Merged 5 German translation strings
- 2 commits, 64 files changed, 230494 insertions(+), 36224 deletions(-)
- Avatar popup SIGSEGV crash fix: All popover button handlers defer UI actions with
Idle.add_full(LOW)— popover is fully unparented before conversation changes or dialogs open - Self-chat prevention: Own avatar click ignored in both MUC and 1:1 chats
- GDK surface guard:
hide_deferred()validates parent and native surface beforehide() - Popover unparent guard:
closedhandler checksget_parent()beforeunparent() - 1 commit, 2 files changed, 60 insertions(+), 26 deletions(-)
- RAM: Signal handler leak fixes: ConversationView (5 signal handler IDs stored + disconnected in dispose()), ConversationSelectorRow (10 handler IDs + disconnected in destructor)
- RAM: Cache limits: AvatarManager
failed_decrypt_hashescapped at 500; MessageCorrectionunmatched_correctionslimited to 50/conversation (FIFO eviction) - RAM: Cache cleanup on conversation close:
clear_conversation_cache()removes per-conversation stanza/server-ID lookup maps - RAM: Periodic malloc_trim(0): Every 60s, returns freed glibc arena pages to OS
- File transfer SIGSEGV fix:
file_providernow storesurl:+ URL infile_transfer.infoinstead of message ID — fixes crash when message body is empty (OOB-only stanzas) - File transfer URL validation:
Uri.parse()before libsoupSoup.Message()— prevents SIGSEGV on malformed URLs - Unencrypted file detection: Plain
https://URLs in body (without OOB element) now recognized as file transfers — many clients use HTTP Upload without OOB - Message truncation: Smart truncation for base64/binary data (200 chars) and normal text (50K chars) to prevent Pango/regex UI freeze
- MUC occupant list: Fix freeze + crash + memory leak for large MUCs — batch row creation (10/frame), pre-sort, cached affiliations, 150ms debounce
- Room creation: Default to public; private rooms hidden from server directory
- Popover crash fix:
unparent()only (nopopdown()) prevents GDK surface lifecycle SIGSEGV - Deleted contact guard: Don't reactivate conversations for contacts with cleared history
- GTK warning suppression: Known harmless AdwBreakpointBin, PopoverMenu, GtkText warnings silenced
- 5 commits, 15 files changed, 359 insertions(+), 77 deletions(-)
- ConversationView NULL race fix: Populators now properly closed on null-conversation path — prevents cascade of CRITICAL assertions when switching/closing conversations
- Null guards:
insert_item(),insert_new(),do_insert_item(),initialize_around_message()all guard against NULL conversation - 1 file changed, 21 insertions
- Jingle Session/Content Teardown:
Session.terminate()clears contents/contents_map;Content.terminate()nulls content_params, transport_params, security_params, clears component_connections + encryptions - RTP Stream Reference Break:
JingleRtp.Stream.contentmade nullable,release_refs()nulls content + plugin indestroy() - Parameters Cleanup:
terminate()clears payload_types, header_extensions, remote_cryptos;weak_ref→ namedunset_stream()+weak_unref()fixes use-after-free CRITICAL - CallWindowController: 13+ signal handler IDs tracked + disconnected in
cleanup();detach_all_video()on terminated - CallState/PeerState: Explicit binding unbind, handler disconnect,
release_objects()nulls heavyweight Jingle fields - Plugin:
malloc_trim(0)returns GStreamer buffer pool pages to OS after pipeline destroy - Stream: REMB timer tracked + cancelled in
destroy() - 11 files changed, 486 insertions
- GObject Reference Cycles: Fixed 26
this.notify[].connect()instances across 8 widget classes — closures capturingthiscreated cycles preventing finalisation. Store handler IDs, disconnect indispose() - Leaked bind_property Bindings: MessageItem, FileItem, CallItem, CallWidget, MessageMetaItem — return values discarded, objects pinned forever. Stored + unbind in
dispose() - Avatar Tile Model Deadlock: Destructor never fired (refcount ≥ 3 from service signals). New
cleanup()method called fromreset(),Tile.dispose(),Skeleton.dispose() - ListBoxRow CRITICAL Fix:
select_fallback_conversation()guarded withrows.has_key()— null crash on last-chat-close - Last Chat Close: Explicit
list_box.select_row(null)switches UI to placeholder - 4 commits, 18 files changed
- ConversationView Widget Pruning:
MAX_CONTENT_ITEMS=200withprune_newest_items()/prune_oldest_items()— prevents unbounded widget accumulation during scrolling - Conversation Close Cleanup:
unset_conversation()→initialize_for_conversation(null)→clear()frees all widgets when closing a chat - URL Preview Cache LRU:
MAX_CACHE_SIZE=200withLinkedList<string>LRU eviction — prevents unbounded Gdk.Texture memory growth - 3 files changed: conversation_view.vala, url_preview_widget.vala, conversation_view_controller.vala
- Bookmark Close Crash Fix:
removing_conversationsguard prevents re-entry during async slide-up animation — fixes flicker, widget tree corruption, SEGV/system freeze - Video Player Hardening:
_disposed+get_mapped()checks in frame update and preview generation callbacks - Bookmarks Reappearing on Reconnect:
sync_autojoin_active()detects closed conversations and corrects server-sideautojoinstate instead of re-joining - 3 files changed: conversation_selector.vala, video_player_widget.vala, muc_manager.vala
- Video Playback Fix:
playbinreplaces manualuridecodebin— fixes WebM/VFR (PTS=0) files showing frozen first frame - Pause/Stop Timer Management: Frame polling timer properly stopped on pause, restarted on resume
- Seek Slider: Re-enabled with safe
KEY_UNITseeking + 200ms debounce - FileSendOverlay Warning:
content-height=400prevents AdwBreakpointBin min > natural height GTK warning - 3 files changed: video_player_widget.vala, file_send_overlay.ui, .gitignore
- Preferences Dialog Caching: Dialog created once and reused — re-open is instant (0ms vs ~200ms)
- Tor Switch Lag Fix: All 3 switches defer async work to
Idle.add(), matching MQTT switch pattern - MQTT Timer Leak Fix: Status timer pauses when dialog is hidden, resumes on re-open
- 3 files changed across main, plugins/mqtt, plugins/tor-manager
- PopoverMenu GTK Warning + WebM Playback: Fixed GTK PopoverMenu deprecation warning; bundled VP8/WebM decoder in AppImage
- GStreamer Plugin Bundling: AppImage now includes
good,bad,libavGStreamer plugins for full audio/video codec support - "Show Bot in Chat" Gated on MQTT State: Button disabled when MQTT is off across all 3 dialogs
- MQTT Logging Refactor: ~80
message()→debug()across 10 files. Verbose output viaG_MESSAGES_DEBUG=mqtt - DEBUG.md MQTT Section: Rewritten with two-tier logging docs, 7 subsystems, mqtt.db reference
- 10 files changed across plugins/mqtt, main, docs
- AES-256-GCM Encrypted Settings: Telegram tokens, AI API keys, ejabberd admin password now encrypted at rest in SQLite. Auto-migration of existing plaintext values
- BUG-02: Removed
token_rawcleartext storage entirely - BUG-04: Race condition fix —
last_insert_rowid()instead ofSELECT max(id)(PR #17) - BUG-06: Telegram bot token redacted from all debug/warning logs
- BUG-17: OMEMO per-key session persistence instead of JSON blob rewrite
- BUG-18:
gnutls_global_init()once at plugin startup, not per-call - BUG-22:
delete_dedicated_bot()properly sequenced with ejabberd unregister - BUG_AUDIT.md: 18/21 bugs fixed, 2 open (external), 1 false positive
- 7 files changed across plugins/bot-features
- HA Discovery Live Start/Stop: Per-account HA Discovery toggle now works without reconnect — DiscoveryManager created/removed on-the-fly in
apply_account_config_change() - ORIGIN_SW → Dino.VERSION: HA Discovery device info version now auto-updated from build system
- Release Automation:
release.shauto-updates VERSION, index.html, dino.doap - NODERED_FLOWS.md: Full English rewrite with 3 broker setup options
- Log Fix: Bot manager save log now shows
discovery_enabledfield - 3 files changed across plugins/mqtt
- MQTT Per-Account Bot JID Collision (BUG-CRITICAL): All per-account bots shared
mqtt-bot@mqtt.local— ConversationManager collapsed them into one conversation. New unique bare JIDs:mqtt-<escaped_bare_jid>@mqtt.local - MQTT Standalone Cross-Wiring (BUG-CRITICAL): Standalone and per-account shared same bare JID → standalone toggle affected per-account. Standalone now uses
mqtt-standalone@mqtt.local - Clear Cache Fixes:
purge_caches()crash on missingundecryptedtable (try/catch), avatar directory re-creation after cache wipe - CI vala-nightly: Shallow clone prevented
git describefrom finding tags →--deepen=200 --tags - 5 files changed across libdino, plugins/mqtt, .github/workflows
- GTK Focus-Out Warnings: 5
grab_focus()calls replaced withGtk.Root.set_focus(null)across 3 MQTT dialogs - MQTT Enable Switch Lag: Per-account dialog
update_connection_sensitivity()deferred toIdle.add()with tracked source ID (§9) - Compiler Warnings: 6 warnings fixed → 0 (unused vars, dead method, unreachable catch)
- Build Scripts:
scripts/build.sh(strict build wrapper),scripts/run_debug.sh(runtime debug),scripts/pre-commit(warning-blocking hook) - Shell Script Fixes:
set -e+ pipeline crash fixed in build.sh and run_debug.sh - 12 files changed, ~700 insertions, ~50 deletions
- MQTT Re-Audit (8 findings): 1 HIGH + 3 MEDIUM + 4 LOW — enable switch bypass, discovery command, QoS scope, port/freetext clamping, server_detector post-yield, discovery_prefix sanitizing
- UX Fixes: Enable switch lag (Idle.add), GTK focus-out warnings (3 dialogs)
- Node-RED Integration: Two example flows (DinoX Bot + Tankerkoenig fuel prices), NODERED_FLOWS.md with embedded JSON + ejabberd config
- 9 files changed, 425 insertions, 42 deletions
- MQTT Self-Audit (11 findings): 4 CRITICAL + 2 HIGH + 3 MEDIUM + 2 LOW bugs fixed across ~15 MQTT source files
- MQTT Tests: +23 audit-driven regression tests (78→101, 12 suites), 5 new suites
- Security Audit Docs: MQTT section added (M1–M11), consolidated 55 findings, upstream Dino refs removed
- GitHub Templates: All templates overhauled with dropdowns, new CrashReport.yml
- Guidelines: 10 new rules from MQTT audit added to coding/review/security docs
- Test Suite: 689 Meson + 136 standalone = 825 total, 0 failures
- ICE/DTLS Handshake Fix: Outgoing call DTLS timeout fixed — deferred to ICE-ready, stale stop-flag race fixed, timeout 20→30s
- MQTT Bridge send_account: Mandatory account selector on bridge rules, DB v4 migration, auto-backfill for legacy rules
- MQTT Bridge Improvements: Client scoping, MUC delivery, alias in messages, inline edit, duplicate bot-chat suppression
- Topic Subscriptions: Inline edit form + full edit dialog for existing subscriptions
- MUC Creation: Privacy fix (explicit room config), context menu fix, autojoin fix
- GLib-CRITICAL Fixes: history_sync.vala DateTime NULL guards, MQTT DateTime guards, Adwaita stale widget guards
- Docs & Cleanup: MQTT docs v1.6.0, static analysis cleanup, audit table formatting
- 140 bugs fixed across all modules: libdino (48), UI (49), xmpp-vala (16), infrastructure (9), systray (5), crypto-vala (4), qlite (3), OMEMO (3), runtime (3)
- Tor Proxy Timing: Fixed "Verbindungsaufbau abgelehnt" — waits for bootstrap before applying SOCKS5 proxy
- Signal Disconnect Guards: Fixed GLib-GObject-CRITICAL warnings (handler ID not found)
- 3 Runtime Fixes: Popover SIGSEGV crash, libsoup session lifecycle, tooltip rebuild spam
- 13 Performance Optimizations: Memory allocation, startup time, hot-path improvements
- Test Suite: +299 tests (835 total), 52/69 XEPs covered (75.4%)
- New: Systray IconPixmap for Qt-based tray hosts, CI --clean mode, coding guidelines
- Plugin Security Audit: Audited all 10 plugins, found and fixed 26 bugs total:
- bot-features: 16 bugs (1 CRITICAL, 3 HIGH, 5 MEDIUM, 7 LOW)
- http-files: 2 LOW (Content-Length overflow, null-check)
- omemo: 2 LOW (iterator invalidation, multi-account notification)
- openpgp: 1 MEDIUM + 1 LOW (null-check copy-paste, stdin piping)
- rtp: 1 MEDIUM + 2 LOW (REMB bitrate calc, buffer leak)
- tor-manager: 1 MEDIUM (infinite restart loop)
- ice, notification-sound: clean
- OMEMO v1/v4 Race Condition: Fixed timing bug where v2 bundle arriving before v1 device list created orphaned v4 sessions causing broken encryption. Three fixes: v2 guard, proactive session replacement, proper error code
- MUC Status Code Spam: Removed
printerr()spam of "110" status codes from stderr
- MQTT 20-Bug Audit: Fixed all 20 bugs found in comprehensive plugin audit:
- 2 CRITICAL: publish routing to wrong client, save_rules() without DB rollback
- 4 HIGH: crash after yield, timer leak, stale index in topic manager, double signal
- 7 MEDIUM: unsafe payload cast, null module guards, hardcoded QoS, save_rules on every alert, GTK child iteration, disconnected account fallback, coordinated QoS
- 7 LOW: discovery unsub, port validation, state topic cleanup, dead null check, discovery sensitivity, uint overflow, publish ack check
- MQTT UI Improvements: Mode selector (XMPP Server / Custom Broker), Show Bot in Chat button, HA Discovery guard for XMPP mode, standalone enable switch lag fix (Idle.add), removed duplicate settings from standalone Bot Manager
- BUILD.md: Complete plugin build options table (13 plugins with meson options, defaults, dependencies)
- Docs: Updated MQTT_PLUGIN.md and MQTT_UI_GUIDE.md with HA Discovery compatibility notes
- Flatpak Module Updates: Updated 4 outdated Flatpak modules: openh264 2.4.1→2.6.0, tor 0.4.8.10→0.4.8.22, obfs4proxy 0.0.14-2+b5→+b6 (now arch-aware for amd64+aarch64), pipewire 1.2.7→1.4.10.
- cJSON Module: Added cJSON 1.7.18 as Flatpak module (required by mosquitto 2.1.2).
- protobuf-c & mosquitto from Source: CI/AppImage now build protobuf-c 1.5.2 and mosquitto 2.1.2 from source via
ci-build-deps.sh(Ubuntu 24.04 packages outdated). - mosquitto Build Fix: Added
-DWITH_DOCS=OFFand-DWITH_TESTS=OFFto mosquitto cmake (xsltproc/GTest not available in CI). - CI: All 4 workflows pass (Build, AppImage, Windows MSYS2, Release/Flatpak).
- MUJI MUC Cleanup (F10): Ephemeral MUC rooms destroyed after call (
destroy_room+close_conversation). Correct teardown order: terminate peers first, then destroy MUC. - MUJI Camera Leak (F11): Fixed camera staying on after MUJI call. Zombie-session guard in async
call_resource(), newdispose_pipeline()safety net. - Entity Caps Hash (F12): Downgraded to
debug()— server-side ejabberd bug. - 1:1 PipeWire Leak: Disconnected
devices_changedhandler, nulled device refs, removed pipe recycling. - DTMF Pipeline: Lazy init + immediate shutdown.
- GDK_IS_SURFACE: Cancelled
hide_control_handleronclose_request. - Signal/Stream Cleanup: PeerState signal handler disconnection, stream null-safety, VideoWidget null-safe dispose.
- MUJI Group Calls Audit: Fixed 14 findings (F1-F9) — signal leak in detach(), invite-retract with 60s timeout, MUC-leave on retract, nick collision retry (3 attempts), codecs_changed signal consumption, dead code removal.
- Peer Limit: MAX_MUJI_PEERS=4 with UI feedback ("Anruf voll" / "Call is full").
- Timeout Separation: 1:1 calls 30s, MUJI initiator 90s, MUJI receiver 30s, invite 60s.
- OMEMO DTLS-SRTP: 8 bug fixes in verification draft (null checks, key comparison, error handling).
- OMEMO MUC: Proactive key fetch, MAM real_jid resolution, empty occupant guard.
- Audio Clipping Mitigation: recv_gain = 1/sqrt(N) for multi-peer group calls.
- Bandwidth Coordination: Per-peer video bitrate cap (upload_budget/N), rebalance on peer join/leave.
- Network Recovery: End active calls on XMPP connection loss.
- MUC Close vs. Leave: Separated hide from close/leave to prevent race conditions and unintended MUC departures.
- Avatar Fixes: Removed debug prints, fixed portrait resize, removed redundant DB reads, added MUC avatar remove button.
- MUC Message Retraction: Fixed wrong moderation ID, missing local feedback, feature cache race.
- GTK Warnings: Fixed AdwBreakpointBin min > natural height (vhomogeneous + measure() override), sidebar placeholder wrapping.
- Panic Wipe Resync: Added sync_not_before + panic marker to prevent MAM from restoring wiped data.
- GLib-GObject-CRITICAL: Fixed realize_id not reset after handler disconnect.
- URL Preview vs. Reactions: Fixed priority conflict (both priority 3), reactions moved to priority 4.
- CI: aarch64 builds now optional (allow-failure).
- GTK4 Call Window Segfault: Recursive
gtk_window_closein call window close handler. Addedclosingguard, removeddispose()during signal emission. - SRTP force_reset Bug:
force_reset()only reset encrypt stream, not decrypt counter. Found by RFC 3711 audit, 10 new tests. - SOCKS5/XEP-0260 Audit: 14 new tests for SOCKS5 Bytestreams protocol logic. Tor toggle lag fixed.
- HTTP-Files Tests: 25 tests for URL regex, filename extraction, log sanitization. GCM tag always-append bug fixed.
- SFS + Legacy Fixes: Encryption propagation, legacy decrypt tag, UI widget fixes, Pango invalid UTF-8.
- Legacy Code Removed: ~400 lines dead code (ESFS registry, encryption fallback, avatar re-encryption, esfs_mode).
- Testing Infrastructure: 692 total tests (556 Meson + 136 standalone).
run_all_tests.shfixed (openpgp-test was missing). Complete source file reference in TESTING.md.
- Bookmark Close Action Race:
Idle.add()umpopover.unparent()— GTK4 schloss Popover bevor Aktion feuerte,unparent()entfernte Action-Group. - Role.NONE Warnung: Fehlender Switch-Case in
status_populator.valabehoben. - "Unterhaltung starten" Lag: Sync Roster-Laden → verzögertes Batch-Laden (2er-Batches, 150ms initial, 10ms zwischen Batches).
- Konto-Deaktivierung Konversationen: Aktive Konversationen werden jetzt explizit geschlossen (OMEMO-sicherer Pfad).
- MUC-Browser Schalter Lag:
clear_list()+populate_list()inIdle.add()gewrappt.
- Legacy Encryption Fallback:
decrypt_data()auto-falls back to pre-v1.1.2.7 format (SALT=8, IV=16, TAG=8) when current format fails. Old avatars decrypted and silently re-encrypted to current format. - Avatar Decrypt Spam Fix:
failed_decrypt_hashesprevents repeated expensive PBKDF2 for corrupt files.store_image()pre-populates bytes cache. - Upgrade Recommendation: Panic Wipe (
Ctrl+Shift+Alt+P) for cleanest migration to new encryption parameters, or let auto-migration handle it.
- Security Audit Test Suite: 506 Meson + 136 standalone = 642 tests. 6 suites, spec-based naming. Found and fixed 21 bugs (T-1 through T-21).
- Flatpak H.264 Fix: Add
GST_PLUGIN_PATH=/app/lib/ffmpeg+autodownload: truefor ffmpeg-full extension. Old Radeon GPUs can now record video messages. - AppImage KDE Icons (GitHub #14): Bundle Adwaita scalable + symbolic icons for KDE Plasma compatibility.
- AppImage VAAPI Segfault: Remove bundled
libgstvaapi.so(crashes on old Radeon). Host VAAPI still works via GST_PLUGIN_PATH prepending. - File Manager Log Spam:
warning()→debug()for "Don't have download data (yet)" race condition. - Documentation: SECURITY_AUDIT.md updated with test-suite bugs. TESTING.md with Developer Quick Reference. README Testing link.
- AppImage TLS Fix: Bundle glib-networking (libgiognutls.so) + set GIO_EXTRA_MODULES in AppRun. Fixes GitHub #13.
- File Upload Null Check: Null check for prepare_send_file() result prevents CRITICAL assertion crash.
- DTMF Debounce: 300ms per-digit debounce prevents double-send on fast clicks.
- DTMF Thread-Safety: Mutex-protected queue replaces unsynchronized LinkedList. Fixes SIGSEGV, stream errors, one-directional audio after DTMF.
- DTMF Local Tones: Silence keepalive + volume gating for reliable playback during audio and video calls.
- Audio Quality Tuning: WebRTC APM: NS kModerate, AEC desktop, AGC kFixedDigital 6dB, transient suppression disabled.
- Opus FEC:
packet-loss-percentage=10for forward error correction on lossy networks. - Receive Audio Ramp-Up: 200ms volume fade-in prevents crackling at call start.
- Outgoing Ringback Tone:
phone-outgoing-callingplays immediately on outgoing calls.
- PopoverMenu Unparent: Right-click context menu popover now unparented on close. Fixes GTK "Broken accounting of active state" warning.
- Flatpak OpenH264: Build OpenH264 v2.4.1 as Flatpak module. Video recording works without optional ffmpeg-full extension.
- MUC Correction Fallback: Fall back to nick matching for MUC corrections when occupant IDs (XEP-0421) are unavailable.
- ESFS GCM Auth Tag: Try authenticated GCM decryption first, fall back to tag-less mode for interop. Eliminates per-file warnings.
- Preferences Lazy Loading: Contacts page defers roster population until visible; Encryption page defers OMEMO key queries. Dirty-state tracking refreshes on next map. Reuses existing AccountDetails. Fixes lag when opening preferences.
- bot_registry.db Encrypted: Bot registry now encrypted with SQLCipher (same key as dino.db). Auto-migrates plaintext DBs.
- File Permissions: All DB files chmod 600 (including WAL/SHM).
- Secure Delete:
PRAGMA secure_delete = ONfor bot_registry.db. - Duplicate Conversations: UNIQUE constraint + dedup migration on
(account_id, jid_id, type_). - Orphan Cleanup: Migration removes orphaned messages and real_jid entries.
- Foreign Keys:
PRAGMA foreign_keys = ONenforced per connection. - Auto-Vacuum:
auto_vacuum = INCREMENTALwith one-time VACUUM conversion. - File Transfer Index: New index on
(account_id, counterpart_id). - FTS4 → FTS5: Runtime detection, conditional upgrade, FTS4 fallback. SQLCipher now built from source with
--enable-fts5in CI/Flatpak. - DB VERSION: 37 → 39.
- Bookmark Close Lag:
part()(sync socket write + bookmark update) blocked UI before collapse animation. Fix: schedule viaIdle.add(), animation runs first. - Systray Quit Lag: Window stayed visible during disconnect. Fix: hide window instantly, remove duplicate cleanup and unused safety timer.
- Avatar Cache Destroyed on Shutdown:
cleanup_temp_files()deleted encrypted avatar files every quit → 6s re-fetch on restart. Fix: stop deleting AES-encrypted avatar cache. - Avatar Bytes Cache: Added in-memory LRU cache (200 entries) for decrypted avatar bytes — no more file I/O + AES decrypt per access.
- Avatar Rebuild Debounce: MUC avatar tiles debounced (150ms) to prevent repeated full rebuilds during login. Occupant avatar changes handled by individual tiles, not full rebuild.
- Animation: Conversation row slide-up reduced 200ms → 120ms.
- Systray Quit Destroyed OMEMO Keys: Systray called
disconnect_account()per account (firesaccount_removed→ OMEMO keys deleted) BEFOREshutdown()ran. Fix: usedisconnect_all(). - Reconnect/Disable Account Destroyed OMEMO Keys: Preferences reconnect and account disable also called
disconnect_account(). Fix: useconnection_managerdirectly. stream_interactor.disconnect_account()now only used when user explicitly removes an account.
- Constrained Baseline Profile: All H.264 encoders forced to Constrained Baseline via capsfilter. High profile was rejected by Android media players (Monocles, Conversations).
- Video Audio Playback: Added missing
audioresamplein video player pipeline. Without it, decoded AAC could not negotiate sample rate with audio sink.
- VP8/WebM Removal: Removed VP8/WebM fallback — Monocles/Conversations can't play WebM. H.264/MP4 only.
- MP4 moov atom Fix: EOS timeout 1s→5s. Without sufficient wait, mp4mux never writes the moov atom → all MP4s were corrupted.
- VAAPI Encoder Test Fix: Added
videoconvertto test pipeline. Hardware encoders need format negotiation, not raw I420. - MP4 faststart: moov atom at file beginning for progressive playback.
- OMEMO Identity Persistence: Shutdown was destroying all OMEMO identity keys via
account_removedsignal. Every restart generated new OMEMO identities (new device IDs, new keypairs). Fix:disconnect_all()closes sockets without triggering account removal. Affects v1+v2.
- OMEMO v2 Phantom Fix: Fixed v2 device list causing phantom devices to re-appear endlessly. Cleanup now runs after v2 list, PubSub node uses
max_items=1, republish uses fixed item_id"current", bundles only fetched for active devices. - Encoder Runtime Validation: Each video encoder tested with 1-frame pipeline before use. Catches broken
openh264enc(factory exists but lib fails at runtime). - VP8/WebM Fallback:
Added(removed in v1.1.1.9).vp8encas ultimate fallback - Pipeline Error → Auto Cancel: Broken pipelines now cancel recording + show error dialog instead of freezing the app.
- Graceful Shutdown: Systray quit disconnects all XMPP accounts with 3s timeout before exit.
- PipeWire Pipeline Leaks: No GStreamer pipeline until user clicks play. Full cleanup on stop/dispose.
- Video Thumbnail Preview: Fixed
is_in_viewport()reference widget bug + deferred init with retry for unmapped widgets. - Video Player Controls: Seek bar, time display, play/pause, stop button re-enabled for inline videos.
- Audio Pipeline Cleanup: Removed
audiodynamicnoise gate/compressor (caused scratching artifacts). Clean pass-through, volume=1.0. - openh264enc Fallback: 5th H.264 encoder fallback for Flatpak (GNOME Platform runtime).
- Audio Quality: voaacenc 64→128kbps, avenc_aac 64→96kbps.
- AppImage Dependencies: Removed unused libgstgtk4.so, added libgstgdkpixbuf.so + libgstx264.so.
- GtkBox Warning Fix: Removed
width_request=400on URL preview card_box (was minimum, not maximum). Fixed baseline bug in NaturalDirectionBoxLayout. - Video Encoder Flatpak Fix: Added
avenc_h264(ffmpeg) as fallback H.264 encoder. Madeh264parseoptional. Video recording now works in Flatpak without gst-plugins-ugly/bad. - Error Diagnostics: Video recorder now reports exactly which GStreamer element is missing instead of generic "Need: gstreamer-gtk4".
- Plugin Load Order Fix:
bot-features.sodepends onomemo.soat runtime. Plugin loader now sorts dependencies-first and retries failed plugins in a second pass. - Flatpak login1 D-Bus: Added
--system-talk-name=org.freedesktop.login1for suspend/resume detection.
- Pango cursor_pos Assertion Fix: Reset
label.selectablebefore text update to invalidate stale cursor index. Movedunbreak_spacebefore AttrList byte index computation (NBSP is 2 bytes vs 1). Recompute/mebold/italic indices after NBSP expansion. - Markup Escaping: Escape
status_textin conversation selector tooltip and reaction emoji in reactions widget to prevent Pango parse errors.
- Video Preview Dark Screen Fix:
gdkpixbufsinkunavailable caused black preview during video recording. Replacedfakesinkfallback withappsinkpulling RGBA frames intoGdk.MemoryTexture. - Missing gst-plugins-good: Added
gstreamer1.0-plugins-goodto all build/install docs and CI workflows. - Build System: Added
gstreamer-app-1.0as core dependency for main binary.
- AudioRecorder MP4 Corruption Fix: Replaced pad probe buffer dropping with volume mute (0 to 1.8 after 200ms). Pad probes caused timestamp gaps in MP4 container, producing corrupted audio files.
- Installation Docs: Added GNOME Platform//48 runtime requirement to Flatpak instructions in README, website and release notes.
- Video Messages: Record and send video messages with camera+microphone. GStreamer pipeline with pipewiresrc/v4l2src (video) and autoaudiosrc (audio), H.264+AAC in MP4, HW encoder fallback (vaapi/va/x264). Live preview via gdkpixbufsink. Camera button in chat input. Max 720p/30fps, 120s.
- G.711 Fallback Codecs: PCMU/PCMA for SIP gateway compatibility.
- MUC Role/Affiliation Fixes: Signals only fire on actual changes, moderator menu per XEP-0045, role status messages.
- Botmother UI Fixes: ejabberd test-before-save, vCard debounce, stream cleanup.
- Video Player Size Cap: 400x225px Gtk.Frame prevents oversized inline video.
- Recording Lifecycle Fixes: Popover destroyed after each recording (fresh preview), signal handlers disconnected in dispose, GStreamer elements released.
- AudioRecorder Hardening: autoaudiosrc instead of pipewiresrc, double-callback guard, timer leak fix, PipeWire transient mute.
- OMEMO Session Reset UI: New "Reset session" and "Reset all sessions" actions in key management. Available per device (ManageKeyDialog), per contact (encryption settings), and per MUC member. Deletes broken Signal sessions while preserving keys and trust levels. Fresh sessions are negotiated automatically on next message.
- OMEMO IV Zeroing Fix: Fixed critical bug where AES-GCM IV was zeroed before being placed in the outgoing stanza. All recipients received a zeroed IV that didn't match the encryption IV, causing universal decryption failure.
- OMEMO Session Auto-Recovery: SG_ERR_NO_SESSION errors now trigger automatic bundle fetch and session rebuild instead of silently dropping messages.
- OMEMO v4 Session Guard: v4 sessions in the v1 encryptor are detected and replaced with correct v3 sessions.
- Sticker Button Visibility Fix: Sticker button now hides when stickers are disabled in settings. Reactive binding to
stickers_enabled. - Sticker Animation Toggle Fix: Toggling sticker animations on/off takes effect immediately. Always loads as animation; playback controlled by setting.
- Tor Settings UI Fixes: Shortened tab title to "Tor", fixed visually stuck firewall/bridges switches, replaced blocking subprocess calls with async.
- Connection Manager Null Guard: Prevents critical assertion failure when account removed during async stream establishment.
- Minimum Window Width: Raised from 400 to 500px to prevent Adwaita GtkStack width overflow.
- Public XMPP Room Search: Search all public XMPP servers via search.jabber.network API in Browse Rooms dialog. Toggle between local disco and global public search.
- Subscription Status: Show roster subscription state (Mutual, To, From, None) and pending requests in contact details.
- Duplicate Close Button Fix: Removed redundant X+Cancel from 10 dialogs (decoration-layout).
- Attachment Button Lag Fix: Optimistic UI keeps file button visible while XMPP stream still connecting.
- All Compiler Warnings Eliminated: Unreachable catches, unused vars, implicit .begin(), uint8[] GObject properties, Windows-conditional extern/methods. 626/626 targets, zero warnings.
- GTK/Adwaita Warnings Fixed: CSS max-width replaced with widget constraint, PreferencesDialog minimum size set.
- SASL Debug Logging & Scripts: Extended debug logging, documented all scripts, extended log scanner.
- SCRAM-SHA-256/512: Implemented SCRAM-SHA-256 and SCRAM-SHA-512 alongside existing SCRAM-SHA-1. Preference order: SHA-512 > SHA-256 > SHA-1.
- SCRAM Channel Binding (-PLUS): All 6 SCRAM variants (SHA-1, SHA-256, SHA-512, and their -PLUS counterparts). Channel binding uses tls-exporter (RFC 9266, GLib 2.74+) with fallback to tls-server-end-point (RFC 5929, GLib 2.66+). Custom VAPI binding to fix upstream Vala NULL dereference bug.
- SCRAM Nonce CSPRNG: Replaced GLib.Random (Mersenne Twister) with /dev/urandom for SASL nonce generation (24 bytes, Base64-encoded).
- Channel Binding Downgrade Protection: Per-account MITM protection toggle in Advanced Settings. When enabled, refuses login if server does not offer SCRAM-*-PLUS mechanisms (possible downgrade attack). Similar to Conversations/Monocles "MITM Protection" toggle. DB version 37.
- DinoX Exclusive: Only XMPP client supporting all 6 SCRAM variants including SHA-512-PLUS.
- Crypto Security Audit (23 Findings): Full audit of 39 crypto-related files and 15 OpenPGP files. 6 critical, 11 medium, 3 low findings in OMEMO/Signal layer plus 3 findings in OpenPGP layer -- all fixed and verified.
- Critical Fixes: AES-GCM tag verification bypass, XML injection in OMEMO key exchange, SASL SCRAM nonce truncation, Double Ratchet key reuse via duplicate XML elements, PKCS#5 padding oracle, pre-key exhaustion without replenishment.
- Medium Fixes: HKDF salt handling, trust store race conditions, session store unbounded growth, bundle fetch without verification, missing replay protection logging, cleartext key material in logs, Signal session serialization integrity, certificate chain validation, stale device ID publishing, multi-device decryption race, X3DH SPK signature verification.
- OpenPGP Fixes: Secure temp file deletion (zero-overwrite before unlink), secure temp file permissions (0600 via FileCreateFlags.PRIVATE), CSPRNG random padding replacing Mersenne Twister.
- Security Audit Documentation: SECURITY_AUDIT.md report, security-audit.html web page, website and README navigation links.
- OMEMO v2 Implementation Story: Full documentation of OMEMO v2 implementation journey.
- URL Link Preview: Telegram-style preview cards for URLs in chat messages. Fetches OpenGraph metadata (title, description, image, site name) with in-memory cache. Accent-color left border, optional 80x80 thumbnail, clickable to open browser.
- Voice Message Waveform (Recorder): Real waveform display using peak dB from GStreamer
levelelement. 60-bar red waveform with pulsing record indicator and age-based opacity gradient. 5-minute max duration with countdown. - Voice Message Waveform (Player): 50-bar waveform visualization (blue=played, grey=unplayed) replacing the slider. Faster-than-realtime scan via
playbin+level+fakesink. Click/drag seek. - Voice Message Audio Quality: 48kHz mono, +5 dB volume, 230ms pre-roll mute, soft-knee compressor to prevent clipping.
- File Provider URL Bug Fix: Receiver no longer sees "unknown file to download" for URL messages. Fixed
oob_url ?? message.bodyfallback logic. - Video DMABuf Fix (Issue #11): Filter out DMABuf/DMA_DRM caps in video device selection. Fixes 0 kbps video on older V4L2 drivers.
- OMEMO File Decryption Fix: Fixed double-decryption bug in
file_encryption.valaGCM auth state. - Subscription Notification Fix: Fixed persistent "Send request" notification in DinoX-to-DinoX chats. Load
askfield from DB, suppress for active conversations. - AppImage Icons: Copy all 6 icon sizes, set XDG_DATA_DIRS in AppRun, SNI IconThemePath property.
- Telegram Bridge: Downgrade timeout warnings to debug level.
- DTMF Support (RFC 4733): Full telephone-event DTMF for audio and video calls. Direct RTP packet injection into the audio stream (same seqnum/SSRC/SRTP path). Supports 0-9, *, #, A-D with 250ms default duration. Dynamic payload type resolution from negotiated session.
- Dialpad UI: New
CallDialpadpopover with 3x4 grid and telephone-style sublabels. Accessible via dialpad button during active calls. Automatic digit queuing for fast input. - Clickable Bot Command Menus: All interactive bot menus (
/help,/ki,/telegram,/api) generate clickablexmpp:URIs. Users click commands instead of typing them. - Dialpad Auto-Hide Fix:
is_menu_active()now checks the dialpad popover, preventing the 3-second auto-hide timer from closing the dialpad during video calls. - DTMF Video Call Lag Fix: Replaced GLib main-loop timers (
Timeout.add/Idle.add) with RTP-timestamp-based timing in the streaming thread. Duration measured in audio clockrate samples, independent of UI thread load.
- Password Dialog i18n: All 22 German gettext msgid strings in password dialogs converted to English. Non-German users previously saw German fallback text.
- Translation Format-Spec Fixes: Fixed format-spec errors in 12 .po files caused by
msguniqconcatenating duplicatemsgstrvalues. - Website: Fixed XMPP contact URI from
?join(MUC) to?message(regular JID). Clarified footer text about REST API.
- Telegram Inline Media Display: Photos, videos, audio and GIFs from Telegram now display inline in XMPP conversations via two-message approach (info text + bare URL).
- Telegram Sticker Handling: Static
.webpstickers forwarded as inline images. Animated.tgs/.webmconverted to emoji representation. /clearCommand: Clean bot conversations -- clears AI history (RAM) and local SQLite DB. Optional/clear mamdeletes ejabberd MAM archive.- Telegram 409 Polling Fix: Per-bot polling lock, long polling (25s),
deleteWebhookon startup, 5-second backoff on HTTP 409.
- AI Integration (9 Providers): OpenAI, Claude, Gemini, Groq, Mistral, DeepSeek, Perplexity, Ollama and OpenClaw. Per-bot provider/model/endpoint/API key settings.
- OpenClaw Agent Support: 9th AI provider -- autonomous agent integration via
{"message": "..."}POST with Bearer token auth. - Telegram Bridge: Bidirectional XMPP-to-Telegram message bridge with polling mode, auto-reconnect, and connection testing.
- HTTP API Extensions: 9 new REST endpoints for Telegram (5) and AI (4). Total: 31 REST endpoints.
- TLS API Server: Auto-generated self-signed certificates (cert_gen.c). Configurable via preferences UI.
- Auto-Restart API Server: Server restarts automatically when settings change (port, TLS, certificates).
- Dedicated Bot Mode with OMEMO: Full OMEMO encryption for bots with session pool management.
- Interactive Menu System: BotFather-style chat menus for
/help,/ki,/telegram,/api. - API_BOTMOTHER_AI_GUIDE.md: Comprehensive 12-chapter documentation (bot management, AI, Telegram, HTTP API, TLS).
- Botmother Chat Interface: Interactive bot management via self-chat commands (BotFather-style). Commands:
/newbot,/mybots,/deletebot,/token,/showtoken,/revoke,/activate,/deactivate,/setcommands,/setdescription,/status,/help. - BotManagerDialog: GTK4/libadwaita dialog showing all bots with status icons, mode, token copy, and delete.
- BotCreateDialog: Create bots with name and mode selection.
- Per-Account Botmother Toggle: Enable/disable Botmother per account.
- Auto-Pin Self-Chat: Botmother self-chat conversation auto-pinned when account has bots.
- OMEMO Race Condition Fix:
message_states.unset()outside lock caused concurrent HashMap modification crash. - SQLite Upsert Fix: Missing conflict column in
set_setting()caused emptyON CONFLICT()SQL.
- XEP-0050 Ad-Hoc Commands: XMPP module for executing, listing and handling ad-hoc commands.
- Bot-Features Plugin: Local HTTP API (localhost:7842) for bot management and XMPP message routing. Token auth, rate limiting, webhooks, 16 REST endpoints.
- Sticker Publish Fix:
publish_pack()uploaded AES-256-GCM encrypted files instead of plaintext. Now decrypts to temp file. - Sticker Chooser Lag Fix: O(n^2)
remove(0)loop replaced withremove_all()(O(1)). - Sticker Thumbnail Speed: Reduced
Thread.usleepfrom 30ms to 2ms, increasing throughput from ~33 to ~500 thumbs/sec.
- MUC OMEMO: Per-member trust management, key visibility, own keys section, double widget fetch fix, undecryptable warning fix for own JID.
- OMEMO v1/v2 MUC Version Selection: v2 only used when ALL recipients support it. Prevents v1 clients from losing messages.
- OMEMO Stale Device Cleanup:
cleanup_stale_own_devices()on every connect -- publishes clean device list, removes stale bundles from server. - OMEMO Device List JID Filter: Filters out PubSub service components and MUC room JIDs from device list processing.
- OMEMO Cleanup on MUC Destroy: Automatically removes OMEMO data stored under room JID when room is destroyed.
- MUC Destroy Room: Full cleanup chain with error handling. Right-click context menu for room owners.
- Channel Dialog: Fixed 5 bugs -- duplicate entries, missing lock icon, broken type check, invisible password field, stuck join button.
- OMEMO MUC Encryption After Rejoin: Fixed false "does not support encryption" by waiting for room features before checking.
- OMEMO Solo/Self-Only Encryption: Allows sending in MUC when only own device is present.
- OMEMO Device Display: Filters inactive devices, sorts by last activity, shows "Last seen" per device.
- Status/Presence (6 Bugs): Persistence, systray sync, status dots, XA color distinction.
- Avatar Preload Race: Pre-load avatar hashes before signal connections.
- Notification Sound Plugin: Enabled by default on all Linux builds (native, Flatpak, AppImage) via libcanberra.
- Call Ringtone: Incoming calls play
phone-incoming-callsound event in 3-second loop via libcanberra. - Double Ringtone Prevention: Freedesktop notification uses
suppress-sound=trueso only the plugin controls audio.
- Undecryptable OMEMO Ghost Messages: Failed decryptions no longer stored as plaintext. Message body cleared on failure.
- MAM Re-sync After History Clear: MAM catchup ranges preserved to prevent archive re-sync.
- Avatar Sync (6 Bugs): Fixed cache invalidation, re-fetch on reconnect, empty hash handling, PubSub item fetch, Base64 whitespace.
- Clipboard Paste Lag: Fixed UI lag from unconditional
read_texture_async. Now checks format before attempting read.
- OMEMO v1/v2 Session Conflict: Fixed
SG_ERR_LEGACY_MESSAGEfailures from shared session store. v1 detects v4 sessions, v2 no longer creates sessions for v1 JIDs. - GTK4 Double Dispose Crash: Added null guards and sentinel resets to prevent double-free in dispose().
- OMEMO Fingerprint Display: Standardized XEP-0384 format (8 groups of 8 hex digits).
- OMEMO Device Labels: Published for v1+v2, fetched from remote v2 device lists.
- Server Cleanup on Account Deletion: Full PubSub cleanup before XEP-0077 unregistration.
- OMEMO Device Management: PubSub device list management, device removal, detailed info dialog.
- OMEMO Session Auto-Repair: Detects and repairs broken sessions automatically.
- OMEMO Session Thrashing Guard: Cooldown period prevents rapid rebuild loops.
- OMEMO Broken Bundle Handling: Broken bundles counted as "lost" instead of "unknown".
- OMEMO Bundle Retry: Auto-retry every 10 minutes, up to 5 attempts.
- Account Deletion: Complete cascade delete across 25+ tables.
- Clear Cache: Purges 10 database cache tables plus filesystem cache.
- CRITICAL Fix: Resolved
dino_entities_file_transfer_get_mime_type: assertion 'self != NULL' failedcrash caused by dangling GObject bind_property bindings. Proper lifecycle management with unbind() in dispose(). - Debug Output Cleanup: Removed 57 leftover debug print/warning statements across the codebase.
- Thumbnail Parsing: Fixed SFS/thumbnail metadata parsing for incoming file transfers with XEP-0264 thumbnails.
- OMEMO 1 + 2 Stabilization: Continued stabilization of dual-protocol OMEMO support.
- Server Certificate Info (GitHub Issue #10): Account preferences now show TLS certificate details -- status, issuer, validity period, and SHA-256 fingerprint. Pinned certificates can be removed from the UI.
- App Icon Fix: Fixed light/white app icon in AppImage and Flatpak (GResource SVG priority issue).
- Menu Order: Moved "Panic Wipe" to bottom of hamburger menu to prevent accidental activation.
- OMEMO 2 (XEP-0384 v0.8+): Full implementation of OMEMO 2 with backward compatibility to legacy OMEMO. Dual-stack: Legacy OMEMO + Modern OMEMO 2 for seamless migration.
- SCE Envelope Layer (XEP-0420): Stanza Content Encryption used by OMEMO 2.
- Crypto: HKDF-SHA-256 / AES-256-CBC / HMAC-SHA-256 via libgcrypt.
- HTTP File Transfer with Self-Signed Certificates: All HTTP file operations now respect pinned certificates.
- Backup/Restore after Panic Wipe: Fixed critical bug where restoring a backup after Panic Wipe failed due to password mismatch. Clear dialog now asks for backup's original password.
- Backup Password Leak: OpenSSL no longer passes passwords via command line. Passwords piped via stdin.
- Windows GStreamer Plugins: Fixed DLL loading failures. Auto-dependency detection now scans plugin subdirectories.
- Windows OMEMO & RTP Plugins: Fixed plugin loading failures by copying before dependency scan.
- Windows UX: No batch file needed, no terminal window, app icon embedded in .exe.
- System Tray (Linux): Restored StatusNotifierItem systray with libdbusmenu. Platform-conditional implementation.
- SHA256 Checksums: All binary downloads now include SHA256 checksum files.
- AppImage Filename: Fixed missing version number in filenames.
- Certificate Pinning SQL Fix: Fixed SQL syntax error in upsert query for pinning self-signed certificates.
- Native ARM CI: Switched aarch64 builds from QEMU emulation to native GitHub ARM64 runners (
ubuntu-24.04-arm).
- Windows Support: DinoX is now available for Windows 10/11 (MSYS2/MINGW64). Automated CI/CD via GitHub Actions.
- XEP-0027 (OpenPGP Legacy): Full implementation of legacy OpenPGP signing and encryption for maximum client interoperability.
- OpenPGP Manager: Unified key management UI for XEP-0373/0374 -- key generation, selection, deletion, revocation. Automatic key exchange via PEP, no keyserver needed.
- Self-Signed Certificate Trust: TOFU certificate pinning for self-hosted XMPP servers.
- PGP Key Revocation: Revoke keys with XEP-0373 announcement to contacts.
- Stability fixes: Video freeze, file transfer crash guards, GStreamer plugins, hash verification.
- Adjustable Audio Gain: Implemented manual audio gain control (Post-Processing) with slider ui to bypass WebRTC limits.
- Input Device Selection: Explicit selection of audio input device in settings.
- Network Reliability: Fixed race conditions during Tor startup; implemented port waiting logic to prevent "Connection Refused".
- Bundling: Explicitly bundled
torandobfs4proxyin AppImage/Flatpak for "Out of the Box" functionality. - Infrastructure: Added fully automated Aarch64 (ARM64) builds via QEMU CI pipelines.
- Sender Identity: Explicit account selection for starting chats, joining/creating MUCs.
- Registration: In-Band Registration (XEP-0077) with CAPTCHA support.
- UI: Responsive MUC browser and creation dialogs.
- MUC Avatars: Full XEP-0486 implementation including persistence, resizing (192px), and conversion.
- UI Refinements: Redesigned header bar, Status Menu moved to dedicated button with dynamic reachability colors.
- Maintenance: Deprecated "Help" button in favor of streamlined UI.
Goal: Bring DinoX to macOS and BSD (FreeBSD, OpenBSD).
- macOS: GTK4/libadwaita via Homebrew or MacPorts. Native .app bundle with code signing.
- FreeBSD/OpenBSD: Port via pkg/ports system. Adapt Tor/Obfs4proxy integration for BSD init systems.
- CI: Extend GitHub Actions with macOS runners; FreeBSD via cross-compilation or VM-based CI.
| Item | Description | Status |
|---|---|---|
| Comprehensive Security Audit | Full audit of 54 crypto-related files (39 OMEMO/Signal + 15 OpenPGP). 23 findings identified and fixed. Documentation published as SECURITY_AUDIT.md and security-audit.html. | DONE |
| OMEMO: Reject Unencrypted Messages | When OMEMO encryption is active for a conversation, unencrypted incoming messages are currently accepted and displayed. conversation.encryption only controls outgoing messages — no pipeline listener checks encryption status on the receive path. Add a new MessageListener (between DECRYPT and STORE) that checks conversation.encryption != Encryption.NONE && message.encryption == Encryption.NONE and either discards the message or marks it with a warning. Affected files: libdino/src/service/message_processor.vala (pipeline), plugins/omemo/src/logic/decrypt.vala, plugins/omemo/src/logic/decrypt_v2.vala. Consider adding a per-conversation setting "Allow unencrypted messages" (default: warn, options: allow/warn/reject). |
TODO |
| XEP / Feature | Description | Implementation TODO | Status |
|---|---|---|---|
| SCRAM-SHA-256 | Modern SASL authentication | Implement SCRAM-SHA-256 mechanism alongside existing SCRAM-SHA-1. Conversations, Monal, and Gajim already support this. Affected files: xmpp-vala/src/module/sasl.vala, xmpp-vala/src/module/xep/plain_sasl.vala. Add SHA-256 hash function to SCRAM negotiation, prefer SHA-256 over SHA-1 when server offers both. |
DONE |
| SCRAM-SHA-1-PLUS | TLS Channel Binding | Implement tls-exporter (RFC 9266) and tls-server-end-point (RFC 5929) channel binding for SCRAM-SHA-1-PLUS. Prevents MITM attacks on SASL authentication. Uses GLib g_tls_connection_get_channel_binding_data() with custom VAPI binding to fix upstream bug. |
DONE |
| SCRAM-SHA-256-PLUS | SHA-256 with Channel Binding | Combined SCRAM-SHA-256 with TLS channel binding. Prefers tls-exporter (GLib 2.74+) with fallback to tls-server-end-point (GLib 2.66+). |
DONE |
| SCRAM-SHA-512-PLUS | SHA-512 with Channel Binding | Combined SCRAM-SHA-512 with TLS channel binding. DinoX is the only XMPP client supporting this. Same channel binding infrastructure as SHA-256-PLUS. | DONE |
| SCRAM Nonce CSPRNG | Cryptographic nonce generation | Replace GLib.Random (Mersenne Twister) in SASL nonce generation with /dev/urandom or gcry_randomize(). Current implementation uses a non-cryptographic PRNG for security-critical nonce generation. |
DONE |
| Channel Binding Downgrade Protection | MITM protection toggle | Per-account toggle to require SCRAM-*-PLUS mechanisms. When enabled, login is refused if server only offers non-PLUS mechanisms (possible MITM stripping channel binding). Similar to Conversations/Monocles "MITM Protection" toggle. DB version 37, UI in Advanced Settings. | DONE |
| XEP-0357 | Push Notifications | Add/verify push enable/disable flow per account, server capability discovery, and end-to-end testing with common push components. | TODO |
| XEP-0388 | SASL2 / FAST | Implement SASL2 negotiation and FAST token handling; ensure interaction with XEP-0198 stream management and session resumption remains correct. | TODO |
| XEP-0386 | Bind 2 | Implement Bind2 negotiation and integrate with session establishment; verify multi-device and reconnection behavior. | TODO |
| Item | Description | Status |
|---|---|---|
| MQTT Plugin (libmosquitto) | Optional plugin for MQTT 3.1.1/5.0 connectivity. Supports ejabberd (mod_mqtt) and Prosody (mod_pubsub_mqtt). Full implementation: connect/subscribe/publish, bot conversation paradigm, alert system, XMPP↔MQTT bridge, sparklines, QoS, MQTT 5.0 properties, topic manager. 52 unit tests. CI integration (AppImage, Flatpak, Windows). See MQTT_PLUGIN.md. |
DONE |
| MQTT Dashboard | Bot-conversation paradigm replaces traditional dashboard. Chat commands (/mqtt subscribe, /mqtt status, /mqtt history) provide interactive topic management within XMPP conversations. ASCII sparklines for numeric data. |
DONE |
| MQTT Settings UI | Broker host/port, TLS, server type detection (ejabberd vs Prosody), XMPP credential reuse. Per-account and standalone mode. Preferences → MQTT panel. | DONE |
| Home Assistant / Node-RED | Subscribe to HA discovery topics, control actuators, Node-RED flow integration. 3 network scenarios documented (LAN, mixed, cloud). Bridge formatting for XMPP↔MQTT. | DONE |
| MQTT Bridge: File Transfer | Binary transfer via magic-byte detection (17 formats: images, audio, video, documents). MQTT binary payloads are saved to temp file and forwarded via HTTP Upload (XEP-0363) with automatic OMEMO encryption. 10MB limit, security-audited temp file handling (/tmp/dinox-mqtt-*). Works with Node-RED and any MQTT publisher. |
DONE |
- ejabberd
mod_mqtt
| Item | Description | Status |
|---|---|---|
| Video Messages: pipewiresrc → autovideosrc | Replace direct pipewiresrc usage in video_recorder.vala with autovideosrc. Fixes EINVAL (-22) on PipeWire >= 1.2 (openSUSE, Fedora, Arch, Ubuntu 26.04 LTS with PipeWire 1.6.0). Root cause: Range-based caps (width=[1,1280]) propagate backwards to pipewiresrc which rejects them. autovideosrc handles caps negotiation correctly via internal wrapping. Also change range-caps to fixed caps (1280x720@30fps) matching the working call pipeline. |
DONE — v1.1.7.6 (42fda212) |
| Unified Source Selection | Long-term: all pipelines (video messages, calls) use consistent source selection: Gst.DeviceMonitor → create_element() (preferred) or autovideosrc/autoaudiosrc (fallback). Never use pipewiresrc/v4l2src directly. |
CONCEPT — v1.3.x |
Detailed analysis and implementation plan: PIPEWIRE_MIGRATION_PLAN.md (gitignored)
| Item | Description | Status |
|---|---|---|
| Windows Code Signing (SignPath) | Authenticode certificate via SignPath Foundation (free for OSS). Eliminates SmartScreen warnings. Build-integrated via GitHub Actions. Application submitted Feb 2026, awaiting approval. | ⏳ Waiting for SignPath approval since Feb 11, 2026 |
| Notification Sounds (Windows) | Messages and incoming calls already play Windows system sounds via Toast notifications (ms-winsoundevent). Missing: outgoing call ringback, MQTT alerts without toast, custom sound selection. Full native backend (PlaySound/XAudio2) still needed for these cases. |
PARTIAL |
| Screen Sharing | Share desktop or windows during calls | TODO |
| Whiteboard | Collaborative drawing (protocol TBD) | CONCEPT |
The milestone for a "feature complete" and rock-solid release.
Requirements:
- Zero P1 (crash) bugs.
- Memory usage < 200MB for 7-day sessions.
- Comprehensive security audit.
- 3+ months of beta testing without major regressions.
See CONTRIBUTING.md for how to set up your development environment and submit Pull Requests.
meson setup build
ninja -C build
./build/main/dinoxMaintainer: @rallep71