Loading repository data…
Loading repository data…
sorokin-vladimir / repository
Keyboard-first Telegram client for the terminal, written in Go
_ _
| |_ ___ | | ___
| __| / _ \ | | / _ \
| |_ | __/ | | | __/
\__| \___| |_| \___|
A terminal-native Telegram client built for keyboard-driven workflows.
Status: Active development — already usable for daily messaging (private chats, groups, replies, reactions, forwarding, drafts). Some Telegram features are still in progress.
Telegram Desktop, the web client, and mobile apps are designed around mouse-first interaction.
If you live in the terminal — using tools like Neovim, yazi, k9s, or tmux — switching to a GUI messenger breaks your flow.
tele keeps you in the terminal.
It is built for:
If tools like lazygit feel natural to you, tele will too.
It also runs lean — typically ~35MB RSS at idle vs several hundred MB for desktop clients.
| Feature | tele | Telegram Desktop | Web |
|---|---|---|---|
| Terminal-native | ✅ | ❌ | ❌ |
| Keyboard-first | ✅ | ⚠️ partial | ⚠️ partial |
| Works over SSH | ✅ | ❌ | ❌ |
| Single static binary | ✅ | ❌ | ❌ |
| Full media support | ⚠️ photos, voice, video | ✅ | ✅ |
| Voice/video calls | ❌ out of scope¹ | ✅ | ✅ |
| Record voice / круж. | ❌ out of scope¹ | ✅ | ✅ |
¹ Architectural constraint.
teleis a terminal-native, cgo-free client with no access to a microphone or camera capture stack. Recording voice messages or round videos (кружки) — and real-time voice/video calls — fall outside that design and are not planned. You can still send an already-recorded audio or video file from disk (see attaching media).
Vim-inspired navigation (j/k, gg/G, insert mode, etc.), plus a movable
per-message cursor (ctrl+j/k) that steps bubble-by-bubble, stays centered as
the chat scrolls, and is the target for the context menu and per-message actions.
Optional mouse support on the main screen: click a chat to open it, click a pane to focus it, click into the composer to start typing, and scroll the chat list or message view with the wheel.
Private chats, groups, channels, replies, reactions, edits, forwarding, and per-chat drafts synced with Telegram (saved on the server, shared across devices).
o to open the full-quality image in an in-app modal viewer (sender and timestamp on the border), or O to open it in an external viewer.p) with an animated playhead. Fully cgo-free on every platform: Opus/Ogg is decoded in pure Go, and audio goes out via oto (macOS/Windows) or the PulseAudio/PipeWire protocol (Linux). On Linux this needs a running PulseAudio or PipeWire server (the desktop default).▶ / duration overlay (round notes shown as a circle); press o to play in the system player.GIF badge; the selected GIF loops silently in place (Kitty graphics mode). Requires ffmpeg — see below.Sending media — attach an existing file from disk with u (photos, videos,
voice notes, music, documents) and confirm the send-as type before sending.
Recording is out of scope.
telecan send a pre-recorded audio or video file, but it cannot record voice messages or round videos (кружки) in-app: as a terminal-native, cgo-free client it has no microphone or camera capture stack. This is an architectural boundary, not a missing feature on the roadmap.
Optional dependency —
ffmpeg: installffmpeg(withffprobe) on yourPATHto enable inline GIF playback (decoding frames) and to attach duration/dimensions/thumbnail metadata when sending videos. It is entirely optional: without it, GIFs stay static and videos still send (Telegram generates the preview server-side).
Built specifically for terminal workflows — not adapted from a GUI client.
Single static Go binary with fast startup and low memory usage.
YAML-based config with sensible defaults.
brew tap sorokin-vladimir/tap
brew trust sorokin-vladimir/tap
brew install tele
Want the latest merged changes ahead of the weekly stable release? Install the
beta package from the same tap. It ships as a separate tele-beta binary with
its own config and state (~/.config/tele-beta), so it lives alongside a stable
install:
brew tap sorokin-vladimir/tap
brew trust sorokin-vladimir/tap
brew install tele-beta
brew upgrade tele-beta # pull newer betas as they are cut
Beta builds come from prerelease tags (vX.Y.Z-beta.N) and are published as
GitHub prereleases, so they never show up as the "latest" release. Run it with
tele-beta.
curl -sL https://github.com/sorokin-vladimir/tele/releases/latest/download/tele-linux-amd64 \
-o ~/.local/bin/tele && chmod +x ~/.local/bin/tele
For arm64: replace amd64 with arm64.
echo 'deb [trusted=yes] https://apt.fury.io/sorokin-vladimir/ /' \
| sudo tee /etc/apt/sources.list.d/tele.list
sudo apt update && sudo apt install tele
sudo tee /etc/yum.repos.d/tele.repo <<'EOF'
[tele]
name=tele
baseurl=https://yum.fury.io/sorokin-vladimir/
enabled=1
gpgcheck=0
EOF
sudo dnf install tele # or: sudo zypper install tele
echo 'https://alpine.fury.io/sorokin-vladimir/' | sudo tee -a /etc/apk/repositories
sudo apk add --allow-untrusted tele
yay -S tele-bin # or: paru -S tele-bin
sudo snap install tele
Prefer a raw package? Signed
.deband.rpmfiles are also attached to every release.
Download the executable with PowerShell (run as your normal user):
$dir = "$Env:LOCALAPPDATA\Programs\tele"
New-Item -ItemType Directory -Force -Path $dir | Out-Null
Invoke-WebRequest `
-Uri "https://github.com/sorokin-vladimir/tele/releases/latest/download/tele-windows-amd64.exe" `
-OutFile "$dir\tele.exe"
For arm64: replace amd64 with arm64. Add $dir to your PATH (or run
tele.exe by full path), then launch it from a terminal that supports the Kitty
graphics protocol — e.g. WezTerm — for inline images.
A plain console (cmd.exe / classic conhost) falls back to ANSI block-art photos.
Prefer a packaged install? A
.zipcontainingtele.exe(tele_windows_amd64.zip) is attached to every release.
Prefer a package manager? Install with Scoop or winget:
scoop bucket add tele https://github.com/sorokin-vladimir/scoop-tele scoop install tele # or winget install sorokin-vladimir.tele
tele ships a flake. Try it without installing anything:
nix run github:sorokin-vladimir/tele
Or install it into your profile:
nix profile install github:sorokin-vladimir/tele
To pull it in as an input of your own flake (e.g. a NixOS configuration):
{
inputs = {
nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
tele = {
url = "github:sorokin-vladimir/tele";
inputs.nixpkgs.follows = "nixpkgs";
};
};
}
Then, in your configuration:
environment.systemPackages = [
inputs.tele.packages.${pkgs.system}.default
];
A nix develop shell is also available in the repo for local development (go,
golangci-lint, lefthook).
tele
On first run, tele creates:
~/.config/tele/config.yml
Then prompts for:
| Flag | Description |
|---|---|
--config <path> | Path to config file (default ~/.config/tele/config.yml) |
-e | Enable debug logging |
--trace | Log sensitive metadata (peer IDs, message lengths). Never use on shared or synced file systems |
--version | Print version and exit |
| Key | Action |
|---|---|
j / k | Navigate chats or scroll messages |
ctrl+j / ctrl+k | Select next / previous message |
i | Compose message |
r | Reply |
e / d | Edit / delete message |
t | React |
f | Forward message |
u | Attach a file to send |
o | Open / view media (photo in viewer, video inline) |
O | Open video in the external player |
p | Play voice message in-app |
s | Download the selected file |
/ | Search chats |
space | Message context menu |
0 / 1 / 2 | Focus panes |
q | Quit |
Full reference: [docs/keyb