Engineering Deep Dive

Under the Hood

A detailed look at how Meow delivers native performance, crystal-clear audio, and rock-solid SIP connectivity, all in a lightweight package.

~30 MB RAMtypical usage<1s startupcold launchC++20native speed0 web viewsno Electron

Layered Architecture

Five cleanly separated layers with one-way dependencies. Each layer only talks to the one directly below it.

┌───────────────────────────────────────────────────┐
│                    QML UI Layer                    │
│          Main.qml · Views · Components             │
├───────────────────────────────────────────────────┤
│                   QmlBridge (C++)                  │
│         Context properties · Signal/Slot           │
├───────────────────────────────────────────────────┤
│                  Core Controllers                  │
│   CallManager · SettingsManager · LicenseManager   │
│    ContactModel · CallStateMachine · Database      │
├───────────────────────────────────────────────────┤
│                    SIP Engine                      │
│       PJSIP · PjAccount · PjCall · SRTP           │
├───────────────────────────────────────────────────┤
│                   Audio Backend                    │
│   PulseAudioDev (Linux) · WASAPI/WMME (Windows)   │
└───────────────────────────────────────────────────┘
UI (QML/Qt Quick)
Bridge (C++ / QML)
Core Logic
SIP Stack
Platform Audio

Audio Pipeline

Custom audio backend built for VoIP. Not a generic media player repurposed for calls.

Custom PulseAudio Backend

Direct PulseAudio integration via dlopen(libpulse-simple.so.0). No dependency on system-compiled audio backends. Works everywhere PulseAudio runs.

VoIP-Optimized Buffers

80ms target playback latency, 20ms capture fragments. Tuned for voice clarity over raw throughput.

Audio Hot-plug

Background pactl subscribe process with 500ms debounce. Plug in a headset mid-call and it just works.

Conference Bridge

PJSIP conference bridge at 8000 Hz clock rate. Native G.711 match eliminates unnecessary resampling.

PulseAudioDev.cpp
// PulseAudio buffer configuration
pa_buffer_attr playback_attrs = {
  .maxlength = (uint32_t)-1,
  .tlength    = 80 * frame_size,  // 80ms
  .prebuf     = (uint32_t)-1,
  .minreq     = (uint32_t)-1,
  .fragsize   = 0
};

pa_buffer_attr capture_attrs = {
  .maxlength = (uint32_t)-1,
  .tlength    = 0,
  .prebuf     = 0,
  .minreq     = 0,
  .fragsize   = 20 * frame_size   // 20ms
};

// Conference bridge — native G.711
epCfg.medConfig.clockRate = 8000;

SIP & Call Management

State-machine-driven call handling with thread-safe PJSIP integration.

Idle
Dialing
Ringing
Connected
Disconnected

QStateMachine FSM

Single source of truth for call state. Transitions are atomic and thread-safe via Qt signal/slot.

Thread-Safe PJSIP

All PJSIP callbacks marshal to the Qt thread via QMetaObject::invokeMethod(Qt::QueuedConnection).

DTMF (RFC 2833)

In-band DTMF tone generation for IVR navigation. Compatible with all major PBX systems.

Contact Enrichment

Incoming calls are matched against contacts using phone number normalization with country code awareness.

Security & Licensing

Cryptographically sound licensing with hardware-bound activation.

Hardware Fingerprinting

SHA-256 composite of CPU model, RAM (rounded GB), first non-loopback MAC address, and machine-id. Unique but stable across reboots.

SHA-2564-factor composite

Ed25519 Signatures

License tokens are Ed25519-signed by the server. The client verifies offline with a hardcoded 32-byte public key. No network needed for validation.

Ed25519Offline verifyPyNaCl

Anti-Reset Protection

Server fuzzy-matches 3 of 4 hardware factor hashes. Reinstalling the OS or clearing local storage won't reset your trial. The server remembers.

Fuzzy matchServer-side

Performance

Native code means native performance. No runtime overhead, no garbage collector pauses.

~30 MB
Memory usage
typical runtime
<1s
Cold startup
to registration
8 kHz
Clock rate
native G.711
20ms
Capture latency
audio fragments

Memory Comparison (typical idle call)

Meow (C++/Qt)30 MB
Typical Electron SIP180 MB
Java SIP Client250 MB
Browser WebRTC400 MB

Platform Support

Truly native on each platform. Not a cross-platform wrapper with platform quirks.

Linux

Primary
PulseAudio backenddlopen + libpulse-simple
System trayQt SystemTrayIcon
Desktop notificationsD-Bus / org.freedesktop
Dark mode detectionD-Bus color-scheme
Autostart.desktop in autostart dir
Audio hot-plugpactl subscribe
Machine identity/etc/machine-id

Windows

Supported
WASAPI / WMME audiopjsua_set_snd_dev()
System trayQt SystemTrayIcon
Desktop notificationsQt native
Dark mode detectionRegistry AppTheme
AutostartRegistry Run key
Audio device selectionPJSIP device index
Machine identityRegistry MachineGuid

Standards & Compatibility

Built on PJSIP, the most widely deployed open-source SIP stack. Standards-first, vendor-agnostic.

RFC 3261

SIP: Session Initiation Protocol

RFC 3550

RTP: Real-Time Transport Protocol

RFC 2833

DTMF Tones via RTP Payloads

RFC 3711

SRTP: Secure Real-Time Transport

RFC 3263

SIP: Locating SIP Servers

RFC 5626

SIP Outbound Connections

Tested PBX Systems

FreePBXAsterisk3CXFusionPBXKamailioOpenSIPS

Ready to experience a truly native SIP client?

Start 14 Days Free Trial