A simple light-weight file upload and file sharing tool
  • Rust 54.2%
  • HTML 17.9%
  • JavaScript 13.2%
  • TypeScript 11.3%
  • CSS 3%
  • Other 0.4%
Find a file
Blake Rain dedb416280
All checks were successful
Check / check (push) Successful in 5m5s
Merge pull request 'Fix various small issues' (#46) from security/audit-fixes into main
Reviewed-on: #46
2026-05-25 19:03:02 +00:00
.cargo security: fix various small issues 2026-05-25 17:15:46 +01:00
.forgejo/workflows fix: incorrect tag used in LibreOffice release workflow 2026-05-20 11:05:12 +01:00
crates fix(clippy): lint issues 2026-05-25 17:40:45 +01:00
cypress security: fix various small issues 2026-05-25 17:15:46 +01:00
etc fix: add file extension to ffmpeg command 2025-07-28 14:45:54 +01:00
media chore: update screenshot used in README 2024-08-12 15:46:00 +01:00
.dockerignore fix: clean up docker ignores 2025-07-28 13:26:33 +01:00
.gitignore chore: split into separate crates 2025-07-23 13:03:36 +01:00
.ignore chore: split into separate crates 2025-07-23 13:03:36 +01:00
bacon.toml chore: split into separate crates 2025-07-23 13:03:36 +01:00
Cargo.toml feat: update Dockerfile and set Docker user 2026-05-24 15:52:37 +01:00
CHANGELOG.md chore: bump version to v2.2.0 2026-03-26 15:43:46 +00:00
Dockerfile feat: update Dockerfile and set Docker user 2026-05-24 15:52:37 +01:00
LICENSE Initial commit 2023-10-14 10:36:18 +00:00
README.md chore: update badges in README.md 2026-03-26 13:01:53 +00:00

parcel A simple file upload tool

Screenshot of Parcel after a successful upload

Release Issues Pulls Check

Parcel is a simple light-weight file upload application with a nice UI and a small set of features.

  • Support multiple users and administrators, including MFA
  • Users can be grouped into teams, with shared uploads
  • Uploaded files can be made public to allow download from anywhere
  • Number of downloads can be limited, and downloads can have an expiry date
  • Public downloads can be password protected
  • Files are stored in separate cache directory
  • Data is stored in an SQLite database
  • Written in Rust using the Poem web framework
  • Styled using Tailwind CSS
  • Using Preact and Web Components

Running Parcel

The easiest way to run Parcel is with Docker, using the blakerain/parcel image on Dockerhub:

docker run blakerain/parcel

Parcel can be controlled through arguments or environment variables. The environment variables are a useful way to control Parcel when creating a Docker container.

Environment Name Default Description
DB sqlite://parcel.db SQLite connection string
CACHE_DIR ./cache Directory for file cache
COOKIE_SECRET Secret used for session cookie encryption
ANALYTICS_DOMAIN Domain to use for analytics script
PLAUSIBLE_SCRIPT URL for Plausible Analytics script

For example, if you had created a volume parcel_data and mounted it under /data you could tell Parcel to store the DB and file cache in that location by setting the DB environment variable to sqlite:///data/parcel.db and CACHE_DIR to /data/cache.

If you do not set the COOKIE_SECRET, you will end up being logged out every time that the container starts. To mitigate this, pass a value for COOKIE_SECRET when starting the container.

docker run -d \
  --name my-parcel \
  -e DB=sqlite:///data/parcel.db \
  -e CACHE_DIR=/data/cache \
  -e COOKIE_SECRET=$(openssl rand -base64 32 | tr -d '\n' ; echo) \
  -e ANALYTICS_DOMAIN=parcel.example.com \
  -e PLAUSIBLE_SCRIPT=https://pa.example.com/js/script.js \
  -v parcel_data:/data

Development

When running as a development server, bacon is mighty helpful. You may also wish to set up a cookie key (in the COOKIE_SECRET environment variable) to avoid being signed out after a restart:

# Initial setup of a cookie key
COOKIE_SECRET=$(openssl rand -base64 32 | tr -d '\n' ; echo)
export COOKIE_SECRET

# Run the server, but recompile/restart on any changes
bacon

Please Note: The icon used for this application is the package-open icon from the Lucide icon pack.