Ferry

by Preetesh Magadum
5
4
3
2
1
Score: 50/100

Description

Carry a folder of notes between vaults as a single encrypted file. No server, no accounts.

Reviews

No reviews yet.

Stats

0
stars
83
downloads
0
forks
3
days
2
days
2
days
0
total PRs
0
open PRs
0
closed PRs
0
merged PRs
0
total issues
0
open issues
0
closed issues
15
commits

Latest Version

2 days ago

Changelog

How Ferry works

Publish a folder of notes as one encrypted file, send it any way you like, and unpack it on the other side after seeing exactly what will change. No server, no accounts, nobody online at the same time.

One owner per topic. A marker inside each folder names its owner, so only they can transfer it — and because two people never write the same file, a team exchange needs nobody to arbitrate.

Nothing is written before a copy is taken. A preview of every change, a snapshot of everything an apply would touch, a one-command undo, and deletions that need a deliberate tick.

Receiving does not mean using Explorer. Open a parcel from wherever the attachment landed, or drop it on the panel.

Install with BRAT: Preeteshgm/obsidian-ferry

README file from

Github

Ferry

Carry a folder of notes between vaults as a single encrypted file.

No server, no accounts, nobody online at the same time. One side publishes what has changed; the file travels however you like — email, chat, a USB stick — and the other side unpacks it into the same place in their vault, after seeing exactly what will change.

How Ferry works

It carries whatever is in the folder: markdown, canvases, images, PDFs, Excalidraw drawings, HTML. Ferry does not interpret content.

For a team

Each folder is claimed by one person. A marker inside it names the owner, so only they can transfer it — and because two people never write the same file, nobody has to arbitrate.

One owner per topic

In the panel

Everything is in one place: what you owe the team, what is waiting for you, and who owns what.

 Ferry                               preetesh · Projects   [Setup]

                      3
            2 new · 1 changed · 0 deleted
          last published 1 Oct 2026, 11:20

 WILL PUBLISH
 from Projects/Packaging · Projects/Reporting
   NEW       Packaging/IWP-12.md
   CHANGED   Packaging/Readiness.canvas
   NEW       Reporting/Week 38.md

 Publish                              [ Publish ]
 Everything I own                          [ ⟳ ]

 SENT — ATTACH THESE TO AN EMAIL
   projects-20261001-1120.ferry          [ Show ]

 RECEIVE
 Open a parcel                   [ Choose a file ]
 …or drop one on this panel

 TOPICS
   Packaging/                                 you
   Architecture/                             omar
   Field/                                    sara

 Undo the last unpack                     [ Undo ]

Why

Sync wants a server, or two devices awake at once, or an account each. Sometimes you have none of those — a colleague behind a corporate firewall, a client who will only accept an email attachment, a site office with no reliable link. Ferry is for that: a parcel you can send by any means at all.

How it works

Share root. One folder both vaults agree on, for example Projects. Paths inside a parcel are relative to it, so a canvas that points at Projects/HTML/card.html resolves the same on both sides. Agreed once, on the first exchange.

State. Each side remembers what was last exchanged. That is what makes a parcel a delta rather than the whole folder, and what makes a genuine conflict detectable.

Conflicts keep both. If a file changed on both sides since the last exchange, the incoming version lands beside yours as Note (conflict from alice 2026-10-01).md. Nothing is ever silently overwritten.

Plugins come listed. A parcel records which community plugins its content needs — Excalidraw, Dataview, Tasks, Charts, Kanban, Templater are detected automatically, and anything else can be declared. The other side is told what is missing and where to get it. The files arrive either way.

Safety

Nothing is written before a copy is taken.

  • A preview before every apply: 12 new · 3 updated · 1 conflict · 1 to delete, with Cancel.
  • A snapshot of every file the apply would overwrite or remove.
  • Undo the last unpack — one command.
  • Deletions need a tick, every time, and deleted files go to the vault trash.
  • Retention — snapshots and old parcels are pruned on command.

This protects you from a bad parcel. It is not a backup of your vault, and the settings screen says so.

Using it

Both sides install Ferry and agree on three things: the share root, a passphrase, and what to call each other.

Sending

  1. Ferry: pack changes into a parcel — or pack everything, the first time.
  2. The parcel appears in Ferry/outbox. Send it however you like.

Receiving

  1. Put the .ferry file in Ferry/inbox.
  2. Ferry: unpack a parcel → choose it → read the preview → Apply.

Ferry: status says what would be sent without packing anything.

If a parcel never arrives, resend the same file rather than packing again — the next parcel is measured from the state the first one created.

Commands

Command What it does
Pack changes into a parcel everything changed since the last exchange
Pack everything the whole share root — first exchange, or to re-sync
Unpack a parcel preview, then apply
Status: what would be sent counts, without writing anything
Undo the last unpack restores the snapshot
Clean up old snapshots and parcels applies the retention setting

Parcel format

An encrypted zip: FERRY\x01 magic, PBKDF2-SHA256 (310,000 iterations), AES-GCM-256. Inside, a manifest.json and only the changed files. The full specification is in docs/00-spec.md.

Building

npm install
npm run build          # typecheck + bundle to main.js
node tools/roundtrip.mjs   # proves the parcel format end to end

To try it, copy main.js, manifest.json and styles.css into <vault>/.obsidian/plugins/ferry/ and enable it.

What Ferry is not

Not continuous sync, not multi-party, not a merge tool, and not transport. It makes a file. Sending it is your business.

MIT licensed.