Telegram terminal client.
To use tg, you'll need to have the following installed:
terminal-notifier
- for Mac (used by default). You can change it to dunst for Linux or any
other notifications program (see NOTIFY_CMD
in
configuration)
ffmpeg - to record voice msgs and upload videos.
tdlib - in case of incompatibility with built in package. For example, macOS:
brew install tdlib
and then set in config TDLIB_PATH
urlview
to choose urls when there is multiple in
message, use URL_VIEW
in config file to use another app (it
should accept urls in stdin)
to open stickers
and animated
ones
(thumbnail preview) you need to set in mailcap appropriate handler and
have app which will open webp
file:
image/webp; mpv %s
ranger, nnn - can be used to choose file
when sending, customizable with FILE_PICKER_CMD
fzf - to create groups and secret chats (used for single and multiple user selection)
This option is recommended for production:
pip3 install tg
tg
brew tap paul-nameless/homebrew-repo
brew install tg
This option is recommended for development:
git clone https://github.com/paul-nameless/tg.git
cd tg
pip install python-telegram
pip install .
tg
Note that voice recordings and notifications won't work when using Docker.
docker run -it --rm ghcr.io/paul-nameless/tg
If you're using Arch Linux, you can install tg through its AUR package:
If you're using the yay
AUR helper, you can install the
package with:
yay -S telegram-tg
If you want to use the latest developement version via the AUR you can find it here
Config file should be stored at ~/.config/tg/conf.py
.
This is simple python file.
# should start with + (plus) and contain country code
= "[phone number in international format]" PHONE
All configurable variables can be found here
import os
# You can write anything you want here, file will be executed at start time
# You can keep you sensitive information in password managers or gpg
# encrypted files for example
def get_pass(key):
# retrieves key from password store
return os.popen("pass show {} | head -n 1".format(key)).read().strip()
= get_pass("i/telegram-phone")
PHONE # encrypt you local tdlib database with the key
= get_pass("i/telegram-enc-key")
ENC_KEY
# log level for debugging, info by default
= "DEBUG"
LOG_LEVEL # path where logs will be stored (all.log and error.log)
= os.path.expanduser("~/.local/share/tg/")
LOG_PATH
# If you have problems with tdlib shipped with the client, you can install and
# use your own, for example:
= "/usr/local/Cellar/tdlib/1.6.0/lib/libtdjson.dylib"
TDLIB_PATH
# you can use any other notification cmd, it is simple python string which
# can format title, msg, subtitle and icon_path paramters
# In these exapmle, kitty terminal is used and when notification is pressed
# it will focus on the tab of running tg
= "/usr/local/bin/terminal-notifier -title {title} -subtitle {subtitle} -message {msg} -appIcon {icon_path} -sound default -execute '/Applications/kitty.app/Contents/MacOS/kitty @ --to unix:/tmp/kitty focus-tab --no-response -m title:tg'"
NOTIFY_CMD
# You can use your own voice recording cmd but it's better to use default one.
# The voice note must be encoded with the Opus codec, and stored inside an OGG
# container. Voice notes can have only a single audio channel.
= "ffmpeg -f avfoundation -i ':0' -c:a libopus -b:a 32k {file_path}"
VOICE_RECORD_CMD
# You can customize chat and msg flags however you want.
# By default words will be used for readability, but you can make
# it as simple as one letter flags like in mutt or add emojies
= {
CHAT_FLAGS "online": "●",
"pinned": "P",
"muted": "M",
# chat is marked as unread
"unread": "U",
# last msg haven't been seen by recipient
"unseen": "✓",
"secret": "🔒",
"seen": "✓✓", # leave empty if you don't want to see it
}= {
MSG_FLAGS "selected": "*",
"forwarded": "F",
"new": "N",
"unseen": "U",
"edited": "E",
"pending": "...",
"failed": "💩",
"seen": "✓✓", # leave empty if you don't want to see it
}
# use this app to open url when there are multiple
= 'urlview'
URL_VIEW
# Specifies range of colors to use for drawing users with
# different colors
# this one uses base 16 colors which should look good by default
= tuple(range(2, 16))
USERS_COLORS
# to use 256 colors, set range appropriately
# though 233 looks better, because last colors are black and gray
# USERS_COLORS = tuple(range(233))
# to make one color for all users
# USERS_COLORS = (4,)
# cleanup cache
# Values: N days, None (never)
= 7
KEEP_MEDIA
= "ranger --choosefile={file_path}"
FILE_PICKER_CMD # FILE_PICKER_CMD = "nnn -p {file_path}"
= os.path.expanduser("~/.config/mailcap")
MAILCAP_FILE
= os.path.expanduser("~/Downloads/") # copy file to this dir DOWNLOAD_DIR
Mailcap file is used for deciding how to open telegram files (docs,
pics, voice notes, etc.). Path to the file can be overriden with
MAILCAP_FILE
in config file.
Example: ~/.mailcap
# media
video/*; mpv "%s"
audio/ogg; mpv --speed=1.33 "%s"
audio/mpeg; mpv --no-video "%s"
image/*; qview "%s"
# text
text/html; w3m "%s"
text/html; open -a Firefox "%s"
text/plain; less "%s"
# fallback to vim
text/*; vim "%s"
vi like keybindings are used in the project. Can be used commands
like 4j
- 4 lines down.
For navigation arrow keys also can be used.
j,k
: move up/downJ,K
: move 10 chats up/downg
: go to top chatl
: open msgs of the chatm
: mute/unmute current chatp
: pin/unpin current chatu
: mark read/unreadr
: read current chatc
: show list of contactsdd
: delete chat or remove historyng
: create new group chatns
: create new secret chat/
: search in chats?
: show helpj,k
: move up/down
J,K
: move 10 msgs up/down
G
: move to the last msg (at the bottom)
D
: download file
l
: if video, pics or audio then open app specified
in mailcap file, for example:
# Images
image/png; qView "%s"
audio/*; mpv "%s"
if text, open in less
(to view multiline msgs)
e
: edit current msg
<space>
: select msg and jump one msg down (use
for deletion or forwarding)
<ctrl+space>
: same as space but jumps one msg
up
y
: yank (copy) selected msgs with
p
: forward (paste) yanked (copied) msgs to current
chat
dd
: delete msg for everybody (multiple messages will
be deleted if selected)
i or a
: insert mode, type new message
I or A
: open vim to write long msg and send
v
: record and send voice message
r,R
: reply to a current msg
S
: calls a file picker
sv
: send video
sa
: send audio
sp
: send picture
sd
: send document
o
: open url present in message (if multiple urls,
urlview
will be opened)
]
: next chat
[
: prev chat
u
: show user info (username, bio, phone,
etc.)
c
: show chat info (e.g. secret chat encryption key,
chat id, state, etc.)
?
: show help
!
: open msg with custom cmd
Run script to automatically increase version and release
./do release