# AppKit: FAQ and troubleshooting (https://docs-rbcpr9qys-ton-core-docs.vercel.app/llms/applications/appkit/faq-troubleshooting/content.md)



Use this page to answer common AppKit questions and triage the most common failure classes: connector issues, wallet rejection, network mismatch, provider gaps, and settlement confusion.

## FAQ [#faq]

### What is AppKit? [#what-is-appkit]

AppKit is a TypeScript toolkit for GRAM wallet connection, transaction requests, asset reads, provider integrations, React hooks, and UI components.

### Is AppKit a wallet? [#is-appkit-a-wallet]

No. Wallets hold keys and sign requests. AppKit prepares requests, tracks application state, and routes actions through connectors and providers.

### Does AppKit store private keys? [#does-appkit-store-private-keys]

No. Private keys stay in the user's wallet. AppKit stores runtime configuration, local state, and provider registrations.

### Can AppKit be used without React? [#can-appkit-be-used-without-react]

Yes. The core package `@ton/appkit` works from plain TypeScript. React-specific hooks and components live in `@ton/appkit-react`.

### How is transaction success confirmed? [#how-is-transaction-success-confirmed]

A wallet transaction response only proves the user signed and the wallet submitted the request. Confirm success with `getTransactionStatus`, streaming updates, or backend verification before changing product state.

### Why does a wallet reject a request? [#why-does-a-wallet-reject-a-request]

Common causes include user rejection, expired requests, wrong network, missing wallet selection, malformed payloads, and insufficient balance for value plus fees.

## Troubleshoot [#troubleshoot]

### The connect button opens, but no wallet connects [#the-connect-button-opens-but-no-wallet-connects]

Check the connector configuration first:

* confirm the TON Connect manifest URL is public and reachable
* confirm at least one connector is registered on the `AppKit` instance
* confirm the React tree is wrapped with `AppKitProvider`

If the UI is custom, confirm the code passes a valid `connectorId` to `connect`.

### Reads work, but watch hooks never update [#reads-work-but-watch-hooks-never-update]

Streaming hooks need a streaming provider. Confirm that:

* a streaming provider is registered for the active network
* the network passed to the watcher matches the configured network
* `hasStreamingProvider(appKit, network)` returns `true`

### The wallet signs, but the app never sees settlement [#the-wallet-signs-but-the-app-never-sees-settlement]

Separate wallet acceptance from on-chain settlement:

* treat the wallet response as a submission result, not finality
* check `getTransactionStatus` with the returned `boc`
* if streaming is used, remember that streaming finality uses `pending`, `confirmed`, `finalized`, and `invalidated`

### Jetton or NFT data looks wrong [#jetton-or-nft-data-looks-wrong]

Treat off-chain metadata as display data:

* read decimals from jetton metadata before building transfers
* sanitize jetton and NFT names, images, and descriptions
* route by contract addresses, not by display metadata

### A transaction fails on the wrong network [#a-transaction-fails-on-the-wrong-network]

Check both the selected wallet network and the AppKit default network. Block unsafe actions until the expected network and wallet-reported network match.

## Related pages [#related-pages]

* [Get started guides](https://docs-rbcpr9qys-ton-core-docs.vercel.app/llms/applications/appkit/get-started/get-started/content.md)
* [How-to guides](https://docs-rbcpr9qys-ton-core-docs.vercel.app/llms/applications/appkit/howto/howto/content.md)
