Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -53,9 +53,9 @@ This setup live-reloads the site and forwards `/api/*` requests to the emulator.

- for code changes, Use commit messages with tags, e.g.:

- `fix(server): handle large file uploads`
- `feat(main): add new button`
- `tests: add tests for upload endpoint`
- `fix(server): improve error handling for large file uploads`
- `feat(ui): add progress indicator for file transfers`
- `perf(server): optimize streaming for multi-GB files`

- Fork the repo and create a branch for your change.
- Open a pull request
Expand Down
133 changes: 55 additions & 78 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,97 +1,74 @@
# Transfer

A simple local file server app for Android. Download and upload files quickly across devices over Wi-Fi — no cables, no cloud.

<table>
<tr>
<td>
<img src="fastlane/metadata/android/en-US/images/phoneScreenshots/01.png" width="150px" />
<img src="fastlane/metadata/android/en-US/images/phoneScreenshots/02.png" width="150px" />
<img src="fastlane/metadata/android/en-US/images/phoneScreenshots/03.png" width="150px" />
<img src="fastlane/metadata/android/en-US/images/phoneScreenshots/04.png" width="150px" />
<img src="fastlane/metadata/android/en-US/images/phoneScreenshots/05.png" width="150px" />
<img src="fastlane/metadata/android/en-US/images/phoneScreenshots/06.png" width="150px" />
</td>
</tr>
</table>

Transfer makes sharing files across your local network incredibly straightforward. Think of it as a temporary USB stick you can access from any computer or device with a web browser — but without the physical stick, powered by a clean and simple UI.

Basically, a better alternative to running `uploadserver` through Termux.

## The Problem It Solves

Imagine you need to transfer a file between your laptop and desktop — but you just want to send the file and move on:

* You don’t have a USB stick or cable handy
* You don’t want to configure SMB (enable/run Samba, then download a client)
* You don’t want to use the cloud — either because it’s slow, unprivate, or you simply don’t have easy access to it

## Key Features

* **Effortless LAN Sharing**: Once Transfer is active, it serves files from your chosen shared folder over HTTP. Any device on the same Wi-Fi can connect using a simple web address shown in the app.
* **Configurable Security**:
* **IP Permissions**: By default, new devices attempting to connect trigger an "Allow/Deny" popup on your phone, giving you control over who accesses your files. This can be turned off for trusted networks.
* **Password Protection**: For an added layer, you can secure access with a password (off by default).
* **Powerful CLI Access (curl-friendly)**:
* Transfer works great with command-line tools. Upload files directly using `curl -T yourfile.txt <your-phone-ip>:8000`.Also,you can download files using`curl <phone-ip>:8000/yourfile.txt`.
* **Dual Browse UI**: Manage and access your shared files directly within the Transfer app on your Android device, or through the intuitive web interface on any connected computer.
* **Quick In-App Transfers**:
* **Upload**: Easily select files from your phone’s storage to add them to the shared folder.
* **Paste**: Paste text from your phone’s clipboard directly into a new `.txt` file in the shared folder with a single tap.

## How to get the app
#### Recommended ways:
1. from [IzzyOnDroid](https://apt.izzysoft.de/fdroid/index/apk/com.matanh.transfer) (use an F-Droid client like Neo Store, Droid-ify, or add IzzyOnDroid repo.)

<a href="https://apt.izzysoft.de/fdroid/index/apk/com.matanh.transfer">
<img alt="Get it on IzzyOnDroid" src="https://gitlab.com/IzzyOnDroid/repo/-/raw/master/assets/IzzyOnDroidButtonGreyBorder_nofont.png" height="54">
<h1 align="center">Transfer</h1>

<p align="center">
<a href="https://github.com/matan-h/Transfer/releases">
<img src="https://img.shields.io/badge/version-0.5.0-blue.svg" alt="Version">
</a>
<a href="LICENSE">
<img src="https://img.shields.io/badge/license-MIT-green.svg" alt="License">
</a>
<a href="https://developer.android.com/about/versions/10">
<img src="https://img.shields.io/badge/platform-Android%2029+-brightgreen.svg" alt="Android">
</a>
</p>

2. [from Google play!](https://play.google.com/store/apps/details?id=com.matanh.transfer) - new
<p align="center"><strong>A simple local file server for Android</strong></p>

#### Other ways
Directly from [github releases](https://github.com/matan-h/Transfer/releases) (and you can also point Obtainium to this link.)
<p align="center">
Transfer files instantly across devices over Wi-Fi – no cables, no cloud, no hassle.
</p>

## Getting Started
## Screenshots

1. Install and open Transfer on your Android device.
2. Grant necessary permissions and select a folder you wish to share (suggestion: create a new folder called `Storage` in your home directory).
3. Tap "Start Server."
4. The app will display an IP address (e.g., `http://192.168.1.X:8000`).
5. Open this address in a web browser on any other device connected to the same Wi-Fi network.
6. You're in! If IP permissions are on (default), you'll get a prompt on your phone to allow the new device.
<p align="center">
<img src="fastlane/metadata/android/en-US/images/phoneScreenshots/01.png" width="150px" />
<img src="fastlane/metadata/android/en-US/images/phoneScreenshots/02.png" width="150px" />
<img src="fastlane/metadata/android/en-US/images/phoneScreenshots/03.png" width="150px" />
<img src="fastlane/metadata/android/en-US/images/phoneScreenshots/04.png" width="150px" />
<img src="fastlane/metadata/android/en-US/images/phoneScreenshots/05.png" width="150px" />
<img src="fastlane/metadata/android/en-US/images/phoneScreenshots/06.png" width="150px" />
</p>

It's designed to be that simple. Enjoy your new wireless drive.
## Features

## FAQ
### Why does my browser show an error?
If your browser displays errors like `ERR_SSL_PROTOCOL_ERROR`, `ERR_CONNECTION_CLOSED`, or `SSL_ERROR_RX_RECORD_TOO_LONG`, it's probably because you're trying to open the site using **HTTPS** instead of **HTTP**. To fix, change the URL from `https://...` to `http://....`
- **One-tap server**: Start HTTP server instantly
- **Cross-platform**: Access from any device with a web browser
- **Secure**: Device permissions and optional password protection
- **CLI-friendly**: Works with `curl` and command-line tools
- **No internet required**: Works over local Wi-Fi only

## Installation

### Can I set a specific IP address to use every time?
Yes, you can set a [static IP](https://junipersys.com/support/article/14695) on your Android device.
**Recommended:**
- [IzzyOnDroid](https://apt.izzysoft.de/fdroid/index/apk/com.matanh.transfer) (F-Droid)
- [Google Play Store](https://play.google.com/store/apps/details?id=com.matanh.transfer)

### Can I use Transfer without an internet connection?
Yes, Transfer works over your local Wi-Fi network, so an internet connection is not required. However, all devices must be connected to the same local network.
**Alternative:**
- [GitHub Releases](https://github.com/matan-h/Transfer/releases)

### What happens to files I share/upload to the Transfer
Transfer copy the files to the shared folder you set earlier.
## Quick Start

### What happens if you click `T0` in the app version screen
It becomes `T1` :)
1. Install Transfer and select a folder to share
2. Tap "Start Server"
3. Open the displayed IP address in any browser on the same Wi-Fi
4. Allow access when prompted

## Planned changes
## Usage

- [ ] add an option to change the port in the settings
- [ ] fallback to hotspot IP in the display.
- [x] automatically update the IP when Wifi changes
1. Upload file(s)
2. Download file(s)
- Both in the app and the web interface.

## FAQ

**Browser shows SSL errors?** Use `http://` not `https://`
**Need consistent IP?** Set up a [static IP](https://junipersys.com/support/article/14695) on your device
**Files location?** Uploaded files go to your selected shared folder

## Contributing

Any contributions, bugs, or feedback are welcome!
Feel free to open an issue or PR.
To get started, look at the `CONTRIBUTING.md` file
Check [CONTRIBUTING.md](CONTRIBUTING.md) for guidelines. Issues and PRs welcome!

## License
this repo is Licensed under the MIT license.

MIT License – see [LICENSE](LICENSE) file.
44 changes: 43 additions & 1 deletion app/src/main/assets/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,25 @@ <h2>Available Files</h2>
</main>

<footer>
<p>Transfer App</p>
<div class="footer-content">
<p>Transfer App</p>
<div class="refresh-controls">
<button id="manual-refresh-button" class="refresh-button" title="Refresh files">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor">
<path d="M17.65 6.35C16.2 4.9 14.21 4 12 4c-4.42 0-7.99 3.58-7.99 8s3.57 8 7.99 8c3.73 0 6.84-2.55 7.73-6h-2.08c-.82 2.33-3.04 4-5.65 4-3.31 0-6-2.69-6-6s2.69-6 6-6c1.66 0 3.14.69 4.22 1.78L13 11h7V4l-2.35 2.35z"/>
</svg>
Refresh
</button>
<div id="auto-refresh-status" class="auto-refresh-status">
<span id="refresh-timer-text">Auto-refresh: Off</span>
</div>
<button id="refresh-settings-button" class="settings-button" title="Configure auto-refresh">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor">
<path d="M12,15.5A3.5,3.5 0 0,1 8.5,12A3.5,3.5 0 0,1 12,8.5A3.5,3.5 0 0,1 15.5,12A3.5,3.5 0 0,1 12,15.5M19.43,12.97C19.47,12.65 19.5,12.33 19.5,12C19.5,11.67 19.47,11.34 19.43,11L21.54,9.37C21.73,9.22 21.78,8.95 21.66,8.73L19.66,5.27C19.54,5.05 19.27,4.96 19.05,5.05L16.56,6.05C16.04,5.66 15.5,5.32 14.87,5.07L14.5,2.42C14.46,2.18 14.25,2 14,2H10C9.75,2 9.54,2.18 9.5,2.42L9.13,5.07C8.5,5.32 7.96,5.66 7.44,6.05L4.95,5.05C4.73,4.96 4.46,5.05 4.34,5.27L2.34,8.73C2.22,8.95 2.27,9.22 2.46,9.37L4.57,11C4.53,11.34 4.5,11.67 4.5,12C4.5,12.33 4.53,12.65 4.57,12.97L2.46,14.63C2.27,14.78 2.22,15.05 2.34,15.27L4.34,18.73C4.46,18.95 4.73,19.03 4.95,18.95L7.44,17.94C7.96,18.34 8.5,18.68 9.13,18.93L9.5,21.58C9.54,21.82 9.75,22 10,22H14C14.25,22 14.46,21.82 14.5,21.58L14.87,18.93C15.5,18.68 16.04,18.34 16.56,17.94L19.05,18.95C19.27,19.03 19.54,18.95 19.66,18.73L21.66,15.27C21.78,15.05 21.73,14.78 21.54,14.63L19.43,12.97Z"/>
</svg>
</button>
</div>
</div>
</footer>

<!-- Custom Confirmation Modal HTML -->
Expand All @@ -87,6 +105,30 @@ <h2>Available Files</h2>
</div>
</div>

<!-- Refresh Settings Modal -->
<div id="refresh-settings-modal-overlay" class="modal-overlay">
<div class="modal-content">
<h3>Auto-Refresh Settings</h3>
<div class="settings-form">
<div class="setting-item">
<label for="refresh-enabled-checkbox">
<input type="checkbox" id="refresh-enabled-checkbox">
Enable auto-refresh
</label>
</div>
<div class="setting-item">
<label for="refresh-interval-input">Refresh interval (seconds):</label>
<input type="number" id="refresh-interval-input" min="5" max="300" value="30">
<small>Between 5 and 300 seconds</small>
</div>
</div>
<div class="modal-buttons">
<button id="settings-save-button">Save</button>
<button id="settings-cancel-button">Cancel</button>
</div>
</div>
</div>

<script src="/assets/script.js"></script>

</body>
Expand Down
Loading