Changelog

What's new in each release.

v0.2.2

Recommended

Much 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

  1. Fixed cases when transfer a call won't work right after transferring to a disconnected/non existing extension.
  2. 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.
  3. Redesign the call manager window to be more robust and handle rapid changes without crashing.

v0.2.0

Recommended

Windows is here!

  1. Windows support is here. The app now runs natively on Windows.
  2. Dual SIP accounts supported. Manage two lines seamlessly in one interface.
  3. Smoother dial pad experience with new subtle animations.
  4. Fixed rare cases where the call window could become unresponsive when the main window was open.
  5. Improved interface design for clearer dual-line workflows.
  6. DTMF tones now visible during active calls.
  7. Resolved a timing issue that could unexpectedly merge simultaneous incoming and outgoing calls.
  8. Cleaner call history and contacts view for faster navigation.
  9. Enhanced call details screen, fully optimized for multi-line usage.
  10. Custom colors per SIP line for better visual identification.
  11. Smoother window resizing with reduced flicker and improved animation performance.
  12. Added unique call identifiers (UUIDs) for calls, recordings, and conferences.

v0.1.91

Recommended

Fixing more things

  1. Fixed call window becoming unresponsive when main window is minimized
  2. Added local ringback tone when calling extensions without early media
  3. Blocked calling your own extension
  4. Added error messages in the dialer (e.g. invalid number, own extension, no account)
  5. Field call no longer clears the numpad when a call fails to place

v0.1.8

Recommended

Fixing Issues

Fixed

  1. Calling internal numbers is fixed after being broken in 0.1.7.
  2. Fixed license logic reverting to trial.

v0.1.7

Recommended

More things to love!

New Features

  1. Added a consent screen on first startup.
  2. Added a dedicated async DNS resolver.
  3. Added network-change debouncing to prevent rapid-fire re-registration when connectivity is unstable.
  4. Added call recording (automatic or manual).
  5. Added support for scaling, zoom, and display resolution changes.
  6. Added initial HiDPI fractional scaling support.
  7. 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%.
  8. Added DND mode: stops the popup window but still keeps a call log.
  9. Added Busy mode: silences ringing.

Fixes

  1. Fixed a UI freeze when packet loss occurs.

Improvements

  1. Improved sound quality during packet loss.
  2. Added support for lock-free audio levels.
  3. Moved stats polling to a worker thread so it cannot block the UI even if a lock is held.
  4. Improved jitter buffer and codec tuning. Added a wider adaptive jitter buffer range for better audio quality during high packet loss.
  5. Increased the PulseAudio playback buffer to better absorb jitter spikes.
  6. 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.
  7. Call history and call details are now organized by date.

v0.1.6

Critical

Binary 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

  1. Fixed sound test button.
  2. Added muting ringing call.
  3. Added connection status in real time.
  4. Few UI/UX updates.
  5. Enhanced security mechanism.

v0.1.5

Critical

Security and feature update

Few UI and security updates

  1. Fixed ringtone volume bar doesn't change volume
  2. Allow main app window to resize
  3. Allow user to disable call-waiting tone
  4. Fixed Call-Waiting window doesn't remember last location.
  5. Detect Network drop and force re-register when back online.
  6. Detect sleep/resume and re-register once the network is online.
  7. Fixed the play button shows stop for both ringing and call speakers when testing one of them.
  8. Enhanced branding.
  9. Added Telemetry opt-out.
  10. Security updates and enhancements.