FTP-WinMount
Mount any FTP server as a local Windows drive. No sync, no ads, no telemetry.
Download
No Python required. Download from GitHub Releases.
Installer (Recommended)
- Install WinFsp (required dependency)
- Download
ftp-winmount-X.X.X-setup.exe - Run the installer (installs to Program Files and adds to PATH)
- Open any terminal and run:
ftp-winmount mount --host 192.168.0.130 --port 2121 --drive Z
Portable
If you don't want to install:
- Install WinFsp (required dependency)
- Download
ftp-winmount-X.X.X-portable.exe - Run from wherever you saved it:
C:\Downloads\ftp-winmount-0.1.0-portable.exe mount --host 192.168.0.130 --port 2121 --drive Z
Why?
- VS Code's FTP plugins only sync files, they don't mount
- Commercial tools like RaiDrive and NetDrive come with ads and tracking
- Windows can't natively mount FTP as a drive letter
- You want to own your tools
Features
- Mount FTP server as a Windows drive letter (Z:, Y:, etc.)
- Full read/write support
- Works with any application (VS Code, File Explorer, Notepad, etc.)
- Anonymous or authenticated FTP
- Auto-reconnect on connection drop
- Lightweight, no background services when not in use
- Open source, no ads, no tracking
Requirements
Windows Dependencies
FTP-WinMount requires WinFsp (Windows File System Proxy) - a free, open-source file system driver that enables user-mode filesystems on Windows.
| Dependency | Version | Required | Download |
|---|---|---|---|
| Windows | 10 or 11 | Yes | - |
| Python | 3.10+ | Yes | python.org |
| WinFsp | 2.0+ | Yes | winfsp.dev/rel |
Installing WinFsp
Option 1: Download installer (Recommended)
- Go to https://winfsp.dev/rel/
- Download the latest
.msiinstaller - Run the installer (requires admin rights)
- Restart any open terminals
Option 2: Winget
winget install WinFsp.WinFsp
Option 3: Chocolatey
choco install winfsp
Verify Installation:
# Check WinFsp is installed
dir "C:\Program Files (x86)\WinFsp"
Installation
Installer (Easiest)
See Download section above. No Python required. Installs to Program Files and adds to PATH.
From PyPI
pip install ftp-winmount
This installs ftp-winmount to your Python Scripts folder. Make sure that folder is in your PATH.
Note: If you install inside a virtual environment, the command will only work when that venv is activated.
From Source
git clone https://github.com/dansasser/ftp-winmount.git
cd ftp-winmount
pip install .
Development Install
git clone https://github.com/dansasser/ftp-winmount.git
cd ftp-winmount
pip install -e ".[dev]"
Building Standalone Executable
To build ftp-winmount.exe yourself:
git clone https://github.com/dansasser/ftp-winmount.git
cd ftp-winmount
pip install -e ".[dev]"
python build_exe.py
The executable will be at dist/ftp-winmount.exe.
Building Installer
To build the Windows installer (requires Inno Setup):
python build_exe.py
iscc installer.iss
The installer will be at dist/ftp-winmount-X.X.X-setup.exe.
Quick Start
Mount an anonymous FTP server:
ftp-winmount mount --host 192.168.0.130 --port 2121 --drive Z
Your FTP server is now accessible at Z:\
To unmount:
ftp-winmount unmount --drive Z
Or just press Ctrl+C in the terminal.
Usage
Command Line
# Mount with minimal options
ftp-winmount mount --host 192.168.0.130 --drive Z
# Mount with custom port
ftp-winmount mount --host 192.168.0.130 --port 2121 --drive Z
# Mount with authentication
ftp-winmount mount --host ftp.example.com --user myuser --password mypass --drive Z
# Mount with config file
ftp-winmount mount --config config.ini
# Check status
ftp-winmount status
# Unmount
ftp-winmount unmount --drive Z
Configuration File
Create config.ini:
[ftp]
host = 192.168.0.130
port = 2121
username =
password =
[mount]
drive_letter = Z
volume_label = My FTP Drive
[cache]
directory_ttl_seconds = 30
[logging]
level = INFO
file = ftp-winmount.log
Then run:
ftp-winmount mount --config config.ini
Use with VS Code
- Mount your FTP server:
ftp-winmount mount --host 192.168.0.130 --port 2121 --drive Z
-
Open VS Code
-
File -> Open Folder -> Select
Z:\ -
Edit files normally. Changes save directly to the FTP server.
Use with Python's pyftpdlib
If you're running a simple FTP server with pyftpdlib:
Server (host machine):
pip install pyftpdlib
cd /path/to/your/files
python -m pyftpdlib -p 2121 -i 0.0.0.0 -w
Client (your machine):
ftp-winmount mount --host SERVER_IP --port 2121 --drive Z
Options
| Option | Description | Default |
|---|---|---|
--host |
FTP server hostname or IP | Required |
--port |
FTP server port | 21 |
--drive |
Drive letter to mount | Required |
--user |
FTP username | Anonymous |
--password |
FTP password | None |
--config |
Path to config file | None |
--verbose |
Enable debug logging | False |
Troubleshooting
"WinFsp not found" or "winfspy not available"
WinFsp must be installed system-wide. The Python package winfspy is just bindings.
- Download WinFsp from https://winfsp.dev/rel/
- Run the installer as administrator
- Restart your terminal
- Try again
"Drive letter in use"
Choose a different drive letter or unmount the existing drive:
net use Z: /delete
"Connection refused"
- Check the FTP server is running
- Check the IP address and port are correct
- Check firewall isn't blocking the connection
"Permission denied"
- For anonymous FTP, ensure the server allows anonymous access
- For authenticated FTP, check username and password
Files appear but can't be read
- FTP server may have disconnected
- Try unmounting and remounting
Slow performance
- Enable caching in config file
- Increase
directory_ttl_seconds - Check network connection to FTP server
Mount crashes or hangs
- Update to the latest version of WinFsp
- Check Windows Event Viewer for errors
- Run with
--verboseflag for detailed logs
Limitations
- Windows only - This tool uses WinFsp which is Windows-specific
- FTP protocol does not support file locking. Concurrent writes from multiple clients may cause issues.
- Some FTP servers don't report accurate file sizes or timestamps.
- Very large files (>1GB) may be slow due to FTP protocol limitations.
Development
Setup
git clone https://github.com/dansasser/ftp-winmount.git
cd ftp-winmount
python -m venv venv
venv\Scripts\activate
pip install -e ".[dev]"
Run Tests
pytest
Linting
ruff check ftp_winmount tests
ruff format ftp_winmount tests
Build Package
python -m build
twine check dist/*
Contributing
Contributions welcome. Please open an issue first to discuss major changes.
- Fork the repository
- Create a feature branch (
git checkout -b feature/amazing-feature) - Commit your changes (
git commit -m 'Add amazing feature') - Push to the branch (
git push origin feature/amazing-feature) - Open a Pull Request
License
MIT License. See LICENSE file.
Acknowledgments
Related Projects
Metadata
Release files for ftp-winmount 0.1.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| ftp_winmount-0.1.1.tar.gz | 52.9 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| ftp_winmount-0.1.1-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 78.5 kB
Release files / ftp_winmount-0.1.1.tar.gz
| Download URL | ftp_winmount-0.1.1.tar.gz |
|---|---|
| Size | 52.9 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
d8f77f3657eb957f88f8cecb24692e55f4eaeaf2dc3c53100b28a6ca474862b9
|
|
BLAKE2b-256 checksum How to use checksums |
574391ecc0eb8d76d63c2caeacc520dd8b60e9dcdcf94bbe689b247db27d4d1e
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.7
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Feb 5, 2026.
Transparency logRelease files / ftp_winmount-0.1.1-py3-none-any.whl
| Download URL | ftp_winmount-0.1.1-py3-none-any.whl |
|---|---|
| Size | 25.5 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
f6bdae903d3006d63aadf6c4c2aefb509e5b170d04f92907cda3d6eca8435e10
|
|
BLAKE2b-256 checksum How to use checksums |
eb2d3378339deb0bfca33e9a1c0aec9955daa8712afe8b2ec299d67e5fdc46d5
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.7
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Feb 5, 2026.
Transparency log