buzz-bot
Version, currently main branch1 version
- main branchlatestJun 9, 2026
github.com/watchcat/buzz-bot
Telegram podcast Mini App — Crystal/Kemal/Tourmaline + Neon PostgreSQL
Installation
# Add this to your shard.yml
dependencies:
buzz-bot:
github: watchcat/buzz-bot
branch: mainmain is a branch, not a release, so this tracks it rather than pinning a version.
Then run:
shards installshard.yml
- Crystal
>= 1.6.0- Target
buzz-botfrom src/buzz_bot.cr
Dependencies
Runtime Dependencies
- db*github: crystal-lang/crystal-db
- pg*github: will/crystal-pg
- kemal*github: kemalcr/kemal
- dotenv*github: drum445/dotenv
- tourmaline*github: protoncr/tourmaline
README
Buzz-Bot
Podcast player for the AI epoch.
Listen to any podcast, then tap one button and hear it in your language — same voices, different words.
Buzz-Bot runs inside Telegram as a Mini App and uses a cloud GPU pipeline (RunPod Serverless) to transcribe, translate, and re-synthesize every speaker's voice.
To view AI pipeline for podcast dubbing workflow check this repository
Features
| Feature | Description |
|---|---|
| RSS subscriptions | Add any podcast by RSS URL; bulk-import via OPML |
| Podcast search | Search Apple Podcasts directory and subscribe in one tap |
| Episode inbox | Unified feed of unheard episodes across all subscriptions, with "hide listened" and compact grouping filters |
| Episode player | Native audio playback inside Telegram with resume-from-position, variable speed (1x/1.5x/2x), skip, and a persistent mini-player |
| Autoplay | Automatically advance to the next episode when one finishes |
| Progress tracking | Listening position saved every 5 seconds; offline saves queued and replayed on reconnect |
| Offline caching | Episode audio downloaded in background; seamless switch to local copy on network loss |
| Bookmarks | Bookmark episodes with a single tap; search saved episodes |
| Semantic search | Search your inbox by meaning — episodes re-ranked by vector similarity to your query — details |
| Topic cloud | Browse episodes by auto-extracted topics, clustered nightly across languages (EN/RU/NL) so synonyms collapse into one tag; tap a tag to filter your library — details |
| Smart recommendations | Hybrid semantic + collaborative filtering with explainable topic matching — details |
| Share & send | Share any episode via Telegram's share sheet, or send the audio file directly to your own chat |
| AI dubbing | Hear any podcast in your language with the original speaker's voice cloned — details |
| Karaoke subtitles | Live subtitle panel with karaoke-style highlighting; fullscreen transcript; tap any line to seek |
Tech Stack
| Layer | Technology |
|---|---|
| Language | Crystal >= 1.9 |
| Web server | Kemal |
| Telegram bot | Tourmaline |
| Database | PostgreSQL (Neon) via crystal-pg, pgvector for embeddings |
| Frontend | ClojureScript, re-frame, Reagent |
| Frontend build | shadow-cljs |
| Service Worker | Offline audio cache (Range-aware) + offline write queue |
| Job dispatch | RunPod Serverless API v2 |
| AI pipeline | Demucs, WhisperX, pyannote, Gemini Flash, VoxCPM2 — details |
| Embeddings | BGE-M3 (1024-dim, multilingual) + KeyBERT topic extraction — details |
| Audio storage | Cloudflare R2 |
| Deployment | Docker, k3s on Hetzner — details |
| Ingress / TLS | Traefik v3, cert-manager + Let's Encrypt |
Quick Start
Prerequisites
- Crystal >= 1.9 +
shards - Node.js >= 18 + npm
- Docker
- PostgreSQL (Neon free tier works)
- Telegram bot token from @BotFather
- Public HTTPS URL for webhooks
1. Clone and install dependencies
git clone https://github.com/yourname/buzz-bot.git
cd buzz-bot
shards install
npm install
2. Configure environment
cp k8s/secret.example.yaml k8s/secret.yaml
# Fill in all values — see docs/DEPLOYMENT.md for variable reference
3. Run migrations
for f in migrations/*.sql; do psql "$DATABASE_URL" -f "$f"; done
4. Build frontend
# Development (live reload)
npx shadow-cljs watch app
# Production
npx shadow-cljs release app
5. Run locally
crystal run src/buzz_bot.cr
Use Cloudflare Tunnel to expose localhost over HTTPS for Telegram webhooks:
# Terminal 1 — ClojureScript watch build
npx shadow-cljs watch app
# Terminal 2 — tunnel + Crystal server
./devrun.sh # auto-detects named tunnel or quick tunnel
./devrun.sh --quick # temporary URL, no account needed
Documentation
- AI Dubbing Pipeline — how dubbing works, supported languages, progress tracking
- Recommendations — hybrid vector + collaborative filtering, topic extraction & clustering, explainability
- Deployment Guide — k3s setup, environment variables, monitoring
- API Reference — routes, database schema, feature flags
License
MIT
Documentation
Built from the current release. The first visit to a release nobody has asked for starts its build.
Links
This branch
- Branch
main- Seen
- Jun 9, 2026
- Crystal
>= 1.6.0- Indexed
- yes
Dependents
No indexed shard depends on this one yet.
Repository
github.com/watchcat/buzz-bot
Metadata
- Created
- Aug 12, 2026
- Updated
- Sep 26, 2026
- Synced
- Sep 26, 2026
- Versions
- 1