# FtpServer: a one click FTP server with a Tkinter control panel

> FtpServer is a Windows desktop application that starts an FTP server from a Tkinter interface, with a system tray icon, multiple users with per user root directories, IPv4 and IPv6, and optional FTPS encryption. It is built on pyftpdlib and is meant for moving files to and from other devices on your network.

**jark006/FtpServer** — 一键开启FTP文件服务器，方便其他设备通过网络传输、管理文件，支持IPv4/IPv6、多用户、FTPS。

- Repository: https://github.com/jark006/FtpServer
- Website: https://jark006.github.io/FTPServer/
- Stars: 683 · Forks: 63
- Language: Python
- License: MIT
- Published: 2026-10-21 · Updated: 2026-10-21 · Language: en
- Canonical page: https://hysenlabs.com/projects/jark006-ftpserver

## The problem it solves, in one line

The project description is a single sentence that states the whole idea: a one click switch to start an FTP file server, making it convenient to transfer and manage files from other devices over the network, with support for IPv4 and IPv6, multiple users, and FTPS. The homepage is jark006.github.io/FTPServer/, the primary language is Python, the licence is MIT, the default branch is main, and the recent release tags are v1.26 from 2026-04-18, v1.25 from 2026-04-16 and v1.24 from 2026-03-03. The last push was on 2026-05-03, so the code has not moved for a few months. The README is written in Chinese, and the topic list names the stack directly with ftp, ftp-server, gui, python, tkinter, tkinter-gui and windows, and the platform badge reads Windows 10/11 64 bit.

## The libraries it is built on

The README has a section listing the libraries in use, and it names four: pyftpdlib, tkinter, pystray and Pillow. pyftpdlib is the FTP server implementation itself, and the reference link in the permissions section points at its authorizers API, which tells you the multi user model is built on pyftpdlib's DummyAuthorizer. tkinter provides the desktop interface, pystray provides the system tray icon that the README describes as a tray icon with a right click menu, and Pillow handles images, which for a server application means the icon and any preview work. The requirements.txt file in the repository is a slightly different list, with Pillow, pywin32, pystray, pyopenssl, pyasynchat and windows-curses, so the Windows specific packages are declared there. The repository also carries a mypyftpdlib/ directory, which is a vendored copy of the server library, and that is why the README can describe permissions in terms of specific FTP commands.

## Turning on FTPS, and what it costs

The default is plain FTP, and the README is explicit that data is transferred in clear text unless you change it. Two routes are given for enabling encrypted transfer. The first is inside the application, by choosing the option to generate an FTPS TLS/SSL certificate from the right click menu on the tray icon. The second is to generate the certificate files yourself with openssl on Linux or in a MinGW64 terminal, and the README is emphatic about one detail: do not rename the files, put ftpServer.key and ftpServer.crt in the program directory, and encrypted transfer is enabled when both files are present at startup.

```sh
openssl req -x509 -newkey rsa:2048 -keyout ftpServer.key -out ftpServer.crt -nodes -days 3653
```

The cost of the encryption is stated plainly as well. The README says encrypted transfer affects transfer performance and that the maximum rate drops to around 50MiB/s, and it notes that if your security requirements are not that high, encryption is not recommended. It also warns that the Windows file manager supports explicit FTPS poorly and recommends the open source WinSCP client instead, which handles FTPS better.

## Multi user setup through a CSV file

For a single user, the README says you just set a username and password on the main page. For several users, you create a file called FtpServerUserList.csv in the program directory and edit it with Excel or a text editor, one configuration per line. The columns are the username, restricted to English letters with case and digits, the password, the permissions, and the root directory path. The sample table in the README shows the shape.

```text
|           |        |            |              |
| --------- | ------ | ---------- | ------------ |
| JARK006   | 123456 | readonly   | D:\Downloads |
| JARK007   | 456789 | readwrite  | D:\Data      |
| JARK009   | abc456 | elradfmwMT | D:\FtpRoot   |
| anonymous |        | elr        | D:\FtpRoot   |
```

The permissions column is the interesting one, and the README documents it in detail. You can use readonly or readwrite, or the word for custom, and then combine individual letters, with case mattering. The read side is e to change directory with the CWD command, l to list files with LIST, NLST, STAT, MLSD, MLST, SIZE and MDTM, and r to retrieve files with RETR. The write side is a to append with APPE, d to delete with DELE and RMD, f to rename with RNFR and RNTO, m to make a directory with MKD, w to store with STOR and STOU, M to change file mode with SITE CHMOD, and T to update the last modified time with MFMT.

## The rules that keep the user list working

Four operational notes in the README are the difference between a working multi user setup and a confusing one. If a valid configuration is read, the user and password settings on the main interface are automatically disabled, so the two sources of truth do not fight each other. Passwords must not contain the English comma character, because that would break the CSV format. If you do not need the multi user configuration, you can delete the file or rename it to something else. And the file may be encoded in UTF-8 or GBK. The anonymous entry has a special meaning: it is the anonymous user, it is allowed to have no password, and every other user must have one. The permission letters themselves map to concrete FTP commands, which is a good reminder that this is a permission model defined by the protocol rather than by an application specific role system.

## How the program is put together on disk

The repository layout is a plain Python desktop application rather than a packaged framework. There is ftpServer.py as the main program, Settings.py for the configuration, UserList.py for reading the user list, and myUtils.py for helper functions. The mypyftpdlib/ directory holds the vendored server library, alongside build-nuitka.ps1, a PowerShell script for building with Nuitka. The icon file ftpServer.ico and a preview.png sit at the root, and there is an AGENTS.md and a CLAUDE.md, which are the files that tell an AI coding assistant how to work in this repository. There is also a .vscode/ directory for editor configuration. The application itself is Python with a Tkinter interface rather than a compiled binary, so the runnable dependency list in requirements.txt is the real installation requirement, and the Windows specific packages in that file, pywin32 and windows-curses, are a fair signal about the platform this was built for.

## The limits, and what to use instead

Two limits are clear from the README. The first is that the default is clear text FTP, and the encrypted alternative costs you roughly two thirds of the transfer speed, which is a poor trade on a fast local network but a sensible one on a hostile one. The second is that the whole tool is aimed at a Windows desktop with a tray icon, and the README's own advice is that Windows Explorer handles explicit FTPS badly, which is a sign of how much of the intended use is local network transfers with a real client such as WinSCP. The alternative to weigh is the operating system's own file sharing, which on Windows means SMB shares over the local network, and on macOS and Linux means an SSH file transfer client. The difference in approach is that a system share is a mounted filesystem that both sides see as ordinary files, while FTP is a protocol with its own client, its own permission model and, in this implementation, its own user list file. If the goal is a mounted folder for a colleague, the system share is simpler; if the goal is a scripted transfer, an FTP client is closer to what you want. Either way, the FTP protocol itself is the weak point, and a tool that defaults to clear text on a shared network deserves a deliberate decision rather than a default.

## Conclusion

Adopt FtpServer if you need to hand files to another device on your network quickly and want a graphical control panel rather than a command line FTP daemon, since the tray icon, the CSV based user list and the FTPS toggle are all built in. Do not adopt it for internet facing transfers, because the README says plain FTP is the default and the encrypted mode cuts the maximum transfer rate to around 50MiB/s. Before you open the service, decide whether FTPS is needed, read the permissions table so the letters in your user list mean what you intend, and keep the passwords free of commas, since the README warns that a comma in a password breaks the CSV format.

## FAQ

### What is FtpServer and what does it do?

It is a Windows desktop application that starts an FTP file server with one click, so other devices can transfer and manage files over the network. It supports IPv4 and IPv6, multiple users, and FTPS, and it is built with Python and Tkinter on top of pyftpdlib.

### How do I enable FTPS encryption in FtpServer?

Either pick the option to generate an FTPS TLS/SSL certificate from the right click menu of the tray icon, or generate the files yourself with openssl, producing ftpServer.key and ftpServer.crt, and place them in the program directory without renaming them. The README says the maximum transfer rate drops to around 50MiB/s when encryption is on.

### How do I configure multiple users in FtpServer?

Create a file called FtpServerUserList.csv in the program directory with one configuration per line, giving username, password, permissions and root directory path. The README says that if a valid configuration is read, the user and password settings on the main page are automatically disabled.

### What do the permission letters in the FtpServer user list mean?

Read permissions are e to change directory, l to list files and r to retrieve files. Write permissions are a to append, d to delete, f to rename, m to make a directory, w to store a file, M to change file mode and T to update the last modified time. You can also use readonly or readwrite, and case matters.

### Which FTP client does the FtpServer README recommend?

The README says the Windows file manager supports explicit FTPS poorly and recommends the open source client WinSCP, which supports FTPS better. It also warns that passwords must not contain the English comma character, because that would conflict with the CSV format.

## Sources

- [jark006/FtpServer on GitHub](https://github.com/jark006/FtpServer)
- [License: MIT](https://github.com/jark006/FtpServer/blob/main/LICENSE)
- [Project website](https://jark006.github.io/FTPServer/)
- [README](https://github.com/jark006/FtpServer/blob/main/README.md)
- [Releases](https://github.com/jark006/FtpServer/releases)

---

Hysen Labs editorial analysis, written from the project's own repository and release notes. Cite the canonical page: https://hysenlabs.com/projects/jark006-ftpserver
