- Chunked uploads are enabled by default. Uses setting `CHUNKED_UPLOADS_ENABLED=true`.
-In-panel bulk actions footer (Delete/Enable/Disable stay inside the box)
-Configure chunk size with `CHUNK_SIZE_MB` (default: `50`). The client only uses chunked mode for files larger than this.
-Per-row icon actions with tooltips; Save button lights up only on changes
-Intended to bypass upstream proxy limits (e.g., 100MB) while preserving duplicate checks, EXIF timestamps, album add, and per‑item progress via WebSocket.
- Per-row QR modal; Details modal close fixed and reliable
- Auto-refresh after creating a link; new row is highlighted and scrolled into view
- Expiry save fix: stores end-of-day to avoid off-by-one date issues
Roadmap highlight
## Developtment
- We’d like to add a per-user UI and remove reliance on a fixed API key by allowing users to authenticate and provide their own Immich API tokens. This is not in scope for the initial versions but aligns with future direction.
- The frontend automatically switches to chunked mode only for files larger than the configured chunk size.
### 📱 Device‑Flexible HMI (New)
### Architecture
- 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.
You can keep a checked‑in `/.env.example` with the keys above for onboarding.
You can keep a checked‑in `/.env.example` with the keys above for onboarding.
---
### How it works
## How it works
1.**Queue**– Files selected in the browser are queued; each gets a client-side ID.
2.**De-dupe (local)**– Server computes **SHA‑1** and checks `state.db`. If seen, marks as **duplicate**.
3.**Save**– The file is saved to the local filesystem under `./data/uploads`.
4.**Album**– If an album is specified via an invite link, or a folder name is provided on the public page, the file is saved into a corresponding subdirectory. Client-side folder structure is also preserved.
5.**Progress**– Backend streams progress via WebSocket to the same session.
6.**Privacy**– The UI shows only the current session's items. It does not provide a way to browse saved files.
1.**Queue**– Files selected in the browser are queued; each gets a client‑side ID.
### Security notes
2.**De‑dupe (local)**– Server computes **SHA‑1** and checks `state.db`. If seen, marks as **duplicate**.
3.**De‑dupe (server)**– Attempts Immich `/assets/bulk-upload-check`; if Immich reports duplicate, marks accordingly.
4.**Upload**– Multipart POST to `${IMMICH_BASE_URL}/assets` with:
-`assetData`, `deviceAssetId`, `deviceId`,
-`fileCreatedAt`, `fileModifiedAt` (from EXIF when available; else `lastModified`),
-`isFavorite=false`, `filename`, and header `x-immich-checksum`.
5.**Album**– If `IMMICH_ALBUM_NAME` is configured, adds the uploaded asset to the album (creates album if it doesn't exist).
6.**Progress**– Backend streams progress via WebSocket to the same session.
7.**Privacy**– UI shows only the current session's items. It never lists server media.
---
## Security notes
- The menu and invite creation are behind login. Logout clears the session.
- The menu and invite creation are behind login. Logout clears the session.
- Invite links are public by URL; share only with intended recipients.
- Invite links are public by URL; share only with intended recipients.
- The default uploader page at `/` is disabled unless `PUBLIC_UPLOAD_PAGE_ENABLED=true`.
- The default uploader page at `/` is disabled unless `PUBLIC_UPLOAD_PAGE_ENABLED=true`.
- The Immich API key remains **server‑side**; the browser never sees it.
- No browsing of uploaded media; only ephemeral session state is shown.
- No browsing of uploaded media; only ephemeral session state is shown.
- Run behind HTTPS with a reverse proxy and restrict CORS to your domain(s).
- Run behind HTTPS with a reverse proxy and restrict CORS to your domain(s).
## Usage flow
- Admin: Login → Menu → Create invite link (optionally one‑time / expiry / album) → Share link or QR.
- Guest: Open invite link → Drop files → Upload progress and results shown.
- Optional: Enable public uploader and set `IMMICH_ALBUM_NAME` for a default landing page.
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.