Stickybeak Docs Dashboard Get early access

Backends

Turbo, htmx and friends

Stickybeak follows path-changing navigation from Turbo, htmx, Livewire, Inertia, LiveView and Blazor without extra page-view code.

What counts

A first load, history.pushState to a different path, and Back or Forward between paths count. Query-only changes, replaceState and updates that leave the address alone do not.

LibraryCountedNot counted
Turbo / TurbolinksDifferent-path visits; Back/Forwardreplace, query-only changes, ordinary Frames
htmxPath-changing boosted links and hx-push-urlhx-replace-url, address-free swaps
LivewirePath-changing wire:navigateComponent and query-only updates
InertiaDifferent-path visitsSame URL, replace: true, preserveUrl
LiveViewPath-changing navigate, patch and push variantsreplace: true, query-only patches
BlazorEnhanced navigation to a different pathSame-path updates

Keep one identical Stickybeak tag in <head>; partial-navigation libraries preserve it.

Goals and custom events in partial updates

data-goal works in swapped content. For server-confirmed goals, avoid body scripts that a page cache may replay:

  • Redirects: render a session-flash call in <head>.
  • Livewire: use $this->js().
  • Inertia: use flash data and router.on("flash").
  • LiveView: use push_event.
  • htmx: send an HX-Trigger response header.
HX-Trigger: {"stickybeak": {"name": "signup", "props": {"plan": "pro"}}}
<script>
  document.addEventListener("stickybeak", function (event) {
    window.stickybeak(event.detail.name, event.detail.props);
  });
</script>

Build the header with your language’s JSON encoder. See Custom goals and Single-page apps.