Embeddable annotation for web apps

Comment on the product, not around it.

Gloss drops a realtime discussion layer into your web app. Pin a thread to any element or region, keep every word anchored to the thing it’s about, and resolve decisions in place.

Try it live on this pageThis site runs Gloss on itself — the button is live.
Live surface

The dashboard below is a real Gloss target — enter annotation mode and click it, or drag across a region.

app.example.com/dashboard
OverviewLast 30 days
Active projects128+14% vs prev. month
Threads resolved342+9% vs prev. month
Median response2.4h−31% vs prev. month

How it works

Three lines in, every page annotatable.

  1. 01

    Install the runtime

    One framework-neutral package. React hosts can take the lifecycle adapter instead — SSR-safe, with the renderer kept behind the package boundary.

    bun add @celados/gloss-annotator
  2. 02

    Mount one annotator

    Point it at your Gloss Project. Hosted realtime is already wired, and supported browsers can attach native visual evidence; your page stays untouched until someone starts annotating.

  3. 03

    Point, comment, resolve

    Click any element — or drag across a region — and a thread opens right there. Everything syncs live and resolves without erasing history.

annotator.ts
import { createAnnotator } from '@celados/gloss-annotator'
import '@celados/gloss-annotator/style.css'

const gloss = createAnnotator({
  projectId: 'your-project-id',
})

// the launcher appears; your page is now a surface
gloss.start()

React host? Wrap your tree with <GlossProvider projectId="…"> from @celados/gloss-react and drive it with hooks.

Built in, not bolted on

The details that make feedback stick.

01

Element anchors

Threads bind to structural element identity, so they reattach after reloads, rebuilds, and routine redesigns.

02

Region anchors

Drag any rectangle inside a container. When HTML-in-Canvas is available, Gloss attaches browser-native visual evidence; otherwise the Region remains structural.

03

Realtime by default

Comments, replies, and resolution sync live over a Convex backend. No refresh, no handoff archaeology.

04

Host-owned identity

Your app asserts who is speaking — ID, name, avatar, traits. Gloss never authenticates your users.

05

Resolve, don’t delete

Resolved threads leave the canvas but keep their history. Reopen any time — decisions stay auditable.

06

Export anywhere

Copy a thread as Markdown or export the page as JSON when a conversation should become an issue.