Introduction
A Radix dApp consists of two layers: on-ledger blueprints deployed as Scrypto packages, and an off-ledger frontend that connects to the user's Radix Wallet to sign and submit transactions. The Radix dApp Toolkit (RDT) is the official TypeScript library that handles wallet connection, session management, data requests, and transaction submission. This guide covers integrating RDT into a web application.
Project Setup
The fastest way to start is the official scaffolding tool:
npx create-radix-app@latestThis generates a project with RDT pre-configured, the Connect Button wired up, and example transaction code. Alternatively, add RDT to an existing project:
npm install @radixdlt/radix-dapp-toolkitInitialising the Toolkit
Create an RDT instance with your dApp's configuration:
import { RadixDappToolkit, RadixNetwork } from '@radixdlt/radix-dapp-toolkit'
const rdt = RadixDappToolkit({
dAppDefinitionAddress: 'account_rdx...', // your dApp definition account
networkId: RadixNetwork.Stokenet, // or RadixNetwork.Mainnet
applicationName: 'My dApp',
applicationVersion: '1.0.0',
})The dAppDefinitionAddress is a Radix account that you own, registered as your dApp's identity through the Developer Console metadata settings. This is how the wallet identifies your application to the user.
Wallet Connection & Authentication
RDT provides the β Connect Button, a framework-agnostic web component that handles the full wallet connection flow:
<!-- Add to your HTML -->
<radix-connect-button />When a user clicks the button, RDT coordinates with the Radix Wallet Connector browser extension to establish a connection to the user's mobile wallet. The user authenticates using a Persona β a reusable identity that can share selected accounts and personal data with your dApp.
Requesting Account Data
Configure what data your dApp needs at connection time:
import { DataRequestBuilder } from '@radixdlt/radix-dapp-toolkit'
rdt.walletApi.setRequestData(
DataRequestBuilder.accounts().atLeast(1),
DataRequestBuilder.persona().withProof(),
)This asks the user to share at least one account address and a cryptographic proof of Persona ownership. For ROLA (Radix Off-Ledger Authentication), provide a challenge generator that fetches a 32-byte hex challenge from your backend:
rdt.walletApi.provideChallengeGenerator(async () => {
const res = await fetch('/api/auth/challenge')
return (await res.json()).challenge
})Submitting Transactions
Radix transactions are built using transaction manifests β a declarative syntax that describes what the transaction should do. Your dApp sends a manifest stub to the wallet; the wallet completes it by adding fee payment and any user-specified assertions.
const result = await rdt.walletApi.sendTransaction({
transactionManifest: `
CALL_METHOD
Address("component_rdx...")
"buy_token"
Decimal("100")
;
CALL_METHOD
Address("${accountAddress}")
"deposit_batch"
Expression("ENTIRE_WORKTOP")
;
`,
})The user reviews the transaction in their wallet β seeing exactly which assets move where β signs it, and the wallet submits it to the network. Your dApp receives a transaction hash that you can track via the Gateway API.
Reacting to Wallet Data
Subscribe to wallet state changes to update your UI in real time:
rdt.walletApi.walletData$.subscribe((walletData) => {
const accounts = walletData.accounts
// Update UI with connected accounts
})Maintenance Status (checked August 2026)
RDT is stable and still the correct library to build against, but it is no longer under active development. The last commit on the toolkit's main branch and its most recent release, v2.3.0, are both dated 2 March 2026, and npm latest has not moved since. The repository is not archived and remains Apache-2.0. Frozen is not unused: the package drew 48,555 downloads in the month to 9 August 2026, close to 12,000 a week, so the library every Radix front end depends on is being installed at scale while nobody is shipping to it. The stall is visible in the queue as well as the log β pull request #326, a community patch making the Radix Connect Relay server URL configurable, was opened on 24 March 2026 and has neither been reviewed nor closed since, which makes an unmerged contribution the most recent thing to happen to the repository. On 7 August 2026 the position was stated directly in the Radix Developers channel: the Radix Wallet and Gateway are maintained on a volunteer basis with bug fixes only, pending a community decision on direction β the same maintenance mode the Radix Foundation entered in April 2026. The surrounding pieces are on the same footing: the Wallet Connector extension last took a commit on 17 April 2026, and the Gateway service itself released v1.10.6 on 7 April 2026. Which of these the community DAO picks up is one of the open stewardship questions.
What this means for the scaffolding
npx create-radix-app@latest still works, but it is older than it looks. The package was last published in December 2024; it does not contain the templates itself, but clones them with degit from radixdlt/official-examples, whose last commit is January 2025. The dependency ranges are caret ranges (@radixdlt/radix-dapp-toolkit: ^2.1.1), so a fresh scaffold does install the current 2.3.0 β what is dated is the example code, not the version you get. In particular the templates predate the subintent and pre-authorization support that landed in 2.3.0, so sendPreAuthorizationRequest appears in no generated project. Scaffold for the wiring, then read the current library API rather than the template's.
Next Steps
- Gateway SDK: Reading Ledger State β read balances, component state, and transaction status from your front end
External Links
- Radix dApp Toolkit β GitHub
- @radixdlt/radix-dapp-toolkit β npm
- Building a Frontend dApp β Official Docs
- Run Your First Frontend dApp β Official Docs
- Radix Wallet SDK β GitHub (archived August 2024 β superseded by the Radix dApp Toolkit; kept for historical reference)
