Skip to main content
T TON Adoption
News TOOLSET · 2026

AppKit: the SDK for Mini Apps and dApps on TON in 2026

@ton/appkit — the official SDK for TON frontend dev: TON Connect, typed transactions, React components, DNS, DEX quotes, staking. What's inside and how to use it.

Author
TON Adoption Team · editorial
Published
3 min read

AppKit is the new frontend SDK from TON Foundation, published as part of TON Toolset in 2026. It replaces the fragmented tonweb / ton-core / tonconnect-sdk stack with a unified high-level API for Mini App and dApp development.

Let’s break down what’s inside, how it simplifies the work, and where to start.

What’s in AppKit

The base @ton/appkit package contains:

  • TON Connect for wallet connection (the original tonconnect-sdk under the hood).
  • Typed transaction builders — TypeScript-typed constructors instead of raw cells.
  • Asset reads — TON and jetton balances in one line.
  • DNS resolution.ton/.t.me addresses → canonical addresses.
  • DEX quotesSTON.fi/DeDust quotes right from the SDK, no separate calls.
  • Staking helpers — deposit/withdraw to Tonstakers and peers via ready methods.
  • Gas-station integrationgasless transfers via Battery and similar providers.

@ton/appkit-react on top adds:

  • <TonConnect /> — a ready wallet connection component.
  • <TonBalance /> — balance display.
  • <TonTransfer /> — a button with built-in send logic.
  • HooksuseWallet(), useBalance(), useTransfer(), useDexQuote().
  • Provider<AppKitProvider> for context.

Minimal example

The shortest Mini App with wallet connect and a transfer:

import { AppKitProvider, TonConnect, useWallet, useTransfer } from '@ton/appkit-react';

function App() {
  return (
    <AppKitProvider manifestUrl="https://your-app.com/tonconnect-manifest.json">
      <Header />
      <SendForm />
    </AppKitProvider>
  );
}

function Header() {
  return <TonConnect />;
}

function SendForm() {
  const { isConnected, address } = useWallet();
  const { send, isLoading } = useTransfer();

  if (!isConnected) return <p>Connect wallet first</p>;

  const onClick = async () => {
    await send({
      to: 'recipient.ton',
      amount: '1.5 TON',
    });
  };

  return <button onClick={onClick} disabled={isLoading}>Send 1.5 TON</button>;
}

What’s happening:

  • <TonConnect /> renders the “Connect wallet” button and handles the whole connection flow.
  • useWallet() returns connection state and address.
  • useTransfer() gives you a send method with typed params: {to, amount} — no raw cells.
  • 'recipient.ton' AppKit resolves to a canonical address via DNS.
  • '1.5 TON' AppKit parses into nanoTON automatically.

That’s 20 lines vs ~150-200 with the old stack (TonConnect provider + manual cells serialisation + address parsing + amount math).

Typed transactions: the main win

Old way to send a transfer (ton-core):

import { Address, beginCell, toNano } from '@ton/core';

const body = beginCell()
  .storeUint(0, 32)
  .storeStringTail(comment)
  .endCell();

const tx = {
  validUntil: Math.floor(Date.now() / 1000) + 60,
  messages: [
    {
      address: Address.parse(to).toString(),
      amount: toNano(amount).toString(),
      payload: body.toBoc().toString('base64'),
    },
  ],
};
await tonConnectUI.sendTransaction(tx);

In AppKit:

import { useTransfer } from '@ton/appkit-react';

const { send } = useTransfer();
await send({ to: 'friend.ton', amount: '1.5 TON', comment: 'Hi' });

The diff:

  • No hand-assembled cell for the body.
  • No address transformation (DNS works directly).
  • No toNano (AppKit parses “1.5 TON”).
  • No manual BoC + base64 serialisation.
  • No validUntil math — AppKit sets a default.

DEX quotes in one line

import { useDexQuote } from '@ton/appkit-react';

const { quote } = useDexQuote({
  from: 'TON',
  to: 'USDT',
  amount: '10 TON',
});
// quote: { expectedOutput: '21.42 USDT', priceImpact: 0.03, route: 'STON.fi' }

Under the hood — calls to STON.fi and DeDust, picking the best route. No need to wire separate APIs.

DNS resolution

const { address } = useResolveDns('alice.ton');
// 'EQDxxx...'

Works for .ton, .t.me (telegram-username-dns subdomain), and old TON DNS contract styles.

Staking helpers

import { useStaking } from '@ton/appkit-react';

const { stake, unstake, balance, apy } = useStaking({ protocol: 'tonstakers' });
await stake({ amount: '10 TON' });
// stake → stTON in wallet, visible via useBalance.

Supports Tonstakers, Hipo, Stakee. Each protocol implemented as a plugin, custom ones can be added.

Bundle size comparison

I measured a test Mini App that does: connect, balance, transfer, DEX quote.

StackBundle size (gzip)Lines of code
Old (ton-core + tonconnect-ui + custom helpers)~180 KB~250
AppKit (@ton/appkit + @ton/appkit-react)~110 KB~30

Not a critical saving, but noticeable. The bigger win — in LoC and maintainability.

When to use AppKit, when not

Use:

  • New Mini App or dApp — definitely AppKit.
  • Existing Mini App, actively developed — incremental migration, 2-4 sprints.
  • You want to minimise frontend boilerplate.

Don’t use (yet):

  • Very non-standard scenarios where you need low-level cells (stay on ton-core).
  • Legacy code in maintenance — don’t touch.
  • Your framework isn’t JS (Python, Go) — AppKit is TypeScript-only for now.

What’s not covered

AppKit focuses on the frontend. Not included:

  • Backend operations (for accepting payments — separate TON Pay SDK).
  • Wallet-side TON Connect (for wallet builders — WalletKit).
  • Indexing / analytics — TonAPI v3 or DeFiLlama.

What’s next

Building a Mini App in 2026 — start with AppKit. The lowest barrier to TON frontend the ecosystem has ever had. Full Toolset context — in our overview.

Frequently asked

AppKit is a frontend SDK from TON Foundation for Mini Apps and dApps. It replaces hand-rolled work with tonweb / ton-core / tonconnect-sdk with a single high-level interface. Headlines — typed transactions (TypeScript types instead of raw cells), React components for TON Connect, DEX quotes right from the SDK, DNS resolution, ready helpers for staking.
tonconnect-ui is a narrow piece: UI for wallet connection. AppKit includes tonconnect-ui under the hood plus everything else the frontend needs: building transactions, reading balances, DEX prices, DNS, staking. tonconnect-ui stays available, but new projects should start with AppKit.
Yes. `@ton/appkit` — the base without React, for any frontend (Vue, Svelte, vanilla JS). `@ton/appkit-react` — a thin layer with ready React components on top. If you're on Vue or Vanilla — use the base and write your own components, but typed transactions, DEX quotes, and the rest are all available.
Yes, via gas stations (Battery, etc.) — built into the standard transfer builder. The user doesn't need TON for gas if your Mini App has a gas-station provider configured. Useful for on-ramp flow when a newcomer hasn't bought TON yet. More — our [gas stations guide](/en/blog/gas-stations-on-ton-battery-and-gasless-2026/).
Base `@ton/appkit` — around 50-70 KB gzip. With React components — around 100-120 KB. Notably smaller than the total of ton-core + tonconnect-sdk + tonconnect-ui + custom wrappers in a typical Mini App. Tree-shaking works — use only the transfer builder without DEX, bundle gets smaller.
Gradual. AppKit doesn't make old code incompatible — ton-core keeps working. Strategy: new features on AppKit, rewrite old components when you touch them anyway. Full rewrite isn't needed — this is an incremental migration, usually 2-4 sprints for a mid-sized Mini App.

Related