Ghostgram Desktop is a privacy- and automation-focused fork of Telegram Desktop (tdesktop). It keeps full Telegram functionality and adds a layer of client-side stealth, message recovery, anti-restriction and quality-of-life features — all toggleable from a single Ghostgram settings section.
It is cross-platform (Windows / macOS / Linux). Pre-built binaries for this fork are produced by the GitHub Actions workflow in this repo; you can also build it yourself with the instructions below.
Based on Telegram Desktop. Source is published under GPLv3 with the OpenSSL exception (see LICENSE). Ghostgram is an unofficial fork and is not affiliated with Telegram FZ-LLC.
- Telegram channel: @ghostgram — latest builds & announcements.
- GitHub Releases —
Ghostgram.exe(Windows x64) and the signed.dmg(macOS, Apple Silicon).
The macOS build is signed with Developer ID but not notarised — on first launch use right-click → Open (or run
xattr -dr com.apple.quarantine Ghostgram.app).
Most features are purely local and never leave your client. A few intentionally change what the Telegram server sees (because that is the point of the feature).
- Local-only (never sent to Telegram): saved deleted/edited messages, view-once / ephemeral media capture, fake Premium, fake Stars, square avatars, archive opacity, custom font, hidden reactions/comments, edit-history viewer, deleted-message preservation in chat, the round app icon.
- Server-visible behaviour we modify: online / typing / read status (suppressed, or forced online via Eternal online), outgoing message text (translated / anti-caps / auto-formatted), forward bypass (sent as fresh messages from you), send-delay (Telegram-side
schedule_date), and Read to here.
All Ghostgram state is stored locally next to your account data and is never uploaded:
tdata/ghostgram_config.json # all toggles
tdata/ghostgram_archive.json # deleted + edited messages
tdata/ghostgram_media_archive.json # view-once / ephemeral metadata
tdata/ghostgram_media/ # captured view-once / voice / round files
A master toggle that gates the stealth sub-options:
- Hide online status — others never see you online (
account.updateStatusis suppressed). - Always appear offline — force offline regardless of activity.
- Hide typing indicator — never broadcast the “typing…/recording…” state.
- Don't mark messages as read — read receipts are not sent (read history is intercepted client-side).
- Don't mark stories as viewed — story views are not reported.
- Mark read when replying or reacting — optional exception: replying/reacting marks the chat read.
- Read to here — context-menu action to mark a chat read up to a specific message, on demand, even with read-suppression on.
- Eternal online — keep yourself permanently “online” by continuously re-asserting online status; applies immediately when toggled.
- Save deleted messages — deleted messages stay in the chat (dimmed, with a trash badge) instead of disappearing; persisted locally.
- Edit history — view every previous version of an edited message.
- Reply to a deleted message — hitting Reply on a recovered message quotes its author + text into the composer.
- View-once / ephemeral capture — view-once photos/videos and voice/round notes are saved locally so they don't vanish; a timer badge marks ephemeral media.
- Bypass protected content — save/forward from chats that disable saving (forwards are re-sent as fresh messages/media from you).
- Block ads — sponsored messages are dropped before display.
- Fake Premium — show yourself as Premium locally (propagates everywhere the client checks
isPremium). - Fake Stars — show an arbitrary local Stars balance (configurable amount).
- Square avatars — square user-pics and single-segment story rings.
- Hide reactions / Hide comments.
- Archive opacity — dim recovered/deleted items to taste.
Applied to every outgoing message before it leaves the client:
- Translate outgoing — auto-translate your message to a target language (Google translate endpoint, no API key).
- Anti-caps — normalise SHOUTING text.
- Auto-format — automatic formatting pass.
- Delay sending — text/media are sent with a configurable delay using Telegram's server-side scheduling (
schedule_date), with independent text/media durations.
- Custom font — load a
.ttfand use it across the UI. - Round app icon — circular taskbar / dock / tray /
.exeicon.
All of the above live under Settings → Ghostgram.
API credentials (TDESKTOP_API_ID / TDESKTOP_API_HASH) are required to build. Get your own from https://my.telegram.org. Never commit them.
The .exe is produced by .github/workflows/ghostgram-windows.yml. It runs on windows-latest, builds all native dependencies (Qt 6, tg_owt, …), caches them, then builds Ghostgram.exe in Release. Push to the ghostgram branch (or run the workflow manually via workflow_dispatch) and download the Ghostgram-Windows-x64-Release artifact.
Key build flags used by CI:
configure.bat x64 qt6 ^
-D TDESKTOP_API_ID=<id> -D TDESKTOP_API_HASH=<hash> ^
-D CMAKE_CONFIGURATION_TYPES=Release ^
-D DESKTOP_APP_DISABLE_AUTOUPDATE=ON ^
-D DESKTOP_APP_DISABLE_CRASH_REPORTS=ON
cmake --build ..\out --config Release --parallel 2The Xcode project is generated by CMake into out/. Build the native dependencies once (Qt 6.2.13, tg_owt, rnnoise, tde2e), then:
# Regenerate the project after editing CMakeLists.txt:
cd out && cmake .
# Debug:
xcodebuild -project out/Telegram.xcodeproj -target Telegram \
-configuration Debug ONLY_ACTIVE_ARCH=YES -arch arm64
# Release (always pass -arch arm64):
xcodebuild -project out/Telegram.xcodeproj -target Telegram \
-configuration Release ONLY_ACTIVE_ARCH=YES -arch arm64Output is out/Debug/Ghostgram.app or out/Release/Ghostgram.app. New source files must be added to Telegram/CMakeLists.txt and the project regenerated with cmake . — never add files through Xcode's project navigator (the project is fully generated).
The upstream tdesktop build process applies. See upstream's build instructions for the toolchain; the Ghostgram sources live under Telegram/SourceFiles/ghostgram/.
All fork code is isolated under Telegram/SourceFiles/ghostgram/ in namespace Ghostgram, reached through one singleton:
Ghostgram::Manager::Instance().config() // toggles, persisted JSON
Ghostgram::Manager::Instance().ghostMode() // online/typing/read suppression
Ghostgram::Manager::Instance().archive() // deleted + edited messages
Ghostgram::Manager::Instance().mediaArchive() // view-once / ephemeral mediaFeatures integrate by branching on Manager::Instance().config().xxx() directly inside the relevant upstream code path — there is no separate event bus.
- @ichmagmaus111 — author & maintainer
Ghostgram Desktop is built on Telegram Desktop by Telegram FZ-LLC and contributors. The original and this fork are licensed under GPLv3 with the OpenSSL exception. This is an independent, unofficial project.