DTexter Bot, the main screen

DTexter Bot

Finding a song meant leaving the chat. DTexter finds it from a name or a few seconds of audio, sends the track and fetches the lyrics, all inside Telegram.

Role
Design and engineering
Team
Solo
Period
2022, Go rewrite 2025
Platform
Telegram
Stack, 2022
Python · Postgres
Stack, 2025
Go · Spotify API
Results
7 a page
Status
Offline

Never leave the chat

  1. Find a song from a name or a few seconds of audio.
  2. Send the track and its lyrics as messages.
  3. Answer a repeated request at once, from the cache.

The small things that made it work

  1. 01
    A name in, seven results out

    Type a song and pick from seven results; the arrow brings the next seven.

  2. 02
    The track, as a message

    Tap a result and the song arrives in the chat, from the cache when it was sent before.

  3. 03
    A voice note becomes a song

    A few seconds of audio are enough to find it (2022).

  4. 04
    The words, one tap away

    Lyrics come back as a message under the song (2022).

A name in, seven results out
01A name in, seven results out

Type a song and pick from seven results; the arrow brings the next seven.

The track, as a message
02The track, as a message

Tap a result and the song arrives in the chat, from the cache when it was sent before.

A voice note becomes a song
03A voice note becomes a song

A few seconds of audio are enough to find it (2022).

The words, one tap away
04The words, one tap away

Lyrics come back as a message under the song (2022).

How a request travels

Telegram user
Telegram API
Bot
Spotify API
ACRCloud
Postgres
Telegram user
Telegram API
Bot
Spotify API
ACRCloud
Postgres
Technologies

The 2022 bot was Python with ACRCloud, spotDL and a Postgres cache; the 2025 rewrite is a long-polling Go program on the Spotify Web API.

  • Go
  • Python
  • PostgreSQL
  • Spotify
  • Telegram
Structure
  • dtexrobot/
  • main.go
  • handlers/
  • handlers.go
  • queries/
  • queries.go
  • services/
  • spotify.service.go
  • go.mod
queries.go
// Add pagination controlspaginationRow := []tgbotapi.InlineKeyboardButton{}if page > 0 {  paginationRow = append(paginationRow,    tgbotapi.NewInlineKeyboardButtonData("⬅️", "p_"+search+"_"+strconv.Itoa(page-1)))}if int(results.Tracks.Total) > (page+1)*limit {  paginationRow = append(paginationRow,    tgbotapi.NewInlineKeyboardButtonData("➡️", "p_"+search+"_"+strconv.Itoa(page+1)))}

Who worked on what

Phase
2022 botOfflineGo rewriteScreens
BotMe
RewriteMe
ScreensMe

A good bot hides the pipeline and keeps the conversation moving.

Next project

Nik Tejarat Samin

Nice try

Everything you uncovered is a decoy. The real data was never sent to your browser.