A simple and elegant physical tally counter app built with React Native. Count anything using on-screen buttons or hardware volume buttons.
- Google Play: https://play.google.com/store/apps/details?id=com.parkjeongseop.tallycounter
- App Store: https://apps.apple.com/kr/app/physical-tally-counter/id6751624376
| Counter | History | Goal Setting |
|---|---|---|
![]() |
![]() |
![]() |
- 📱 Clean, modern UI with gradient design
- 🔊 Hardware volume button support (increment/decrement)
- 💾 Automatic save/restore of count value
- 📳 Haptic feedback on button press
- 🎯 Safe area support for all devices
- 🌐 Cross-platform (iOS & Android)
- React Native 0.80
- TypeScript - Type safety and better DX
- AsyncStorage - Persistent data storage
- React Native Safe Area Context - Handle device safe areas
- Custom Native Modules - Volume button integration
src/
├── components/ # Reusable UI components
│ ├── Header.tsx # App header with title
│ ├── CounterDisplay.tsx # Main counter display
│ └── ControlButtons.tsx # Increment/decrement/reset buttons
├── hooks/ # Custom React hooks
│ ├── useCounter.ts # Counter logic & persistence
│ └── useVolumeButtons.ts # Volume button handling
├── constants/ # App constants
│ └── storage.ts # Storage keys
├── styles/ # Styling utilities
│ └── colors.ts # Color palette
└── screens/ # Screen components
└── CounterScreen.tsx # Main counter screen
- Separation of Concerns: Each component has a single responsibility
- Reusability: Components and hooks can be used independently
- Maintainability: Small, focused files are easier to understand and modify
- Testability: Each part can be tested in isolation
useCounter: Encapsulates counter state logic and persistenceuseVolumeButtons: Abstracts platform-specific volume button handling
- iOS: Uses
react-native-volume-managerfor volume button detection - Android: Custom native module for direct volume button interception
- Node.js (v18 or newer)
- React Native development environment set up
- Android Studio (for Android development)
- Xcode (for iOS development, macOS only)
- Clone the repository:
git clone https://github.com/ParkJeongseop/Tally-Counter.git
cd Tally-Counter- Install dependencies:
npm install- Install iOS dependencies (macOS only):
cd ios && pod install && cd ..npm run androidnpm run iosnpm start# Run linter
npm run lint
# Run tests
npm test
# Type check
npx tsc --noEmitnpm start- Start Metro bundlernpm run android- Run on Android device/emulatornpm run ios- Run on iOS device/simulatornpm test- Run testsnpm run lint- Check code style
The app intercepts hardware volume button presses to control the counter without affecting system volume. This is achieved through a custom native module.
Volume button detection works through the react-native-volume-manager library, which monitors volume changes and resets them immediately to simulate button capture.
- Fork the repository
- Create your feature branch (
git checkout -b feature/amazing-feature) - Commit your changes (
git commit -m 'Add some amazing feature') - Push to the branch (
git push origin feature/amazing-feature) - Open a Pull Request
This project is licensed under the MIT License - see the LICENSE file for details.
- React Native community for the excellent libraries
- Icons and design inspiration from modern UI trends
- Built with ❤️ using React Native



