-
Notifications
You must be signed in to change notification settings - Fork 7.2k
Description
Feature area
News panels / RSS feeds
Description
A @username input field in the Telegram Intel panel that lets users add any public Telegram channel to a personal watchlist, persisted in localStorage. The user types a username, sees a preview (channel title + member count), then clicks Add. Their saved channels appear as removable pills and their posts render alongside the curated feed.
No user login to Telegram required. The relay's existing authenticated GramJS session already has permission to read any public channel — this only needs two new GET routes on the relay and ~170 lines of frontend/service code.
User flow:
- User types
@ukraine_newsin a new input in the panel - Frontend debounces 800ms → calls
GET /telegram/resolve?username=ukraine_news - Relay resolves via
client.getEntity()→ returns title + member count, cached in Redis 24h - Panel shows: "Ukraine News · 89k members [+ Add]"
- User clicks Add → saved to
localStorageundertelegram:watchlist:v1 - Panel calls
GET /telegram/channel?username=ukraine_news&limit=20 - Relay fetches via
client.getMessages(), cached 60s (same TTL as curated feed) - Posts appear with a removable pill tag
Problem it solves
The Telegram Intel panel is currently locked to the 26 curated OSINT channels hardcoded in the Railway relay.
This is especially limiting for:
- Anyone who wants a specific telegram channel to look from
- Researchers and analysts who follow known channels not in the curated list
- Users outside the Middle East / Ukraine focus who want locally relevant OSINT channels
Alternatives considered
- Telegram Login Widget: only provides user identity, not a channel-reading session. Adds per-user session storage complexity with no benefit since the relay session already covers public channels.
- contacts.search keyword search: possible but Telegram rate-limits this aggressively. Better as a follow-up once username-based lookup is stable.
- Expanding the hardcoded 26: doesn't scale and requires a relay redeploy for every user request.
Additional context
No response