A stupid simple file upload application that provides a clean, modern interface for dragging and dropping files. Built with Node.js and vanilla JavaScript.
No auth (unless you want it now!), no storage, no nothing. Just a simple file uploader to drop dumb files into a dumb folder.
# Pull and run with one command
docker run -p 3000:3000 -v ./local_uploads:/app/uploads dumbwareio/dumbdrop:latest
- Go to http://localhost:3000
- Upload a File - It'll show up in ./local_uploads
- Celebrate on how dumb easy this was
Create a docker-compose.yml
file:
services:
dumbdrop:
image: dumbwareio/dumbdrop:latest
ports:
- 3000:3000
volumes:
# Where your uploaded files will land
- ./local_uploads:/app/uploads
environment:
# The title shown in the web interface
DUMBDROP_TITLE: DumbDrop
# Maximum file size in MB
MAX_FILE_SIZE: 1024
# Optional PIN protection (leave empty to disable)
DUMBDROP_PIN: 123456
# Upload without clicking button
AUTO_UPLOAD: false
Then run:
docker compose up -d
- Go to http://localhost:3000
- Upload a File - It'll show up in ./local_uploads
- Rejoice in the glory of your dumb uploads
If you're a developer, check out our Dev Guide for the dumb setup.
- Install dependencies:
npm install
- Set environment variables in
.env
:
PORT=3000 # Port to run the server on
MAX_FILE_SIZE=1024 # Maximum file size in MB
DUMBDROP_PIN=123456 # Optional PIN protection
- Start the server:
npm start
If you're using Windows PowerShell with Docker, use this format for paths:
docker run -p 3000:3000 -v "${PWD}\local_uploads:/app/uploads" dumbwareio/dumbdrop:latest
- Drag and drop file uploads
- Multiple file selection
- Clean, responsive UI
- File size display
- Docker support
- Dark Mode toggle
- Configurable file size limits
- Drag and Drop Directory Support (Maintains file structure in upload)
- Optional PIN protection (4-10 digits) with secure validation
- Configurable notifications via Apprise
Variable | Description | Default | Required |
---|---|---|---|
PORT | Server port | 3000 | No |
MAX_FILE_SIZE | Maximum file size in MB | 1024 | No |
DUMBDROP_PIN | PIN protection (4-10 digits) | None | No |
DUMBDROP_TITLE | Site title displayed in header | DumbDrop | No |
APPRISE_URL | Apprise URL for notifications | None | No |
APPRISE_MESSAGE | Notification message template | New file uploaded {filename} ({size}), Storage used {storage} | No |
APPRISE_SIZE_UNIT | Size unit for notifications | Auto | No |
AUTO_UPLOAD | Enable automatic upload on file selection | false | No |
ALLOWED_EXTENSIONS | Comma-separated list of allowed file extensions | None | No |
To restrict which file types can be uploaded, set the ALLOWED_EXTENSIONS
environment variable. For example:
ALLOWED_EXTENSIONS=.jpg,.jpeg,.png,.pdf,.doc,.docx,.txt
If not set, all file extensions will be allowed.
The notification message supports the following placeholders:
{filename}
: Name of the uploaded file{size}
: Size of the file (formatted according to APPRISE_SIZE_UNIT){storage}
: Total size of all files in upload directory
Example message template:
APPRISE_MESSAGE: New file uploaded {filename} ({size}), Storage used {storage}
Size formatting examples:
- Auto (default): Chooses nearest unit (e.g., "1.44MB", "256KB")
- Fixed unit: Set APPRISE_SIZE_UNIT to B, KB, MB, GB, or TB
Both {size} and {storage} use the same formatting rules based on APPRISE_SIZE_UNIT.
- Integration with Apprise for flexible notifications
- Support for all Apprise notification services
- Customizable notification messages with filename templating
- Optional - disabled if no APPRISE_URL is set
- Variable-length PIN support (4-10 digits)
- Constant-time PIN comparison to prevent timing attacks
- Automatic input sanitization
- Secure PIN validation middleware
- No PIN storage in browser (memory only)
- Rate Limiting to prevent brute force attacks
- Optional file extension filtering
Want to contribute or develop locally? Check out our Development Guide - it's stupid simple, just the way we like it! If you're writing complex code to solve a simple problem, you're probably doing it wrong. Keep it dumb, keep it simple.
- Backend: Node.js with Express
- Frontend: Vanilla JavaScript with modern drag-and-drop API
- File handling: Chunked file uploads with configurable size limits
- Security: Optional PIN protection for uploads
- Containerization: Docker with automated builds via GitHub Actions
- Camera Upload for Mobile
Got an idea? Open an issue or submit a PR