Repository navigation
Releases: LevelFourAB/syncplane
Releases · LevelFourAB/syncplane
Release list
v0.6.0
v0.5.0
v0.4.1
v0.4.0
0.4.0 (2026-10-31)
Features
- Blob storage to support attaching binary data to rows (737afcb)
- client: Let a text patch name the document the editor last saw (dec4715)
- client: Let apps await setSubscriptions() until the new scope is local (c2efea9)
- engine: Let server-side code make list order keys that match the client (4783830)
- engine: Let servers delete a workspace (ae5f336)
- Let clients sync through a message channel instead of HTTP (e30b89c)
Bug Fixes
- Return the same rows from an index as from a scan when ordered rows tie (c9cd20e)
Performance Improvements
- client: Cut IndexedDB storage for full-text search by about a third (e7ca6d4)
- client: Key search records by a short scope fingerprint instead of entity and workspace (10523bc)
- client: Store full-text search postings as packed term lists (12a1b41)
- engine: Cut SQLite index storage by a third for text search (f994128)
- engine: Cut SQLite index storage for text-heavy rows by a fifth (3af80e4)
- engine: Make reference indexes sparse to cut storage for empty refs (8111241)
- engine: Shrink index storage with short scope ids and per-row entry lists (d34c34c)
- engine: Shrink the SQLite search index by dropping row keys from search entries (3a88b04)
- query: Serve a sort against an index's direction from the index (e8f8671)
v0.3.0
0.3.0 (2026-10-29)
Features
- engine: Add typed, iterator-based reads and mutators (35a5f79)
- engine: Detect restored stores and reset clients ahead of the backup (81a60cf)
Bug Fixes
- client: Keep a write another tab already pushed instead of dropping it as poison (a35d502)
- client: Keep a write made during a format upgrade instead of wiping it (41db80c)
- client: Keep new text typed right after clearing a compacted text field (1bc3956)
- client: No longer lose queued text edits when a pull brings a compacted document (29c3dd9)
- client: Report a rejected edit when another tab syncs before the lost push is re-sent (df280ff)
- client: Report writes the server rejects during a local format upgrade (deca49f)
- client: Stop compaction recovery from deleting text typed by other users (93e73e2)
- client: Stop path-style row keys from sharing optimistic text edits (f94b1b9)
- client: Store recovered text edits until they are re-applied (9fc6e5e)
- client: Sync rows whose int64 id is written as a string like "007" or "0x10" (68aa054)
- client: Undo of a mark no longer removes formatting a peer applied on top of it (c156a1e)
- engine: Accept new text typed into a compacted text field after it was cleared (386abb4)
- engine: Always keep the rejections of a client's latest push (43ab390)
- engine: Keep a push batch going when a text document sits under a \u0000 key (ef91e4f)
- engine: Keep an interrupted bootstrap from leaving rows outside the window or closure (364ef14)
- engine: Keep indexed queries finding rows after a PATCH into an opaque field or reference (eaaad05)
- engine: Keep refused in-process writes from leaking text into readers copies (0a0dd53)
- engine: Keep rows hidden by the read filter off clients that bootstrap during a write (cc669e1)
- engine: Keep windowed rows in sync when a scope change follows a window move (9c73083)
- engine: No longer drop a write when a new client's first push sends ids out of order (c32eed4)
- engine: Refuse idempotency keys that are not valid UTF-8 or hold \u0000 on every store (515b802)
- engine: Reject duplicate keyed-list keys with invalid_argument instead of storing them (8fb974a)
- engine: Stop paginated pulls from leaving stale rows outside a window or closure (be447a6)
- engine: Stop the change feed from skipping writes after an access move (a4de84a)
- Keep a list element or map entry when a patch clears one of its fields (d3a6ce6)
- Keep queued writes through a server outage instead of dropping them as poison (eb51312)
- Keep stored text on PUTs without a document (e6fae74)
- Merge text in either order to the same bytes when a peer entry has counter 0 (704969c)
v0.2.0
0.2.0 (2026-10-24)
Features
- Add WriteFilter for controlling writes based on current data (11281b2)
- Declare access permissions, roles and access parents within schema (56165df)
Bug Fixes
- client: Keep a delete and re-create as separate writes (992e717)
- client: Keep accepted edits when the server refuses another edit to the same row (fc1caf8)
- client: Keep an unconfirmed edit queued when the client re-downloads a workspace (c2f7afe)
- client: Make useGroupCount and useGroupRows respect the workspaceId option (c94c757)
- client: Refuse map keys outside the key type's range in local queries (6d99d52)
- client: Stop text fields that start with U+FEFF from becoming unreadable (496943b)
- engine: Accept compiled messages after a schema is registered from a descriptor set (354065a)
- engine: Answer out-of-range mutation ids with invalid_argument (cf1e439)
- engine: Keep idempotency keys per caller so one user never receives another's recorded result (5f9bc9b)
- engine: Let users reconnect to presence after a stranger takes their session id (f4168e6)
- engine: Make server queries match local queries for out-of-range integer literals (c4f230b)
- engine: Purge history rows on Postgres for any non-ASCII key prefix (afbee60)
- engine: Re-check entity write rules under the write lock (09d5789)
- engine: Refuse client ids longer than 128 bytes instead of failing the push on Postgres (09013b3)
- engine: Reject writes whose indexed value is too long instead of dead-lettering them on Postgres (c364310)
- engine: Remove rows from clients when they stop following a reference (1621ebc)
- engine: Stop a node from overwriting a newer app schema (e870857)
- engine: Stop an edited sync cursor from reading rows the read filter hides (f1be064)
- engine: Stop an older presence update from replacing a newer one (fd8a4e2)
- engine: Stop leased background work from running twice on one Postgres node (d43855d)
- engine: Stop open sync streams from sending rows that a permission change hides (dfeb228)
- engine: Stop other users from blocking a client's writes by reusing its client ID (af4c330)
- engine: Stop pulls failing after a windowed subscription is removed (ba0e035)
- engine: Use the default heartbeat for a value that is not positive (24c7eee)
- Prevent dynamic registrations disagreeing after a server restart (a4f7268)
- Return the matching rows for prefix searches on descending indexes (d6bb403)
- Stop an edit to an empty-string key from replacing the whole map, set or list (4fb0588)
- Stop index reads from rounding integer literals on double fields (056fecd)
- Stop one malformed text edit from making a field unreadable for everyone (80eb325)
- Stop one write from making a collaborative text field impossible to edit (4163afe)
v0.1.0
0.1.0 (2026-09-25)
Features
- Ability for an entity to reserve DELETE for trusted writes (a85a506)
- Add full-text search with relevance ranking (28bff8f)
- Add one-hop query support for relations (5032134)
- Allow collaborative text fields inside keyed-list elements and map values (5a25573)
- Allow grouping a match set by a path, with counts or distinct values (53192c7)
- Allow limiting which fields a client can write (223b97a)
- Allow oneof use for references (16ca1db)
- Allow syncing only certain fields (3c2f02f)
- client: Add devtools for easier debugging (4c0468b)
- client: Add purgeLocalData for local sign-out (d6cd206)
- client: Add storagePrefix option (0b2b9fd)
- client: Add syncplane/testing for easier testing (e8df539)
- client: Add useQueryAll hook for React (7a589e4)
- client: Batch include hydration and add per-relation options (b539af2)
- client: Cache movable lists (19f3f12)
- client: Coalesce a burst of local writes into one push (1f15878)
- client: Cut local index storage by a third and speed up entity scans (818de3d)
- client: Examine large semi-join membership moves in probe-sized batches (f7bcb5e)
- client: Fast path for search postings (5bf4da2)
- client: Hydrate include trees with one read per relation instead of one per row (14d2d8b)
- client: Improve bootstrap performance by overlapping decoding with store writes (a84ca1e)
- client: Improve query and indexing speeds (cdd2cac)
- client: Improve querying performance with focus on total counts (b6fd692)
- client: Local queries report which path answered them through onSyncEvent (e2d0e52)
- client: Push the changes that happened mid-push before pulling (4e0ff7c)
- client: Rank a byWorkspace query by relevance (9d2dd81)
- client: Read rows across workspaces by ref, and add useRowsAll (47db376)
- client: Read rows by key without deriving the entity, and add useRows (a8e450c)
- client: Scope cross-workspace reads to named workspaces (d276525)
- client: Serve cross-workspace queries from secondary indexes (b96cb5f)
- client: Serve indexed queries as soon as a cold bootstrap completes (92d346a)
- client: Speed up watcher scope prune (bd1f16c)
- client: Support for scoped undo management (e11e7f2)
- client: Support movable window and totals for live query results (8a35d42)
- Cross-namespace referencing of objects (3b5f9eb)
- engine: Add MaxResyncScan to bound delta-resync work per Pull (e05bda2)
- engine: Add work queries so maintenance passes skip idle workspaces (4fbdf46)
- engine: Batch queued pokes into one NOTIFY round trip (fccfdb6)
- engine: Dedup background work across nodes with per-workspace leases (8e2f6a4)
- engine: Enumerate index candidates by key without reading the rows twice (56a6e7b)
- engine: Hash-partition support for pgstore (41f1593)
- engine: Improve background index build performance (421c234)
- engine: Judge pgstore compatibility by what migrations did not version (e48addd)
- engine: Let a deployment turn off SQLite's memory-mapped reads (3916fc5)
- engine: Let text compaction run as its own sweep instead of as part of GC (e84ca8d)
- engine: Load data in batches when querying via index (d417b29)
- engine: Maintain a forward follow closure from what changed instead of rebuilding it (8667aea)
- engine: Prepare SQLite statements once per pool and reuse them across transactions (35cc870)
- engine: Read a row's recorded actor and version through GetMeta (337b588)
- engine: Refuse text inside repeated/map elements and list identities inside a oneof (f3f5c2f)
- engine: Serve delta resync from indexes instead of scanning the workspace (cd4a4dd)
- engine: Serve partial bootstraps from indexes, closures and windows (bb8496b)
- engine: Speed up following subscriptions (e2475d6)
- engine: Subscribe to a workspace set through one wake channel instead of a goroutine per scope (9c785e9)
- engine: Wake the listener for a new channel without dropping its session (c342eca)
- engine: Write only the index entries a row write changes (37a782b)
- Entities can now declare who may create and update their rows (aa1e2fa)
- Faceting support for queries (1703088)
- Feed cursors now name the store that issued them for safety (88a4474)
- Improve performance of pull via incremental window and closure membership ([92ee35d](https://github.com/LevelFourAB/syncplane/co...