Alerts on your phone
Problems, deleted and edited messages and a daily summary in Telegram, Discord, email or another service.
A bot, a webhook or a mailbox
YOUR TELEGRAM OBSERVATION WORKSPACE
Preserve captured messages, follow their edits, and take a signed history with you. Your accounts. Your infrastructure.
Self-hosted. No telemetry. You control the data.
Paste your panel access token to continue.
GitHub Actions capture (preview)Find it in data/live/panel-token.txt.
Demo mode uses data/demo/panel-token.txt.
For a custom directory, follow the path printed at startup.
Sign in, choose your sources, then start observation.
Captured messages. Preserved changes. One record.
| Event / observation | Source | Observed · UTC | Open |
|---|
Connect an account, choose your sources, then start observation.
Pick the groups and channels this account should observe.
Load the available history of every enabled source into Chats and the signed journal. Progress survives a restart. Attachments follow your media settings. Deleted messages and unseen past edits cannot be recovered.
For an account archive, choose Whole account above, load and review the source list, then start observation. This run uses the enabled sources listed at its start; new sources are not added to a running job.
Use Export evidence to hand over the journal and saved attachments. Finishing history reads does not mean every attachment was downloaded.
Notifications, evidence mode and a 24/7 server are under Extras.
Workspace ID: default · Large downloads & verification
Journal, report, attachments and verification tools.
Includes all sources through a fixed journal boundary, regardless of filters. Streaming export · ZIP limit: 4 GiB uncompressed unless changed in Parameters.A fresh Telegram login, one chat, an encrypted archive and GitHub provenance.
The file is saved as an AES-256 ZIP that 7-Zip or WinRAR opens with this password. Inside is the unchanged signed file, so verify.py works as before. The password is not stored; without it the file cannot be opened.
Automatic timestamps and an encrypted off-site copy: Extras → Evidence that holds up.
Ed25519 · SHA-256 public-key fingerprint
Retain this fingerprint and signed checkpoints outside the collector. A self-contained archive can verify its internal consistency; independently retained records help detect replacement or truncation.
The signed journal records program hashes, dependency versions, starting scope, account, settings, run identifier, and periodic heartbeats. Local checkpoints are saved at startup, every five minutes while observing (changeable in Parameters), and on orderly stop.
This is a collector-signed process record. It is not independent attestation or a trusted timestamp. Copy checkpoints to a separately controlled location for a stronger chain of custody.
Prepare an RFC 3161 request for a signed checkpoint. Submit it to a timestamp authority you trust, then verify its response against independently obtained CA certificates.
No external service is contacted by this button. A prepared request is not a timestamp proof. The package includes instructions for checking a TSA response with OpenSSL.
Versions are preserved when received. Intermediate changes during downtime may be missing. The sender is not necessarily the editor.
Earlier captured content remains. Telegram usually does not supply the deleter or exact deletion time. Unscoped notices remain account-level observations.
Counts, recent reactors, service messages, and participant updates are recorded when delivered. These are not guaranteed complete lists.
Collector starts, stops, detected disconnects, and heartbeats are recorded. Brief outages can escape detection. Times depend on the collector's clock.
Signatures bind saved bytes to this collector's key. They do not establish Telegram origin, truthfulness, trusted time, or protection from an operator controlling the signing key.
Timestamps show the journal existed at a given time; an off-site copy keeps it if this machine is lost or seized.
Choose a service, fill in one or two fields and send a test.
The server has no SSH and no open ports: the panel is reached through a Cloudflare Tunnel, and anyone with a read-only token can check how it was created.
Run these on your own computer in a checkout of TgWitness. Provider and Cloudflare tokens are read from files there; this panel never asks for them.
Tokens, costs and what the check proves ↗Problems, deleted and edited messages and a daily summary in Telegram, Discord, email or another service.
A bot, a webhook or a mailbox
Independent timestamps for the journal and an encrypted copy in storage that nobody can quietly delete.
Timestamps work at once · the copy needs S3 storage
Collect around the clock on a cloud server without SSH, with a provider log anyone can check.
Hetzner, DigitalOcean, Linode, Vultr, AWS or your own server + Cloudflare
Keep signed checks in Telegram so you can compare your saved history later.
Your bot + a channel + a witness host
Prove that this program is exactly one commit of your fork or of the official repository.
A public GitHub repository · no token
Only the option you choose opens its settings. Nothing is connected automatically.
A separate witness checks the journal and your bot publishes the result.
Create an access token for this account. It cannot read conversations or control collection.
Create your bot with @BotFather and allow it to post in your channel.
The saved configuration is a setup file. Run it on the witness host to begin checks and publication.
On the witness host, save the read-only token in witness-token.txt and the BotFather token in bot-token.txt next to witness.json. The bot token is never entered into this collector panel.
Keep the witness key fingerprint separately. Confirm the first signed post in your channel; a downloaded file does not mean the bot is running.
Run the witness on another host, ideally with another operator. Its bot token and signing key stay there. The bot is the publisher; the separate witness process performs verification.
You need a Telegram bot (create one with @BotFather) that is an administrator of a channel, and this panel's address reachable from the witness — over HTTPS outside a private network. Any Telegram account can watch the channel; its posts carry Telegram's own times.
A running witness records missing or invalid collector answers. Verification compares retained checkpoints with the full export and detects missing or invalid signed posts in a channel export. Witness downtime and posting failures leave intervals without external anchors; signatures do not prove complete Telegram delivery.
How often it checks, how long it waits, which checks it posts (all, only a new head or a problem, only problems) and the words of its posts are options of the witness itself: on its command line, in its environment or in a JSON file given with --config. Wording never affects verification: verify.py checks the signed token at the end of every post.
Every program file is compared with the same file in the commit on GitHub. The result is saved in the signed journal, so anyone holding an export sees which public code was running.
Limits and pace of collection, rechecks, downloads, people profiles, notifications and exports for this workspace. Each change applies from the next use of the value and is recorded in the signed journal.
Stop the demo with Ctrl+C, then run from your project folder:
python start.pyOn Windows, you can double-click Start.cmd instead. Open the panel address printed in the terminal.
Installation help ↗Settings → Devices → Link Desktop Device
Choose a route before signing in.
Pause observation to change the route. Until then, observation keeps using the current one.
Choose a proxy, save it and test the Telegram connection before signing in. Your own proxy can be entered below.
Only compatible public addresses are included. Fake TLS ee entries are skipped. A listed server has not necessarily been tested from your network.
Every server the automatic route can use: whether it answers, how fast, its country and list. A workspace keeps its server while it works and moves to the next one when it fails.
| Country | Server | Ping | Status | List | Used by | Action |
|---|
Public lists maintained on GitHub. Switch off the ones you do not trust.
Add a list address, upload files or paste links. Lists are read for tg://proxy and t.me/proxy links anywhere in the text.
With a token, downloads from GitHub are authenticated and TgWitness can search GitHub for newly published MTProxy lists whenever the lists update. The token is kept encrypted and is sent only to GitHub.
Country lookups ask a public GeoIP service about the server addresses only, through the same route as list downloads.
Use an encrypted disk or volume for message content, attachments, temporary exports and backups. Signatures detect changes; they do not hide content. A proxy routes Telegram traffic and does not protect the web panel.
Add as many workspaces as you need. Use a distinct Telegram account per workspace: the same session in two places makes Telegram revoke it (AUTH_KEY_DUPLICATED).
Isolated workspaces — add as many as you need. Each has its own session, sources, journal and signing key, and runs its own collector. Several accounts can export one chat together.
Each account gets its own workspace, signing key and proxy. Files with the same name form one account, for example name.session with name.json. A session that does not sign in is not kept.
Search saved observations, review the sources, then choose whether to use AI.
Edits and deletion notices are separate records. Missing on recheck does not establish that Telegram sent a deletion notice.
Observed facts, model inferences and analyst notes remain distinct. The original signed events are unchanged.
Open a saved attachment's journal record and choose Recognize attachment. Processing runs locally in an isolated worker.
The external model can receive messages requested by its client. Choose the workspaces and chats you want to share.
The token is shown only here. Save it now; it cannot be retrieved later.
The copied token grants access to the selected archive. Keep it out of repositories, logs and shared screenshots.
.vscode/mcp.json in your client workspace.The configuration contains a secret input prompt, not the token. A connection check reads no messages.
VS Code configuration referenceStructured notifications for n8n and SIEM. Metadata is sent by default; message text requires a separate choice.
Configure the receiver to verify the signature and timestamp, and deduplicate by event_id.
Who opens this panel and what they can do there. Your panel token stays the main key; everyone else gets their own access, limited to chosen workspaces and chats.
What this TgWitness process logs: its start, Telegram connections, proxy changes, sign-ins, refusals and changes made by anyone, and the journal records of every workspace. Message records are left out; they stay in the journal.