A terminal-based application for transferring files and directories between laptops on a local network. Features real-time progress tracking, file integrity verification, and cross-platform network interface detection.
Transfer files and directories directly over a local network without requiring internet connectivity. Uses reliable, blocking TCP communication with configurable buffering and retry behavior.
Built using Pythonโs curses library:
- ๐ Color-coded status indicators
- ๐ Real-time progress bars with speed and ETA
- ๐ฅ๏ธ Responsive layout that adapts to terminal size
- โจ๏ธ Simple keyboard-driven navigation
Transfers include cryptographic hash verification to ensure data integrity. Sender and receiver hashing logic is handled independently to correctly account for platform and timing differences.
All transfer behavior is controlled by a single config.json file.
- Network tuning: port selection, buffer sizes, keepalive, timeouts, and automatic retries for unstable connections.
- Data integrity: SHA-256 hashing with configurable chunk sizes, plus an option to skip verification when speed matters.
- Safety limits: hard caps on file size and directory contents to prevent accidental abuse.
- Transfer modes: explicit support for both file and directory transfers.
- Progress feedback: frequent, lightweight progress updates suitable for CLI or UI use.
This setup keeps the binary static and the behavior flexible, making deployment, tuning, and distribution refreshingly painless.
Below are a few practical presets you can drop in depending on what you care about today: raw speed, maximum safety, or not angering your network admin.
{
"PORT": 8888,
"BUFFER_SIZE": 262144,
"HASH_CHUNK_SIZE": 262144,
"SERVER_TIMEOUT": 2.0,
"RECEIVED_DIR": "received_files",
"HASH_ALGORITHM": "sha256",
"SKIP_HASH_VERIFICATION": true,
"TRANSFER_TYPES": {
"FILE": "file",
"DIRECTORY": "directory"
},
"CONNECTION_TIMEOUT": 60,
"KEEPALIVE_ENABLE": true,
"RETRY_ATTEMPTS": 1,
"RETRY_DELAY": 1,
"MAX_FILE_SIZE_MB": 4096,
"MAX_DIRECTORY_FILES": 2000,
"PROGRESS_UPDATE_INTERVAL": 0.25
}{
"PORT": 8888,
"BUFFER_SIZE": 32768,
"HASH_CHUNK_SIZE": 32768,
"SERVER_TIMEOUT": 5.0,
"RECEIVED_DIR": "received_files",
"HASH_ALGORITHM": "sha256",
"SKIP_HASH_VERIFICATION": false,
"TRANSFER_TYPES": {
"FILE": "file",
"DIRECTORY": "directory"
},
"CONNECTION_TIMEOUT": 300,
"KEEPALIVE_ENABLE": true,
"RETRY_ATTEMPTS": 5,
"RETRY_DELAY": 5,
"MAX_FILE_SIZE_MB": 1024,
"MAX_DIRECTORY_FILES": 800,
"PROGRESS_UPDATE_INTERVAL": 0.1
}{
"PORT": 8888,
"BUFFER_SIZE": 65536,
"HASH_CHUNK_SIZE": 65536,
"SERVER_TIMEOUT": 2.0,
"RECEIVED_DIR": "received_files",
"HASH_ALGORITHM": "sha256",
"SKIP_HASH_VERIFICATION": false,
"TRANSFER_TYPES": {
"FILE": "file",
"DIRECTORY": "directory"
},
"CONNECTION_TIMEOUT": 120,
"KEEPALIVE_ENABLE": true,
"RETRY_ATTEMPTS": 3,
"RETRY_DELAY": 2,
"MAX_FILE_SIZE_MB": 1024,
"MAX_DIRECTORY_FILES": 800,
"PROGRESS_UPDATE_INTERVAL": 0.1
}The internal structure is organized to support multiple transfer methods:
- Each transfer method lives in its own module
- Core utilities are shared and transport-agnostic
- LAN transfer remains the reference implementation
- Designed to support future BLE, USB, or other transfer modes
๐ฅ Receive Mode Active
๐ฏ Listening on 192.168.1.105:8888
๐พ Files will be saved in 'received_files' folder
๐ Ensure sender uses this IP to connect
๐ฅ Connection from 192.168.1.108
๐ Receiving Directory: ProjectFiles
๐ 127 files, 856.3 MB
๐ Receiving ProjectFiles
[โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ] 67.3%
576.2 MB/856.3 MB | 32.1 MB/s | ETA: 00:08
๐ [89/127] src/components/Dashboard.jsx
๐ค Sending File: presentation.pdf
๐ Size: 12.4 MB
๐ฏ Target: 192.168.1.105
๐ Connecting to 192.168.1.105...
๐ Calculating file hash...
๐ค Sending presentation.pdf
[โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ] 100.0%
12.4 MB/12.4 MB | 8.7 MB/s | ETA: Complete!
โ
File sent successfully!
- Download the latest version from GitHub Releases page
- Edit
config.jsonor leave it for default settings - Run it.
No Python installation required.
- Python 3.7 or higher
psutil(for network interface detection)
git clone https://github.com/yourusername/tetherfile.git
cd tetherfile
pip install psutil
python main.pyOn startup, the application first prompts you to choose the transfer method:
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ SELECT CONNECTION TYPE โ
โ โ
โ 1. LAN / WiFi Connection โ
โ 2. Bluetooth Connection (Coming Soon) โ
โ 3. USB Wire Connection (Coming Soon) โ
โ โ
โ Q. Quit โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
Select connection type:
NOTE: The current version only supports LAN/WiFi transfers. Bluetooth and USB options are placeholders for future updates.
After selecting LAN / WiFi, the application scans for available network interfaces and displays them for selection:
๐ Found 3 network interface(s):
1. ๐ Ethernet Network - 192.168.86.1
2. ๐ถ WiFi Network - 192.168.1.14
Select interface (or ESC to cancel)
Once a network interface is selected, the main menu is displayed:
- Send File - Transfer a single file to a target device
- Send Directory - Transfer an entire folder recursively
- Start Receiving Mode - Listen for incoming transfers
- Change Network Interface - Switch to a different adapter
- Exit - Close the application
- Select Start Receiving Mode from the main menu
- Note the displayed IP address and port
- Share this information with the sender
- Press 'Q' to stop receiving mode
- Files are saved to the configured receive directory
- Ensure the target device is already in receiving mode
- Select Send File or Send Directory
- Enter the target IP address when prompted
- Provide the file or directory path (drag-and-drop paths are supported in most terminals)
- Monitor transfer progress in real time