diff --git a/README.md b/README.md index 4fbf7f8..5d52b35 100644 --- a/README.md +++ b/README.md @@ -19,12 +19,18 @@ Admin users log in to create public invite links; invite links are always public - **Dark mode** — detects system preference; manual toggle persists across pages - **Albums** — add uploads to a configured album (creates if needed) - **Copy + QR** — copy invite link and display QR for easy sharing + - **Chunked uploads (optional)** — split large files to bypass proxy limits; configurable size + - **Invite passwords (optional)** — protect invite links with a password prompt + - **Device‑flexible HMI** — responsive layout, mobile‑safe picker, sticky mobile bar + - **Retry failed uploads** — one‑click retry for any errored item + - **Invites without album** — create links that don’t add uploads to any album --- ## Table of contents - [Quick start](#quick-start) - [New Features](#new-features) +- [Chunked Uploads](#chunked-uploads) - [Architecture](#architecture) - [Folder structure](#folder-structure) - [Requirements](#requirements) @@ -64,6 +70,10 @@ services: PUBLIC_UPLOAD_PAGE_ENABLED: "false" # keep disabled by default PUBLIC_BASE_URL: https://drop.example.com + # Large files: chunked uploads (bypass 100MB proxy limits) + CHUNKED_UPLOADS_ENABLED: "false" # enable chunked uploads + CHUNK_SIZE_MB: "95" # per-chunk size (MB) + # App internals SESSION_SECRET: ${SESSION_SECRET} @@ -108,6 +118,34 @@ docker compose up -d - Set link expiry (e.g., 1, 2, 7 days). Expired links are inactive. - Copy link and view a QR code for easy sharing. +### 🔑 Invite Passwords (New) +- When creating an invite, you can optionally set a password. +- Recipients must enter the password before they can upload through the link. +- The app stores only a salted hash server‑side; sessions that pass the check are marked authorized. + +### 🧩 Chunked Uploads (New) +- Opt‑in support for splitting large files into chunks to bypass proxy limits (e.g., Cloudflare 100MB). +- Enable with `CHUNKED_UPLOADS_ENABLED=true`; tune `CHUNK_SIZE_MB` (default 95MB). +- The frontend automatically switches to chunked mode only for files larger than the configured chunk size. + +### 📱 Device‑Flexible HMI (New) +- Fully responsive UI with improved spacing and wrapping for small and large screens. +- Mobile‑safe file picker and a sticky bottom “Choose files” bar on phones. +- Safe‑area padding for devices with notches; refined dark/light theme behavior. +- Desktop keeps the dropzone clickable; touch devices avoid accidental double‑open. + +### ♻️ Reliability & Quality of Life (New) +- Retry button to re‑attempt any failed upload without re‑selecting the file. +- Progress and status updates are more resilient to late/reordered WebSocket events. +- Invites can be created without an album, keeping uploads unassigned when preferred. + +### Last 8 Days – Highlights +- Added chunked uploads with configurable chunk size. +- Added optional passwords for invite links with in‑UI unlock prompt. +- Responsive HMI overhaul: mobile‑safe picker, sticky mobile action bar, safe‑area support. +- Retry for failed uploads and improved progress handling. +- Support for invites with no album association. + ### 🌙 Dark Mode - Automatically detects system dark/light preference on first visit - Manual toggle button in the header (sun/moon icon) @@ -128,6 +166,14 @@ docker compose up -d --- +## Chunked Uploads + +- Enable chunked uploads by setting `CHUNKED_UPLOADS_ENABLED=true`. +- Configure chunk size with `CHUNK_SIZE_MB` (default: `95`). The client only uses chunked mode for files larger than this. +- Intended to bypass upstream limits (e.g., 100MB) while preserving duplicate checks, EXIF timestamps, album add, and per‑item progress via WebSocket. + +--- + ## Architecture - **Frontend:** static HTML/JS (Tailwind). Drag & drop or "Choose files", queue UI with progress and status chips. @@ -216,6 +262,10 @@ STATE_DB=./data/state.db SESSION_SECRET=SET-A-STRONG-RANDOM-VALUE LOG_LEVEL=DEBUG +# Chunked uploads (optional) +CHUNKED_UPLOADS_ENABLED=true +CHUNK_SIZE_MB=95 + ```