Waypoint adds a reading progress bar and read-time estimate in one script. Paid plans add a table of contents and scroll-to-top control. It detects headings and word count automatically.
A thin bar tracks how far through the article a reader is — updated on every scroll burst, throttled with one requestAnimationFrame so it never janks. Color, height, and top/bottom position are customizable on a license.
Waypoint counts the words in your article and divides by reading speed — 238 WPM by default, the average adult pace — to inject an honest "min read" line near the top. Set the WPM to match your audience on a license.
Waypoint scans the page's h2 and h3 headings and builds a table of contents from them — no manual list, no anchors to maintain. Float it to the side or inline it at the top; the current section highlights as you read.
A floating button fades in once a reader scrolls past the fold and smoothly returns them to the top in one tap. It lives in a Shadow-DOM bubble so it can't be styled — or broken — by your theme's CSS.
When a reader hits ~98% of the article, Waypoint fires a waypoint:complete DOM event with the read minutes and word count — a clean hook for analytics, gamification, or a "you finished it" nudge.
Pure HTML/CSS/JS, zero dependencies, no build step, rAF-throttled and prefers-reduced-motion-aware. The floating chrome lives in a Shadow DOM. Drop it on WordPress, a static site, Webflow — anything that renders a <script> tag.
One <script> tag with defer, plus optional data-* attributes for theme color, bar position, and your license key. No build step, no config required.
It finds your article container automatically (article → main → common post-content classes), then reads its h2/h3 headings and word count — no markup to add.
A progress bar tracks their scroll, a "min read" estimate shows near the top, the auto table of contents follows along, and the scroll-to-top button is one tap away.
Tune the bar's color, data-bar-position, and height, override the WPM, and listen for the waypoint:complete event to feed your analytics.
Free gives every reader a progress bar and an honest read-time estimate. A license adds the auto ToC, scroll-to-top, customization, and the reading-complete event.
Waypoint locates your article container by trying article → main → [role="main"] → common post-content classes → <body>, then scans that container for h2 and h3 elements to build the table of contents and counts its words for the read-time estimate. No anchors, no manual list, no markup to add. If your theme uses a different wrapper, point it at the right one with data-content-selector.
The floating controls use Shadow DOMto reduce styling conflicts with the surrounding page. The read-time line and inline table of contents inherit your article's typography. Test those elements and the floating controls on your theme before publishing.
No. The free tier renders a reading progress bar and an estimated read time forever — those two always render, no key required. A license adds the auto table of contents, the scroll-to-top button, bar customization, the WPM override, and the waypoint:complete event.
Read time is words divided by reading speed, defaulting to 238 words per minute — the average adult pace — with a one-minute floor. It's an honest estimate, not a guarantee, because everyone reads differently. On a license you can override the WPM (clamped 80–1000) to match a slower or more technical audience.
It's pure vanilla JS, no dependencies, served from Cloudflare's edge. The scroll handler is requestAnimationFrame-throttled with passive listeners — one frame per scroll burst updates the bar, the scroll-top visibility, and the active heading together. It also respects prefers-reduced-motion, turning smooth scrolls into instant jumps and killing transitions for readers who ask for that.
Yes. window.Waypoint exposes a JS API — Waypoint.refresh() re-scans headings and recomputes the read time after a client-side route change, and calls made before the script loads are queued and flushed on init. There's also Waypoint.scrollTop() and Waypoint.getReadTime().