Changelog
All notable changes to this project are documented here. The format follows Keep a Changelog and this project adheres to Semantic Versioning.
[Unreleased]
Added
- Nothing yet.
[1.1.0]
Added
- Public share page. Recipients of a share link now land on a real page at
/s/:tokeninstead of being redirected to the landing page. It handles password prompts, shows file metadata, and downloads the file without requiring an account. - Video previews.
POST /api/previews/generateacceptsvideo/*in addition to images and returns a 640x360 JPEG thumbnail captured at the one-second mark, plus the video duration when it can be read. Requires FFmpeg; videos over the 25 MB preview cap are rejected with413. - Documentation site. A complete bilingual (English / Bahasa Indonesia) documentation site built with VitePress, published to GitHub Pages and deployed automatically on every push to
main. - End-to-end test suite. A self-contained Playwright suite under
e2e/covering the public share flow, including the wrong-password path. - Frontend test suite. Vitest and Testing Library, covering the share page and the public share API client.
Changed
BCRYPT_ROUNDSis now read from the environment instead of being hardcoded. Values outside the safe 4-15 range fall back to12with a warning.- WebDAV rate limiting is split into a generous general limit (5000 requests per 15 minutes, configurable via
WEBDAV_RATE_LIMIT_MAX) and a separate 20-per-15-minute cap on failed authentication attempts, so mounted clients are no longer throttled. - The backend test suite grew from 36 to 114 tests, covering validation schemas, the JWT service, middleware, and filename helpers.
- Removed the unused
form-dataandmulterdependencies and the dead multer upload machinery.
Fixed
- Share links could not be created twice in the same second. Share tokens contained no unique nonce, so two links for the same file created within one second produced byte-identical JWTs and the second request failed with
500. Tokens now include a randomjti. CORSdid not allowPATCH, which blocked file rename, move, and favorite from the browser.sanitizeFilenamedid not neutralize path separators or bare directory tokens, despite being documented as preventing security issues.FRONTEND_URLwas missing from.env.example, producing relative share links.- Documentation described features that no code implemented (a Redis-backed preview queue, FFmpeg video thumbnails, and the
TELEGRAM_API_URL/TELEGRAM_API_SERVER_URLsettings).
[1.0.0]
The initial public release of Teldock, a self-hosted cloud storage application that uses the Telegram Bot API as its storage backend.
Added
- Chunked uploads. Files are split into bounded parts (~18 MB, configurable via
TG_PART_SIZE) and streamed to Telegram without buffering the whole file in memory. - Streaming downloads. Parts are reassembled in order with backpressure handling and resumable HTTP
Rangerequests. - Multi-bot pool. Users can register multiple bot tokens, distributed round-robin for higher throughput.
- Version history. Overwriting a file automatically snapshots the previous content, and any version can be restored, including chunked and encrypted files.
- Soft delete. Deleted files are recoverable, with storage-usage accounting kept consistent.
- Folders. Hierarchical folders with path-based navigation and rename/delete operations.
- Search, favorites, tags, and smart folders. Filename search, a favorite flag, user-defined tags, and saved filter "smart folders".
- File previews. In-browser image previews generated in multiple sizes.
- Sharing. Public links with optional expiration, download limits, and password protection.
- WebDAV endpoint. An Rclone-compatible
/webdavmount supportingOPTIONS,PROPFIND,GET,HEAD,PUT,DELETE,MKCOL, andMOVE. - JWT authentication. Short-lived access tokens with refresh-token rotation.
- Encryption. Opt-in per-file encryption and AES-256-CBC encryption of bot credentials at rest.
Security
- Bot tokens are encrypted at rest and never returned to clients; internal Telegram identifiers are stripped from API responses.
- Login uses constant-time bcrypt comparison and does not reveal whether an account exists.
- Signed, file-scoped URLs authorize downloads and previews.
- Global and login rate limiting, strict input validation, and a Helmet Content Security Policy are enabled by default.
- Secrets are validated at boot; the API refuses to start with missing or placeholder values.
Documentation
- Added deployment, security, API, database schema, project structure, contributing, and changelog documentation, available in English and Bahasa Indonesia.
Related pages
- Contributing — how changes reach a release.
- Deployment — running a released version in production.
- Security — the security model behind the hardening listed above.