Virtual Calzone's fork of the Team Relay Obsidian plugin — shared vaults with CRDT sync and web publishing, served by our own relay. Install and update one-liners in the README. https://git.psn.virtualcalz.one/virtualcalz/evc-team-relay-plugin
  • TypeScript 84.5%
  • Svelte 10.1%
  • Shell 1.8%
  • PowerShell 1.6%
  • JavaScript 1.4%
  • Other 0.6%
Find a file
Repository files (latest commit first)
Filename Latest commit message Latest commit date
pasquale 2dfa6f2485
Some checks are pending
CI / TypeScript type-check (push) Waiting to run
CI / Jest (unit + integration) + coverage report (push) Waiting to run
CI / Build + smoke (push) Waiting to run
CI / ESLint (push) Waiting to run
CI / manifest.json version sync (push) Waiting to run
CI / CI gate (push) Blocked by required conditions
docs: record the organisation rename, and why the old namespace is kept
The old paths 301-redirect, git follows them, and that is what keeps an
already-installed client updating — so the emptied organisation is not
vestigial, it is load-bearing. Say so where the next person will look before
'cleaning up' an empty org.
2026-09-19 04:22:32 +00:00
.github feat(dist): the namespace is virtualcalzone, not virtualcalz 2026-09-19 04:21:06 +00:00
__tests__ test(storage): pin the whenSynced contract that 771 green tests missed 2026-09-18 19:33:54 +00:00
scripts release: 1.2.28 2026-09-19 04:21:33 +00:00
src feat(dist): the namespace is virtualcalzone, not virtualcalz 2026-09-19 04:21:06 +00:00
.editorconfig Team Relay plugin for Obsidian 2026-09-09 15:54:48 +03:00
.gitignore Team Relay plugin for Obsidian 2026-09-09 15:54:48 +03:00
.npmrc Team Relay plugin for Obsidian 2026-09-09 15:54:48 +03:00
.prettierrc Team Relay plugin for Obsidian 2026-09-09 15:54:48 +03:00
CHANGELOG.md docs: make the public instructions match what the scripts actually do 2026-09-19 03:38:36 +00:00
esbuild.config.mjs Team Relay plugin for Obsidian 2026-09-09 15:54:48 +03:00
eslint.config.bot.mjs Team Relay plugin for Obsidian 2026-09-09 15:54:48 +03:00
eslint.config.mjs Team Relay plugin for Obsidian 2026-09-09 15:54:48 +03:00
FORK.md docs: record the organisation rename, and why the old namespace is kept 2026-09-19 04:22:32 +00:00
icon.svg Team Relay plugin for Obsidian 2026-09-09 15:54:48 +03:00
jest.config.js Team Relay plugin for Obsidian 2026-09-09 15:54:48 +03:00
jest.live.config.js Team Relay plugin for Obsidian 2026-09-09 15:54:48 +03:00
LICENSE Team Relay plugin for Obsidian 2026-09-09 15:54:48 +03:00
main.js release: 1.2.28 2026-09-19 04:21:33 +00:00
manifest-beta.json release: 1.2.28 2026-09-19 04:21:33 +00:00
manifest.json release: 1.2.28 2026-09-19 04:21:33 +00:00
NOTICE Team Relay plugin for Obsidian 2026-09-09 15:54:48 +03:00
package-lock.json release: 1.2.28 2026-09-19 04:21:33 +00:00
package.json release: 1.2.28 2026-09-19 04:21:33 +00:00
README.md feat(dist): the namespace is virtualcalzone, not virtualcalz 2026-09-19 04:21:06 +00:00
SECURITY.md docs: make the public README useful instead of a wall of prose 2026-09-19 03:28:26 +00:00
styles.css Team Relay plugin for Obsidian 2026-09-09 15:54:48 +03:00
svelte.config.mjs Team Relay plugin for Obsidian 2026-09-09 15:54:48 +03:00
tsconfig.json Team Relay plugin for Obsidian 2026-09-09 15:54:48 +03:00
tsconfig.svelte-check.json Team Relay plugin for Obsidian 2026-09-09 15:54:48 +03:00
tsconfig.tests.json Team Relay plugin for Obsidian 2026-09-09 15:54:48 +03:00
version-bump.mjs Import upstream source (snapshot 1d87805) + Virtual Calzone rebrand 2026-09-18 04:15:16 +00:00
version.py Team Relay plugin for Obsidian 2026-09-09 15:54:48 +03:00
versions.json release: 1.2.28 2026-09-19 04:21:33 +00:00

Virtual Calzone Relay for Obsidian

Live collaboration and web publishing for Obsidian vaults, served by our own relay: shared folders, real-time cursors, CRDT documents, and a published web view — with no vendor account and no data leaving our infrastructure.

Endpoint URL
Control plane obsidian-cp.virtualcalz.one
CRDT relay obsidian-relay.virtualcalz.one
Plugin id evc-team-relay

What syncs

Content How
Markdown (.md) CRDT document — concurrent edits merge
Canvas (.canvas) CRDT document, when the canvas toggle is on
Bases (.base) whole-file sync (last writer wins — it does not merge), when Other files is on for that share
Images, audio, video, PDF attachments, per-type toggles
Everything else Other files, per share

Install

macOS and Linux (bash, curl, python3):

U=https://git.psn.virtualcalz.one/virtualcalzone/evc-team-relay-plugin/raw/branch/main/scripts/update-plugin.sh
curl -fsSL "$U" | bash -s -- --check            # show what is installed; writes nothing
curl -fsSL "$U" | bash -s -- --install --all    # install/update every registered vault
# one vault only:  … | bash -s -- --install --vault ~/Documents/Work

Windows (PowerShell):

$u = 'https://git.psn.virtualcalz.one/virtualcalzone/evc-team-relay-plugin/raw/branch/main/scripts/update-plugin.ps1'
irm $u -OutFile update-plugin.ps1
powershell -ExecutionPolicy Bypass -File .\update-plugin.ps1 -Check
powershell -ExecutionPolicy Bypass -File .\update-plugin.ps1 -Install -All
# one vault only:  .\update-plugin.ps1 -Install -Vault C:\Users\me\Obsidian\Work

--install needs a target on purpose: with several vaults registered, an implicit install would guess where to write. --all covers every registered vault, --vault <path> one of them.

Then enable it in Obsidian: Settings → Community plugins → turn Restricted Mode off → enable Virtual Calzone Relay.

A fresh vault does not bind any share on its own — a share is only connected once its folder exists in the vault. To create the folders and update the plugin in one step:

# one share path per line in the file; '#' starts a comment
curl -fsSL https://git.psn.virtualcalz.one/virtualcalzone/evc-team-relay-plugin/raw/branch/main/scripts/setup-vault.sh \
  | bash -s -- --vault ~/Documents/Work --shares-file ~/relay-shares.txt

On Windows: setup-vault.ps1 -Vault C:\Users\me\Obsidian\Work -Shares 'Personal,RatPG'.

Sign in to the relay once per vault. The token is kept in the vault's local storage by design, so it is never written to the repository or to this plugin's folder.

Update, pin, roll back

Goal Command
Update (vaults that already have the plugin) ... | bash -s
Install into every registered vault ... | bash -s -- --install --all
Install into one vault ... | bash -s -- --install --vault <path>
Pin a release ... | bash -s -- --ref <tag>
Undo the last update ... | bash -s -- --rollback
Update while Obsidian is running add --force

Without --ref the updater installs the newest published release and prints which one. PowerShell spellings are -All, -Vault, -Ref, -Rollback, -Force.

Every run reports the installed version and the bundle's sha256 before and after, and keeps a per-vault backup it can roll back to.

Troubleshooting

What you see What it usually is
A share shows no files and never moves Its folder does not exist in the vault yet — run setup-vault.sh (or create the folder), then sign in
An update reports success but Obsidian still shows the old version Obsidian was running during the write (use --force), or the plugin is disabled in Restricted Mode
.base or other non-note files do not appear on another device Other files is off for that share — it is a per-share toggle
A file is stuck as a sync conflict Command palette → Team Relay: Show sync conflicts → take the server or the local version
--check cannot reach the relay Check that obsidian-cp.virtualcalz.one resolves and that your clock is correct (the relay tokens are short-lived)

Security

Shares are private by default: only their members can read them, the relay refuses anonymous API callers, writes always require a signed-in account, and every relay token is issued only after a share-membership check. Publishing a share to the web, or changing its visibility, is an explicit action with an explicit warning.

Fetching this plugin proves nothing about access: the bundle and its updater are public, while using the relay needs an account that a maintainer has admitted to the relay, and then membership of the specific share. Report vulnerabilities privately — see SECURITY.md.

This is a fork

Virtual Calzone's fork of Team Relay. What we changed, what upstream offers that we do not, and how to merge a future upstream snapshot: FORK.md. Upstream's hosted service, documentation and support channels do not apply here — this plugin talks only to our relay, and the updater refuses a bundle that references the vendor control plane.

Licence

Upstream's licence is retained. See LICENSE and FORK.md for attribution.