- Vala 84.5%
- Shell 6.4%
- C++ 4%
- Python 3.3%
- C 1%
- Other 0.6%
| .github | ||
| .guix/modules | ||
| ci/images | ||
| crypto-vala | ||
| docs | ||
| google-webrtc | ||
| libdino | ||
| main | ||
| MQTT/Node Red Examples | ||
| packaging/flatpak | ||
| plugins | ||
| qlite | ||
| scripts | ||
| tests | ||
| xmpp-vala | ||
| .dockerignore | ||
| .gitignore | ||
| .guix-channel | ||
| AUTHORS | ||
| CONTRIBUTING.md | ||
| dino.doap | ||
| dino.doap.in | ||
| im.dinox.dinox.json | ||
| LICENSE | ||
| meson.build | ||
| meson_options.txt | ||
| NOTICE | ||
| README.md | ||
| SECURITY.md | ||
| VERSION | ||
DinoX
Secure XMPP messenger for desktop chat, calls, files and automation
DinoX is a GTK4/libadwaita XMPP client for Linux and Windows. It focuses on private messaging, self-hosted infrastructure and practical interoperability: encrypted 1:1 chats, group chats, file sharing, voice/video calls, voice/video messages, optional Tor routing, local data encryption and OpenPGP/OMEMO key management.
Beyond normal messenger use, DinoX includes optional modules for local REST automation, Botmother bot management, AI provider integration, MQTT/IoT topics and DTMF dialpad support for XMPP SIP provider workflows.
DinoX is developed based on the XMPP servers Ejabberd 26.04 and Prosody 13.06. The latest updates or further development of both servers are integrated into DinoX immediately. Other XMPP servers are supported in their basic functions as well, but there is no guarantee they will work flawlessly.
Website • Source • Releases • Milestone 2.0.0 • Download • Features • XEP Support • Build • Debug • Testing • Changelog • Contributing
Key Features
| Feature | Description |
|---|---|
| Encrypted File Upload | AES-GCM URI scheme and XEP-0448 support for encrypted file sharing |
| Local File Encryption | Local avatars, stickers and transfers are encrypted at rest (AES-256-GCM) |
| Secure Deletion | Global history deletion with throttling and local cache cleanup |
| OMEMO Encryption | End-to-end encryption for messages and files (legacy OMEMO + OMEMO 2 paths) |
| OpenPGP Encryption | XEP-0027 plus XEP-0373/0374 with key management, generation, deletion and revocation |
| Encrypted Local Database | Local data is stored in an encrypted SQLCipher database (password required at startup) |
| Change Database Password | Change the local database password via Preferences (SQLCipher rekey) |
| Panic Wipe | Quickly wipe local DinoX data (Ctrl+Shift+Alt+P) and exit (also triggered after 3 failed unlock attempts) |
| OpenPGP Keyring Isolation | Uses an app-scoped GNUPGHOME so Panic Wipe can remove app OpenPGP material |
| Disappearing Messages | Auto-delete messages after 15min, 30min, 1h, 24h, 7d or 30d |
| 1:1 Voice & Video | Google/libwebrtc calls with echo cancellation, noise suppression, AGC and transient suppression |
| DTMF & Dialpad | RFC 4733 telephone-event support with Dialpad UI for XMPP SIP Provider telephony (hotlines, IVR, conference controls) |
| Voice Messages | Record and send audio messages (AAC format) |
| Video Messages | Record and send video messages with camera preview (H.264+AAC in MP4, max 720p, 120s) |
| Inline Video Player | Play videos directly in chat (no external player) |
| Group Chats (MUC) | Group chats with moderation, roles and private-room workflows |
| Tor Routing | Optional integrated Tor and Obfs4proxy support |
| System Tray | Background mode with StatusNotifierItem |
| Message Retraction | Delete messages for everyone (XEP-0424) |
| Emoji Reactions | React to messages (XEP-0444) |
| Stickers | Send & receive sticker packs (XEP-0449) |
| Message Replies | Quote and reply to messages (XEP-0461) |
| MQTT Plugin | IoT sensor data via MQTT 5.0 — topic subscriptions, alerts, sparkline charts, XMPP bridging, Home Assistant integration, Prosody mod_pubsub_mqtt support, ejabberd mod_mqtt support, Node-RED integration with free-text publish/response |
| MUC Moderation | Kick, ban and role-management workflows (XEP-0425) |
| TLS Certificate Pinning | Trust self-signed certs for self-hosted servers |
| TLS Certificate Info | View TLS certificate details (issuer, validity, fingerprint) in account settings |
| Backup & Restore | Full data backup with optional GPG encryption (AES-256) |
| Database Maintenance | Clean orphaned records, optimize storage |
| PGP Key Management | Generate, select, delete, revoke OpenPGP keys in-app. Automatic key exchange via PEP |
| 47 Languages | ~85% translated |
| Dark Mode | System theme or manual toggle |
Installation
Windows
Download the newest release that contains a Windows ZIP/prebuild artifact from
DinoX Releases. Extract the ZIP
archive and run dinox.exe. Keep the complete extracted directory together;
it contains the required runtime DLLs and the package-specific license
inventory under share/licenses/dinox.
To build DinoX from source on Windows, see the build instructions: Deutsch | English
On first start after unpacking, Windows Defender may briefly scan the extracted files. After that, DinoX should start normally. Calls and media-message capture load the Google/libwebrtc worker on demand; media-file decoding is handled separately by GStreamer.
Geolocation for locations is not available on Windows.
Ubuntu 24.04 / Linux Mint 22 (.deb)
Download the .deb package and matching .sha256 file from a DinoX release
that contains Debian-format package artifacts. The official binary .deb is
built and tested on Ubuntu 24.04 and Linux Mint 22; it is not the Debian 13
binary package. Debian 13 users should use the AppImage or Flatpak below, or
build DinoX from source:
DinoX Releases.
sha256sum -c dinox_*.deb.sha256
sudo apt install ./dinox_*.deb
Flatpak
Download the Flatpak bundle and matching checksum from a DinoX release that contains Flatpak artifacts: DinoX Releases.
# Verify and install DinoX
sha256sum -c ./dinox-*-x86_64.flatpak.sha256
flatpak install --user ./dinox-*-x86_64.flatpak
# Run
flatpak run im.dinox.dinox
The bundle installation automatically fetches its required GNOME 50 and
matching codec runtimes from the embedded runtime repository when they are not
installed yet.
A manual flatpak install flathub org.gnome.Platform//50 is only a
troubleshooting step if automatic runtime resolution reports an error; it is
not part of the normal installation.
AppImage
-
Download the AppImage and matching checksum from a DinoX release that contains AppImage artifacts: DinoX Releases.
sha256sum -c DinoX-*.AppImage.sha256 chmod +x DinoX-*.AppImage ./DinoX-*.AppImageThe matching
.AppImage.sources.tar.xzrelease asset provides the corresponding-source and license payload. It is not required to run DinoX. -
Install via AppMan (rootless)
appman -i dinox -
Install via AM
am -i dinox
Build from Source
DinoX uses Meson/Ninja and normal distribution development packages. Official release packages use a separately provisioned builder image for pinned custom dependency versions. Every production build consumes the public, pinned Google/libwebrtc M150 DinoX runtime artifact. The current source-build reference is Ubuntu 24.04 LTS, Linux Mint 22.x and Debian 13. For complete build instructions and packaging notes, start with the Linux Source Build guide.
Local data encryption
DinoX stores your local data (accounts, messages, settings, cached metadata) in an encrypted SQLCipher database.
- You will be prompted for a password on startup.
- If you forget the password, the database cannot be recovered.
- A Panic Wipe action is available via the app menu and the shortcut
Ctrl+Shift+Alt+P.
Audio/Video calling notes
DinoX 1:1 calling focuses on cross-client interoperability, notably with Conversations/monocles (Android) and Monal (iOS):
- Live-call engine: pinned Google/libwebrtc M150 in an external supervised worker process; GStreamer RTP is not a production call fallback.
- Security profile: mandatory DTLS-SRTP; XMPP/OMEMO verifies the call fingerprint before media is accepted.
- Baseline codecs: Opus (audio) and VP8 (video). H.264 is not enabled in the default DinoX libwebrtc artifact.
- Network policy: Automatic by default, with an explicit audio-only low-bandwidth (2G) mode using a 16 kbit/s Opus sender cap.
- Devices: libwebrtc owns microphone, speaker and camera integration on Linux and Windows. PipeWire, PulseAudio, ALSA and WASAPI are platform details behind that engine rather than separate DinoX call pipelines.
The media paths are deliberately separated:
- On Linux, Google/libwebrtc captures raw microphone/camera frames for voice
and video messages. The
ffmpegcommand encodes and writes AAC/M4A or H.264+AAC/MP4 files. - On Windows, Google/libwebrtc captures the raw frames and Windows Media
Foundation encodes and writes the media-message files; a system
ffmpegexecutable is not used for this path. - GStreamer demuxes and decodes received/local media files, extracts metadata and thumbnails, and feeds decoded audio PCM to the selected libwebrtc speaker. It is neither the production call engine nor the Linux recorder muxer.
Google/libwebrtc owns ICE, STUN and TURN for calls. libnice remains packaged
only because the separate legacy ICE plugin currently also supplies local
address discovery and per-account Tor/SOCKS5 policy hooks to direct Jingle-S5B
file transfer. For targeted call diagnostics, see
DEBUG.md.
XEP Support
DinoX tracks XMPP extension support in the machine-readable dino.doap file. That file currently lists 90 XEP entries across implemented, partial, deprecated and helper-protocol implementations. The table below highlights the user-visible and interoperability-critical XEPs. "Implemented" describes DinoX project coverage, not formal XSF specification maturity or certification. "Partial" means DinoX supports the relevant product workflow, but not every optional or historical part of the specification.
Messaging
| XEP | Name | Status |
|---|---|---|
| XEP-0080 | User Location | Implemented |
| XEP-0085 | Chat State Notifications | Implemented |
| XEP-0184 | Message Delivery Receipts | Implemented |
| XEP-0280 | Message Carbons | Implemented |
| XEP-0308 | Last Message Correction | Implemented |
| XEP-0313 | Message Archive Management | Partial |
| XEP-0333 | Chat Markers | Implemented |
| XEP-0359 | Unique and Stable Stanza IDs | Implemented |
| XEP-0424 | Message Retraction | Implemented |
| XEP-0444 | Message Reactions | Implemented |
| XEP-0449 | Stickers | Implemented |
| XEP-0461 | Message Replies | Implemented |
Profile & Contact
| XEP | Name | Status |
|---|---|---|
| XEP-0054 | vCard-temp | Implemented |
| XEP-0055 | Jabber Search | Implemented |
| XEP-0077 | In-Band Registration | Implemented |
| XEP-0158 | CAPTCHA Forms | Implemented |
| XEP-0172 | User Nickname | Implemented |
| XEP-0292 | vCard4 | Partial |
Security
| XEP | Name | Status |
|---|---|---|
| XEP-0027 | Current Jabber OpenPGP Usage (legacy interop) | Implemented |
| XEP-0373 | OpenPGP for XMPP (experimental spec) | Implemented |
| XEP-0374 | OpenPGP for XMPP Instant Messaging (deferred spec) | Implemented |
| XEP-0384 | OMEMO Encryption (legacy namespace + OMEMO 2 paths, experimental spec) | Implemented |
| XEP-0420 | Stanza Content Encryption (experimental spec) | Implemented |
| XEP-0448 | Encryption for Stateless File Sharing | Implemented |
| XEP-0454 | OMEMO Media Sharing | Partial |
Voice & Video
| XEP | Name | Status |
|---|---|---|
| XEP-0166 | Jingle | Partial |
| XEP-0167 | Jingle RTP Sessions | Partial |
| XEP-0176 | Jingle ICE-UDP Transport | Partial |
| XEP-0320 | Use of DTLS-SRTP in Jingle Sessions | Implemented |
| XEP-0353 | Jingle Message Initiation | Implemented |
Multi-User Chat
| XEP | Name | Status |
|---|---|---|
| XEP-0045 | Multi-User Chat | Partial |
| XEP-0249 | Direct MUC Invitations | Partial |
| XEP-0402 | PEP Native Bookmarks | Implemented |
| XEP-0421 | Anonymous Unique Occupant Identifiers | Implemented |
| XEP-0425 | Message Moderation | Implemented |
| XEP-0486 | MUC Avatars | Implemented |
File Transfer
| XEP | Name | Status |
|---|---|---|
| XEP-0066 | Out of Band Data | Implemented |
| XEP-0234 | Jingle File Transfer | Partial |
| XEP-0260 | Jingle SOCKS5 Bytestreams Transport | Implemented |
| XEP-0261 | Jingle In-Band Bytestreams Transport | Implemented |
| XEP-0363 | HTTP File Upload | Implemented |
| XEP-0447 | Stateless File Sharing | Partial |
Core
| XEP | Name | Status |
|---|---|---|
| XEP-0004 | Data Forms | Implemented |
| XEP-0030 | Service Discovery | Implemented |
| XEP-0049 | Private XML Storage | Implemented |
| XEP-0059 | Result Set Management | Partial |
| XEP-0060 | Publish-Subscribe | Partial |
| XEP-0082 | XMPP Date and Time Profiles | Implemented |
| XEP-0092 | Software Version | Implemented |
| XEP-0115 | Entity Capabilities | Implemented |
| XEP-0163 | Personal Eventing Protocol | Implemented |
| XEP-0198 | Stream Management | Implemented |
| XEP-0199 | XMPP Ping | Implemented |
| XEP-0352 | Client State Indication | Implemented |
| XEP-0368 | SRV records for XMPP over TLS | Implemented |
Roadmap / Not Yet Claimed
| XEP | Name | Status |
|---|---|---|
| XEP-0357 | Push Notifications | Roadmap |
| XEP-0386 | Bind 2 | Roadmap |
| XEP-0388 | Extensible SASL Profile / SASL2 | Roadmap |
| XEP-0484 | Fast Authentication Streamlining Tokens | Roadmap |
Screenshots
Resources
| Resource | Link |
|---|---|
| Website | dinox.im |
| Source | git.dinox.im/dinoxim/dinox |
| Releases | DinoX Releases |
| Milestone | DinoX 2.0.0 Relaunch |
| Issues | Bug Tracker |
| Security | Security Policy |
| XMPP Chat Room | dinox@conference.dinox.im |
| XMPP Contact | dinox@dinox.im |
| contact@dinox.im |
Contributing
Use Forgejo Issues for bug reports and feature requests. For code changes, DinoX uses Forgejo AGit pull requests instead of forks:
git clone ssh://git@git.dinox.im:2222/dinoxim/dinox.git
cd dinox
git checkout -b fix-short-topic
# edit, build, test, commit
git push origin HEAD:refs/for/master -o topic="fix-short-topic"
See CONTRIBUTING.md for the full contributor workflow.
Debug Mode
See DEBUG.md for debugging instructions.
License
DinoX is free software licensed under GPL-3.0-or-later. Copyright and fork attribution are recorded in NOTICE.
Official Linux binary packages and the portable Windows distribution also
contain third-party components under their respective licenses.
Package-specific notices are installed with DinoX. The Windows ZIP contains
hash-bound inventories for every packaged PE file, bundled third-party runtime
assets, embedded Google/libwebrtc and Lyrebird Go components, and every
included license file, but no large source archives or build caches. Large
corresponding source payloads for the AppImage are published as a separate matching
.AppImage.sources.tar.xz release asset, so they do not enlarge the runnable
AppImage and are not required to run it. See the
build and packaging documentation and the
Flatpak third-party inventory for
details.
Made for the XMPP community