Create Elaan notification types, templates and brands, trigger sends, and debug delivery.
Copy the AI prompt to install this server into Claude Code, Cursor, or another agent β or use 1-click editor setup below.
One-click editor setup isnβt available for this listing yet β we donβt have a confirmed install command, and weβd rather show nothing than point your editor at the wrong package or host. Follow the projectβs own setup instructions, linked above.
Client SDKs for Elaan β drop-in notification inbox, preferences, and push-token management for your users' frontends.
This is the JavaScript/TypeScript family. Swift and Kotlin/Android live in
their own repos (elaan-swift, elaan-kotlin).
| Package | What it is | Registry |
|---|---|---|
@elaanio/core | Framework-agnostic foundation β API client, types, observable inbox/preferences stores, and a realtime-transport interface. No UI, no framework. | npm |
@elaanio/react-core | React bindings only (no DOM) β ElaanProvider + hooks (useNotifications, useUnreadCount, usePreferences, usePush, useBrowserPush) over the core stores. Shared by web and native. | npm |
@elaanio/react | React (web) components β notification bell, feed, and preferences UI, plus real-time updates over SSE-on-fetch. | npm |
@elaanio/react-native | React Native components over the same hooks; realtime over SSE (react-native-sse) with polling fallback. | npm |
@elaanio/vue | Vue 3 components + composables β bell, feed, and preferences, with fetch-SSE realtime. | npm |
@elaanio/svelte | Svelte stores (headless) β reactive inbox, unread count, and preferences; bring your own markup. | npm |
@elaanio/elements | Framework-agnostic Web Components β <elaan-bell> / <elaan-feed> / <elaan-preferences>. Drop into any page or framework. | npm |
The non-visual logic lives once in @elaanio/core; each framework package is a
thin adapter over the core client + observable stores (React goes through the
shared @elaanio/react-core hooks; Vue and Svelte bind the stores to their own
reactivity). Adding another framework means a new binding over @elaanio/core,
not a reimplementation of the client or stores.
The SDK never sees your API key. Your backend mints a short-lived contact
token for the signed-in user (POST /v1/contacts/tokens with your service
key, by external_id) and returns it to the client. You pass the SDK a
tokenProvider callback that fetches a fresh token from your own endpoint; it
refreshes automatically on expiry. See @elaanio/react for the
full token flow.
Same provider and hooks; the components render with React Native primitives
(View/FlatList/Switch/Modal) instead of DOM, and there's no stylesheet
to import. Realtime works over SSE via react-native-sse
(RN can't stream fetch, but its XHR-based EventSource can send the auth
header), wired into the RN provider by default and falling back to polling when
the deployment has realtime off. Pass realtime={null} for polling only.
web_push channel)A separate channel from mobile push, not a provider under it β a contact's opt-out
is keyed by (type, channel), so "no browser nags, keep my phone alerts" has to be
expressible.
There is no token to hand in here, only a handshake to perform, so useBrowserPush
does the whole thing: permission, service worker registration, subscribe(), and
converting the subscription's two keys into what the API stores.
subscribe() resolves to a result rather than throwing, because the failures are
states to render: unsupported, denied, dismissed, not-configured. denied
is the one to handle deliberately β the browser will not prompt again, so the only
way forward is site settings.
Your service worker must show the notification. If it doesn't, the browser substitutes its own "site has been updated in the background" notice:
The account needs a VAPID keypair (Push Transport in the console). Without one
subscribe() returns not-configured β the SDK checks before it prompts, so a
one-shot permission isn't spent on an account that can't send.
It also needs a browser push template for each notification type you send, but the SDK cannot check that and does not claim to: subscribing succeeds and the sends then fail server-side with "no resolvable template". If notifications never arrive for a browser that reports itself subscribed, that is the first thing to check β the delivery log in the console names it directly.
A runnable version of all of this is in
examples/web-push-demo.
Web (@elaanio/react) ships a stylesheet driven entirely by CSS variables, so
you theme it without touching component internals. Import the stylesheet once,
then override the variables on :root (or any ancestor of the components):
Every component also takes className and any other DOM attribute, applied to
its root element, so you can scope the variables to a subtree instead of
:root:
Dark mode follows the OS by default and can be driven by your app instead:
a dark class or data-theme="dark" on any ancestor switches the palette, so
a manual theme toggle (the Tailwind and shadcn default) works without you
redeclaring the variables. Override the variables inside your own media query
or under your own selector to customize either palette.
No reviews yet β be the first to share how this listing worked for you.
Showcase your server listing on GitHub or your project documentation. Embed this dynamic SVG badge to highlight official listing status and live engagement.
[](https://allmcps.com/mcp/mcp-186)<a href="https://allmcps.com/mcp/mcp-186"><img src="https://allmcps.com/api/badge/mcp-186?style=directory" alt="Elaan JavaScript SDKs on AllMCPs" /></a>