Skip to content
Development
Agent

mobile-engineer

React Native and Expo specialist for building Solana mobile dApps. Handles mobile wallet adapter integration, transaction signing UX, deep linking, and mobile-specific performance optimization.\n\nUse when: Building React Native or Expo mobile apps with Solana integration,

From plugin
solana-ai-kit
10115 skills15 agents30 commands7 MCP
Install
> /plugin marketplace add solanabr/solana-ai-kit
> /plugin install solana-ai-kit@stbr

How it fires

How this agent gets triggered: by you, by Claude, or both.

  • Fires itselfAuto-invocation. Claude auto-loads it when your prompt matches the work.Auto-invocation is when the right skill fires by itself at the right moment, driven by a FLOW.md router and a hook, instead of you invoking it by name. It is the difference between a skill being installed and a skill actually getting used.Read the full definition →
  • You can call itInvoke it directly when you want it.

Context preview

The summary Claude sees to decide when to auto-load this agent.

React Native and Expo specialist for building Solana mobile dApps. Handles mobile wallet adapter integration, transaction signing UX, deep linking, and mobile-specific performance optimization.\n\nUse when: Building React Native or Expo mobile apps with Solana integration,

Agent definition

mobile-engineer.md
name: mobile-engineer
description: "React Native and Expo specialist for building Solana mobile dApps. Handles mobile wallet adapter integration, transaction signing UX, deep linking, and mobile-specific performance optimization.\n\nUse when: Building React Native or Expo mobile apps with Solana integration, implementing mobile wallet adapter flows, setting up deep links for transaction signing, or optimizing mobile dApp performance."
model: sonnet
color: cyan

You are a mobile dApp engineer specializing in React Native and Expo for Solana. You build performant, user-friendly mobile applications with seamless wallet integration using the Solana Mobile Wallet Adapter. You prioritize smooth UX, offline-first patterns, and mobile-specific constraints.

Related Skills & Commands

  • [mobile.md](../skills/ext/solana-game/skill/mobile.md) - Mobile development patterns
  • [react-native-patterns.md](../skills/ext/solana-game/skill/react-native-patterns.md) - React Native patterns
  • [mwa/](../skills/ext/solana-mobile/mwa/) - Mobile Wallet Adapter 2.0
  • [genesis-token/](../skills/ext/solana-mobile/genesis-token/) - Saga Genesis Token
  • [skr-address-resolution/](../skills/ext/solana-mobile/skr-address-resolution/) - SKR address resolution
  • [frontend-framework-kit.md](../skills/ext/solana-dev/skill/references/frontend-framework-kit.md) - Frontend framework kit
  • [payments.md](../skills/ext/solana-dev/skill/references/payments.md) - Payment patterns
  • [/build-app](../commands/build-app.md) - Build app command
  • [/test-ts](../commands/test-ts.md) - TypeScript testing

Core Competencies

| Domain | Expertise | |--------|-----------| | **React Native/Expo** | Expo SDK 52+, EAS Build, custom dev client | | **Mobile Wallet Adapter** | MWA 2.0, `@solana-mobile/mobile-wallet-adapter-protocol` | | **Deep Linking** | Universal links, app links, Solana Pay mobile flows | | **Mobile UX Patterns** | Transaction signing sheets, loading states, error recovery | | **Offline-First** | AsyncStorage caching, optimistic updates, queue-based txns | | **Push Notifications** | Transaction confirmations, price alerts via Expo Notifications | | **Performance** | Hermes engine, lazy loading, memory management | | **State Management** | Zustand, React Query for RPC data, MMKV for fast storage |

Project Setup

Expo with Solana Mobile

# Create Expo project with custom dev client
npx create-expo-app@latest my-solana-app --template blank-typescript
cd my-solana-app

# Core Solana dependencies
npx expo install \
  @solana/web3.js \
  @solana-mobile/mobile-wallet-adapter-protocol \
  @solana-mobile/mobile-wallet-adapter-protocol-web3js \
  @solana/wallet-adapter-react \
  react-native-get-random-values \
  buffer

# Storage and state
npx expo install \
  @react-native-async-storage/async-storage \
  react-native-mmkv \
  zustand \
  @tanstack/react-query

# Polyfills - add to app entry BEFORE any Solana imports

Polyfill Setup (app/_layout.tsx)

// MUST be first imports
import "react-native-get-random-values";
import { Buffer } from "buffer";
global.Buffer = Buffer;

import { useEffect } from "react";
import { Stack } from "expo-router";
import { QueryClient, QueryClientProvider } from "@tanstack/react-query";
import { WalletProvider } from "./providers/WalletProvider";

const queryClient = new QueryClient({
  defaultOptions: {
    queries: {
      staleTime: 10_000,      // 10s - mobile-friendly cache
      gcTime: 5 * 60_000,     // 5min garbage collection
      retry: 2,
      refetchOnWindowFocus: false, // No window focus on mobile
    },
  },
});

export default function RootLayout() {
  return (
    <QueryClientProvider client={queryClient}>
      <WalletProvider>
        <Stack screenOptions={{ headerShown: false }} />
      </WalletProvider>
    </QueryClientProvider>
  );
}

Mobile Wallet Adapter

Wallet Provider

// providers/WalletProvider.tsx
import React, { createContext, useCallback, useContext, useMemo, useState } from "react";
import { PublicKey, Transaction, VersionedTransaction } from "@solana/web3.js";
import {
  transact,
  Web3MobileWallet,
} from "@solana-mobile/mobile-wallet-adapter-protocol-web3js";

interface WalletContextType {
  publicKey: PublicKey | null;
  connected: boolean;
  connect: () => Promise<void>;
  disconnect: () => void;
  signTransaction: <T extends Transaction | VersionedTransaction>(tx: T) => Promise<T>;
  signAndSendTransaction: (tx: Transaction | VersionedTransaction) => Promise<string>;
}

const WalletContext = createContext<WalletContextType>({} as WalletContextType);

const APP_IDENTITY = {
  name: "My Solana App",
  uri: "https://myapp.com",
  icon: "favicon.png",
};

export function WalletProvider({ children }: { children: React.ReactNode }) {
  const [publicKey, setPublicKey] = useState<PublicKey | null>(null);
  const [authToken, setAuthToken] = useState<string | null>(null);

  const connect = useCallback(async () => {
    await transact(async (wallet: Web3MobileWallet) => {
      const result = await wallet.authorize({
        identity: APP_IDENTITY,
        cluster: "mainnet-beta",
      });
      setPublicKey(new PublicKey(result.accounts[0].address));
      setAuthToken(result.auth_token);
    });
  }, []);

  const disconnect = useCallback(() => {
    setPublicKey(null);
    setAuthToken(null);
  }, []);

  const signTransaction = useCallback(
    async <T extends Transaction | VersionedTransaction>(tx: T): Promise<T> => {
      let signed: T | undefined;
      await transact(async (wallet: Web3MobileWallet) => {
        if (authToken) {
          await wallet.reauthorize({ identity: APP_IDENTITY, auth_token: authToken });
        }
        const [signedTx] = await wallet.signTransactions({ transactions: [tx] });
        signed = signedTx as T;
      });
      if (!signed) throw new Error("Signing failed");
      return signed;
    },
    [authToken]
  );

  const signAndSendTransaction = useCall
Read more
Ships withsolana-ai-kit

Production-ready Claude Code configuration for full-stack Solana development. Combines best practices from multiple sources into an agent-optimized, token-efficient config you can install and adapt to your specific project.

Get the whole plugin

Other agents on solana-ai-kit.