
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
- Find a song from a name or a few seconds of audio.
- Send the track and its lyrics as messages.
- Answer a repeated request at once, from the cache.

The small things that made it work
- 01A name in, seven results out
Type a song and pick from seven results; the arrow brings the next seven.
- 02The track, as a message
Tap a result and the song arrives in the chat, from the cache when it was sent before.
- 03A voice note becomes a song
A few seconds of audio are enough to find it (2022).
- 04The words, one tap away
Lyrics come back as a message under the song (2022).

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

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

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

Lyrics come back as a message under the song (2022).
How a request travels
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
- dtexrobot/
- main.go
- handlers/
- handlers.go
- queries/
- queries.go
- services/
- spotify.service.go
- go.mod
// 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
A good bot hides the pipeline and keeps the conversation moving.
