owpengram-server/docs/telegram-feature-comparison.md
Astra eb23afdd39 docs: compare OwpenGram Server's implemented features to Telegram's official server
Feature-by-feature comparison across transport/auth, messaging, groups,
media, bots, calls, stories, secret chats, sync, themes, moderation, and
the payments/Stars economy - marking each Full / Partial / Stub / None,
with the deliberate omissions and OwpenGram-only additions called out
separately.
2026-09-14 12:05:28 +01:00

21 KiB

OwpenGram Server vs. Telegram - Feature Comparison

This document compares what OwpenGram Server actually implements against the behaviour of Telegram's official server, as seen through the MTProto API (layer 228) and the official clients (Telegram Desktop is the primary target, with Android / iOS / Web compatibility paths).

It is written from the server code in this repository: ~633 canonical registerRPC handlers across internal/rpc, plus the domain services in internal/app/*. "Telegram" below means the closed official backend.

Legend:

  • Full - implemented with real server-side state and semantics
  • Partial - core paths work; edges, scale features, or moderation depth missing
  • Stub - RPC is answered with a fixed/empty valid response so clients don't hang or crash, but there is no feature behind it
  • None - not registered / not implemented

1. Transport, auth keys, sessions

Area Telegram OwpenGram Status
MTProto 2.0 over TCP Full TCP transport, RSA key exchange, auth keys, salts, ack/resend, bad-msg notifications, RPC dispatch Full
Obfuscated / padded intermediate / other transports Full (TCP, HTTP, WS, obfuscation) intermediate / padded-intermediate focus Partial
Multiple data centers, CDN DCs, DC migration Full (5+ DCs, PHONE_MIGRATE, CDN file DCs) Single logical DC; help.getConfig advertises one; no CDN redirects None (by design)
Perfect-forward-secrecy temp auth keys (auth.bindTempAuthKey) Full Implemented Full
Takeout / data export sessions Full (account.initTakeoutSession) Not registered None
Web / bot authorizations listing & reset Full account.getWebAuthorizations, resetWebAuthorization(s) Full

2. Login and accounts

Area Telegram OwpenGram Status
Phone-number login with SMS/flash-call/app code Full, global SMS delivery Dev login code; external delivery via SMS webhook or SMTP; email as identity (no phone required) Partial (delivery is operator-provided)
QR-code login (auth.exportLoginToken / acceptLoginToken) Full Implemented Full
Cloud password / 2FA (SRP) Full account.getPassword, updatePasswordSettings, auth.checkPassword, recovery e-mail, resetPassword Full
Passkey / WebAuthn sign-in Not in official server auth.initPasskeyLogin / finishPasskeyLogin, account.*Passkey* Extra (OwpenGram-only)
"Login with Telegram" as an OIDC provider for 3rd-party sites Not applicable Self-hosted OpenID Connect provider (internal/telegramloginhttp) Extra
Sign-up, terms of service, delete account, account TTL Full Implemented incl. account.setAccountTTL, deleteAccount with reason Full
Login email as second factor Full Implemented Full
Active sessions / authorizations management Full account.getAuthorizations, resetAuthorization, TTL, changeAuthorizationSettings Full

3. Users, contacts, privacy

Area Telegram OwpenGram Status
Profiles, bios, profile photos, personal channel Full users.getFullUser, photos.*, account.updatePersonalChannel Full
Usernames + collectible/fragment usernames Full Mint / transfer / activate, account.reorderUsernames, fragment.getCollectibleInfo Full
Contact import / export / search / resolve phone Full contacts.importContacts, resolvePhone, search, close friends Full
Blocked list, privacy rules, "who can..." keys Full (all privacy keys) account.getPrivacy / setPrivacy, global privacy settings, blocked list Partial (common keys; some newer keys may be defaulted)
Presence / last seen Full account.updateStatus, contacts.getStatuses, presence fan-out Full
Birthdays, close friends, contact notes Full contacts.getBirthdays, editCloseFriends, updateContactNote Full
Global name search directory Full contacts.search over local users/chats Partial (local instance only)

4. Messaging (private chats)

Area Telegram OwpenGram Status
Send / edit / delete / forward / reply Full messages.sendMessage / sendMedia / sendMultiMedia / editMessage / forwardMessages Full
Rich entities, formatted text, link previews Full Entities, messages.getWebPage / getWebPagePreview, TDesktop rich messages Full
Albums / grouped media Full album_group grouping Full
Reactions (emoji + custom emoji), paid reactions Full incl. paid (Stars) sendReaction, available/recent/top/default reactions, tags; no paid reactions Partial
Scheduled messages Full getScheduledHistory, sendScheduledMessages, deleteScheduledMessages Full
Self-destruct / TTL, default history TTL Full setHistoryTTL, setDefaultHistoryTTL, TTL-oriented paths Partial
Read receipts, read date, "who read" in groups Full readHistory, getOutboxReadDate, getMessageReadParticipants Full
Drafts (incl. cloud drafts sync) Full saveDraft, getAllDrafts, clearAllDrafts Full
Saved Messages, saved dialogs, pinned saved Full getSavedDialogs, getSavedHistory, toggleSavedDialogPin Full
Quick replies (business) Full getQuickReplies, sendQuickReplyMessages, editQuickReplyShortcut Full
Translation (messages.translateText) Full Provider-backed batch translation, per-peer language, rate limits Full
Transcribe voice (messages.transcribeAudio) Full (Premium) Registered Partial (provider-dependent)
Fact-check / sponsored-message plumbing Full getSponsoredMessages, viewSponsoredMessage, reportSponsoredMessage Partial (plumbing)
To-do lists in messages Full appendTodoList, toggleTodoCompleted Full
Search: in-chat, global, by date, counters, calendar Full messages.search, searchGlobal, getSearchCounters, getSearchResultsCalendar / Positions Full

5. Groups, supergroups, channels

Area Telegram OwpenGram Status
Basic groups create / add / migrate to supergroup Full messages.createChat, addChatUser, migrateChat Full
Supergroups / channels create, join, leave, delete Full channels.createChannel / joinChannel / leaveChannel / deleteChannel Full
Admin rights, banned rights, default banned rights, ranks Full channels.editAdmin / editBanned, editChatDefaultBannedRights, editChatParticipantRank Full
Invite links (permanent, named, request-to-join, importers) Full messages.exportChatInvite, getExportedChatInvites, hideChatJoinRequest, importers Full
Participants list, admin log, hidden participants Full channels.getParticipants, getAdminLog, toggleParticipantsHidden Full
Forum topics Full getForumTopics, editForumTopic, pinned topics, view-as-messages Full
Linked discussion group Full setDiscussionGroup, getGroupsForDiscussion, readDiscussion Full
Slow mode, join-to-send, join-request, anti-spam, gigagroup Full toggleSlowMode, toggleJoinToSend, toggleAntiSpam, convertToGigagroup Full
Public username directory + previews for non-members Full channels.searchPosts, resolve, public landing pages Full
Boosts / boost level perks Full premium.applyBoost, getBoostsStatus, getMyBoosts Partial (levels tracked; not all perks gated)
Channel monetization, paid posts, suggested posts Full (Stars/TON) service_suggested_post, toggleSuggestedPostApproval, updatePaidMessagesPrice Partial (no real payout ledger)
Statistics (channel / megagroup / message / story) Full stats.getBroadcastStats, getMegagroupStats, getMessageStats, loadAsyncGraph Partial (graphs from local data)
Communities / peer links (layer 228) Full communities.* create / join / peer links / bans Partial (new API)

6. Media and files

Area Telegram OwpenGram Status
Upload / download, big-file parts, file hashes Full upload.saveFilePart / saveBigFilePart / getFile / getFileHashes Full
CDN-backed downloads, upload.getCdnFile Full None - always served from origin None (by design)
Storage backends Google infra Local disk or S3/MinIO-compatible, switchable per deployment; low-space guard; stale-media cleanup Full (self-host)
Web files / proxied external media (upload.getWebFile) Full Registered, external media fetch Partial
Photos, documents, thumbnails, GIFv conversion, video Full Implemented incl. canonical GIFv conversion Full
Web page previews, instant view Full Previews yes; Instant View pages no Partial
Map/venue tile cache Full Cache hooks only Partial

7. Stickers, emoji, GIFs

Area Telegram OwpenGram Status
Sticker sets install/archive/reorder, custom emoji, masks Full messages.*StickerSet*, getCustomEmojiDocuments, mask stickers Full
Create / edit own sticker set (stickers.*) Full createStickerSet, addStickerToSet, renameStickerSet, suggest short name Full
Featured / trending / recent / faved stickers Full getFeaturedStickers, getRecentStickers, getFavedStickers Full
Emoji keywords / groups / status Full getEmojiKeywords*, getEmojiGroups, emoji status incl. collectible Full
Saved GIFs + inline @gif catalog Full Admin-curated categorized @gif catalog, auto-save on send Full (plus extras)
Premium animated emoji / effects Full messages.getAvailableEffects Partial

8. Bots and mini apps

Area Telegram OwpenGram Status
Bot messaging, callbacks, inline mode Full getInlineBotResults, sendInlineBotResult, getBotCallbackAnswer, setBotCallbackAnswer Full
BotFather-style bot creation & config Full bots.createBot, setBotInfo, setBotCommands, menu button, usernames Full
Web apps / mini apps (messages.requestWebView, main/app/simple) Full webViewRequest, mainWebViewRequest, appWebViewRequest, prolongWebView, sendWebViewData Full
Attachment-menu bots Full getAttachMenuBots, toggleBotInAttachMenu Full
Bot API HTTP gateway (getUpdates / webhooks) Full (api.telegram.org) Minimal Bot API gateway in internal/botapi; persistent getUpdates, webhook delivery Partial (subset of methods)
Business connections / Business AI replies Full account.getBotBusinessConnection, connected bots, business automation, AI echo Partial
Bot payments (payments.sendPaymentForm, invoices) Full Not registered None
Star-ref / affiliate programs Full bots.updateStarRefProgram shell Stub
Games (messages.setGameScore, high scores) Full Registered incl. inline high scores Full

9. Calls and live streams

Area Telegram OwpenGram Status
1:1 call signaling (DH, phone.requestCall ... discardCall) Full Full state machine with g_a hash commit, ring timeout, tombstones (internal/app/phone) Full (signaling)
Group calls / voice chats Full phone.joinGroupCall, participants, editGroupCallParticipant, titles, scheduled starts Full (signaling/state)
Conference calls (layer 228 chain blocks) Full createConferenceCall, getGroupCallChainBlocks, invite/decline Partial
Media relay Global TURN + SFU fleet SFU/TURN building blocks (internal/sfu, internal/turnsrv); operator must run relays Partial
RTMP live streaming into channels Full phone.getGroupCallStreamRtmpUrl, RTMP ingest, segmenter (internal/app/livestream) Full
Screen sharing / presentation Full joinGroupCallPresentation / leaveGroupCallPresentation Full (signaling)
Call debug / rating Full saveCallDebug, setCallRating Full

10. Stories

Area Telegram OwpenGram Status
Post / edit / delete stories, media Full stories.sendStory, editStory, deleteStories, canSendStory Full
Read state, views, viewers list, reactions Full readStories, incrementStoryViews, getStoryViewsList, sendReaction Full
Pinned stories / profile grid, archive Full togglePinned, getPinnedStories, getStoriesArchive Full
Story albums (layer 228) Full createAlbum, getAlbumStories, reorderAlbums Full
Stealth mode, hidden peers Full activateStealthMode, toggleAllStoriesHidden, togglePeerStoriesHidden Full
Channel stories + live stories Full Channel posting via access checks; stories.startLive Partial
Story boosts / repost / public forwards Full stats.getStoryPublicForwards, search posts Partial

11. Dialogs, sync, folders

Area Telegram OwpenGram Status
Dialog list, pinned, manual unread, archive folder Full getDialogs, getPinnedDialogs, markDialogUnread, folders.editPeerFolders Full
Chat folders / dialog filters, suggested filters Full getDialogFilters, updateDialogFilter, getSuggestedDialogFilters, filter tags Full
Shareable folders / chatlist invites Full chatlists.exportChatlistInvite, join/import, updates, revoked handling Full
Update sequencing: updates.getState / getDifference / getChannelDifference Full Implemented incl. durable updates, pts/qts/seq, offline difference recovery Full
Real-time push over the MTProto connection Full Online fan-out, reliable dispatch Full
External push (APNs / FCM / GCM) Full None - account.registerDevice only records the in-connection MTProto push session; other token types are ignored None (by design)
Notification settings / exceptions / reactions-notify Full getNotifySettings, getNotifyExceptions, getReactionsNotifySettings Full

12. Secret chats (E2E)

Area Telegram OwpenGram Status
DH handshake, messages.requestEncryption -> accept/discard Full State machine + id/access_hash allocation, blind g_a storage (internal/app/secretchat) Full
Encrypted message / file / service delivery, qts queue Full sendEncrypted, sendEncryptedFile, sendEncryptedService, uploadEncryptedFile Full
Encrypted typing, read history, spam report Full setEncryptedTyping, readEncryptedHistory, reportEncryptedSpam Full
Rekeying / perfect forward secrecy for long chats Full Handled at handshake layer; server is a blind relay Partial

13. Themes, wallpapers, appearance

Area Telegram OwpenGram Status
Wallpapers install/upload/reset, multi-wallpaper Full account.getWallPapers, installWallPaper, getMultiWallPapers Full
Custom themes create/install/update, chat themes Full account.createTheme, installTheme, getChatThemes, messages.setChatTheme Full
Peer colors, profile colors, name colors Full help.getPeerColors, account.updateColor, channels.updateColor Full
Unique-gift chat themes Full account.getUniqueGiftChatThemes (empty - no gifts) Stub
Ringtones Full account.getSavedRingtones Full

14. Payments, Stars, gifts, Premium - deliberately omitted

Telegram's economy layer is intentionally not implemented. OwpenGram keeps a handful of read-only RPCs answered with valid empty/zero responses purely so the official clients render "no Stars / no gifts" instead of hanging or retrying in a storm.

Area Telegram OwpenGram
Invoice / payment form / shipping / checkout Full (payments.sendPaymentForm, ...) Not registered
Telegram Stars balance, purchase, transactions Full getStarsStatus / Subscriptions / Transactions return zero balance, empty ledger
Star gifts / collectible gifts / gift profiles Full getStarGifts / getSavedStarGifts return empty lists
Google Play / App Store receipt verification Full canPurchaseStore returns false; assignPlayMarketTransaction -> STORE_PAYMENT_UNAVAILABLE
Premium subscription, gift codes, giveaways Full payments.getPremiumGiftCodeOptions empty; Premium status can be granted server-side by the operator, not purchased
TON / channel revenue withdrawal Full getStarsRevenueStats / RevenueAdsAccountUrl return fixed zero/compat values
Business Stars / paid messages payout Full Price fields tracked; no real ledger or payout

15. Moderation, admin, operations

Area Telegram OwpenGram Status
Report spam / peer / message / reaction / profile photo Full messages.report, account.reportPeer, reportProfilePhoto, channels.reportSpam Full
Global ban / spam-bot / account restrictions Full (internal) Per-account freeze (admin read-only restriction advertised via appConfig), moderation cases, appeal links (internal/app/moderation) Partial
Anti-spam service for groups Full (@GroupAnti-SpamBot) channels.toggleAntiSpam, reportAntiSpamFalsePositive Partial
Admin API + web UI Not public RBAC-scoped admin API tokens, web UI (internal/adminapi, internal/web) Extra
Broadcast / announcements to all users Not public Admin-panel broadcast from the official account to all or a picked list Extra
Shared-device detection across accounts Internal Implemented Extra
TUI server panel (setup wizard, start/stop, git-pull update, log tail, .env editor) N/A Bundled (tui-panel) Extra
Metrics, pprof, DB tracing, load-test harness Internal internal/observability, internal/loadtest, internal/loadharness Extra

16. Verification and badges

Area Telegram OwpenGram Status
Official blue checkmark Full (manual) @verifybot flow, verification worker Full (self-host policy)
Third-party bot verification mark (icon + label before a name) Full (bots.setCustomVerification) @marksbot mechanism - experimental, hidden by default Partial
Scam / fake labels Full Flag paths present Partial

17. Misc API surface

Area Telegram OwpenGram Status
help.getConfig / getAppConfig / getCountriesList / timezones / promo Full Implemented Full
Language packs (langpack.*) Full getLangPack, getDifference, getStrings, seeded packs Full
App update check (help.getAppUpdate) Full Registered Partial (operator-fed)
Deep-link info, t.me link resolution Full help.getDeepLinkInfo, public link landing pages Full
contacts.getLocated (nearby people/chats) Full Not registered None
Peer color / emoji-status catalogs Full Implemented Full
smsjobs.* (Android SMS relay income) Full Not registered None

Summary

Strong, near-complete parity:

  • MTProto edge, auth, sessions, PFS, 2FA/SRP
  • Private chat messaging: send/edit/delete/forward/reply/reactions/scheduled/ drafts/search/translation/albums/rich text
  • Groups, supergroups, channels: admin model, invite links, forum topics, discussion groups, slow mode, anti-spam toggles, public search
  • Media pipeline with pluggable local-disk or S3 storage
  • Stickers / custom emoji / GIFs (with an extended @gif catalog)
  • Bots, inline mode, web apps / mini apps, games
  • Stories (incl. layer 228 albums, stealth mode)
  • Secret chats (E2E, server as blind relay)
  • Dialogs/folders/chatlists and the full update-difference sync machinery
  • Themes, wallpapers, peer colors, language packs

Partial / compatibility-first:

  • Calls and live streams: signaling and state are complete; media relay needs an operator-run SFU/TURN
  • Boosts, channel/story statistics, communities, business features, conference calls: core flows present, some perks and edges not gated
  • Bot API HTTP gateway: a useful subset, not the full api.telegram.org
  • Moderation: instance-level tooling exists, no global trust-and-safety network

Deliberately not implemented:

  • The entire payments/economy layer: invoices, Telegram Stars, star gifts, Premium purchase, TON/revenue withdrawal, Play/App Store billing. Read-only RPCs return valid empty responses so clients don't break.
  • External push notifications (APNs / FCM / GCM). Delivery is only over the live MTProto connection; registerDevice records the in-connection push session and ignores other token types.
  • Multi-DC / CDN infrastructure: one logical DC, files always served from origin, no DC-migration redirects.
  • contacts.getLocated (nearby), takeout sessions, smsjobs.*, Instant View.

OwpenGram-only additions not in Telegram's server:

  • WebAuthn / passkey sign-in
  • Self-hosted "Login with Telegram" OpenID Connect provider
  • Admin API + web UI, RBAC admin tokens, admin broadcast/announcements
  • Shared-device detection
  • Bundled TUI server-operations panel
  • AI compose / rewrite with pluggable local or external providers
  • Pluggable S3/MinIO media backend with live switch