A full-featured, offline-first mobile audio recording application built with React Native and Expo. Record, manage, and play back high-quality audio recordings entirely offline with an intuitive and modern interface.
- High-quality audio recording (44.1kHz, 16-bit)
- Multiple format support (M4A, MP3, WAV)
- Pause/Resume functionality
- Real-time audio visualization
- Background recording support
- Audio level meter
- Recording quality presets
- Smooth audio playback with seek controls
- Variable playback speed (0.5x - 2x)
- Skip forward/backward (10/30 seconds)
- Loop and repeat options
- Waveform visualization
- Lock screen controls
- Background playback
- 100% offline functionality
- SQLite database for metadata
- Local file system storage
- Search and filter recordings
- Sort by date, name, duration, or size
- Folder organization with categories
- Batch operations
- Storage space monitoring
- Clean, intuitive interface
- Dark mode support
- Haptic feedback
- Accessibility features
- Responsive design
- Material design principles
- Share recordings with other apps
- Export to device storage
- Save to media library
- Multiple format export options
- Node.js 18+
- npm or yarn
- Expo CLI
- iOS Simulator (macOS) or Android Emulator
- Physical device for best testing experience
-
Clone the repository
git clone https://github.com/yourusername/audio-recorder-app.git cd audio-recorder-app -
Install dependencies
npm install # or yarn install -
Start the development server
npx expo start
-
Run on your device
- Scan the QR code with Expo Go app (iOS/Android)
- Press
ifor iOS simulator - Press
afor Android emulator
On first launch, the app will request the following permissions:
- Microphone - Required for audio recording
- Media Library (optional) - For saving recordings to your device
audio-recorder-app/
βββ App.tsx # App entry point
βββ app.json # Expo configuration
βββ package.json # Dependencies
βββ tsconfig.json # TypeScript configuration
βββ src/
β βββ components/ # Reusable UI components
β β βββ recorder/ # Recording-related components
β β βββ player/ # Playback-related components
β β βββ common/ # Shared components
β βββ screens/ # App screens
β β βββ RecordScreen.tsx
β β βββ RecordingsListScreen.tsx
β β βββ PlaybackScreen.tsx
β β βββ SettingsScreen.tsx
β βββ services/ # Business logic
β β βββ audioRecorder.ts
β β βββ audioPlayer.ts
β β βββ audioProcessor.ts
β βββ storage/ # Data persistence
β β βββ database.ts # SQLite operations
β β βββ fileManager.ts # File system operations
β β βββ settingsStorage.ts # Settings management
β βββ hooks/ # Custom React hooks
β βββ navigation/ # Navigation configuration
β βββ context/ # React Context providers
β βββ types/ # TypeScript type definitions
β βββ utils/ # Helper functions
β βββ constants/ # App constants
β βββ assets/ # Images, icons, fonts
βββ assets/ # Expo assets (root level)
Default audio recording configuration can be modified in src/constants/audioConfig.ts:
export const AUDIO_CONFIG = {
isMeteringEnabled: true,
android: {
extension: '.m4a',
outputFormat: Audio.RECORDING_OPTION_ANDROID_OUTPUT_FORMAT_MPEG_4,
audioEncoder: Audio.RECORDING_OPTION_ANDROID_AUDIO_ENCODER_AAC,
sampleRate: 44100,
numberOfChannels: 2,
bitRate: 128000,
},
ios: {
extension: '.m4a',
outputFormat: Audio.RECORDING_OPTION_IOS_OUTPUT_FORMAT_MPEG4AAC,
audioQuality: Audio.RECORDING_OPTION_IOS_AUDIO_QUALITY_HIGH,
sampleRate: 44100,
numberOfChannels: 2,
bitRate: 128000,
linearPCMBitDepth: 16,
linearPCMIsBigEndian: false,
linearPCMIsFloat: false,
},
};Main app settings are in app.json. Key configurations include:
- App name and slug
- Version and build numbers
- Splash screen and icon
- Permissions
- Platform-specific settings
# Start development server
npm start
# Start with cleared cache
npm start -- --clear
# Run on iOS
npm run ios
# Run on Android
npm run android
# Run tests
npm test
# Type check
npm run type-check
# Lint code
npm run lint- React Native - Cross-platform mobile framework
- Expo - Development platform and toolchain
- TypeScript - Type-safe JavaScript
- expo-av - Audio recording and playback
- expo-file-system - File management
- expo-sqlite - Local database
- React Navigation - Navigation library
- React Native Paper - UI component library
- AsyncStorage - Key-value storage
- NetInfo - Network status detection
-
Install EAS CLI
npm install -g eas-cli
-
Login to Expo
eas login
-
Configure build
eas build:configure
-
Build for iOS
eas build --platform ios
-
Build for Android
eas build --platform android
-
Build APK for testing
eas build -p android --profile preview
For local builds without EAS:
# iOS (macOS only)
npx expo run:ios --configuration Release
# Android
npx expo run:android --variant releaseThe repository includes an automated build workflow (.github/workflows/android-build.yml) that:
- β Runs type checking with TypeScript
- β Executes all tests
- β Performs code linting
- β Generates JavaScript bundle with verification
- β Builds Android APK automatically with error checking
- β Verifies APK was created successfully
- β Uploads APK as a downloadable artifact
The workflow includes verification steps to ensure:
- JavaScript bundle is created before building
- Gradle build completes successfully
- APK file exists at the expected location
- Build failures are caught with detailed error messages
The workflow automatically runs on:
- Pushes to
mainordevelopbranches - Pull requests to
mainordevelopbranches - Git tags (e.g.,
v1.0.0,v1.0.1) - Manual trigger via GitHub Actions UI
- Go to the Actions tab in the GitHub repository
- Click on the workflow run you're interested in
- Scroll to the Artifacts section at the bottom
- Download the
app-releaseartifact (APK file) - Extract the ZIP file to get the release APK
- Download the APK artifact from GitHub Actions
- Extract the ZIP file to get
app-release.apk - Transfer the APK to your Android device
- Enable Install from Unknown Sources in device settings
- Tap the APK file to install
- Grant permissions when prompted
Note: The release APK is unsigned. For distribution, you'll need to sign it with your keystore.
To manually trigger a build:
- Go to Actions tab in GitHub
- Select Android Build workflow
- Click Run workflow button
- Select the branch to build
- Click Run workflow to start
To build locally without GitHub Actions:
# Generate native Android project
npx expo prebuild --platform android --clean
# Create assets directory
mkdir -p android/app/src/main/assets
# Generate JS bundle and assets (for release builds)
npx expo export:embed \
--platform android \
--dev false \
--bundle-output android/app/src/main/assets/index.android.bundle \
--assets-dest android/app/src/main/res
# Build release APK
cd android
./gradlew assembleRelease
# APK location: android/app/build/outputs/apk/release/app-release.apk
# Or build debug APK for testing (bundle generation not required)
./gradlew assembleDebug
# APK location: android/app/build/outputs/apk/debug/app-debug.apkNote: For release builds, the JS bundle must be generated before running assembleRelease to ensure the app can run standalone without the Metro development server.
# Run all tests
npm test
# Run tests in watch mode
npm test -- --watch
# Run tests with coverage
npm test -- --coverage- Install Expo Go app on your device
- Ensure device is on same WiFi network
- Scan QR code from terminal
- Grant necessary permissions when prompted
Audio not recording:
- Check microphone permissions in device settings
- Ensure no other app is using the microphone
- Try restarting the app
Playback issues:
- Check if file exists in storage
- Verify file format is supported
- Check device volume settings
Build errors:
- Clear cache:
npx expo start --clear - Reinstall dependencies:
rm -rf node_modules && npm install - Clear Expo cache:
npx expo start -c
Permission denied:
- Check app permissions in device settings
- Re-request permissions from settings screen
- Reinstall the app
To enable debug logging, set the following in your environment:
// Add to App.tsx
if (__DEV__) {
console.log('Debug mode enabled');
}This project is licensed under the MIT License - see the LICENSE file for details.
Contributions are welcome! Please feel free to submit a Pull Request.
- Fork the repository
- Create your feature branch (
git checkout -b feature/AmazingFeature) - Commit your changes (
git commit -m 'Add some AmazingFeature') - Push to the branch (
git push origin feature/AmazingFeature) - Open a Pull Request
- Follow TypeScript best practices
- Write meaningful commit messages
- Add tests for new features
- Update documentation as needed
- Follow the existing code style
- Your Name - @yourhandle
- Expo team for the amazing development platform
- React Native community for continuous support
- Contributors who help improve this app
For support, email support@yourapp.com or open an issue on GitHub.
- Cloud sync functionality
- Audio editing features (trim, merge)
- Voice-to-text transcription
- Recording templates and presets
- Audio effects and filters
- Folder sharing and collaboration
- Widget support
- Apple Watch integration
- Web version
- App size: ~25MB (varies by platform)
- Cold start: <3 seconds
- Recording latency: <100ms
- Supports recordings up to 4 hours
- Efficient battery usage during recording
This app:
- β Works 100% offline
- β No data collection or analytics
- β No third-party tracking
- β All recordings stored locally
- β No cloud storage required
- β Open source and transparent
Made with β€οΈ using React Native and Expo