No description
Find a file
2026-07-13 03:45:56 +03:00
cmd feat: sync message translation support 2026-07-12 14:20:26 +08:00
data fix: sync WebA labels and forward fixes 2026-07-04 21:14:41 +08:00
deploy feat: sync iOS compatibility support 2026-07-13 00:58:57 +08:00
docs feat: sync message translation support 2026-07-12 14:20:26 +08:00
internal feat: sync iOS compatibility support 2026-07-13 00:58:57 +08:00
media/readme changed readme 2026-07-13 03:45:56 +03:00
scripts feat: sync Bot API gateway support 2026-07-09 13:49:24 +08:00
.env.example feat: sync message translation support 2026-07-12 14:20:26 +08:00
.gitignore feat: sync Bot API gateway support 2026-07-09 13:49:24 +08:00
go.mod feat: sync group call livestream support 2026-07-06 14:32:45 +08:00
go.sum feat: sync group call livestream support 2026-07-06 14:32:45 +08:00
LICENSE chore: refresh gramsrv public release 2026-06-30 14:37:43 +08:00
README.md changed readme 2026-07-13 03:45:56 +03:00
README.zh-CN.md feat: sync iOS compatibility support 2026-07-13 00:58:57 +08:00
sqlc.yaml Initial open source release 2026-06-04 01:37:39 +08:00

OwpenGram

🚀 OwpenGram Server

Your own private messaging server — self-hosted, protocol-compatible, fully yours.

OwpenGram Server is an open-source, Telegram-compatible MTProto backend written in Go. Run it on your own network for a private, closed setup, or on a VPS to be reachable anywhere in the world. Your data, your keys, your rules — no cloud, no lock-in, no censorship.

🔗 Implements MTProto API layer 227.

gramsrv is independent and unofficial. It is not affiliated with, endorsed by, or sponsored by Telegram or the official Telegram team.


Why OwpenGram?

  • 🔒 Private & self-hosted — messages live on infrastructure you control.
  • 🧩 Telegram-compatible — works with the OwpenGram Android and Desktop clients.
  • 🌍 Reachable anywhere — host it globally, or keep it on your own network.
  • 🛡️ Censorship-resistant — no central authority can shut you down.
  • ⚙️ Single binary — one Go program prepares keys, runs migrations, serves MTProto, and dispatches updates and background workers.
  • 🆓 Free & open source — Apache-2.0, audit and extend it freely.

🎯 What works today

  • 💬 Private chats, groups, supergroups & channels
  • 📞 Voice & group calls, live streams, SFU/TURN building blocks
  • 🖼️ Media & files — photos, videos, documents, stickers, reactions
  • 🤖 Bots and mini apps, with a minimal Bot API gateway
  • 🌐 Message translation and AI-assisted compose
  • 📇 Contacts, dialogs sync, chat folders, public link landing pages
  • 🖥️ Admin API and web UI for operations
📋 Full feature checklist (click to expand)
Status Feature What works today
MTProto server edge TCP transport, RSA key exchange, auth keys, encrypted sessions, salts, ack/resend, bad messages, RPC dispatch, and layer compatibility helpers.
Login and accounts Development login code, sign-in, sign-up, log-out, authorizations, account settings, SRP/password state, email/passkey-oriented paths.
Users and contacts User profiles, usernames, profile photos, contact import/search, blocked/privacy state, presence, and last-seen style status.
Dialogs and sync Dialog list, pinned dialogs, manual unread, folders/filters, drafts, read boundaries, durable updates, online fan-out, and offline difference recovery.
Chatlists and public links Chat folder sharing, exported chatlist invite links, join/import flows, revoked invite handling, public username landing pages, and shared public link landing pages.
Private chats Send, history, read receipts, edit, delete, forward, reply, rich entities, grouped/media messages, reactions, scheduled/TTL-oriented paths.
Rich messages Telegram Desktop rich text messages, rich content conversion, send/edit/scheduled flows, dialog/history projections, and memory/PostgreSQL persistence.
AI compose and ChatBot Input-box rewrite/polish, default and custom tones, addstyle previews, local and external provider chains, streamed @ChatBot draft replies, and Business AI reply hooks.
Message translation Telegram messages.translateText, provider-backed batch translation, peer language settings, per-account rate limits, and privacy-conscious logging defaults.
Supergroups and channels Create, join, leave, invite links, participants, admins, forum topics, linked discussion guests, history, send/edit/delete/read, reactions, public search, and previews.
Media and files Upload, download, local blob storage, photos, documents, thumbnails, canonical GIFv conversion, external media fetch, web page previews, map tile cache hooks, profile/channel photos.
Stickers and reactions Sticker/reaction catalog, seed support, saved GIFs, recent reactions, top reactions, default reactions, and moderation-oriented reaction paths.
Gifts and stars Star gifts and local stars ledger foundations for compatibility and future feature work.
Bots and mini apps Bot service foundations, callbacks, inline helpers, webview/mini-app paths, a minimal Bot API gateway for libraries such as python-telegram-bot, persistent getUpdates delivery, and demo tools.
Calls and live streams Private call signaling foundations, group call state, RTMP live streaming, scheduled video chats, channel join_as, SFU/TURN building blocks, liveness, and expiry workers.
Admin and operations Admin API/UI backend, PostgreSQL migrations, Redis volatile state, retention workers, pprof/debug hooks, and load-test helpers.
Desktop, Android, iOS, and Web focus Telegram Desktop is the primary target, with Android, iOS, and Web compatibility paths actively covered by the same server.

Some items are compatibility-first or experimental, but they are real open server code, not hidden product-only features.

Quick Start

Requirements:

  • Go 1.25+
  • Docker (or Docker Desktop), for PostgreSQL and Redis
  • OpenSSL, if you want to build a matching Telegram Desktop-based client

1. Clone the repository

git clone https://github.com/owpengram/owpengram-server.git
cd owpengram-server

2. Start the infrastructure (PostgreSQL + Redis)

docker compose -f deploy/docker-compose.yml up -d

3. Build and run the server

Windows (PowerShell):

go build -o bin/gramsrv.exe ./cmd/telesrv
.\bin\gramsrv.exe

Linux / macOS:

go build -o bin/gramsrv ./cmd/telesrv
./bin/gramsrv

On first start, the server creates data/server_rsa.pem, applies database migrations, seeds bundled language packs, prepares optional media resources, starts MTProto on 0.0.0.0:2398, and brings up the update/media/background workers in the same process.

Default local login code: 12345 — change it before any real use!

⚙️ Configuration

See the complete English configuration reference or the Chinese configuration reference. .env.example is a copyable development template, not an exhaustive parameter dictionary. Most commonly used variables:

Variable Default Meaning
TELESRV_LISTEN 0.0.0.0:2398 MTProto listen address
TELESRV_ADVERTISE_IP 127.0.0.1 client-reachable fallback IP for media and calls
TELESRV_DC 2 self-hosted DC id
TELESRV_DEV_AUTH_CODE 12345 fixed login code for local development
TELESRV_AUTH_CODE_MAX_ATTEMPTS 5 wrong-code attempts before the code hash is deleted
TELESRV_POSTGRES_DSN local Compose DSN PostgreSQL connection string
TELESRV_REDIS_ADDR 127.0.0.1:6399 Redis address
TELESRV_BLOB_DIR data/blobs local media blob directory
TELESRV_PUBLIC_LINK_WEB_ADDR empty optional public link landing listener, for example 127.0.0.1:2401
TELESRV_BOT_API_ADDR empty optional HTTP Bot API gateway listen address, for example 127.0.0.1:8081
TELESRV_AI_ENABLED true enable AI compose entry points
TELESRV_TRANSLATION_ENABLED true enable Telegram message translation RPCs

Optional OpenAI-compatible, Kimi/Moonshot, Gemini, and Anthropic AI provider variables, login email/SMTP settings, and Business AI settings are documented in .env.example and the configuration reference.

🔌 Ports to open

When deploying on a public server, open the following according to the features you enable.

Minimal (chat only)

Port Protocol Purpose Required
2398 TCP MTProto main port; also handles WebSocket when TELESRV_WEBSOCKET_ENABLE=true Yes

With admin backend

Port Protocol Purpose Notes
2399 TCP Admin REST API Restrict to trusted IPs or put behind VPN
2600 TCP Admin Web UI Use Nginx/reverse proxy + HTTPS in production

Optional features

Port Protocol Purpose When needed
2400 TCP RTMP live stream ingest Live streaming
12399 UDP SFU/WebRTC conferencing Voice/video group calls
12400 UDP TURN/STUN server P2P/call relay
12500-12999 UDP TURN relay port range TURN relay
configurable TCP Bot API When TELESRV_BOT_API_ADDR is set
2401 example TCP Public username/sticker/chatlist landing pages When TELESRV_PUBLIC_LINK_WEB_ADDR=127.0.0.1:2401 is set

Internal/debug (do not expose publicly)

Port Default bind Purpose
6060 127.0.0.1:6060 pprof debugging endpoint
5432 127.0.0.1:5432 PostgreSQL
6399 127.0.0.1:6399 Redis

Make sure TELESRV_LISTEN=0.0.0.0:2398 is set, and TELESRV_ADVERTISE_IP points to your public IP so clients can connect.

The server can serve public landing pages for /<username>, profile avatars, /addstickers/<shortName>, /addemoji/<shortName>, and /addlist/<slug>.

TELESRV_PUBLIC_LINK_WEB_ADDR=127.0.0.1:2401
TELESRV_PUBLIC_BASE_URL=https://your-domain.example
TELESRV_PUBLIC_APP_SCHEME=yourapp
TELESRV_PUBLIC_WEB_BASE_URL=https://web.your-domain.example
TELESRV_PUBLIC_APP_NAME=YourApp

In production, keep TELESRV_PUBLIC_LINK_WEB_ADDR on loopback and reverse-proxy the public routes to it with HTTPS.

📱 Connect a client

Use the OwpenGram clients, which have a built-in Add Server option on the server-selection screen at login — no source patching or custom build needed:

A stock Telegram client will not connect, since it only trusts Telegram's own DC list and RSA keys.

1. Export your server's public key

After the server generates data/server_rsa.pem, export the matching public key as PEM:

openssl rsa -in data/server_rsa.pem -RSAPublicKey_out -out data/server_rsa.pub

2. Add the server in the client

On the login screen, open server selection → Add Server, and fill in:

  • Host — your server's address (e.g. 192.168.1.50 or chat.example.com)
  • Port2398 by default
  • Main data center — the DC id from TELESRV_DC (2 by default)
  • RSA Public Key — paste the full contents of data/server_rsa.pub (the -----BEGIN RSA PUBLIC KEY-----... PEM block) into the key field

Current baseline: TL layer 227.

🧪 Development: multi-device smoke test

Use separate client working directories so sessions do not share local tdata:

$tdesktop = "C:\path\to\tdesktop\out\Debug\Telegram.exe"
Start-Process $tdesktop -ArgumentList @("-workdir", "$PWD\.tdata-alice")
Start-Process $tdesktop -ArgumentList @("-workdir", "$PWD\.tdata-bob")

Log in with different phone numbers — the local login code is 12345 unless you changed TELESRV_DEV_AUTH_CODE. Recommended checks:

  • Send private messages, stickers, media, replies, forwards, edits, deletes, and read receipts between two users.
  • Keep one device online and restart another device to verify offline updates.getDifference recovery.
  • Open the same account from multiple sessions and confirm current-session echoes are not duplicated while other online sessions receive updates.
  • Check server logs for no new NOT_IMPLEMENTED, Unhandled RPC, bad_msg, panic, or internal errors.

📂 Repository layout

cmd/telesrv/              server entrypoint
cmd/telesrv-admin/        admin backend and web UI
deploy/                   docker-compose, migrations, deploy helpers
data/                     bundled language packs and optional seed data
internal/mtprotoedge/     MTProto transport, auth key, session, ack/resend
internal/rpc/             TL router and client compatibility handlers
internal/app/             domain services
internal/domain/          protocol-independent domain models
internal/store/           memory/postgres/redis storage backends
internal/seed/            bundled seed catalog loaders
internal/sfu/             real-time SFU experiments
internal/turnsrv/         TURN/STUN building blocks

🤝 Contributing

This server gets better fastest with real usage and focused fixes:

  • Telegram Desktop and Android compatibility reports with reproducible steps.
  • RPC traces for startup, sync, chat, media, calls, bots, or edge cases.
  • Focused fixes for implemented paths instead of broad rewrites.
  • Tests for online/offline updates, multi-device sessions, read state, media, and channel behavior.
  • Performance work on hot paths such as fan-out, pagination, storage queries, media upload/download, and connection handling.

If a change affects visible client behavior, please include the client version/commit, the RPC path you tested, and whether server logs stayed free of new NOT_IMPLEMENTED, Unhandled RPC, bad_msg, panic, or internal errors.

💬 Community

OwpenGram Server builds on the open-source gramsrv project.

📄 License

Apache License 2.0


If OwpenGram is useful to you, a star on GitHub helps the project grow.