The model
Ease is multi-tenant. You sign up, get an API key,
and the account that the key authorises is your
tenant. The SDK reads your tenant's config (auth
method, OTP settings, avatar size limits) at
connect() time; everything else operates
inside your tenant boundary.
- You are the tenant. One API key authorises every call from your application. Bill, audit log, configuration, all scoped here.
- Your users are users. They sign
up under your tenant, authenticate with the method
you chose (email + password, or phone + password),
and interact with each other through DMs and groups.
User IDs look like
EUSR_…. - Tenants don't cross. A user in your tenant can't DM a user in someone else's tenant. Membership lives inside the tenant boundary.
The shape
Four named surfaces, one entry point. Whatever platform you're on, your code reads the same.
const ease = new Ease({ apiKey })
await ease.connect()
await ease.auth.signUp(email, password, otp)
await ease.contacts.sendRequest({ email: 'bob@example.com' })
const dm = ease.chat.dm(bobId)
await dm.send({ kind: 'message', text: 'hello' })
dm.on('message', (e) => console.log(e.from, e.text))
const profile = await ease.me.getProfile()
Pick your platform
.xcframework with libsignal bundled. Pin a version, hit go.
Android 8+
Maven Central. com.ease:ease-sdk: Coroutines-first, libsignal native libs per ABI.
Browser + Node
npm. @securegroupchat/web-sdk: Minified ES modules, libsignal-wasm bundled. TypeScript declarations included.
.NET 8+
NuGet. EaseSDK: Native libsignal runtimes per platform; signed package.
Server-side
NDA-gated. Private git source for customers under contract. cargo dependency on a pinned tag.
How it's organised
Four surfaces on every SDK. Each surface owns one
domain. The boundaries hold across platforms; if it's
on ease.chat.* here, it's on
ease.chat.* there.
Defaults
- Encrypted by default. Every DM and group is end-to-end encrypted via libsignal Sender Keys. The server never sees plaintext.
- Same shape on every SDK. Verified by a cross-platform conformance check on every commit: identical type names, identical surface taxonomy, idiomatic syntax per language.
- Lockstep versioning. All five
SDKs ship at the same semver.
0.5.0on Apple is0.5.0on every other SDK, same wire compatibility, same surface.