alterQR is a fast, offline-first React Native utility app designed to let users upload, manage, and cycle through multiple QR codes or barcode images. Built with a stunning Neo-Brutalist aesthetic, the app makes it effortless to rapidly switch between and share your different QR codes at events, check-ins, or networking sessions.
Many shopkeepers want to have UPI as a payment option at their shops but they dont want all the money to be credited to one bank account for "Personal Reasons". So alterQR lets them add different bank accounts and lets them switch bw them so that all money cycles through all bank accounts.
- Dynamic QR Loop: Load multiple QR code screenshots from your device's gallery. The app automatically cycles to the next QR code immediately after you share the current one.
- Persistent Storage: All images and the current sequence position are saved securely on-device using
AsyncStorage. - Native Sharing: Instantly trigger the native Android/iOS share sheet with one tap.
- Neo-Brutalist UI: High contrast, thick borders, sharp drop shadows, and incredibly snappy micro-animations.
- Fully Offline: Zero network requests required. Your data and images never leave your phone.
- Framework: React Native (via Expo SDK 56)
- Routing: Expo Router (File-based navigation)
- Styling: NativeWind (TailwindCSS)
- Animations: Moti & React Native Reanimated
- Storage:
@react-native-async-storage/async-storage - Native Modules:
expo-image-picker,expo-sharing
Since the app uses NativeWind, which relies on custom Babel and Metro bundler configurations, you must run it as a custom development build (not the standard Expo Go app).
- Node.js (v18+)
- Android Studio / Android SDK (for local Android builds)
git clone https://github.com/your-username/alterQR.git
cd alterQR
npm installTo run the app on an attached Android device or emulator:
npx expo run:androidTo generate a standalone Production APK (e.g., for GitHub Releases) without needing an active Metro bundler:
- Ensure you have the required Gradle JVM arguments configured in
android/gradle.properties:org.gradle.jvmargs=-Xmx4096m -XX:MaxMetaspaceSize=1024m
- Build the release APK skipping the heavy linting tasks:
cd android ./gradlew assembleRelease --no-daemon -x lint -x lintVitalRelease -x lintVitalAnalyzeRelease - Find your built APK at:
android/app/build/outputs/apk/release/app-release.apk
src/app/: Contains the Expo Router file-based screens (index.tsxfor the Home screen,settings.tsxfor the Image manager).src/hooks/: Houses the global React Context providers.use-qr-loop.tsxprovides the shared state logic syncing memory directly with AsyncStorage.src/components/: Reusable Neo-Brutalist UI pieces (e.g.,<NeoShadow>).