Bug fixes, dependency updates, and Dockerfile improvements
🐛 Bug Fixes
- client: Fixed
skysend updatefailing on Windows with "Permission denied" even as Administrator. Windows locks running.exefiles, sofs.renameSyncalways threwEPERM. The fix spawns a detached, hiddencmd.exebatch script that waits 2 seconds (until the current process exits) then moves the downloaded binary into place withmove /y. - client: Fixed
install.ps1hanging silently during download. PowerShell's default$ProgressPreference = 'Continue'makesInvoke-WebRequestup to 100x slower and shows no feedback in many terminal environments. The script now sets$ProgressPreference = 'SilentlyContinue'and printsDownloading <file>... done (X.X MB)andVerifying checksum... okstep messages instead. - client: Fixed
install.shshowing no output during binary download.curl -fsSLandwget -qwere fully silent. The binary download now usescurl --progress-bar(shows a#####bar on stderr) andwgetwithout-q, so users see download progress. - server: Fixed S3 uploads failing with Cloudflare R2 and other S3-compatible providers with the error
[EntityReplacer] Invalid character '#' in entity name: "#xD". The root cause wasfast-xml-parser@5.7.1introducing a regression where numeric character references (e.g.
) in XML responses could no longer be parsed. Updatedfast-xml-parseroverride to>=5.7.2which restores correct behavior. - server: Set
requestChecksumCalculationandresponseChecksumValidationtoWHEN_REQUIREDon the S3 client. AWS SDK v3 >=3.679 defaults toWHEN_SUPPORTED, causing proactive CRC checksum headers that can trigger provider-specific XML parsing issues.
🔒 Security
- infra: Added
pnpm.overridesforpostcss(>=8.5.10) to patch a moderate XSS vulnerability (GHSA-qx2v-qp2m-jg93) in transitive dependencies viaautoprefixer
🗑️ Removed
- server: Removed
S3_PUBLIC_URLenvironment variable. S3 downloads now exclusively use presigned URLs, which enforce expiry and download limits server-side and expire automatically. Public bucket URLs allowed clients to bypass these controls by reusing a captured URL.
📝 Documentation
- docs: Removed PBKDF2-SHA256 fallback references from
password-protection.md,README.md, anddocs/index.md- password protection now exclusively documents Argon2id
🎨 Improvements
- server: Updated
@hono/node-serverfrom v1 to v2 - same public API, up to 2.3x faster body parsing via optimized direct Node.jsIncomingMessagereads, URL construction fast-path, andbuildOutgoingHttpHeadersoptimization - infra: Updated patch and minor dependencies across all workspace packages -
hono,@aws-sdk/client-s3,@aws-sdk/lib-storage,@aws-sdk/s3-request-presigner,better-sqlite3,tailwindcss,@tailwindcss/vite,react-router-dom,i18next,react-i18next,lucide-react,autoprefixer,vite,vue,wrangler,@cloudflare/workers-types,prettier,typescript,eslint-plugin-react-hooks,globals,typescript-eslint - infra: Updated
eslintand@eslint/jsfrom v9 to v10, andcommanderfrom v13 to v14 - no API changes required, fixed two neweslint:recommendedrules (no-useless-assignmentin upload chunking code,preserve-caught-errorin upload worker) - web: Removed deprecated
@types/dompurify- DOMPurify v3+ ships its own TypeScript declarations - infra: Added
COPY apps/client/package.json,COPY apps/client/stubs/, andCOPY workers/instances/package.jsonto the Dockerfile build stage sopnpm install --frozen-lockfilecan resolve all workspace packages (including thefile:stub dependency in@skysend/client) beforeCOPY . .
🐳 Docker
- Image:
skyfay/skysend:v2.5.1 - Also tagged as:
latest,v2 - Platforms: linux/amd64, linux/arm64