Transfer files with ease over a network.
QRServ is a file sharing application that utilizes its own HTTP server to serve files while having a clean & functional user interface.
The app is a native Android app written in Kotlin with Jetpack Compose. Prior to v4.0.0, it was built with Flutter/Dart.
- QR Code
- Tap to show the URL in a tooltip
- Press and hold to copy the URL to the clipboard
- Share sheet
- Share the download URL via the system share sheet
- Import files via the system share sheet from other apps
- Sharing text with the app creates a text file to share
- Shows live import progress, whether for a single file or multiple
- Multi-file selection
- Bundled into a ZIP archive
- Press and hold the archive's filename to see the originally selected files in a tooltip
- Direct Access Mode -- serves the file directly from storage instead of copying it into app cache first, ideal for large files
- Single file selection only
- Always available on the GitHub release; Play Store builds only support it on Android 10 or earlier (see Play Store and GitHub version differences)
- Toggle-able in settings
- Detects if the selected file is removed while being served, or modified (Direct Access Mode only)
- Show or hide the filename in the download URL
- Notifies when a client requests or finishes downloading the file, including their IP address
- Resumes interrupted downloads in supported software
- Choose which network interface's IP address to serve from -- the server only listens on that address unless listening on all interfaces is enabled in settings
- Switches to another IP address if the selected one disappears, and suggests better ones as they appear
- Private hotspot (Android 13 or later) -- shares over a Wi-Fi network the app creates, reachable only by devices you let join
- Scan a Wi-Fi QR code to join, or enter the network name and password by hand
- Switch an ongoing share to or from the private hotspot without selecting the file again
- Chooses 5 GHz for faster transfers on Android 16 or later, or 2.4 and 5 GHz at once on devices that can run both; the preferred band can be changed in settings
- If a device can't find the network, the hotspot screen can restart it on 2.4 GHz, which every device supports
- On Android 13 to 15 the band can't be chosen, so the device's default is used (usually 2.4 GHz). Some devices can't host a 5 GHz hotspot at all
- Keeps sharing while the app is in the background, with a notification to stop sharing
- Stops sharing after a set time without downloads (10 minutes by default, or off), with a notification saying why
- HTTP server binds to a random free port by default, or a user-configured one
- In-app theme selection
- Supports various languages: English, French, German, Hungarian, Italian, Polish, Portuguese, Spanish, Russian, Turkish, Persian, Hebrew
- System: Android
- Minimum version: 7.0
- Private hotspot: Android 13 or later (choosing the band, including 5 GHz: Android 16 or later, on supported devices)
Releases can be found in the releases section of this repository.
Note: Android builds on GitHub will have a different certificate than builds on the Play Store. In other words, you cannot upgrade a build from installation source A via source B, and vice versa.
As you may be aware, there are two different Android builds of this application. This section will cover the differences.
- Direct Access Mode is not available for Android 11 or later due to the
MANAGE_EXTERNAL_STORAGEruntime permission requirement (see issue #20).- In short, Google Play became far stricter about the usage of such sensitive permissions in June 2024.
- The MediaStore API has its own limitations for this use case that would require a substantial amount of custom implementation to work around.
- Direct Access Mode is available for all supported Android versions, as
MANAGE_EXTERNAL_STORAGEcan be used to allow support for Android 11 or later.
By default, the source code builds the GitHub version. The version used for the Play Store uses the build command ./gradlew bundleRelease -PNO_MES=true so that the MANAGE_EXTERNAL_STORAGE permission gets patched out and the build would be accepted.
The last desktop builds (Windows, Linux) can be found in the releases section under v1.1.1. These predate the Kotlin rewrite and can no longer be built from the current source, which targets Android only.
If you are considering contributing to QRServ or reporting issues, more information can be found here.
Ensure you have the Android NDK installed to build a release variant. You may need to specify ndk.dir in the local.properties file.
The NDK is used by the no-build-id plugin (see noBuildId.ndkDirectory in the app Gradle build file) to strip .note.gnu.build-id from native libraries for reproducible builds. If you do not need this, you can remove that plugin block.
Google Play and the Google Play logo are trademarks of Google LLC.
Nunito (the font) is licensed under OFL-1.1.
QRServ is licensed under the MIT license.
New and existing translations are very welcome via issue, pull request, or even email. Credit will be given unless opted out.
Thanks to the following users for helping with language translation:
| User | Language(s) |
|---|---|
| miklosakos | Hungarian |
| MrRocketFX | Polish |
| utf-4096 | French |
| SimoneG97 | Italian |
| guidov2006 | Spanish |
| SapphicMoe | Russian |
| metezd | Turkish |
| princessmortix | Portuguese |
| alr86 | Persian |
| vhhhl | German |
| elid34 | Hebrew |









