VPlayer is an Android-first app that does two things:
- hosts a local HTTP server so you can upload files from a browser on the same Wi-Fi
- plays local video files on the device
- Local HTTP upload server running on the phone.
- Browser-based uploads from another device on the same Wi-Fi network.
- Local video playback on the device.
- Automatic landscape playback for videos.
- Portrait library screens on phones, with landscape playback only while a video is open.
- Background playback gestures in the player:
- single tap to show or hide controls
- one-finger double tap to play or pause
- two-finger double tap to lock or unlock the player controls
- Locked player mode that hides the control chrome except the lock button.
- Continuous scrub preview popup above the seek bar while seeking.
npm install
npx expo startBecause the project uses a native HTTP server module, use a custom development build instead of Expo Go.
npm install -g eas-cli
eas login
eas build:configure
eas build -p android --profile previewdevelopment: installable dev client APKpreview: installable APK for testersproduction: Play Store AAB
Local and GitHub release builds use the same metadata source:
versionNamecomes fromapp.jsonversionCodedefaults to1000000 + git rev-list --count HEAD
That keeps the package version in sync for the same commit across local builds and the GitHub release workflow.
Build a local release APK from the Android project:
cd android
./gradlew assembleReleaseOutput file:
android/app/build/outputs/apk/release/vplayer-<versionName>-<versionCode>.apk
Build an ARM64-only APK:
cd android
./gradlew assembleRelease -PreactNativeArchitectures=arm64-v8aTo let a local APK upgrade the GitHub release APK already installed on your device, build with the same release keystore used by the workflow:
export VPLAYER_RELEASE_STORE_FILE=/absolute/path/to/vplayer-release.keystore
export VPLAYER_RELEASE_STORE_PASSWORD=...
export VPLAYER_RELEASE_KEY_ALIAS=...
export VPLAYER_RELEASE_KEY_PASSWORD=...
cd android
./gradlew assembleRelease -PreactNativeArchitectures=arm64-v8aWithout those signing values, local assembleRelease falls back to the debug keystore, and Android will not install it over a release-signed GitHub build.
If you need to override the computed version for a one-off build, pass the same properties the workflow understands:
cd android
./gradlew assembleRelease \
-PVPLAYER_VERSION_NAME=1.0.2 \
-PVPLAYER_VERSION_CODE=123 \
-PreactNativeArchitectures=arm64-v8aBefore running Gradle locally, make sure Android SDK and JDK 17 are configured. You can either set ANDROID_HOME / ANDROID_SDK_ROOT, or create android/local.properties with:
sdk.dir=/Users/<your-user>/Library/Android/sdk- Launch the app on an Android phone.
- Open the Upload tab and note the local URL.
- Visit that URL from a browser on the same Wi-Fi network and upload a video.
- Open Library and play the uploaded file.
Back: leave the player and save playback progress.Next: jump to the next video in the queue when available.-10/+10: seek backward or forward by ten seconds.- Scrub the progress bar to preview frames in a popup before releasing.
- Tap the center lock button to hide the rest of the controls.
- When the device sleeps and wakes again, playback stays paused and the player returns to unlocked mode.
- Current work is focused on Android first.
- iOS local network permissions and packaging can be added later.