Nectenda

by Nectenda
5
4
3
2
1
Score: 50/100

Description

End-to-end encrypted real-time collaborative editing for Obsidian.

Reviews

  • Cedric Lau
    Reviewed on Oct 1st, 2026
    No review text provided.

Stats

0
stars
315
downloads
0
forks
22
days
4
days
4
days
0
total PRs
0
open PRs
0
closed PRs
0
merged PRs
0
total issues
0
open issues
0
closed issues
16
commits

Latest Version

5 days ago

Changelog

Nectenda 0.5.0

Added

  • Excalidraw drawings sync live. A change in one vault appears in the other's open drawing within moments, merged shape by shape, with each person's pointer and selection shown on the canvas.
  • Boards of the Kanban plugin (not the native bases Kanban) update live for everyone, keep a card you are editing safe while others change the board, and show who is on the board and which card they are editing.
  • Two new settings, "Live sync for Excalidraw drawings" and "Live sync for Kanban boards", turn live updates off per plugin. Drawings and boards are still merged safely when saved.
  • The Nectenda icon now appears in the header of canvases, bases and Excalidraw drawings as well as notes, under the same "in each note's header" setting.
  • The diagnostic log keeps the previous session as diag.prev.log, so restarting Obsidian no longer erases the record of what happened just before.

Fixed

  • Two people editing the same shape at once no longer corrupt a drawing. When the edit that loses changed the shape's text, style, link or points, it is kept beside the original, grouped and labelled with who made it and when.
  • A note you edited while sync was stopped is now merged when sync starts again, instead of being overwritten by the other vaults' version. If both sides changed it, your copy is kept in .nectenda-backups. Drawings are treated the same way.
  • Files added just after Obsidian started could upload but never reach the other vault, until a restart. They now arrive.
  • Turning sync off and on no longer slows Obsidian down over time.
  • Canvases and bases now show their real sync status, green when in sync, in their header and in the file explorer, instead of always grey. Drawings do too.

Known

  • Everyone sharing a drawing should update to 0.5.0. A collaborator on an earlier version still sees it as a note and merges it as text. Their edits reach you as conflict copies beside the drawing, about one per save. Nothing is lost.
  • When two people move or resize the same shape at once, one move wins and the other is not kept.
  • A shape deleted offline, in a drawing that is not live, comes back if Obsidian is quit before it reconnects.
  • Live sync of drawings is tested against Excalidraw 2.27.3 and 2.28.1. An Excalidraw release that changes what Nectenda relies on falls back, with a notice, to syncing a drawing when it is saved, a few seconds behind.
  • A shape type one vault's Excalidraw does not know, such as a sticky note in an older Excalidraw, is kept but not shown there until that vault updates Excalidraw.
  • With live sync for drawings off, nobody is shown on a drawing.
  • While a drawing is open, its file can be up to a minute behind it. Nothing is lost, but another app reading the file sees changes late.
  • A Kanban board edited in the first second or so after Obsidian starts, before it has synced, is not merged: your edit is kept in .nectenda-backups with a notice, and the board shows it as gone until you restore it from there.
  • Two people moving the same Kanban card, or changing the same line, at the same moment can leave both versions on the board. The extra one can be deleted.
  • In a Kanban board torn out into its own window, a collaborator's change is not held back while you are editing a card.
  • Everyone sharing a base should be on 0.4.0 or later. A collaborator on an earlier version still syncs bases as whole files. Their edits reach you as conflict copies beside the base, and yours do not reach them. Nothing is lost, but the base does not merge until they update.
  • A collaborator on 0.3.0 or earlier still edits properties as text. Their edits are taken in, but if they and someone on 0.4.0 set the same property at once, the 0.4.0 value wins. The note as it stood is backed up first.
  • When two people change the same presentation setting of a base at once, such as its sort or column order, one value is kept with no conflict copy. Filters, formulas and grouping still get a conflict copy.
  • Column widths in a base are each vault's own, and a base whose filters reach outside the shared folder shows different rows in each vault. Entries without the shared mark are that vault's own.
  • If a collaborator moves a card while you are dragging it, your drop wins its position.
  • Collaborators still on 0.1.5 or earlier will appear to have no cursor. Their edits sync normally.
  • iOS is untested on a device. It should work, since it is the same JavaScript as Android, but nobody has run it on an iPhone, so it is not claimed.
  • On Android, all vaults in the app share one secret store: signing one vault in signs them all in.
  • There is no read-only membership. Everyone in a shared folder can edit it.
  • Not audited. The client ships unminified and the build is reproducible, so the claim is checkable, but no third party has checked it.

Installing

Install main.js, manifest.json and styles.css into .obsidian/plugins/nectenda/.

Verifying this build

The bundle is not minified. The code that encrypts your notes is the code you can read, and you can confirm this release was built from this source:

sha256(main.js) = 772290b97b569267c0ae6d47d1a477cb8817c8d09bf2b1a10aa37f6d2f8e3116
git clone <this repo> && cd nectenda-plugin && git checkout 0.5.0
pnpm install --frozen-lockfile && pnpm build
shasum -a 256 packages/plugin/main.js

The toolchain is part of the answer: packageManager in package.json pins the pnpm version, and the recipe above uses it. A different package manager produces a byte-different bundle with identical behaviour, because esbuild records each module’s resolved path in a comment.

Built from nectenda@41ae375.

README file from

Github

Nectenda

End-to-end encrypted real-time collaborative editing for Obsidian.

Two people in one Obsidian note, on one canvas and in one base at the same time: each one's named pointer, caret and selection shown to the other, cards moved, resized, linked and typed in at once, and a card moved between lanes of a base's kanban view.

Live cursors, offline editing, shared folders and attachments — on a server that cannot read your notes. Content is encrypted on your device before it is sent; the server stores ciphertext it has no key for, and document paths are HMACs rather than filenames.

What it makes live, for everyone in a shared folder:

  • Notes. Each person's caret and pointer, with their name; edits merge character by character as you type.
  • Canvases. Cards moved, resized, linked and typed in show as they happen, and changes to different cards merge.
  • Bases. Changes to different filters, formulas and views merge, you see which row, cell or card each person is on, and cards moved between lanes of the kanban view Obsidian 1.14 adds merge too.
  • Properties. A note's properties merge property by property.
  • Kanban boards made with the community Kanban plugin, and Excalidraw drawings made with the community Excalidraw plugin, live, with each person's presence on the board or the drawing. Images in a drawing are attachments, so they need a plan with attachment storage.
  • Offline. Your notes are files on your disk; what you change offline merges when you reconnect, and a version that cannot merge is kept as a conflict copy rather than lost.

The full list, with the version each arrived in, is the roadmap.

This repository

The Obsidian plugin and the shared library it is built from, source-available under the PolyForm Shield License 1.0.0.

This is the code that does the encrypting, and it is why the repository is published: every security property Nectenda claims is enforced here, on your device, before anything leaves it. The server relays ciphertext it cannot read and is not published — doing so would prove little, since nobody can verify which build an operator is actually running.

Start with docs/security-model.md: it states exactly what the server can and cannot see, and names the code implementing each claim so you can check rather than believe.

The published main.js is not minified, so the file that runs in your vault is one you can read directly.

This plugin requires an account and a server

Nectenda is a client for a sync server. It does nothing on its own: there is no offline-only or local-only mode, and with no account nothing syncs.

There are two ways to run it, and they differ in what reaches us:

Hosted at nectenda.com. We operate the server, so your encrypted notes pass through our infrastructure and are stored on it. We cannot read them: content is encrypted on your device before it is sent, the keys that decrypt it never leave your device unencrypted, and document paths are HMACs rather than filenames. What the server does see is real and is listed exhaustively in docs/security-model.md — which accounts share which folders, update sizes and timings, device records, and the display name you choose for a shared folder. Signing in talks to accounts.nectenda.com, the one address the plugin knows without being told.

A server you run. The plugin talks to whatever address you give it, and a vault pointed at your own server sends us nothing at all — not the ciphertext and not the metadata above. The server is not something you can obtain today: it will be sold as a licensed image, and that is not yet available. This is functional since it is the same codebase that runs our hosted service, but we have not yet packaged and documented it nicely for licensed usage. We will prioritise this and have it ready fairly quickly if demand for it is there.

Both modes run the same encryption. The plugin talks to the server you point it at and to no third party.

What leaves your machine

Nothing about what you do. There is no analytics of any kind.

When you are signed in to the hosted service, the plugin reports its own crashes to an error tracker Nectenda runs itself — not a third party. It is on unless you turn it off, and it sends nothing until it has shown you what a report contains. A report carries the exception and its message, scrubbed; stack frames as line and column numbers and function names, each frame's file reduced to the published main.js, Obsidian, or an unnamed frame; the plugin and Obsidian versions, the platform, and the install identifier every request already carries. It carries no note content, no note, folder or attachment name, no file path, not your vault's name, and no token or key.

The payload is built from a fixed list of fields rather than filtered down from a larger one — packages/plugin/src/error-report.ts, and there is no error-reporting library behind it, because a library owns the event and we would be subtracting from it. docs/security-model.md states the rule and names the code.

Installing

Install it from Obsidian's plugin directory, or find it under Settings → Community plugins → Browse inside Obsidian.

By hand, from the latest release: take main.js, manifest.json and styles.css, put all three in <your vault>/.obsidian/plugins/nectenda/, and enable the plugin under Settings → Community plugins.

Then open Settings → Nectenda and sign in. Signing in creates your own organisation on the free plan; share a folder from the plugin's pane and anyone you invite sees your edits as you type.

What changed in each version is in CHANGELOG.md.

What it costs

The plugin is free and always will be. The hosted service is what is paid for, and an organisation is the billable unit — a person can belong to several and takes one seat in each.

Price Seats Devices per seat Attachments
Free — 3 2 none; text sync only
Personal $5/mo or $48/yr 6 3 10 GB
Team $6 per seat/mo up to 10 4 20 GB + 5 GB per seat
Small Business $18 per seat/mo up to 25 6 100 GB + 20 GB per seat

Free is not a trial: it does not expire and it is not a reduced version of a paid plan - the main differences being attachment storage space and user/device allowances. Text sync is never blocked on any plan, and nothing is deleted if you stop paying — an organisation that lapses returns to Free with everything it stored still downloadable.

Plans are bought inside Obsidian rather than on a web page, because the keys that encrypt your vault are derived on your own device from a passphrase that never reaches us. An account cannot be created for you remotely; the last step is always yours. Full pricing at nectenda.com/pricing.

Build

pnpm install
pnpm build          # produces packages/plugin/main.js

Building it yourself is the point of publishing it: scripts/verify-build.mjs rebuilds from this source and compares the result byte for byte against the main.js in a release, so you can check that the file you installed is the file you just read.

Documentation

  • Security model — what the server can and cannot see, the exact cryptographic parameters, and what is deliberately not claimed

Licence

PolyForm Shield 1.0.0 — source-available, not open source.

Any purpose is permitted, commercial use included, except providing a product that competes with Nectenda. Reading this code, auditing it, modifying it for your own use, and building it to check the result against the main.js you installed are all expressly permitted — that is what publishing it is for.

If you redistribute any part of it, PolyForm Shield requires you to pass on the licence terms and this line, which also travels inside every built main.js:

Required Notice: Copyright (c) 2026 Nerchure Ltd (https://nectenda.com)

Getting help, and reporting a vulnerability

Support: [email protected] — accounts, subscriptions and refunds. We reply within three business days.

Security: if you have found a vulnerability, please write to [email protected] rather than opening an issue, and give us a reasonable chance to fix it before disclosing. We will confirm receipt within three business days, tell you what we find, and credit you unless you would rather we did not.

Every claim in docs/security-model.md is meant to be checkable against this code. If you can show one of them is wrong, that is the report we most want.


Generated from Nectenda's development repository; issues and pull requests are welcome here, and changes are applied upstream and mirrored back.