The new π Signum Mobile Wallet β fast, secure, and modern.
Built with Expo, React Native, and Expo Dev Client, targeting both iOS and Android.
- Node: see
.nvmrc - JDK 17
- Android Gradle Plugin: 8.1.1
- Gradle: 8.3
- Xcode: only required for local iOS builds β not needed when using EAS Build
npm installnpm run android
# or
npm run iosnpx expo run:android --no-build-cache
npx expo run:ios --no-build-cachenpm run prebuildThe 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
- Android
- iOS
The project uses EAS Build with the following profiles:
| Profile | Purpose | Notes |
|---|---|---|
| development | Dev Client builds | Debugging, Reactotron, Drizzle Studio |
| preview | Internal test builds (APK / ad-hoc iOS) | QA & testing |
| production | Store releases | Google Play & App Store |
# Development build
eas build -p android --profile development
# Preview build (APK)
eas build -p android --profile preview
# Production build
eas build -p android --profile production
eas build -p ios --profile productionCorrect versioning is essential for publishing builds to Google Play and App Store Connect.
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
- Secure key storage via expo-secure-store
- Optional biometric authentication
- Automatic logout and inactivity protection
Apache License 2.0
Β© 2025 Signum Network