Simple upload service with TOTP support, made with Python Flask
Find a file
swee 8165606baf
All checks were successful
Test web app / Check syntax (push) Successful in 6s
Test web app / docker (push) Successful in 1m42s
Update templates/homev2.html
2025-08-31 20:21:31 -07:00
.forgejo/workflows Update .forgejo/workflows/code.yml 2025-08-06 18:30:17 -07:00
templates Update templates/homev2.html 2025-08-31 20:21:31 -07:00
.env.example Update .env.example 2025-06-15 16:49:58 -07:00
.gitignore Change docs 2025-06-10 19:02:58 -07:00
api.md Update api.md 2025-07-17 15:40:10 -07:00
cache.json Add bare support 2025-06-10 17:51:19 -07:00
Dockerfile Update Dockerfile 2025-06-18 13:23:48 -07:00
LICENSE Initial commit 2025-02-10 21:26:03 -08:00
providers.md Update providers.md 2025-07-16 17:04:41 -07:00
README.md specify year 2025-08-06 01:51:26 -07:00
requirements.txt Update requirements.txt 2025-06-16 18:55:04 -07:00
server.py quote because pound causes not found errors 2025-07-17 20:49:20 -07:00

FastFile

Simple upload service with TOTP support, made with Python Flask.

This is basically an open-sourced + enhanced version of the one I had in my old PythonAnywhere site in 2023.

Features

  • TOTP authentication
  • Randomize file names or keep the original one
  • View both frontend and raw files
  • Upload to different storage providers

Upcoming features

  • Better Object Storage support (using boto3 instead of rclone)
  • Persistent logins
  • Redesign in Bulma
  • Support Zipline
  • API
  • Optional fastfileV2 interface (file viewer stays the same)
    • Home screen showing already uploaded files
    • Bulk upload
    • Multi-user
    • Multi-provider

Screenshots (V1)

Screenshot of the login screen

Screenshot of the dashboard

Screenshot of the upload complete dialog

Screenshot of the 404 page

Screenshot of the built-in file viewer

Installation

Via Docker

Create this docker-compose.yml file in an empty directory:

services:
    fastfile:
        image: git.swee.codes/swee/fastfile:latest
        restart: unless-stopped
        ports:
            - 2007:2007
        env_file: .env
        volumes:
            - ./files:/files
            - ./cache.json:/app/cache.json

Create the .env file, you can use .env.example as an example for all of fastfile's properties

And run this:

mkdir files
touch cache.json
docker compose up -d

Directly

Install packages:

Directly: pip install flask gunicorn pytotp magic boto3

Debian/Ubuntu: sudo apt install python3-flask python3-gunicorn python3-pyotp python3-magic python3-boto3

Alpine: apk add py3-flask py3-gunicorn py3-otp py3-magic py3-boto3

Run:

source .env # Make sure you configure .env!
gunicorn -w --bind=0.0.0.0:2007 server:app

How to get TOTP key?

Install the pyotp (py3-otp in alpine) module as shown above, run

python3 -c "import pyotp; print(pyotp.random_base32())"

Copy the output and use in your environment variable and authenticator app.