Skip to content

Releases: polius/FileSync

v.4.0.0

Choose a tag to compare

@polius polius released this 11 Jun 18:13
ae50bd1

A ground-up rebuild of how FileSync connects and saves files — native WebRTC, a built-in signaling server, and true streaming-to-disk for transfers of any size.

This is a major release. FileSync no longer depends on PeerJS: connection setup is now handled by a lightweight first-party signaling server bundled with the app, and received files stream straight to disk so even multi-gigabyte transfers stay memory-safe.

Important

Upgrading from 3.x requires re-downloading the compose files (docker-compose.yml, and for HTTPS the docker-compose-ssl.yml + Caddyfile). Pulling the new image alone is not enough — see Upgrading.


✨ Highlights

  • 🔗 Native WebRTC — PeerJS is gone. Smaller footprint, fewer moving parts, no third-party connection broker.
  • 📡 Built-in signaling server — served by FileSync itself at /ws. Nothing extra to run; it relays only connection setup and never sees your files.
  • 💾 Streaming downloads, any size — files are written to disk as they arrive, so memory stays flat even on multi-GB transfers.
  • 🩺 Redesigned diagnostics page at /test.html — light/dark, an at-a-glance verdict, and a one-click connectivity report to share with support.
  • 🛡️ Hardened for production — required secret at startup, rate-limited credentials, a self-healing container, and self-hosted fonts.

🚀 What's new

Connectivity

  • Native RTCPeerConnection / RTCDataChannel client replacing the PeerJS wrapper.
  • First-party WebSocket signaling relay (/ws) with rate limiting, idle timeouts, and capacity guards.
  • Relayed transfers now work correctly behind Docker — TURN relay candidates are rewritten in transit so peers on different networks get a reachable address.

Transfers

  • Chunked, backpressured protocol that keeps both sender and receiver memory bounded.
  • Three save methods, auto-selected per browser:
    Method When Notes
    File System Access Desktop Chrome/Edge/Brave/Opera (HTTPS) Streams straight to a file you pick
    Service Worker All modern browsers (HTTPS) Streamed browser download, memory-safe
    Blob Fallback / plain HTTP Buffered in memory (~500 MB practical limit)

Reliability

  • Serialized disk writes — fixes a File System Access corruption case on fast/large transfers.
  • Transfers no longer hang if a peer drops mid-send; abort, remove, and "cancel all" now tear down cleanly (no leaked connections or stuck downloads).
  • Transient network blips are tolerated instead of killing an in-progress transfer.
  • The container self-heals: if the backend process dies, it restarts instead of serving a half-dead app.

Security

  • The server refuses to start without SECRET_KEY (used to sign TURN credentials and tokens).
  • /api/credentials is rate-limited; CORS is off by default (opt-in via CORS_ORIGINS).
  • Fonts are self-hosted — no third-party font CDN, satisfying the app's strict Content-Security-Policy.

Tooling & docs

  • End-to-end Playwright test harness covering browsers × save methods × connection modes.
  • Dependabot for Python, Docker, GitHub Actions, and the test harness.
  • README refreshed: how connections are made, the required ports, and how files are saved.

⚠️ Upgrading from 3.x

The compose files changed — re-download them.

  1. Re-download the deploy file(s) for your setup:

  2. Set your secret (now required — the app won't start without it). Generate one:

    python3 -c "import secrets, base64; print(base64.b64encode(secrets.token_bytes(32)).decode())"

    Replace both <SECRET_KEY> placeholders in the compose file.

  3. Open the required ports (below) if you haven't already.

  4. Pull and restart:

    docker compose pull && docker compose up -d

💡 No separate PeerJS server is needed anymore — if you ran one, you can decommission it.


📋 Required ports

Port Protocol Purpose
80 / 443 TCP Web interface (HTTP / HTTPS)
3478 TCP + UDP STUN/TURN — connection setup
50000–50100 UDP TURN relay range (used when a direct path isn't possible)

Full changelog: v.3.7.0...v.4.0.0

v.3.7.0

Choose a tag to compare

@polius polius released this 18 Feb 19:22

Changes:

  • WebRTC compatibility check — Added a browser compatibility check that detects if RTCPeerConnection is unavailable and displays a user-friendly error message with a link to supported browsers, preventing the app from crashing on incompatible browsers.
error

v.3.6.0

Choose a tag to compare

@polius polius released this 18 Feb 18:51

Changes:

  • Version badge in title — The app version is now displayed as a pill badge next to the "FileSync" heading, fetched dynamically from the API.

v.3.5.0

Choose a tag to compare

@polius polius released this 17 Feb 17:36

Automatic reconnection with exponential backoff

This release improves connection resilience by automatically reconnecting to the PeerJS signaling server when the connection drops, instead of immediately showing an error.

What's new:

  • Auto-reconnect for user peers — When the signaling server connection is lost, FileSync now schedules up to 5 reconnection attempts with exponential backoff (1s → 2s → 4s → 8s → 16s). If all attempts fail, a clear error message is shown asking the user to refresh.
  • Auto-reconnect for file transfer peers — File-transfer peers independently retry up to 3 times with the same backoff strategy, preventing interrupted transfers from silently failing.
  • Smarter error handling — Peer errors are now classified into:
    • Fatal (browser-incompatible, invalid-id, unavailable-id, ssl-unavailable) → immediate error page.
    • Recoverable (disconnected, network, server-error, socket-error, socket-closed) → triggers reconnect.
    • Expected (peer-unavailable) → logged as a warning, no disruption.

v.3.4.0

Choose a tag to compare

@polius polius released this 10 Feb 19:52

Changes:

UI Redesign

  • New design system with Inter font, refined spacing, shadows, and animations
  • Modernized cards, buttons, modals, tables, and form elements across light/dark themes

Toast Notifications

  • Replaced modal notifications with lightweight slide-in toasts
  • Contextual feedback for all user actions (file ops, user joins/leaves, clipboard, password, name changes)

File Sharing

  • Drag-and-drop file uploads with visual drop-zone feedback
  • Duplicate file detection to prevent re-sharing identical files
  • Redesigned file details modal with inline progress bars and status badges

Docker

  • Upgraded Python 3.12 → 3.14
  • Added container HEALTHCHECK
  • Path-agnostic site-packages cleanup

v.3.3.0

Choose a tag to compare

@polius polius released this 03 Feb 19:39

Changes:

  • The default HTTP port (80) is now configurable.
  • Replaced the deprecated crypto-js library with the modern Web Crypto API.
  • Improved the README.md for better clarity and easier setup instructions.

v.3.2.0

Choose a tag to compare

@polius polius released this 13 Sep 17:52
  • Deploying FileSync is now simpler. Port 9000 no longer needs to be exposed, as FileSync can connect to the PeerJS server internally.

⚠️ Important

Make sure to re-download the docker-compose.yml and Caddyfile from the deployment folder, as this Release includes important changes.

v.3.1.0

Choose a tag to compare

@polius polius released this 04 Sep 18:56
  • Fixed a Chrome compatibility issue transferring files.
  • Bootstrap is now bundled directly in the project.
  • Added a new page (test.html) to test ICE server connectivity (STUN and TURN).

v.3.0.0

Choose a tag to compare

@polius polius released this 02 Sep 16:14
  • Full rework of core functionality.
  • Numerous bug fixes and performance improvements.
  • Added Docker Compose support for easy self-hosted deployment.

v.2.3.0

Choose a tag to compare

@polius polius released this 28 May 17:24

This update introduces a custom TURN server to enhance the reliability of connections behind NATs.