{"id":50692122,"url":"https://github.com/sorokin-vladimir/tele","last_synced_at":"2026-06-26T03:00:42.202Z","repository":{"id":358113460,"uuid":"1233312687","full_name":"sorokin-vladimir/tele","owner":"sorokin-vladimir","description":"Keyboard-first Telegram client for the terminal, written in Go","archived":false,"fork":false,"pushed_at":"2026-06-25T10:17:03.000Z","size":6253,"stargazers_count":108,"open_issues_count":52,"forks_count":13,"subscribers_count":3,"default_branch":"main","last_synced_at":"2026-06-25T12:08:47.822Z","etag":null,"topics":["cli","cross-platform","go","golang","keyboard-driven","linux","macos","messenger","tele","telegram","telegram-client","terminal","terminal-ui","tui","vim-like"],"latest_commit_sha":null,"homepage":"","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/sorokin-vladimir.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":".github/CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":".github/SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-05-08T20:29:19.000Z","updated_at":"2026-06-25T10:17:06.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/sorokin-vladimir/tele","commit_stats":null,"previous_names":["sorokin-vladimir/tele"],"tags_count":63,"template":false,"template_full_name":null,"purl":"pkg:github/sorokin-vladimir/tele","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sorokin-vladimir%2Ftele","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sorokin-vladimir%2Ftele/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sorokin-vladimir%2Ftele/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sorokin-vladimir%2Ftele/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/sorokin-vladimir","download_url":"https://codeload.github.com/sorokin-vladimir/tele/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sorokin-vladimir%2Ftele/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34801014,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-26T02:00:06.560Z","response_time":106,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["cli","cross-platform","go","golang","keyboard-driven","linux","macos","messenger","tele","telegram","telegram-client","terminal","terminal-ui","tui","vim-like"],"created_at":"2026-06-09T04:00:26.013Z","updated_at":"2026-06-26T03:00:42.162Z","avatar_url":"https://github.com/sorokin-vladimir.png","language":"Go","funding_links":[],"categories":["Go"],"sub_categories":[],"readme":"# tele\n\n```\n  _            _\n | |_    ___  | |   ___\n | __|  / _ \\ | |  / _ \\\n | |_  |  __/ | | |  __/\n  \\__|  \\___| |_|  \\___|\n```\n\n\u003e A terminal-native Telegram client built for keyboard-driven workflows.\n\n[![Go](https://img.shields.io/badge/go-1.26+-blue)](https://go.dev)\n[![License](https://img.shields.io/badge/license-GPL--3.0-green)](LICENSE)\n[![Release](https://img.shields.io/github/v/release/sorokin-vladimir/tele)](https://github.com/sorokin-vladimir/tele/releases)\n[![Platform](https://img.shields.io/badge/platform-macOS%20%C2%B7%20Linux%20%C2%B7%20Windows-lightgrey)](#installation)\n\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"#features\"\u003eFeatures\u003c/a\u003e •\n  \u003ca href=\"#installation\"\u003eInstallation\u003c/a\u003e •\n  \u003ca href=\"#why-tele\"\u003eWhy tele?\u003c/a\u003e •\n  \u003ca href=\"#keybindings\"\u003eKeybindings\u003c/a\u003e •\n  \u003ca href=\"#roadmap\"\u003eRoadmap\u003c/a\u003e\n\u003c/p\u003e\n\n---\n\n![tele demo](./assets/demo.gif)\n\n\u003e **Status:** Active development — already usable for daily messaging (private chats, groups, replies, reactions, forwarding, drafts). Some Telegram features are still in progress.\n\n---\n\n## Why tele?\n\nTelegram Desktop, the web client, and mobile apps are designed around mouse-first interaction.\n\nIf you live in the terminal — using tools like Neovim, yazi, k9s, or tmux — switching to a GUI messenger breaks your flow.\n\n`tele` keeps you in the terminal.\n\nIt is built for:\n\n- keyboard-driven navigation\n- fast chat switching\n- SSH / remote workflows\n- distraction-free messaging\n\nIf tools like lazygit feel natural to you, `tele` will too.\n\nIt also runs lean — typically ~35MB RSS at idle vs several hundred MB for desktop clients.\n\n---\n\n| Feature              | tele                    | Telegram Desktop | Web        |\n| -------------------- | ----------------------- | ---------------- | ---------- |\n| Terminal-native      | ✅                      | ❌               | ❌         |\n| Keyboard-first       | ✅                      | ⚠️ partial       | ⚠️ partial |\n| Works over SSH       | ✅                      | ❌               | ❌         |\n| Single static binary | ✅                      | ❌               | ❌         |\n| Full media support   | ⚠️ photos, voice, video | ✅               | ✅         |\n| Voice/video calls    | ❌ out of scope¹        | ✅               | ✅         |\n| Record voice / круж. | ❌ out of scope¹        | ✅               | ✅         |\n\n\u003e ¹ **Architectural constraint.** `tele` is a terminal-native, cgo-free client\n\u003e with no access to a microphone or camera capture stack. Recording voice\n\u003e messages or round videos (кружки) — and real-time voice/video calls — fall\n\u003e outside that design and are not planned. You can still **send** an\n\u003e already-recorded audio or video file from disk (see [attaching media](#keybindings)).\n\n---\n\n## Features\n\n### ⚡ Keyboard-first UX\n\nVim-inspired navigation (`j/k`, `gg/G`, insert mode, etc.), plus a movable\nper-message cursor (`ctrl+j/k`) that steps bubble-by-bubble, stays centered as\nthe chat scrolls, and is the target for the context menu and per-message actions.\n\n### 💬 Full Telegram support\n\nPrivate chats, groups, channels, replies, reactions, edits, forwarding, and\nper-chat drafts synced with Telegram (saved on the server, shared across devices).\n\n### 🎞 Rich media in the terminal\n\n- **Photos** — rendered inline in high quality via the Kitty graphics protocol, with an ANSI block-art fallback; press `o` to open in an external viewer.\n- **Voice messages** — amplitude waveform with duration, and **in-app playback** (`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).\n- **Video \u0026 round video (кружки)** — inline thumbnail preview with a `▶` / duration overlay (round notes shown as a circle); press `o` to play in the system player.\n- **GIFs** — inline static thumbnail with a `GIF` badge; the selected GIF loops silently in place (Kitty graphics mode). Requires `ffmpeg` — see below.\n- **Audio (music)** — performer / title / duration; other media types show a labelled placeholder.\n\n**Sending media** — attach an existing file from disk with `u` (photos, videos,\nvoice notes, music, documents) and confirm the send-as type before sending.\n\n\u003e **Recording is out of scope.** `tele` can _send_ a pre-recorded audio or video\n\u003e file, but it cannot **record** voice messages or round videos (кружки) in-app:\n\u003e as a terminal-native, cgo-free client it has no microphone or camera capture\n\u003e stack. This is an architectural boundary, not a missing feature on the roadmap.\n\n\u003e **Optional dependency — `ffmpeg`:** install `ffmpeg` (with `ffprobe`) on your `PATH` to 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).\n\n### 🧠 Terminal-native design\n\nBuilt specifically for terminal workflows — not adapted from a GUI client.\n\n### 🚀 Lightweight by design\n\nSingle static Go binary with fast startup and low memory usage.\n\n### ⚙ Simple configuration\n\nYAML-based config with sensible defaults.\n\n---\n\n## Installation\n\n### macOS / Linux — Homebrew\n\n```sh\nbrew tap sorokin-vladimir/tap\nbrew install tele\n```\n\n### Linux — binary\n\n```sh\ncurl -sL https://github.com/sorokin-vladimir/tele/releases/latest/download/tele-linux-amd64 \\\n  -o ~/.local/bin/tele \u0026\u0026 chmod +x ~/.local/bin/tele\n```\n\nFor arm64: replace `amd64` with `arm64`.\n\n### Windows — binary\n\nDownload the executable with PowerShell (run as your normal user):\n\n```powershell\n$dir = \"$Env:LOCALAPPDATA\\Programs\\tele\"\nNew-Item -ItemType Directory -Force -Path $dir | Out-Null\nInvoke-WebRequest `\n  -Uri \"https://github.com/sorokin-vladimir/tele/releases/latest/download/tele-windows-amd64.exe\" `\n  -OutFile \"$dir\\tele.exe\"\n```\n\nFor arm64: replace `amd64` with `arm64`. Add `$dir` to your `PATH` (or run\n`tele.exe` by full path), then launch it from a terminal that supports the Kitty\ngraphics protocol — e.g. [WezTerm](https://wezterm.org) — for inline images.\nA plain console (cmd.exe / classic conhost) falls back to ANSI block-art photos.\n\n\u003e Prefer a packaged install? A `.zip` containing `tele.exe`\n\u003e (`tele_windows_amd64.zip`) is attached to every [release](https://github.com/sorokin-vladimir/tele/releases/latest).\n\n---\n\n## First launch\n\n```sh\ntele\n```\n\nOn first run, `tele` creates:\n\n```text\n~/.config/tele/config.yml\n```\n\nThen prompts for:\n\n- phone number\n- SMS code\n- optional 2FA password\n\n---\n\n## Flags\n\n| Flag              | Description                                                                                    |\n| ----------------- | ---------------------------------------------------------------------------------------------- |\n| `--config \u003cpath\u003e` | Path to config file (default `~/.config/tele/config.yml`)                                      |\n| `-e`              | Enable debug logging                                                                           |\n| `--trace`         | Log sensitive metadata (peer IDs, message lengths). Never use on shared or synced file systems |\n| `--version`       | Print version and exit                                                                         |\n\n---\n\n## Keybindings\n\n| Key                 | Action                                          |\n| ------------------- | ----------------------------------------------- |\n| `j` / `k`           | Navigate chats or scroll messages               |\n| `ctrl+j` / `ctrl+k` | Select next / previous message                  |\n| `i`                 | Compose message                                 |\n| `r`                 | Reply                                           |\n| `e` / `d`           | Edit / delete message                           |\n| `t`                 | React                                           |\n| `f`                 | Forward message                                 |\n| `u`                 | Attach a file to send                           |\n| `o`                 | Open / view media (photo in viewer, video inline) |\n| `O`                 | Open video in the external player               |\n| `p`                 | Play voice message in-app                       |\n| `s`                 | Download the selected file                      |\n| `/`                 | Search chats                                     |\n| `space`             | Message context menu                            |\n| `0` / `1` / `2`     | Focus panes                                     |\n| `q`                 | Quit                                            |\n\nFull reference: [docs/keybindings.md](docs/keybindings.md)\n\n---\n\n## Configuration\n\n```yaml\ntelegram:\n  session_file: ~/.config/tele/session.json\n\nui:\n  history_limit: 50 # messages fetched per chat on open\n\nphotos:\n  mode: auto # auto | kitty | blocks — inline image renderer\n  eager_full_quality: true # download full resolution in the background on chat open\n  kitty_placement_cap: 16 # max inline images kept on the terminal at once\n  max_long_side_px: 800 # cap a rendered image's long side; height also ≤ 2/3 pane\n\n# keybindings: see \"Customizing keybindings\" below\n```\n\n\u003e **`kitty_placement_cap`** bounds how many Kitty image placements are live on\n\u003e the terminal simultaneously. Only on-screen images (plus a few recently\n\u003e scrolled-past) are transmitted; older ones are evicted. Transmitting an entire\n\u003e heavy chat at once can exceed the terminal's image limit and corrupt\n\u003e placements (shrunken/shifted photos) — lower the cap if you still see that.\n\n\u003e **`max_long_side_px`** caps a rendered inline image's long side in pixels\n\u003e (mirrors the desktop clients' fixed media size). The height is additionally\n\u003e bounded to 2/3 of the chat pane so a tall photo never dominates the view.\n\u003e Raise it for larger inline images, lower it for more compact ones.\n\n### Customizing keybindings\n\nOverride default keys in the `keybindings:` section of `~/.config/tele/config.yml`.\nThe generated config already lists **every action with its current default keys**,\ncommented out — just uncomment a line and change the key(s). Bindings are grouped\nby **context**, then by **action**:\n\n```yaml\nkeybindings:\n  chat:\n    reply: \"R\" # a single key\n    go_top: [\"g g\", \"gg\"] # several keys for one action\n  chatlist:\n    confirm: \"l\"\n```\n\n- **Replace semantics:** the keys you list become the _only_ keys for that\n  action in that context. Actions you don't mention keep their defaults.\n- **Chords:** a multi-key sequence is written as space-separated key tokens —\n  `\"g g\"` means press `g` then `g`. Tokens use the terminal key names\n  (`ctrl+d`, `enter`, `esc`, `space`, `up`, ...).\n- **Conflicts** (an unknown action/context, an empty key, a key reused for two\n  actions, or a single key that shadows a chord) are logged as warnings on\n  startup and skipped or applied last-wins; a bad section never crashes the app.\n\n**Contexts:** `global`, `folders`, `chatlist`, `chat`, `composer`, `search`,\n`context_menu`, `delete_submenu`, `chat_menu`, `folder_submenu`, `filepicker`.\n\nSee [docs/keybindings.md](docs/keybindings.md#configurable-actions) for the full\nlist of action names and what each one does.\n\n---\n\n## Roadmap\n\nPlanned work lives on the public [**project board**](https://github.com/users/sorokin-vladimir/projects/2),\ngrouped into release [milestones](https://github.com/sorokin-vladimir/tele/milestones).\n\n| Release   | Focus                                                                                                       |\n| --------- | ----------------------------------------------------------------------------------------------------------- |\n| `v1.7.0`  | Input \u0026 navigation polish — extended markdown, word-wise composer motions, mouse support, native Linux packages, search-to-create chats |\n| `v1.8.0`  | Notifications \u0026 messaging UX — toast banners, in-app alerts for inactive chats, `@mentions`, own-message alert suppression |\n| `Backlog` | Power-user polish — themes, vim motions, command palette, full-text search                                  |\n\nWork is also categorized by theme (Security \u0026 Reliability, Architecture \u0026 Performance,\nFeature Completeness, Power User \u0026 Polish) via the board's **Theme** field.\n\n---\n\n## Build from source\n\nRequires Go 1.26+ and your own [Telegram API credentials](https://my.telegram.org).\n\n```sh\ngit clone https://github.com/sorokin-vladimir/tele\ncd tele\ngo build \\\n  -ldflags \"-X main.buildAPIID=YOUR_API_ID -X main.buildAPIHash=YOUR_API_HASH\" \\\n  -o tele ./cmd/tele/\n```\n\n---\n\n## License\n\nGPL-3.0 — free to use and fork; derivative works must remain open-source.\n\n---\n\nBuilt with:\n\n- [gotd/td](https://github.com/gotd/td)\n- [bubbletea](https://github.com/charmbracelet/bubbletea)\n- [lipgloss](https://github.com/charmbracelet/lipgloss)\n- inspired by [lazygit](https://github.com/jesseduffield/lazygit)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsorokin-vladimir%2Ftele","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fsorokin-vladimir%2Ftele","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsorokin-vladimir%2Ftele/lists"}