Ambient mode
Ambient mode removes the bar. Your page keeps its own buttons, styled your way, and fires reactions through the JS API — while everything live keeps working: the falling reactions (yours and every other reader's, in real time), the counts, the rate limits and budgets. Available on Supporter and Pro plans.
Set it up
- In the console, open your app → Customize → Layout → ambient.
- Keep the
<tapback-bar>element in your page. It renders nothing in ambient mode, but it's still the anchor that opens the session and names the entity:
<tapback-bar entity="your-page-id"></tapback-bar>
<script type="module" async src="https://api.tapback.party/loader.js"
data-key="pk_live_…"></script>
- Wire your UI:
<button id="love">♥ <span id="love-n">0</span></button>
<script type="module">
await customElements.whenDefined("tapback-bar"); // the loader tag is async — wait for it
document.getElementById("love").onclick = () => tapback.react("heart");
tapback.on("counts", (totals) => {
document.getElementById("love-n").textContent = totals.heart ?? 0;
});
</script>
That's a working live-reactions page: taps land in the shared room, other readers' reactions fall down your page as they happen, and your counter updates live.
What to know
- Falls cover the whole page by default in ambient mode (there's no bar corner to anchor a strip to). The fall controls in the console — speed, travel direction, straight/weave — all still apply.
- Accessibility is yours. The bar's buttons ship labels, keyboard handling and a
screen-reader live region; in ambient mode your UI owns those. Use real
<button>elements and give them accessible names. - Mute: there's no bell, so offer your own control wired to
tapback.mute()if your audience needs one. A visitor's remembered mute on your site is honored across visits. - Plans: ambient is a paid layout. If an app's plan lapses, the same config serves the floating bar (with the badge) until the plan is restored — nothing breaks, and no reconfiguration is needed when it comes back.
- Archives: the static archive export renders the floating bar with
final counts (an archive is read-only, so there's nothing for your buttons to fire).
The archive bundle ships an inert
tapbackstub, so your UI's calls no-op instead of throwing.