Coming soon

Pulsify Cloud.
Sync without servers.

A managed CRDT database for your pulses, on Cloudflare Durable Objects or Unikraft Cloud. Swap the connector and never manage a database again.

Three steps

Same code, zero infrastructure

  1. Deploy a backend: Cloudflare or Unikraft Cloud.
  2. Grant roles and sign tokens from your backend.
  3. Point the cloud connector at it and ship.

Local connectors keep working, so your app still renders instantly and edits offline. The cloud is the durable, always-on peer.

app.ts
import { createCloudConnector } from "pulsify-cloud";
import { loadPulse } from "pulsify-core";
import { Notebook } from "./schema";

// One connector. No relay, no database, no migrations to run.
const cloud = createCloudConnector({
  url: "https://pulsify.example.com",
  token: () => fetch("/api/pulsify-token").then((response) => response.text()),
});

// The user's root and every note below it, over one socket.
const notebook = await loadPulse(Notebook, user.id, { connectors: [cloud], include: true });
notebook.name = "Stored at the edge";

Under the hood

One actor per root

A collaborative namespace is a tiny stateful service: one writer at a time, many readers, a log to persist. A Durable Object, or an actor beside PostgreSQL on Unikraft Cloud, is exactly that primitive.

One isolated root per namespace

A user, a team or a project is a root: its own single-threaded actor with its own storage. Capacity grows with the number of roots, with no shared database to size.

One socket per user and root

Every document of a root is multiplexed over one WebSocket. Clients subscribe to exactly the documents they load: the root, one note, or a whole subtree.

Built-in authentication

Your backend signs an identity token. Each root keeps its own grant table of readers, editors and owners, and applies changes to open sockets immediately.

Operations, not blobs

Pulsify stores immutable patch rows, so the cloud answers version-vector queries with an indexed read. No document is decoded on the server.

Global and pay as you go

On Cloudflare, a root lives near its first user and idle sockets hibernate. On Unikraft Cloud, idle instances scale to zero. You pay for activity and storage.

Open protocol, no lock-in

The cloud speaks the same versioned binary protocol as the open-source relay, and stores rows in the same schema as the self-hosted stores.

Both backends pass the same conformance suite. Moving from one to the other is a URL change.

Cloud or self-hosted?

Both use the open-source core and the same connector on the client.

Pulsify CloudSelf-hosted
StorageManaged, per rootYour PostgreSQL or SQLite
ScalingAutomatic, per rootYou size the relay and database
Access controlBuilt in: tokens and per-root grantsYour upgrade handler
LatencyNearest Cloudflare location or Unikraft metroYour region
Data residencyJurisdiction hintsAnywhere you deploy
SetupA Worker or an image, then a URLRelay + store, about 40 lines