Skip to content

TeamSync

One shared folder for a whole team, without anyone ever overwriting someone else's work.

Desktop app for Mac and WindowsDelivered

fig. IIlocal hashbasecloud versionSHA-256L ≠ BC ≠ Bdecidepure function, no I/Oexactly one actionuploaddownloadconflict copydo nothing
fig. II Three facts per file, exactly one action.

Who it is for

A small team on both Macs and Windows laptops that works on the same files.

The problem

Sending files back and forth always goes wrong at some point: someone works in an old version and someone else loses their work. Real co-editing through Microsoft 365 needs a licence per person and an administrator who signs off, which a small team usually does not have.

What I built

I built a desktop app where the cloud is the source of truth and every laptop keeps its own copy. A custom sync engine compares, per file, the local version, the last shared version and the cloud version, and picks exactly one action. When two changes collide, both are kept. The team sees who has a document open and can also write in the same document at the same time.

What it delivers

  1. No more overwritten work: on a collision both versions are kept.

  2. Version history per file, an older version can always be restored.

  3. You see who has a Word document open before you start on it.

  4. Write together at the same time and save the result as a Word file again.

  5. Runs on Mac and Windows and updates itself automatically.

Under the hood

  • A Rust sync engine whose decision rules can be tested on their own: every situation has its own test.

  • Access rules at database level for every table and for storage, with tests that check them.

  • Integration tests that simulate two laptops, including offline work, renames and conflicts.

The hardest part

Edits in Word were sometimes silently lost: while Word had a document open, the file looked unchanged and was never uploaded. I taught the app to treat open documents differently and wrote a test that replays opening, editing, saving and closing exactly, so it cannot come back.

Built with

  • Tauri 2
  • Rust
  • React
  • TypeScript
  • Supabase
  • Yjs