Flick is a sleek and lightweight self-hosted file sharing tool built with Go and Next.js. It's not here to replace WeTransfer or Dropbox but rather to offer a simple, modern, and hassle-free way to share files from your own server with minimal effort.
You send a file and Flick gives you a short code that is easy to remember or say out loud. The other person enters the code, from the website or the terminal, and gets the file. Files clean themselves up: they expire after a while or after a few downloads.
$ flick myfile.pdf
Uploading the file myfile.pdf... (2097152 bytes)
Uploading 100% |████████████████████████████████| (2.1/2.1 MB, 46 MB/s)
Code: ocean-tiger-42 [15m left]
Code copied to clipboard.
$ flick
Specify the code: ocean-tiger-42
Searching the code ocean-tiger-42...
Downloading 100% |████████████████████████████████| (2.1/2.1 MB, 51 MB/s)
✅ No accounts, no long links: just a short code, easy to say over the phone
✅ Self-destructing files: expire by time, by download count, or both
✅ Your server, your rules: max file size, duration, rate limits, all configurable
✅ Open-source and self-hosted: your files never leave your server
A "flick" is a quick, effortless movement of the finger. That's exactly how sharing a file should feel. 😄
Get Flick running in minutes.
All you need is Docker installed on your server.
git clone https://github.com/matteoepitech/flick.git
cd flick
# Create your configuration
cp .env.example .env
# Start everything: database, migrations, API, web app
make up
Open http://localhost. 🎉
Important
Set a strong POSTGRES_PASSWORD in .env before starting for the first time.
Note
Everything goes through the bundled Caddy reverse proxy.
To serve Flick on your own domain with automatic HTTPS (Let's Encrypt) and HTTP/3,
just set it in .env:
FLICK_SITE_ADDRESS=flick.example.comNo certificate to generate or manage: Caddy takes care of it.
| Service | URL |
|---|---|
| 🌐 Web app | http://localhost |
| ⚙️ API | http://localhost/api/v1 |
To stop Flick, run make down. Your data is kept safe.
Use the dev stack when you want to hack on Flick: the API is rebuilt from source and the web app hot-reloads.
make dev # start the dev stack
make down-dev # stop and clean up
make help # see all available commands
Prefer the terminal? On Debian/Ubuntu, install flick straight from the APT repository:
curl -fsSL https://apt.d3l.tech/apt/flick.gpg | sudo tee /usr/share/keyrings/flick.gpg > /dev/null
echo "deb [signed-by=/usr/share/keyrings/flick.gpg] https://apt.d3l.tech/apt stable main" | sudo tee /etc/apt/sources.list.d/flick.list
sudo apt update && sudo apt install flickOn other platforms (macOS, Windows, other Linux), grab the flick binary from
apt.d3l.tech/releases - the CLI keeps itself up to date afterwards.
# Send a file
flick holiday-photos.zip
# Send with custom rules: expires in 1 hour, max 3 downloads
flick holiday-photos.zip --exp 1h --mdc 3
# Receive a file (it will ask you for the code)
flick
# Set your defaults (server address, expiration...)
flick configureYou can also build the binaries yourself:
make build # requires Go 1.26+, outputs to build/bin/Flick combines effortless sharing with full control over your server.
- Human-friendly codes in the
word-word-numberformat, easy to type and remember - Share code copied automatically to your clipboard after upload
- Self-destructing files: expiration by time, by download count, or both
- Fast transfers with HTTP/3 (QUIC) and automatic HTTPS, served at the edge by Caddy
- Send: drag and drop a file, get your code
- Receive: enter a code, download the file
- Dashboard for admins with stats, users and server settings
- Localized interface with light and dark mode
- Configurable max file size, default and max expiration, download counts
- Rate limiting per user, per IP, and global hourly caps
- PostgreSQL persistence with automatic database migrations
The server creates a default configuration on first start. The main knobs:
| Setting | Default | What it does |
|---|---|---|
max_file_size_mb |
1000 |
Biggest file allowed |
default_expiration |
15m |
How long files live by default |
max_expiration |
4h |
Longest a file can live |
default_download_count |
1 |
Downloads allowed by default |
max_download_count |
5 |
Most downloads allowed per file |
activate_rate_limit |
true |
Protect your server from abuse |
- Go with Cobra
- Caddy for automatic HTTPS and HTTP/3 at the edge
- Next.js with shadcn/ui and Tailwind CSS
- PostgreSQL with dbmate migrations
- Docker Compose for one-command deployment
Contributions are welcome! Feel free to open an issue or submit a pull request.
Made with ❤️ · © 2026 Flick. All rights reserved.