ensemble is an open-source collaborative spreadsheet platform. It embeds a Univer-powered editor into any host application and exposes pluggable adapters for identity, permissions, data masking, and blob storage — so each host controls its own auth and data policy.
Status: v0.1.0 GA. Single + multi-user editing with realtime collaboration over WebSocket: every Univer mutation auto-broadcasts (per-recipient mask-rule applied) and the editor auto-acquires a cell-region lock so concurrent writes to the same cell are server-arbitrated (not last-write-wins). Multi-tenant RLS at the Postgres layer; version history with named snapshots + restore; debounced auto-save (configurable autoSaveMs); server-side xlsx export with mask; viewer-role enforcement at HTTP, WS, and Univer-command layers (defense in depth); 4-adapter conformance suite (identity / permission / storage / event); docs site; FastAPI integration example. Ready for npm publish + public GitHub once §11 decisions land (product name / org / domain).
Prerequisites: Node 20+, pnpm 9, Docker (for integration tests).
pnpm install
pnpm -r test
pnpm lint| Package | Purpose |
|---|---|
@ensemble-sheets/core |
Univer editor bootstrap, sheet codec (import/export XLSX) |
@ensemble-sheets/server |
Hono HTTP + WebSocket server, Drizzle/Postgres persistence, adapter contracts |
@ensemble-sheets/react |
React component wrapping the core editor |
@ensemble-sheets/vue |
Vue 3 component wrapping the core editor |
@ensemble-sheets/identity-jwks |
JWKS-based IdentityAdapter (resolves tenant + user from JWT) |
@ensemble-sheets/storage-fs |
Local-filesystem blob storage adapter (dev / single-node) |
@ensemble-sheets/storage-s3 |
AWS S3 blob storage adapter |
@ensemble-sheets/webhook |
Outbound webhook event adapter |
@ensemble-sheets/demo |
Demo app: single-tenant dev server + Vite front-end |
- Full design spec:
docs/specs/2026-05-15-ensemble-design.md - Sprint 1 implementation plan:
docs/superpowers/plans/2026-05-15-sprint1-it-opens.md
Apache 2.0 — see LICENSE.