Pre-recorded tooltip tours
"Click Save → then Settings → then this icon" — one fixed path, no eye-contact, no follow-up question.
- Static, pre-recorded path
- Breaks when the UI changes
- One-way — you can't see them
- Same script for everyone
Register in admin, paste two lines of code. Co-browse, chat and AI on your site in minutes — no SDK, no iframe, no tour builder.
Widget is live on this page — bottom-right corner
Static product tours are a guess about what each user might need. They break the moment your UI changes and can't adapt to what the visitor is actually looking at. Guidewell flips it: a real teammate joins the session, sees the same screen, and points with the cursor in real time — with an AI co-pilot that knows when to stay quiet.
"Click Save → then Settings → then this icon" — one fixed path, no eye-contact, no follow-up question.
Shared cursors, click ripples, scroll & navigation in sync. When a human guide joins, AI goes on standby — summon it any time with @ai in chat. Solo visitors still get full AI guidance.
@ai tag — explicit handoff in chatReal install — not a mockup. The button in the corner runs co-browse, session chat, and AI with @ai handoff.
Click the floating button, enter your name, pick visitor or guide. Saved locally — no form on return visits.
Hit Copy invite link and open it in another tab, incognito, or send to teammates — everyone lands in the same session with their own cursor.
On Guide, point and scroll together. On Chat, reach your ops inbox. Solo? AI replies on its own. Human in the room? Type @ai to summon it — guides stay in control.
Live co-browse, AI handoff, and operator chat — grouped by what your demo audience actually cares about. Every card maps to a real capability in the widget you can try on this page.
Solo visitors get proactive AI co-browse and automatic replies. When a guide joins, AI goes on standby — summon it with @ai in chat. No duplicate answers, no awkward overlap.
Unique color per peer, 60 fps, viewport-normalized — see exactly where everyone points.
Tap anywhere — a wave fires for every peer. "Click this button" without a voice call.
Normalized scroll ratio — different viewport sizes stay in lock-step, no echo loops.
Classic loads and SPAs — we patch pushState so routes mirror instantly.
N participants, no hard cap. Broadcast model — peers_snapshot on join, honest UI when someone leaves.
Name + role once, then copy the invite link — every tab auto-joins. No email, no signup wall.
Vanilla JS, scoped styles, async load — won't block TTI.
JWT-scoped per session. Peer snapshot on join — UI never lies.
Sessions remember site_origin. Cross-origin filtered server-side.
primaryColor, dark theme, custom FAB icon — brand in HTML.
Cursors & scroll stay in-memory. Meaningful events — clicks, navigations, custom actions — land in gw_analytics_events for admin replay.
data-chat="session" for co-browse room chat · inbox for operator queue · both for Guide + Chat tabs. Dynamic @ai hint when a guide is present.
REST to bootstrap, WebSocket to stream, Postgres to remember. A pure broadcast room — N peers, no cap, no master/slave. Every signal fans out; only meaningful events hit the database.
POST /v1/sessions with X-Guidewell-Key creates a row scoped to project_id + owner_user_id — that's how admin shows only your sessions.
Each peer opens /v1/sessions/{id}/signal?token=…. Server adds them to an in-memory SignalRoom, sends peers_snapshot to the newcomer, then peer_join to everyone else.
Cursor, scroll, click ripples and nav sync — JSON from any peer, relayed to all others (sender excluded). No participant cap, no role hierarchy, no per-pair signaling.
@ai tagSolo room → POST /v1/ai/respond on visitor messages + proactive nudges. Human teacher joins → AI waits until chat contains @ai. Guide messages never trigger AI unless tagged.
Cursors & scroll stay in-memory — they'd drown Postgres at 60 fps. click_wave, nav_change and custom action events land in gw_analytics_events for admin replay.
Seven copy-ready paths — script tag, dynamic config, reverse proxy, React, Nuxt, URL invites, and a JavaScript API. Every snippet is generated per project in the admin console.
Drop the snippet anywhere on your page. The bundle injects its own host element, scopes its styles, creates sessions on demand and tears itself down on unmount — no glue code, no virtual DOM runtime.
data-api points at your backend, data-key binds the session to a project. Everything else has sensible defaults.
data-fab-icon (any inline SVG — paste from lucide.dev), data-fab-text, data-primary-color, data-theme="dark".
window.GuidewellConfig = {…} before the script tag. Same options, useful when you build the config dynamically.
data-chat="session" for in-session messaging, data-chat="inbox" for a site-wide operator queue, or data-chat="both" for Guide + Chat tabs. Off by default.
data-ai="true". Solo visitors get automatic replies; when a guide joins, type @ai in chat to summon the assistant.
data-guidewell-toggle on any button on your page, or call Guidewell.open() / .close() / .toggle() from your own JS. The two CTAs on this page use exactly that.
<!-- That's the entire install. Same-origin: no data-api needed. --> <script src="/widget.js"></script> <!-- Cross-origin? Point at your API host. The data-key links every session this widget creates to your project + owner row, so the admin console shows you only the sessions you actually own. --> <script src="https://api-gw.screwglit.ch/widget.js" data-api="https://api-gw.screwglit.ch" data-key="prj_pk_…" data-chat="both"></script>
One <script src="…/widget.js"> with data-api and data-key. Auto-mounts on load — the fastest path (~2 min after signup).
window.GuidewellConfigSet config in JS before loading the script — same options as data attributes, useful when values come from your CMS or env at runtime.
Proxy /gw-api/* to the Guidewell API. Serve /gw-api/widget.js with data-api="/gw-api" — no CORS, no third-party script domain.
Inject the script in useEffect with dataset.api and dataset.key. Call Guidewell.unmount() on cleanup for SPA route changes.
Client-only plugin that appends the widget script on app init — same pattern as React, fits Nuxt's plugin lifecycle out of the box.
Deep-link into a session: ?session_id=…&role=teacher&autojoin=1&name=Anna. Share the link — widget opens and joins automatically.
After load: Guidewell.open(), .toggle(), .showGuideNudge(), .unmount(), .mount({…}). Bind with data-guidewell-toggle on any button — no glue code.
All snippets pre-filled with your API key in Admin → Projects → Embed Code · full reference in Widget docs
Guidewell ships with a Nuxt-based admin console for project owners and operators — manage projects, watch live sessions, run the API, handle billing & access. Production console: guidewell-admin.vercel.app.
Spin up a new project, get an API key, paste the embed snippet, lock to site_origin, tweak per-project widget defaults — all from the dashboard.
Every session you launched — scoped to your account via owner_user_id, filterable by project_id. Status, origin, mode, started/ended timestamps. Drill in to replay the persisted click / nav / action stream.
Per-project payments ledger with manual or provider-backed entries (Stripe/etc.), currency-aware, export-ready. Wire your own pricing on top.
Invite teammates, assign roles, review who has access to which projects. Admin-only view, JWT-backed, role-aware navigation in the sidebar.
RBAC primitives baked in: control which roles can manage projects, run sessions, see analytics or charge customers — Postgres rows, not config files.
Built-in OpenAPI playground — pick any endpoint, set path params and JSON body, fire it from the admin without touching curl. Live docs included.
No proprietary runtime, no vendor lock-in. Three deploy surfaces you already know — API on Fly, admin + landing on Vercel, Postgres via Supabase. Same repo, same migrations, same OpenAPI.
Async REST + WebSocket on one process. OpenAPI at /docs, widget at /widget.js.
In-memory SignalRoom per session — cursor, scroll, nav, chat fan-out. peers_snapshot on join.
Single Dockerfile + compose for local dev. Prod image serves API + static widget bundle.
Sessions, participants, projects, inbox, AI runs — transactional, RLS-ready schema in supabase/migrations/.
Admin login via Supabase → POST /v1/app/auth/supabase → app JWT for /v1/app/*.
Per-project LLM config, guide programs, run logs — optional module behind GUIDEWELL_AI_ENABLED.
IIFE embed — one <script> tag, scoped CSS, no React/Vue on customer sites.
Projects, sessions, inbox, AI guide, billing, API console — thin client to the same API.
This page — static HTML + GSAP, live widget embed, built with VITE_GUIDEWELL_API.
Spin up the backend, mount the widget, open the admin console. Everything you saw on this page is shipped in this repo — no SaaS sign-up required.