Skip to main content

How to Self-Host Snikket: Private XMPP Messaging 2026

·OSSAlt Team
snikketxmppmessagingprivacyself-hostingdocker2026

TL;DR

Snikket (Apache 2.0) is a batteries-included XMPP server distribution based on Prosody — the battle-tested XMPP server in Lua. Snikket removes all the complexity of configuring XMPP: it comes with automatic TLS, invite-based registration, and officially maintained iOS and Android apps. Share encrypted messages, voice calls, video calls, and files with friends and family — all on your own server. No phone number required, no telemetry, no ads.

Key Takeaways

  • Snikket: Apache 2.0, Prosody-based — opinionated, easy XMPP deployment
  • XMPP protocol: Open standard — federates with other XMPP servers worldwide
  • Invite-only: Users join via invite links you generate — no open registration
  • End-to-end encryption: OMEMO E2E encryption in all supported clients
  • Apps: Official Snikket iOS and Android apps; also compatible with Conversations (Android) and Siskin IM (iOS)
  • Calls: Voice and video calls via XMPP Jingle (no third-party server)

Snikket vs Signal vs Telegram vs Matrix

FeatureSnikketSignalTelegramMatrix
Self-hostedYesNoNoYes
Open protocolXMPPOpen sourceMTProtoMatrix
E2E encryptedYes (OMEMO)Yes (always)Opt-inYes (E2EE rooms)
FederationYes (XMPP)NoNoYes
Phone number requiredNoYesYesNo
Voice/video callsYesYesYesYes
Group callsBasicYesYesYes
Server requiredYes (yours)Signal'sTelegram'sYes (yours)
RAM (idle)~100MB~1GB+

Server Requirements

  • Domain: A dedicated domain or subdomain (e.g., chat.yourdomain.com)
  • DNS: Specific SRV records required for federation
  • Ports: 80, 443 (HTTPS), 5222 (XMPP client), 5269 (XMPP federation), and STUN/TURN ports for calls
  • RAM: ~100–200MB

Part 1: DNS Setup

Snikket requires several DNS records:

# A records:
chat.yourdomain.com.     A     your-server-ip
groups.chat.yourdomain.com.  A  your-server-ip
share.chat.yourdomain.com.   A  your-server-ip

# SRV records for XMPP:
_xmpp-client._tcp.chat.yourdomain.com.  SRV  5 0 5222 chat.yourdomain.com.
_xmpp-server._tcp.chat.yourdomain.com.  SRV  5 0 5269 chat.yourdomain.com.
_xmpps-client._tcp.chat.yourdomain.com. SRV  5 0 5223 chat.yourdomain.com.
_xmpps-server._tcp.chat.yourdomain.com. SRV  5 0 5270 chat.yourdomain.com.

Part 2: Docker Setup

# docker-compose.yml
services:
  snikket:
    image: snikket/snikket-server:latest
    container_name: snikket
    restart: unless-stopped
    network_mode: host    # Required for SRV record routing
    volumes:
      - snikket_data:/snikket
    env_file:
      - snikket.conf

volumes:
  snikket_data:
# snikket.conf
SNIKKET_DOMAIN=chat.yourdomain.com
SNIKKET_ADMIN_EMAIL=admin@yourdomain.com

# TURN server for calls (optional but recommended for external calls):
# SNIKKET_TWEAK_TURN_ENABLED=true
docker compose up -d

Snikket automatically provisions Let's Encrypt certificates for all required subdomains.


Part 3: Create Your Admin Account

After startup, create the initial admin invite:

# Create an admin invite:
docker exec snikket snikket-invite admin

# Output: https://chat.yourdomain.com/invites/abc123def456

Open this URL in a browser → download the Snikket app → scan the QR code to join.


Part 4: Invite Users

# Create single invite:
docker exec snikket snikket-invite create

# Create bulk invites:
docker exec snikket snikket-invite create-bulk 10

# Create group invite (for a specific channel):
docker exec snikket snikket-invite create --group family-group

Each invite is a URL that creates an account when opened in the Snikket app.


Part 5: Client Apps

  1. Open the invite link on your phone
  2. App opens automatically and creates your account
  3. Start messaging

Third-Party XMPP Clients

Snikket is standard XMPP — any XMPP client works:

PlatformClientNotes
AndroidConversationsBest third-party Android XMPP client
iOSSiskin IMFeature-rich XMPP for iOS
macOSBeagle IMNative macOS
Windows/LinuxGajimDesktop XMPP client
WebConverse.jsBrowser-based XMPP

Connect with:

  • Server: chat.yourdomain.com
  • Username: yourname@chat.yourdomain.com
  • Password: set during invite registration

Part 6: Group Chats (Multi-User Chat)

Create a persistent group chat room:

# Create a group:
docker exec snikket snikket-group create family

# The group JID is: family@groups.chat.yourdomain.com

In the Snikket app → Channels → Join → enter the group JID.

Or invite directly:

# Create invite that auto-joins a group:
docker exec snikket snikket-invite create --group family
# Share this invite link — recipients join both the server and the group

Part 7: File Sharing

Snikket includes HTTP file upload (share.chat.yourdomain.com):

  • Files and images are uploaded to your server
  • Share links in chat
  • Configurable file size limit and retention period
# snikket.conf additions:
SNIKKET_TWEAK_SHARE_MAX_SIZE=10485760    # 10MB max file size
SNIKKET_TWEAK_SHARE_EXPIRE_DAYS=30      # Files auto-delete after 30 days

Part 8: Federation with Other XMPP Servers

XMPP is a federated protocol — your users can message anyone on any XMPP server:

your-user@chat.yourdomain.com → friend@jabber.org
your-user@chat.yourdomain.com → colleague@another-xmpp-server.com

No extra configuration needed — federation works automatically via the SRV DNS records.

Public XMPP servers your users can contact:

  • jabber.org
  • conversations.im
  • movim.eu

Part 9: Monitoring and Admin

# View current users:
docker exec snikket snikket-user list

# View active sessions:
docker exec snikket prosodyctl status

# Check certificate status:
docker exec snikket snikket-certs status

# Renew certificates manually:
docker exec snikket snikket-certs renew

# Server stats:
docker exec snikket prosodyctl mod_measure dump

Maintenance

# Update:
docker compose pull
docker compose up -d

# Backup:
tar -czf snikket-backup-$(date +%Y%m%d).tar.gz \
  $(docker volume inspect snikket_snikket_data --format '{{.Mountpoint}}')

# Restore:
docker compose down
# Restore volume data
docker compose up -d

See all open source privacy and messaging tools at OSSAlt.com/categories/messaging.

Comments