Any Telegram chat, two keystrokes away

A rofi quick-switcher for Telegram Desktop (and forks like AyuGram). Hit a global hotkey from any window, fuzzy-type a few letters, and it jumps straight to that chat, group, channel, contact or forum topicacross all your accounts. It's Discord's Ctrl-K, reimagined for the desktop.

Features

One flat, fuzzy list across every account — with the ranking, folders and topics that make it faster than the client itself.

🔀Every account, one list

Chats, groups, channels and contacts from all your accounts in a single fuzzy list — even contacts you have no open chat with.

Frecency ranking

Your most-used chats float to the top automatically — visit count with a 30-day recency half-life.

🧵Forum topics, flat

Every forum topic is its own searchable row, so you jump straight to a topic on the first keystroke.

📁Chat folders

Each Telegram folder shows as a 📁 Folder ▸ row that expands into that folder's chats.

🗄Archive browsing

Open the archive folder view, or jump straight to a specific archived chat.

Saved Messages

A guaranteed Saved Messages row per account, ranked like any other jump target.

🔎@handle search

Match a peer by display name or its public @username — whichever you remember.

🖼Optional avatars

sync --avatars shows profile photos as row icons. Opt-in — plain sync stays a clean text list.

🧩Any client

Vanilla Telegram Desktop by default, or AyuGram / another TDesktop fork via one client line.

🪟Any window manager

Configurable focuser + key-injector — i3, sway, hyprland; X11 or Wayland (xdotool / ydotool).

🔒Local & private

Your session and chat list live on disk. No server, no cloud, no telemetry — just MTProto and D-Bus.

🚀Global hotkey

Bind telepad to a key in your WM and trigger it from your editor, terminal, browser — anything.

A rofi window titled Jump, with the query 'dur' typed and a fuzzy list of chats across two accounts — the top result selected

Install

A single static Rust binary. You'll need rofi and an app api_id / api_hash from my.telegram.org.

build & set up
git clone https://github.com/antlis/telepad
cd telepad && cargo install --path .

# ~/.config/telepad/config.toml → api creds + accounts
telepad login personal   # interactive, one per account
telepad sync             # cache your chats
# then bind `telepad` to a hotkey in your WM
cargo
cargo install --git https://github.com/antlis/telepad
# (crates.io release coming: cargo install telepad)
rustPlatform.buildRustPackage
telepad = pkgs.rustPlatform.buildRustPackage {
  pname = "telepad";
  version = "0.10.0";
  src = pkgs.fetchFromGitHub {
    owner = "antlis"; repo = "telepad";
    rev = "v0.10.0"; hash = "…";
  };
  cargoHash = "…";
};

Cross-account switching drives the client's own account-switch shortcut with a real keypress (the tg://…&acc= deep-link crashes AyuGram). That needs a focuser + key-injector — defaults i3-msg + xdotool, overridable for any WM. See Configuration in the README.

Usage

Three commands and a handful of config keys — bind telepad to a hotkey and forget the rest.

Commands

telepad menu
open the switcher (bind this to a hotkey) — also the default with no args
telepad login <acct>
interactive MTProto login, one session per account
telepad sync [acct|all]
refresh the cached chat list for one account or all
telepad sync --avatars
also download profile photos to show as row icons

Config keys · config.toml

client
telegram (default) or ayugram — sets the D-Bus name & window class
focus_cmd
focus the client window ({class}) — i3 / sway / hyprctl
inject_cmd
press the switch key ({key}) — xdotool / ydotool
dbus_service
override the client's D-Bus name for other TDesktop forks
accounts[].switch_key
key that switches to this account, e.g. alt+1 — empty = same-account only