Need help with file-transfer?
Click the “chat” button below for chat support from the developer who created it, or find similar developers for support.

About the developer

134 Stars 12 Forks MIT License 39 Commits 1 Opened issues


A simple file transfer app

Services available


Need anything else?

Contributors list

No Data



A simple file transfer web app with support of P2P. Backend is written in Golang, frontend with React.


  • P2P file transfer is implemented using simple-filer, a webRTC tool also written by me :smiley:
  • upload progress is broadcast to all online users
  • page and all its files are auto expired and deleted after specified duration

How to use

I have deployed this app on my server, please go to You'll be redirected to another page with the URL like this:

On this page, you can upload 4 files at most(each file 5M at most), send the page URL to your friends. You don't need to wait for the upload to finish, then send the URL. Your friends will see the upload progress as you do. Each page will expire after 20 minutes, after that, all files are removed, and the page URL is no longer valid.

This is a personal site with limited network bandwidth and storage, don't expect too much from the server performance. However, if you and your friends are both online at he same time, you can try the P2P transfer(Chrome browser only) which copy the file between your browsers without going through server. The number of files and file size you can transfer in P2P mode is only limited by your computer hard drive. But P2P connection is not guaranteed to work 100%.

Here is a running screenshot:

running screesnshot


  • Go(>= 1.9.2)
  • MongoDB(>= 3.2)
  • Chrome browser for P2P file transfer
  • NodeJS(>=6.5) for client side JavaScript bundling


go get
cd $GOPATH/src/
go build -o filetransferd cmd/filetransferd/main.go

cd web npm install npm run build (for development environment) npm run ship (for production environment)


  • use supervisord: consult init/filetransferd.conf
  • manually: just move the
    binary and
    subdirectory is needed) to wherever you seem fit.

The absolute

directory need to be passed as
argument when run the binary, for example:
filetransferd -webRoot /var/www/filetransferd/web

command arguments(case matters)

  • serverPort
    default is
  • mgoHost
    mongoDB host IP and port, default is
  • mgoUsername
    mongoDB username, default is empty.
  • mgoPassword
    mongoDB password, default is empty.
  • mgoDBName
    mongoDB database name, default is
  • mgoCollectionName
    mongoDB collection name, default is
  • maxUpload
    the maximum allowed number of upload files for one page, default is 5.
  • maxFileSize
    the maximum allowed single filesize, default is 20M, only allowed unit is
    are all valid.
  • duration
    how long uploaded files exist on server, default is 30m, allowed units are: m(minute), h(hour), d(day).
  • urlRootPath
    the path following your domain(or IP), for example:
    in, default is empty.
  • webRoot
    the directory to serve web static files, default is
    in current working directory.
  • uploadDir
    the directory to save the uploaded files, default is
    , relative directory is assumed to be inside current working directory.
  • webrtcConfig
    the iceServer list to help both parties make P2P connection, you need to pass the argument in quoted JSON string, default is empty.


filetransferd -serverPort 9090 -maxUpload 5 -maxFileSize 20M -duration 30m -urlRootPath abc/xyz/ -webRoot ./web -uploadDir ./upload
-webrtcConfig '{"iceServers":[{"urls":""},{"urls":""}]}'
Go to, if you want to experience the P2P file transfer, open 2 tabs. You can run multiple app instances, as long as they have different

If you have Nginx(>= 1.7.11) running in front, let it handle the

directory for better performance. Copy the
folder to where Nginx can access (like
), and edit Nginx config file, like the following: ```

in server block

location /transfer/public { alias /var/www/webApp/transfer/web/public/; } location /transfer { proxypass; proxyrequestbuffering off; proxyredirect off; proxysetheader Upgrade $httpupgrade; proxysetheader Connection "upgrade"; proxysetheader Host $httphost; proxysetheader X-Real-IP $remoteaddr; proxysetheader X-Forwarded-For $proxyaddxforwardedfor; proxysetheader X-ForwardedProto $scheme; } ```

And don't forget to add the following in http(or server or location) directive. By default, nginx only allow 1M file upload limit.

client_max_body_size 5M;

The P2P feature works pretty well in small office and local network, you can adjust the

to meet your needs. It only takes you less than 2 minutes to
go get
the code, build, deploy the web app, :stuckouttonguewinkingeye:.


This project is licensed under the MIT License.

We use cookies. If you continue to browse the site, you agree to the use of cookies. For more information on our use of cookies please see our Privacy Policy.