Pulse
Rhea Milan Ada
private beta · self-hosted

Real-time collaboration for any website.

Comments pinned to pixels, live cursors, presence, reactions, and shared data — added to your product with a single HTML tag, running on your own server.

one <pulse-widget> tag multi-tenant works with any stack
Pulse - Self-hosted real-time collaboration for any website | Product Hunt
your-app.html
<!-- 1. load the SDK -->
<script type="module" src=
  "https://pulse.hire.rest/sdk/pulse-elements.js">
</script>

<!-- 2. drop the widget -->
<pulse-widget
  api-key="pk_your_key"
  token="…from your backend"
  room="dashboard"
  endpoint="wss://pulse.hire.rest">
</pulse-widget>

# or with a bundler
npm i @gamention/pulse-elements
this is a real page

Your users see each other. On your site.

Below is our live demo, running the widget you'd ship — comments panel, pinned thread, presence, and the room's heartbeat. Open it in two tabs and watch them sync.

demo.pulse.hire.rest
The Pulse widget on the live demo: comments panel, a pinned thread, presence avatars, and toolbar
what's in the widget

Everything a multiplayer page needs.

One tag adds the full collaboration layer. Every feature is enforced server-side per environment, so you decide what each tenant gets.

Comments pinned to pixels

Threads anchored to the exact spot they're about. Creators drag their pins; everyone sees the move live.

Live cursors & clicks

Color-coded cursors with names, click ripples, and shared text selections — throttled and smooth.

Presence & follow

Who's here, live in the toolbar. Click a teammate to follow their scroll for walkthroughs and reviews.

Notifications that navigate

Mentions, replies, and reactions land in an inbox. Click one and the page scrolls to the pin and opens it.

Media notes

Attach images, in-browser voice notes, and video clips to any comment. Lightbox and players included.

P2P shared data

Optional CRDT-backed SharedMap, SharedList, and SharedCounter over WebRTC — with server persistence for late joiners.

Self-hosted, multi-tenant

Your Postgres, your keys, your data. Tenants, environments, and API keys managed in the admin panel.

Themeable to the pixel

CSS custom properties for every surface — brand colors, dark mode, header caps, fonts, radii.

quick start

Live in three steps.

Your backend mints a short-lived token with your secret key; the widget does the rest. Full walkthrough in the Quick Start guide.

terminalor load it straight off your Pulse server — no build tools needed
npm i @gamention/pulse-elements

// no build tools?
<script type="module" src=
  "https://pulse.hire.rest/sdk/pulse-elements.js">
</script>
your serverthe sk_ never touches the browser
// Node.js — any framework works the same way
const res = await fetch(
  "https://pulse.hire.rest/auth/token",
  { method: "POST",
    headers: { Authorization: "Bearer sk_…" },
    body: JSON.stringify({ userId, name }) }
);
const { token } = await res.json();
the browseropen two tabs and you're multiplayer
<pulse-widget
  api-key="pk_your_publishable_key"
  token="{token}"
  room="dashboard"
  endpoint="wss://pulse.hire.rest">
</pulse-widget>
the hard part, solved

Pins that survive your next redesign.

Percentage-based pins drift the moment a layout reflows. Pulse anchors every pin with barycentric coordinates against three stable DOM landmarks, then degrades gracefully through four tiers instead of disappearing.

  • Tier 1–2: triangulated against 3 landmarks; still solves with 2
  • Tier 3: element-relative offset when landmarks vanish
  • Tier 4: document-fraction fallback — a pin never just vanishes
  • Movable: creators drag their pins; moves sync and persist
A pinned thread open in its popover, anchored to a kanban card

Pulse is in private beta.

Registrations are closed while we onboard early teams. Leave your email and we'll set up a tenant for you — or poke around the live demo and docs first.

no spam — one email when your tenant is ready