The new π Signum Mobile Wallet β fast, secure, and modern.
Built with Expo, React Native, and Expo Dev Client, targeting both iOS and Android.
The setup supports development on Windows, macOS, and Linux, with parallel testing on iOS and Android devices.
Windows 11 is fully supported. macOS additionally allows local iOS simulator builds.
Expo Go App is not supported, because of native modules dependencies (Quick Crypto library and Nitro modules). All local development and testing is done using the Expo Dev Client.
More details: https://docs.expo.dev/develop/development-builds/introduction/
This project supports two local development workflows, depending on your environment and use case.
- Node.js (see
.nvmrc) - npm
- Expo CLI
- EAS CLI
Prerequisite: Dependencies must be installed once before using any development workflow:
npm installCreate an internal development build using EAS:
npm run build-devInstall the generated build on your iOS and/or Android device.
Important (iOS): The iPhone must be registered in Expo / Apple Developer provisioning:
- The device UDID needs to be added to the Apple Developer account
- The device must appear in Expo / EAS as an allowed device for development builds
- Otherwise the dev client cannot be installed or launched on iOS
Start the Metro bundler in Dev Client mode:
npm startIf you run into caching or bundling issues, use:
npm run start-cleanOpen the app using the Expo Dev Client on your device. The app will connect to the running development server.
Note (Device setup):
- iOS: Make sure Developer Mode is enabled
- Settings β Privacy & Security β Developer Mode β ON
- Device restart required
- Android: Enable Developer options and USB debugging
- Settings β About phone β tap Build number 7Γ
- Settings β Developer options β USB debugging
This workflow is useful for quick local testing using emulators or simulators.
- JDK 17
- Android Gradle Plugin: 8.1.1
- Gradle: 8.3
- Android Studio
- Xcode (macOS only, required for local iOS builds)
npm run android
# or
npm run iosNote:
npm run iosrequires macOS.
npx expo run:android --no-build-cache
npx expo run:ios --no-build-cachenpm run prebuildChange the schema in src/db/schema.ts and run:
npx drizzle-kit migrateThe project uses a unified design-token system for all colors and theming, combined with NativeWind v4 for layout utilities.
- No Tailwind color classes like
bg-white,text-gray-500, ordark:bg-black - All colors are defined centrally in:
src/theme/tokens.ts - Each design theme (e.g.
defaultLight,defaultDark,midnight,solarized,sunrise,bubblegum) provides a full token set:backgroundsurface/surfaceElevatedbordertext/textMutedprimary/primarySoftsuccesserror
- Components access design tokens using:
import { useAppTheme } from "@/hooks/useAppTheme";
const { tokens, isDarkMode, themeDesign } = useAppTheme();- All UI elements (Navigation, TabBar, Buttons, Cards, Inputs, Forms, Alerts, Screens) render based on these tokens.
NativeWind is used for layout utilities such as:
- Flexbox (
flex,items-center,justify-between) - Spacing (
px-4,py-2,gap-4) - Sizing (
w-full,h-12) - Borders & radius (
rounded-lg,rounded-full) - Interaction (
active:opacity-80)
But not for colors.
All color styling must come from the token system.
- Users can switch design themes under Settings β App Design
- On first app launch, the system light/dark mode determines the initial theme:
- Light system β
defaultLight - Dark system β
defaultDark
- Light system β
- After that, theme selection is persistent and user-controlled
- Themes are completely independent of system light/dark mode
- NativeWind Docs: https://www.nativewind.dev/
- Theme Tokens:
src/theme/tokens.ts - Theme Hook:
src/hooks/useAppTheme.ts
Useful for logging, network monitoring, async storage inspection, and performance insights.
https://docs.infinite.red/reactotron/
- Start the development client
- Open Expo DevTools β press Shift + M
- Select expo-drizzle-studio-plugin
This project uses multiple EAS build profiles with different guarantees depending on the target environment.
| Profile | Script | Description |
|---|---|---|
| Development | npm run build-dev |
Internal dev client build, uncommitted changes allowed |
| Preview | npm run build-preview |
Preview build, clean git state required |
| Production | npm run build-prod |
Production build, clean git state required |
Correct versioning is essential for publishing builds to Google Play and App Store Connect.
To cut a new release just run npm run new-version
Expo uses:
- version β user-visible version
- android.versionCode β required by Google Play
- ios.buildNumber β required by App Store Connect
"version": "1.0.0"Update only when the user will notice changes:
- new features
- UI changes
- meaningful bug fixes
- performance improvements
These must be incremented every time you submit a build.
"android": {
"versionCode": 1
}- Must be an integer
- Must always increase
"ios": {
"buildNumber": "1"
}- Must be a string
- Must always increase
{
"expo": {
"version": "1.0.0",
"android": {
"versionCode": 1
},
"ios": {
"buildNumber": "1"
}
}
}When something changes for the user.
Every time you upload a build to Google Play or App Store Connect.
- Preview builds for internal QA
- Development builds for debugging
- Production builds for store submissions
Test dApp integration deep links:
# Test transaction signing (sign action)
npm run test-deeplink
# Test dApp connection (connect action)
npm run test-connectSee Deep Link Testing Guide and Connect dApp Flow for details.
Test deep links in a real browser environment:
cd demo-dapp
npm install
npm run dev
# Vite will show local and network URLsThe demo dApp provides:
- β Connect wallet flow (request public key)
- β Send transaction flow (sign & broadcast)
- β Network switching (Testnet/Mainnet)
- β Activity logging
- β No build required (pure HTML/JavaScript)
See Demo dApp README for detailed instructions.
- Secure key storage via expo-secure-store
- Optional biometric authentication
- Automatic logout and inactivity protection
Apache License 2.0
Β© 2026 Signum Network