You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
Go to file
renovate[bot] e401ba2688
fix(deps): update dependency zod to v4.1.11
1 day ago
.claude Add e2e file transfer test with playwright (#289) 2 months ago
.github/workflows Add comprehensive component tests (#279) 3 months ago
bin FilePizza v2 🍕 (#134) 9 months ago
docs docs: document file transfer protocol (#301) 2 months ago
public FilePizza v2 🍕 (#134) 9 months ago
scripts Add git pull 9 months ago
src Inline add-files link in confirmation screen (#298) 2 months ago
tests feat(upload): allow adding more files before starting (#293) 2 months ago
.cursorrules FilePizza v2 🍕 (#134) 9 months ago
.dockerignore Add coturn support 9 months ago
.gitignore Add coturn support 9 months ago
.prettierrc.js FilePizza v2 🍕 (#134) 9 months ago
CLAUDE.md Add e2e file transfer test with playwright (#289) 2 months ago
Dockerfile chore(docker): optimize image size using Next.js standalone output (#194) 8 months ago
LICENSE Load fonts locally & not from Google (#51) 9 years ago
README.md docs: document all configuration env vars (#291) 2 months ago
docker-compose.production.yml Update dependency web-streams-polyfill to v4 (#176) 9 months ago
docker-compose.yml Add coturn support 9 months ago
eslint.config.mjs FilePizza v2 🍕 (#134) 9 months ago
next-env.d.ts FilePizza v2 🍕 (#134) 9 months ago
next.config.js chore(docker): optimize image size using Next.js standalone output (#194) 8 months ago
package.json fix(deps): update dependency zod to v4 (#285) 2 months ago
playwright.config.ts Add e2e file transfer test with playwright (#289) 2 months ago
pnpm-lock.yaml fix(deps): update dependency zod to v4.1.11 1 day ago
postcss.config.js chore: upgrade tailwind (#275) 3 months ago
renovate.json Add renovate.json (#164) 9 months ago
tsconfig.json Add comprehensive component tests (#279) 3 months ago
vitest.config.ts Add comprehensive component tests (#279) 3 months ago
vitest.setup.ts Add comprehensive component tests (#279) 3 months ago

README.md

XKCD 949 FilePizza wordmark

Peer-to-peer file transfers in your browser

Cooked up by Alex Kern & Neeraj Baid while eating Sliver @ UC Berkeley.

Using WebRTC, FilePizza eliminates the initial upload step required by other web-based file sharing services. Because data is never stored in an intermediary server, the transfer is fast, private, and secure.

A hosted instance of FilePizza is available at file.pizza.

What's new with FilePizza v2

  • A new UI with dark mode support, now built on modern browser technologies.
  • Works on most mobile browsers, including Mobile Safari.
  • Transfers are now directly from the uploader to the downloader's browser (WebRTC without WebTorrent) with faster handshakes.
  • Uploaders can monitor the progress of the transfer and stop it if they want.
  • Better security and safety measures with password protection and reporting.
  • Support for uploading multiple files at once, which downloaders receive as a zip file.
  • Streaming downloads with a Service Worker.
  • Out-of-process storage of server state using Redis.

Development

$ git clone https://github.com/kern/filepizza.git
$ pnpm install
$ pnpm dev
$ pnpm build
$ pnpm start

Running with Docker

$ pnpm docker:build
$ pnpm docker:up
$ pnpm docker:down

Stack

  • Next.js
  • Tailwind
  • TypeScript
  • React
  • PeerJS for WebRTC
  • View Transitions
  • Redis (optional)

Configuration

The server can be customized with the following environment variables:

  • REDIS_URL Connection string for a Redis instance used to store channel metadata. If not set, FilePizza falls back to in-memory storage.
  • COTURN_ENABLED When set to true, enables TURN support for connecting peers behind NAT.
  • TURN_HOST Hostname or IP address of the TURN server. Defaults to 127.0.0.1.
  • TURN_REALM Realm used when generating TURN credentials. Defaults to file.pizza.
  • STUN_SERVER STUN server URL to use when COTURN_ENABLED is disabled. Defaults to stun:stun.l.google.com:19302.

FAQ

How are my files sent? Your files are sent directly from your browser to the downloader's browser. They never pass through our servers. FilePizza uses WebRTC to send files. This requires that the uploader leave their browser window open until the transfer is complete.

Can multiple people download my file at once? Yes! Just send them your short or long URL.

How big can my files be? As big as your browser can handle.

What happens when I close my browser? The URLs for your files will no longer work. If a downloader has completed the transfer, that downloader will continue to seed to incomplete downloaders, but no new downloads may be initiated.

Are my files encrypted? Yes, all WebRTC communications are automatically encrypted using public-key cryptography because of DTLS. You can add an optional password to your upload for an extra layer of security.

License & Acknowledgements

FilePizza is released under the BSD 3-Clause license. A huge thanks to iblowyourdesign for the pizza illustration.