tglow
A Telegram client that never leaves the keyboard. Read, reply, search and send from the terminal — in vim's own grammar.
Source on GitHub Download v0.11.0 Linux · macOS · Windows
Real output. The gutter counts distance from the cursor, so 3j is obvious before you type it.
What it is
An editor that happens to chat.
tglow opens in normal mode. Nothing you type is sent by accident. Messages are lines in a buffer, the gutter counts relative to your cursor, and the keys are the ones already in your fingers — j and k to move, i to write, dd to delete, . to repeat.
It is not a port of the Telegram app to a smaller screen. The layout borrows from git blame rather than from a chat bubble: a fixed rail of gutter, time and sender, and one content column that wrapped lines respect.
Keys
Press \ in the application and it lists every binding for wherever you are. You should not have to read a manual to use a chat client.
What it does
Messages look like messages
Links, bold, code, strikethrough and code blocks render as themselves. Spoilers stay masked until you ask.
Nothing is lost while you are away
Messages sent while tglow was closed are recovered on launch, not silently skipped — the part most terminal clients quietly omit.
Your text survives a failure
A send that fails leaves what you typed exactly where it was. Delete asks first, every time, because a mistyped dd cannot be undone.
The block turns red and every other key is ignored until you answer.
You can fix a typo where it is
The caret moves through what you are writing, so a wrong letter in the middle of a message costs one ←, not deleting the rest of the sentence. It steps by whole characters — ế is one press to cross and one backspace to remove, never half a letter.
It speaks your language
Vietnamese, CJK and emoji measure and wrap correctly. nguyen finds Nguyễn Tấn Phát — diacritics optional.
Logs never touch the screen
Diagnostics go to a file. The alternate screen belongs to the interface, so nothing ever prints over a frame.
One binary
No runtime to install, no node_modules. Database migrations are compiled in, so a fresh machine needs only the executable.
It uses the room it has
Give it a wide window and your messages move to the right, theirs stay left. Narrow it and everything returns to one column — right-aligning in a cramped pane costs the text the room it has least of. Your Telegram folders sit above the chat list, and ]f moves between them.
Pictures, not drawings of pictures
Photos and stickers go to the terminal as pixels — the Kitty graphics protocol in kitty, Ghostty and WezTerm; Sixel in foot, GNOME Terminal and Contour. Where a terminal has neither, chafa draws them and O opens the original outside.
More than one conversation
<C-w>\ puts a chat in a new column, <C-w>- stacks one underneath, and <C-w>hjkl moves between them. The panes you are not in stay live and keep their own scroll position — but only the focused one has a composer, so Enter is never ambiguous.
It tells you when there is a newer one
One request a day, and :update installs it — the published checksum is fetched first and has to match, or nothing is written. update_check = false if you would rather it never asked; it is the only request tglow makes to anything other than Telegram.
It does not misrepresent itself
A dropped connection shows, rather than looking like a quiet afternoon. A rate limit says wait 30s and holds the next send back, instead of handing you FLOOD_WAIT_30 and letting the retry extend it. And a launch draws your chats from the local cache in well under a second, rather than a blank terminal for two and a half.
The next unread chat is one key
]u goes to it and opens it, so holding it walks through everything waiting — opening marks a chat read, which is what makes the next press find the next one. [u goes back. Within the folder you are looking at, because that is your own statement of what you are looking at.
Read state that keeps up
A tick becomes two the moment they read you. Read a chat on your phone and the badge here stops counting it — following Telegram's own figure, so a partial read shows what is genuinely left.
Your colours, not its own
Twelve devglow palettes ship. Drop a .toml in ~/.config/tglow/themes/ for your own, and a file there overrides a built-in of the same name. A theme with a typo in it is never applied half-way — tglow says so and draws sage.
Install
Get the binary
From the latest release — tglow-linux-x64, tglow-macos-arm64, tglow-macos-x64 or tglow-windows-x64.exe.
macOS refuses an unsigned download the first time: xattr -d com.apple.quarantine tglow-macos-arm64.
Bring your own API credentials
Get an api_id and api_hash from my.telegram.org, under API development tools. tglow ships no keys: Telegram restricts credentials that appear inside distributed applications, so yours stay yours.
Log in once
It asks for your phone number and the code Telegram sends. The code and any two-factor password are read without echo, so neither is left in your scrollback.
Not yet
Things people reasonably expect, that this version does not do:
- Voice notes and video are shown as what they are, not played. Opening them hands the file to your desktop.
- Animated stickers draw their still frame. Playing them means a Lottie renderer, which is a larger thing than it sounds.
- Themes are chosen in the config file. There is a command line now, but no
:themeon it — switching still needs a restart. - Conversations split into columns and rows, but the layout is not remembered between runs.
- The macOS Intel binary is cross-built and checked only as far as its format and the renderer inside it — GitHub has no Intel macOS runner left to build it on. Linux, Apple silicon and Windows are each built and started on their own operating system now, though nothing in CI draws to a real terminal.
- No arm64 Linux or Windows build yet, though both are one line of the release workflow away.
Elsewhere
- Source and releasesgithub.com/phatnt199/tglow
- Phat Nguyenphatnt.com
- Buy me a coffeeif tglow saved you a trip to the mouse