ChatCrawlersearch across public Telegram Open the app
T

TypeScript Ecosystem

snapshot for January 2026
January 2026 ×
29 January 2026
W
Brb, building a telegram bot framework on top of React
Lol can you imagine? import { Bot, Command, Message, InlineKeyboard, Button, useChat, useState } from 'telegram-react'; function CounterBot() { const [count, setCount] = useState(0); const chat = useChat(); // current chat context return ( <Command name="counter"> <Message> Count: {count} </Message> <InlineKeyboard> <Button onClick={() => setCount(c => c - 1)}>➖</Button> <Button onClick={() => setCount(c => c + 1)}>➕</Button> </InlineKeyboard> </Command> ); } // Multi-step flows become trivial function OnboardingFlow() { const [step, setStep] = useState(0); if (step === 0) return <NamePrompt onComplete={() => setStep(1)} />; if (step === 1) return <EmailPrompt onComplete={() => setStep(2)} />; return <Confirmation />; }
T
GrammY conversations *is* a React-style thing
W
Right now I'm just meming 😂️️️️ it might not be practical, but X will love it
T
Similar with for example a generator
30 January 2026
31 January 2026
S
import React from 'react'; import { render, Route, Router, Root, Text, ButtonGroup, Button, useText } from '@urban-bot/core'; import { UrbanBotTelegram } from '@urban-bot/telegram'; import { UrbanBotSlack } from '@urban-bot/slack'; function Echo() { const [text, setText] = React.useState('Say something'); useText(({ text }) => { setText(text); }); return ( <Text> <i>{text}</i> </Text> ); } function Counter() { const [count, setCount] = React.useState(0); const increment = () => setCount(count + 1); const decrement = () => setCount(count - 1); return ( <ButtonGroup title={count} isNewMessageEveryRender={false}> <Button onClick={increment}>+1</Button> <Button onClick={decrement}>-1</Button> </ButtonGroup> ); } function App() { return ( <Router> <Route path="/echo"> <Echo /> </Route> <Route path="/counter"> <Counter /> </Route> </Router> ); } const urbanBotTelegram = new UrbanBotTelegram({ token: 'telegramToken', }); const urbanBotSlack = new UrbanBotSlack({ signingSecret: 'slackSigningSecret', token: 'slackToken', }); render( <Root bot={urbanBotTelegram}> <App /> </Root> ); render( <Root bot={urbanBotSlack}> <App /> </Root> );
StäfnI think it makes sense to add TSX for formatting individual messages, but not for designing chats
There are just too many edge cases unfortunately. For formatting, it's perfect. But imagine things like this // seems fine <InlineQuery onChange={(text) => setInput(text)} articles={articles} /> // but what does it mean to have two? Runtime error? ugh... <InlineQuery onChange={(text) => setInput(text)} articles={articles} /> // nice <InlineButton callback={someFunc} /> <ReplyButton value="Test" />
Open in Telegram Каталог площадок Искать в ChatCrawler

A snapshot of an open public feed from the search index ChatCrawler — “Google for public Telegram”; refreshed as the venue is crawled. Times are UTC.

Public content only, official Telegram API. About · FAQ · What we do not do · Remove a page · Catalog