React bots are bots that use React for generating UI (images, PDF, HTML).
System design context: React's SSR (Server-Side Rendering) capability makes it surprisingly useful for generating static images and HTML. Instead of using canvas libraries or template engines, you can render React components to HTML strings and then convert them to images using Puppeteer. This is the approach used by services like OG Image generators and certificate builders.
1. Telegram Bot with React components:
1// Using react-telegram-web-app2import WebApp from "@twa-dev/sdk";34function BotApp() {5 const [score, setScore] = useState(0);67 const handleBuy = () => {8 WebApp.showConfirm("Buy points?", (confirmed) => {9 if (confirmed) setScore(s => s + 100);10 });11 };1213 return (14 <div>15 <h1>Score: {score}</h1>16 <button onClick={handleBuy}>Buy</button>17 </div>18 );19}
2. Image generation through React (SSR):
1// Server code: render React to HTML → screenshot2import { renderToString } from "react-dom/server";3import puppeteer from "puppeteer";45async function generateImage(data) {6 const html = renderToString(<Certificate data={data} />);7 const browser = await puppeteer.launch();8 const page = await browser.newPage();9 await page.setContent(html);10 const image = await page.screenshot({ type: "png" });11 await browser.close();12 return image;13}
3. Discord Bot with React:
1// Server side: using discord.js2import { Client, EmbedBuilder } from "discord.js";34const client = new Client({ intents: ["Guilds", "GuildMessages"] });56client.on("messageCreate", async (message) => {7 if (message.content === "!profile") {8 const embed = new EmbedBuilder()9 .setTitle("Profile")10 .setDescription(`${message.author.username}`)11 .setColor(0x00FF00);12 await message.reply({ embeds: [embed] });13 }14});
How the image generation pipeline works:
!certificate John).renderToString() converts the React tree to an HTML string.Common pitfalls:
Using React in bots is useful for: