Zero-config peer-to-peer encrypted live folder syncing tool that respects your .gitignore. Built on top of the Hypercore protocol with emphasis on being zero-config, secure, and decentralized.
Pre-packaged binary, no external dependencies required! You can find the binaries on the latest release here.
# Requires node >=v12.22.1
$ npm i -g portal-sync
# Start using portal
$ portal new
# or
$ portal join [sessionID]- On MacOS, ensure you give your terminal full disk access permission. (System preferences > Security & privacy > Privacy > Full disk access)
- Ephemeral: As soon as you close your
portal, no further content can be downloaded from it. No data is stored anywhere except on the host device. - Decentralized: There is no central
portalserver that all data is routed through.portalonly uses public servers to maintain a DHT (distributed hash table) for peer discovery. - One-to-many: A single host can sync data to any number of connected peers.
- Stream-based: Utilizes file streaming to handle files of arbitrary size (regardless of whether they fit in memory or not)
- Efficient: Changes in single files means that only one file needs to be synced.
portaltracks which files have changed to avoid resyncing entire folders wherever possible. A priority queue is used to optimize concurrent operations. - Secure: Like Dat, all data is encrypted using the read key. Only those that possess your current 32-byte
portalsession ID can view the data you share.
Portal relies on a publish-subscribe event model to drive its render and update cycles. File tree structure and individual file statuses are stored in a trie structure known as the Registry. On the host side, there is a local Registry that listens to file changes on the host machine and broadcasts them to an append-only Hypercore that is used as an event log. A drive syncing hook listens for changes in the local registry and streams file changes from disk to a Hyperdrive. On the client side, a remote Registry listens for changes in the event log and replicates changes locally. A drive download hook listens for changes in the remote registry and streams file changes from the Hyperdrive to the local disk.
Portals are identified by unique* 32-byte keys. When a client 'joins' a portal, portal looks up the session key using Hyperswarm and establishes a connection to the host using UDP holepunching.
*8.63x10-78 chance of collision
Might seem similar to another similar project built on top of the Hypercore protocol called Dat but there are a few key differences.
- Dat relies on nodes to keep seeding archives and drives and aims to be a distributed filesystem whereas
portalfocuses purely on being one-to-many for file sharing/syncing. - No footprint. Because
portalis designed to be zero-config, it doesn't leave any dotfiles laying around, whereas Dat stores secrets and metadata in a~/.datfolder. - Dat tracks version history. Although
portalruns on the same underlying protocols, I haven't found a need to utilize version histories yet. portalrespects your.gitignoreso it doesn't sync anything you don't want (like peskynode_modules)
- Clone the repository and ensure you have
node >= v12.22.1 - Run
yarnto install deps andyarn devto enable hot-reload - Run
yarn linkto registerportalas a valid executable



