Portal
🔗 zero-config peer-to-peer encrypted live folder syncing that respects your `.gitignore`
Install / Use
/learn @jackyzha0/PortalREADME

portal
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.
Demos
<p align="center"> <img alt="Uploading Files" src="assets/upload-demo.gif" width="45%"> <img alt="Downloading Files" src="assets/download-demo.gif" width="45%"> </p>Installation
Binary
Pre-packaged binary, no external dependencies required! You can find the binaries on the latest release here.
With Node.js
# Requires node >=v12.22.1
$ npm i -g portal-sync
# Start using portal
$ portal new
# or
$ portal join [sessionID]
Troubleshooting
- On MacOS, ensure you give your terminal full disk access permission. (System preferences > Security & privacy > Privacy > Full disk access)
Highlights
- 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.
Architecture

Publish-subscribe Model
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.
Connection
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<sup>-78</sup> chance of collision
How is this different from Dat?
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)
Developing
- 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
Related Skills
vue-3d-experience-skill
A comprehensive learning roadmap for mastering 3D Creative Development using Vue 3, Nuxt, and TresJS.
prt
This skill should be used when the user asks to "manage project tasks", "track roadmap", "add a task", "list tasks", "complete a task", "update task status", "show task details", "validate roadmap", "initialize roadmap", or uses the prt CLI tool. Provides comprehensive guidance for using the Project Roadmap Tracking CLI.
next
A beautifully designed, floating Pomodoro timer that respects your workspace.
roadmap
A beautifully designed, floating Pomodoro timer that respects your workspace.
