A lightweight file transfer application written in Rust.
urbanSend is an experimental project focused on understanding how modern peer-to-peer file sharing applications work under the hood. The long-term goal is to create a fast, cross-platform file transfer tool inspired by solutions like LocalSend, while learning networking, systems programming, and Rust along the way.
urbanSend is heavily under development.
Features, networking behavior, and internal architecture may change at any time. Expect bugs, breaking changes, unfinished functionality, and protocol modifications as the project evolves.
The primary goal right now is learning, experimentation, and building the foundations of a future cross-platform file transfer application.
- Send files over TCP
- Receive files over TCP
- Supports large files (tested with files over 1 GB)
- IPv6 support
- No external servers
- Pure Rust implementation
The project can:
- Start a receiver that listens for incoming connections.
- Connect a sender to the receiver.
- Transfer a file.
- Save the received file on the destination machine.
How to setup Rust?
git clone https://www.github.com/nivedhz/urbanSend-cli
cd urbanSend/
cargo install --path .Open a terminal and run:
urbanSend receiveThe receiver will start listening for incoming file transfers.
Open another terminal and run:
urbanSend send "/path/to/file"Specifying the file paths in quotes would be mandatory for certain file names.!
Example:
urbanSend send "/home/user/Videos/video.mkv"The sender will:
- Connect to the receiver.
- Transfer the file.
- Disconnect automatically after the transfer completes.
Receiver:
[*] Server listening on 8080
[*] Discovery service listening on 9999
[*] Sending response back directly to 172.20.10.11:42880
[*] Sent 14 bytes
[*] Connection established from 172.20.10.11:58508
[*] Receiving file: video.mkv (1112000827 bytes)
[*] Received file: video.mkv -> Saved to: "/home/user/Downloads/urbanSend/video.mkv"
[!] 172.20.10.11:58508 disconnected
Sender:
[*] Bound to 0.0.0.0:42880
[*] Waiting for responses...
[*] Received 14 bytes from 172.20.10.11:9999
[*] Found devices automatically:
1) 172.20.10.11:9999
[*] Attempting connection to server at 172.20.10.11:8080...
[*] Connected to server successfully!
[00:00:00] [||||||||||||||||||||||||||||||||||||||||] 1.04 GiB/1.04 GiB (0s)
[*] Sent "video.mkv" of 1112000827 bytes to 172.20.10.11:8080
- Multiple device support
- Transfer progress reporting
- Transfer speed metrics
- Resume interrupted transfers
- File integrity verification
- Better error handling
- Transfer confirmations
- Device authentication
- End-to-end encryption
- Desktop application
- Android application
- iOS application
- Cross-platform GUI
This project exists primarily as a learning journey.
Rather than treating networking as a black box, urbanSend is being built from the ground up to explore:
- TCP/IP networking
- File transfer protocols
- Service discovery
- Concurrency
- Systems programming
- Rust
Every feature is implemented incrementally with the goal of understanding the underlying technology rather than simply using it.
MIT