Your email inbox, reimagined as a modern messenger.
RoundChat is a desktop chat app that works directly with your existing email account — no new account to create, no proprietary server, no data stored anywhere except your own inbox. Open it in your browser and chat the way you already do, just with a familiar messenger interface.
| Sign in | Conversations | Chat |
|---|---|---|
| Contacts | Files |
|---|---|
- 💬 Conversations — your email threads displayed as chat bubbles, grouped by contact or group
- ✉️ Send & receive — reply directly from the chat view; messages are real emails under the hood
- 👤 Contacts — browse your address book pulled from CardDAV
- 📁 Files — upload, download, and delete files stored on your WebDAV server
- 🔔 Real-time updates — new messages appear automatically without refreshing
Grab the latest pre-built binary for your platform from the Actions → Artifacts tab (Linux x86-64 or Windows x86-64).
Copy the example configuration file and fill in your email server details:
cp .env.example .envOpen .env in any text editor and set at minimum:
| Setting | What to put here |
|---|---|
IMAP_HOST |
Your mail server (e.g. imap.gmail.com) |
SMTP_HOST |
Your outgoing server (e.g. smtp.gmail.com) |
See .env.example for the full list of options including POP3, CardDAV and WebDAV.
./roundchat serve # Linux
roundchat.exe serve # WindowsRoundChat opens your default browser at http://127.0.0.1:7979 automatically.
Sign in with your email address and password (or app-specific password).
To see all available commands and environment variables:
./roundchat helpTo keep RoundChat running in the background and start automatically on boot, install it as a systemd service.
1 · Place the binary and config
cp roundchat /usr/local/bin/roundchat
chmod +x /usr/local/bin/roundchat
cp .env /etc/roundchat.env2 · Create the unit file
Save the following to /etc/systemd/system/roundchat.service:
[Unit]
Description=Roundchat
Wants=network.target
[Service]
Type=simple
EnvironmentFile=/etc/roundchat.env
ExecStart=/usr/local/bin/roundchat serve
Restart=on-failure
RestartSec=5
[Install]
WantedBy=multi-user.target3 · Enable and start
systemctl daemon-reload
systemctl enable --now roundchatCheck the status at any time with:
systemctl status roundchat
journalctl -u roundchat -fWhen the server has no internet access to GitHub Container Registry, deploy via Docker tarball.
Pushing a v* tag triggers the Build and Push Docker Image workflow which:
- Builds the Docker image and pushes it to
ghcr.io/tayyebi/roundchat - Exports the image as
roundchat-docker.tar - Attaches the tarball to the GitHub release
# 1. Download the tarball from the release
gh release download v1.0.0 --pattern "roundchat-docker.tar"
# 2. Upload to the server
scp roundchat-docker.tar root@your-server:/root/roundchat/
# 3. Load and run on the server
ssh root@your-server
cd /root/roundchat
docker load -i roundchat-docker.tar
docker tag <loaded-image-id> ghcr.io/tayyebi/roundchat:v1.0.0
docker compose up -d/root/roundchat/
├── .env # environment configuration
├── docker-compose.yml # service definition
└── roundchat-docker.tar # pre-built Docker image (loaded with docker load)
Set IMAP_TLS_INSECURE=true in .env when the IMAP server uses a self-signed certificate.
- No cloud, no accounts — RoundChat runs entirely on your machine and talks directly to your own mail/DAV servers.
- No data leaves your control — messages are your normal emails; contacts and files live on your own server.
- TLS on by default — all connections to mail and DAV servers use TLS.
Developer notes
| Layer | Technology |
|---|---|
| Backend | Rust (axum, tokio) |
| Frontend | HTML5 + CSS3 + pure JS (embedded in the binary) |
| Protocols | IMAP / POP3, SMTP, CardDAV, WebDAV |
# Debug run
cargo run
# Release (opens browser automatically)
cargo run --release
# Cross-compile
cargo build --release --target x86_64-unknown-linux-gnu
cargo build --release --target x86_64-pc-windows-msvcGitHub Actions builds both targets on every push and uploads artifacts.
| Variable | Description | Default |
|---|---|---|
IMAP_HOST |
IMAP server hostname | — |
IMAP_PORT |
IMAP port | 993 |
IMAP_TLS |
Enable TLS | true |
IMAP_TLS_INSECURE |
Skip TLS certificate verification (self-signed certs) | false |
POP3_HOST |
POP3 server (used when IMAP_HOST is unset) |
— |
POP3_PORT |
POP3 port | 995 |
POP3_TLS |
Enable TLS | true |
POP3_TLS_INSECURE |
Skip TLS certificate verification (self-signed certs) | false |
POP3_POLL_INTERVAL |
Polling interval in seconds | 30 |
SMTP_HOST |
SMTP server hostname | localhost |
SMTP_PORT |
SMTP port | 465 |
SMTP_TLS |
Enable TLS | true |
CARDDAV_URL |
CardDAV address book URL ({email} placeholder) |
— |
WEBDAV_URL |
WebDAV file storage URL ({email} placeholder) |
— |
ROUNDCHAT_PORT |
Local HTTP server port | 7979 |