Telegram Mini App Dev

v1.0.1

Build Telegram Mini Apps without the pain. Includes solutions for safe areas, fullscreen mode, BackButton handlers, sharing with inline mode, position:fixed issues, and React gotchas. Use when building or debugging Telegram Mini Apps, or when encountering issues with WebApp API, safe areas, or sharing.

1· 2.3k· 2 versions· 3 current· 4 all-time· Updated 12h ago· MIT-0

Install

openclaw skills install tg-miniapp

Telegram Mini App Development

Battle-tested solutions for common Telegram Mini App issues.

Quick Reference

Safe Area (Fullscreen Mode)

// Use reactive hook - values are async and context-dependent
const safeArea = useSafeAreaInset(); // from references/hooks.ts
<div style={{ paddingTop: safeArea.top }}>Header</div>

position:fixed Broken

Telegram applies transform to container. Use createPortal:

import { createPortal } from 'react-dom';
createPortal(<Modal />, document.body);

BackButton Not Firing

Use @telegram-apps/sdk, not raw WebApp:

import { onBackButtonClick, showBackButton } from '@telegram-apps/sdk';
onBackButtonClick(handleBack);

Sharing with Inline Mode

  1. Enable inline mode: @BotFather → /setinline → select bot
  2. Backend calls savePreparedInlineMessage → returns prepared_message_id
  3. Frontend calls WebApp.shareMessage(prepared_message_id)

Note: prepared_message_id is single-use — prepare fresh for each share tap. For static content, consider caching images on R2/CDN and preparing per-tap.

React "0" Rendering

// WRONG: renders literal "0"
{count && <span>{count}</span>}

// CORRECT
{count > 0 && <span>{count}</span>}

Detailed Guides

Testing Checklist

Before shipping, test:

  • Open from folder (chat list)
  • Open from direct bot chat
  • iOS device
  • Android device
  • Share flow (tap → dismiss → tap again)
  • Share to different chat types (user, group, channel)
  • Back button
  • Scroll with sticky header

Version tags

botvk974np8et61j22epsqpndc6tq980c5xwcloudflare-workersvk974np8et61j22epsqpndc6tq980c5xwfullscreenvk974np8et61j22epsqpndc6tq980c5xwinline-modevk974np8et61j22epsqpndc6tq980c5xwlatestvk974np8et61j22epsqpndc6tq980c5xwmini-appvk974np8et61j22epsqpndc6tq980c5xwreactvk974np8et61j22epsqpndc6tq980c5xwresvgvk974np8et61j22epsqpndc6tq980c5xwsafe-areavk974np8et61j22epsqpndc6tq980c5xwshare-cardsvk974np8et61j22epsqpndc6tq980c5xwsharingvk974np8et61j22epsqpndc6tq980c5xwtelegramvk974np8et61j22epsqpndc6tq980c5xwtmavk974np8et61j22epsqpndc6tq980c5xwwebappsvk974np8et61j22epsqpndc6tq980c5xw