Changelog
What's new in each release.
v0.2.2
RecommendedMuch More To Love!
Conference Calling
- Fixed conference calls where connected parties couldn't hear each other. Cross-connects call audio ports on the PJSIP conference bridge.
SIP Registration & Licensing
- SIP accounts no longer register when the license is expired. Unregisters on expiry, re-registers on activation.
- Fixed registration retry: replaced escalating delays (5/10/30s) with a fixed 10-second cooldown.
- Added live countdown displayed next to the account name during retry cooldown.
- Added "Reset Network" button in Settings under SIP Accounts. Unregisters all, waits 5 seconds, re-registers with IP change handling.
- Added confirmation dialog before removing a SIP account.
Networking, NAT Traversal, & Reconnect
- Added STUN servers for public IP discovery behind NAT.
- Added ICE support on SIP accounts for media path negotiation through firewalls.
- Added automatic ICE fallback. If a call fails with 488, retries without ICE seamlessly.
- Added IPv6 transport support (UDP6, TCP6, TLS6) alongside IPv4.
- Auto-detects network type (IPv4-only, IPv6-only, dual-stack) on startup and after IP changes via pj_gethostip() probe.
- Dual-stack networks prefer IPv4 for SDP offers; IPv6-only networks use IPv6.
- Fixed PulseAudio device selection on Ubuntu/PipeWire. Explicitly selects the PulseAudio device instead of letting PJSIP default to raw ALSA locked by PipeWire.
- Network change handler now does a full unregister/re-register cycle to get fresh transport bindings, fixing the "can't place calls after network reconnect" issue.
- Auto-recovery: if an outgoing call fails to reach the PBX (transport broken), automatically triggers a network reset.
- Increased PJSIP transport restart delay from 10ms to 500ms to avoid socket binding races.
- Added NAT improvements: SIP Outbound (RFC 5626), explicit STUN for signaling and media, source port in Contact header, ICE host candidate limit.
Call Statistics
- Fixed stats panel not working.
- Changed stats polling interval from 2 seconds to 1 second.
- Fixed bitrate display. Computed from total bytes / call connect duration instead of incorrect RTCP timestamp fields.
Encryption Detection & Display
- Added SRTP encryption detection from PJSIP transport layer.
- Added encryption indicator badge during active calls with three levels: Green: SRTP + TLS or SRTP = media encrypted. Amber: Media Unencrypted; TLS signaling only, RTP is plaintext. Red: Unencrypted; both signaling and media unencrypted.
- Added encryption details row in the stats overlay panel with cipher name.
- Added SRTP status logging for call diagnostics.
Audio Loss Detection
- Added 5-second audio loss watchdog monitoring RTP packet counts during active calls.
- Red "Audio lost — no packets received" banner appears on the call screen.
- Watchdog runs independently of the stats panel.
Call Recording Player
- Added in-app recording player popup dialog with play, pause, stop, and seek.
- Seek bar with draggable handle and click-to-seek.
- Progress display with elapsed/total time.
- Block-aligned seeking to prevent audio artifacts.
Database
- Enabled SQLite foreign key enforcement (PRAGMA foreign_keys = ON).
- Enabled WAL journal mode for crash resilience.
- Added integrity check on startup with automatic REINDEX repair on failure.
- Added startup health check. Verifies all tables and columns exist, adds missing ones via.
- Auto-prunes call history older than 120 days.
- Fixed recording INSERT to include call_uuid for reliable linkage.
- Added UUID fallback when looking up recordings. Matches by call_uuid if call_log_id is missing.
- Added error logging on failed call log inserts.
- Validated SQL identifiers in tableColumns(), ensureColumn(), and type parameters against injection.
License System
- Replaced fixed 30-second trial retry with exponential backoff (30s → 60s → 2m → 5m → 10m, max 5 attempts).
- Changed key/token presence logging from qWarning to qDebug. No partial secrets in production logs.
- Documented intentional QML property exposure for license UI.
Performance
- Eliminated idle CPU drain. Uses null sound device when no calls are active; real PulseAudio device activated on-demand when a call's media starts, deactivated when all calls end.
- Eliminated thread leak. Replaced QThread::create() per tick in CallStatsProvider with a persistent StatsWorker on a single QThread.
- Added proper CallStatsProvider destructor. Stops timers, quits worker thread, prevents use-after-free on shutdown.
- Fixed pactl process leak. AudioDeviceHelper was spawning pactl list processes without killing previous in-flight ones, causing dozens of orphan processes that overwhelmed PipeWire. Now tracks processes as members and kills the old one before starting a new one.
- Removed UI-blocking waitForFinished calls. killPaplay() no longer blocks the main thread for up to 500ms.
- Deferred SIP initialization. SipEngine::initialize() runs after the event loop starts via QTimer::singleShot(0), so the UI loads instantly instead of waiting 2-5 seconds for STUN DNS resolution.
- Cached D-Bus dark mode result. portalColorScheme() queried once at startup and on scheme changes, eliminating a 100ms blocking D-Bus call on every darkMode property read.
- Reduced AudioLevelProvider poll rate from 30Hz to 20Hz. Still visually smooth, 33% less CPU and signal overhead.
- Debounced audio device sync. setAudioDevices() / meow_pulse_move_streams() coalesced via 200ms timer to prevent burst of redundant PulseAudio move operations.
- Batched recording lookup queries. callDetails() now uses WHERE IN (...) instead of one query per entry.
- Incremental model update. addEntry() updates the first group in-place with dataChanged() instead of full beginResetModel()/endResetModel() when the new entry matches the top group.
- Cached WAV header. Parsed once on playRecording(), reused for all seeks without re-reading the file.
- Async pactl list device enumeration. Replaced synchronous waitForFinished(2000) with QProcess::finished signal handler.
Code Quality
- Extracted linkRecordingsToLogEntry() helper. Eliminated duplicate recording-link code in logCallEnd and logCallEntry.
- Extracted resetCallState() helper. Eliminated duplicate state-reset boilerplate across dial(), answerIncoming(), onSipIncomingCall(), and promoteNextIncoming().
- Extracted shared Crypto::verifyEd25519() and Crypto::ed25519Payload(). Eliminated duplicate Ed25519 verification in LicenseManager and UpdateManager.
- Fixed SecondaryButton. DemiBold weight, disabled state uses Theme.textMuted.
- Fixed QML duplicate id: resetLabel causing SettingsView to fail to load.
Security
- SIP password no longer returned to QML.
- PJSIP log level reduced to 2 for release builds to prevents Authorization digest headers from appearing in logs.
- Windows update batch script arguments sanitized — strips ", %, ^, &, |, <, >, ! to prevent command injection.
- SQL type parameter validated in ensureColumn() against ^[a-zA-Z0-9 ()_,]+$.
- Update downloads rejected without checksum for known package formats (deb, rpm, exe, msi, dmg, AppImage) in release builds.
- s_active_stream pointer in PulseAudioDev changed to std::atomic<pulse_stream*> with acquire/release ordering.
- Recording files now set to 0600 permissions after save.
- execPragma() failures now logged instead of silently ignored.
Compatibility
- Verified full build compatibility with Ubuntu 25.10 (GCC 15.2, Qt 6.9.2, CMake 3.31.6, kernel 6.17).
Call Hold Transfer
- Added transfer button to the held-only call view, allowing call transfer without unholding first.
Held Call UI Redesign
- Replaced text buttons with three circular action buttons: End (coral), Resume (teal), Transfer (indigo).
- Added pulsing fade animation on the amber "On Hold" indicator dot.
Consent Screen Fix
- Fixed "click twice to register" bug on the privacy consent button by moving it outside the Flickable scroll container (both mobile and desktop layouts).
Window Sizing
- Increased main window from 820×580 to 860×640.
- Increased held-only call window height from 320 to 400.
- Added 16px horizontal and 12px bottom padding to call content area.
Call History Detail View
- Copy number button now always visible.
- Replaced bouncing scroll chevrons with gradient fade edges (top/bottom) for a cleaner look.
- Removed external scrollbar.
Dialer Cursor Fix
- Fixed cursor indicator positioning in the number input field. It now tracks the AnimatedDigits component instead of the invisible TextInput layout.
v0.2.1
New UX
- Fixed cases when transfer a call won't work right after transferring to a disconnected/non existing extension.
- Fixed rare cases when ending a call while there are calls waiting would cause the call manager window to become unresponsive till the queue is finished.
- Redesign the call manager window to be more robust and handle rapid changes without crashing.
v0.2.0
RecommendedWindows is here!
- Windows support is here. The app now runs natively on Windows.
- Dual SIP accounts supported. Manage two lines seamlessly in one interface.
- Smoother dial pad experience with new subtle animations.
- Fixed rare cases where the call window could become unresponsive when the main window was open.
- Improved interface design for clearer dual-line workflows.
- DTMF tones now visible during active calls.
- Resolved a timing issue that could unexpectedly merge simultaneous incoming and outgoing calls.
- Cleaner call history and contacts view for faster navigation.
- Enhanced call details screen, fully optimized for multi-line usage.
- Custom colors per SIP line for better visual identification.
- Smoother window resizing with reduced flicker and improved animation performance.
- Added unique call identifiers (UUIDs) for calls, recordings, and conferences.
v0.1.91
RecommendedFixing more things
- Fixed call window becoming unresponsive when main window is minimized
- Added local ringback tone when calling extensions without early media
- Blocked calling your own extension
- Added error messages in the dialer (e.g. invalid number, own extension, no account)
- Field call no longer clears the numpad when a call fails to place
v0.1.8
RecommendedFixing Issues
Fixed
- Calling internal numbers is fixed after being broken in 0.1.7.
- Fixed license logic reverting to trial.
v0.1.7
RecommendedMore things to love!
New Features
- Added a consent screen on first startup.
- Added a dedicated async DNS resolver.
- Added network-change debouncing to prevent rapid-fire re-registration when connectivity is unstable.
- Added call recording (automatic or manual).
- Added support for scaling, zoom, and display resolution changes.
- Added initial HiDPI fractional scaling support.
- Added zoom support: Ctrl+Plus to zoom in (up to 200%), Ctrl+Minus to zoom out (down to 50%), and Ctrl+0 to reset to 100%.
- Added DND mode: stops the popup window but still keeps a call log.
- Added Busy mode: silences ringing.
Fixes
- Fixed a UI freeze when packet loss occurs.
Improvements
- Improved sound quality during packet loss.
- Added support for lock-free audio levels.
- Moved stats polling to a worker thread so it cannot block the UI even if a lock is held.
- Improved jitter buffer and codec tuning. Added a wider adaptive jitter buffer range for better audio quality during high packet loss.
- Increased the PulseAudio playback buffer to better absorb jitter spikes.
- Font size is no longer hard-coded in pixels and now uses DP(). This allows proper scaling and correct window rendering when resolution, zoom, or scaling changes.
- Call history and call details are now organized by date.
v0.1.6
CriticalBinary Update
Important before you update
- please manually remove the old package. this package changed the binary name due to conflict.
sudo apt remove meow
sudo dnf remove meow
What's new
- Fixed sound test button.
- Added muting ringing call.
- Added connection status in real time.
- Few UI/UX updates.
- Enhanced security mechanism.
v0.1.5
CriticalSecurity and feature update
Few UI and security updates
- Fixed ringtone volume bar doesn't change volume
- Allow main app window to resize
- Allow user to disable call-waiting tone
- Fixed Call-Waiting window doesn't remember last location.
- Detect Network drop and force re-register when back online.
- Detect sleep/resume and re-register once the network is online.
- Fixed the play button shows stop for both ringing and call speakers when testing one of them.
- Enhanced branding.
- Added Telemetry opt-out.
- Security updates and enhancements.