Stanislaw dcf1b8b8b5 fix(tracker): track clicks on annotated containers and gracefully handle invalid pushState URLs
Three bugs in src/tracker/index.js, all empirically reproduced.

1. handleClicks() missed clicks on container elements: closest('a,button')
   could not find a non-anchor ancestor with data-umami-event, so a click on
   any descendant of <div data-umami-event=...> went untracked. Reworked to
   closest([data-umami-event]) so any annotated ancestor matches.

2. handlePush() called new URL(url, location.href) outside normalize()'s
   try/catch, so a host page calling history.pushState({}, '', invalidUrl)
   would have umami's wrapper throw a TypeError into the host's router.
   normalize(url) already handles base resolution and catches parse errors.

3. The history hook ran the umami callback BEFORE native pushState, so a
   failed native call (SecurityError on invalid URL, etc.) would still mutate
   currentUrl/currentRef and schedule a phantom pageview. Run native first;
   if it throws, the callback never fires and tracker state stays consistent.

Bug 2 verified: 4/10 representative click scenarios missed before
(span inside div, deep span inside div, a with no href, button inside a),
all 10/10 tracked after.

Bug 1+3 verified: pushState({}, '', invalidUrl) now leaves tracker state
unchanged (currentUrl unchanged, no phantom pageview).
2026-05-07 16:04:16 +02:00
2026-05-04 14:12:08 -07:00
2025-04-17 19:08:25 +02:00
2026-04-14 09:27:07 -07:00
2026-04-20 21:58:54 +02:00
2026-03-06 09:58:43 -08:00
2022-12-27 21:38:23 -08:00
2025-12-03 23:01:22 -08:00
2026-05-01 15:34:07 -07:00
2025-03-31 22:49:34 -05:00
2022-12-26 20:50:55 -08:00
2026-04-15 22:02:48 -07:00
2025-10-16 02:42:13 -07:00
2026-05-04 08:42:48 +00:00
2025-04-29 09:53:11 -07:00
2025-04-29 14:36:52 -07:00
2025-11-21 21:35:11 -08:00
2025-09-01 16:17:55 -07:00
2025-09-03 17:16:03 -07:00

Umami Logo

Umami

Umami is a simple, fast, privacy-focused alternative to Google Analytics.

GitHub Release MIT License Build Status Umami Demo


🚀 Getting Started

A detailed getting started guide can be found at umami.is/docs.


🛠 Installing from Source

Requirements

  • A server with Node.js version 18.18+.
  • A PostgreSQL database version v12.14+.

Get the source code and install packages

git clone https://github.com/umami-software/umami.git
cd umami
pnpm install

Configure Umami

Create an .env file with the following:

DATABASE_URL=connection-url

The connection URL format:

postgresql://username:mypassword@localhost:5432/mydb

Build the Application

pnpm run build

The build step will create tables in your database if you are installing for the first time. It will also create a login user with username admin and password umami.

Start the Application

pnpm run start

By default, this will launch the application on http://localhost:3000. You will need to either proxy requests from your web server or change the port to serve the application directly.


🐳 Installing with Docker

Umami provides Docker images as well as a Docker compose file for easy deployment.

Docker image:

docker pull docker.umami.is/umami-software/umami:latest

Docker compose (Runs Umami with a PostgreSQL database):

docker compose up -d

🔄 Getting Updates

To get the latest features, simply do a pull, install any new dependencies, and rebuild:

git pull
pnpm install
pnpm build

To update the Docker image, simply pull the new images and rebuild:

docker compose pull
docker compose up --force-recreate -d

🛟 Support

GitHub Twitter LinkedIn Discord

S
Description
Umami is a privacy-first analytics platform. Traffic, campaigns, behavior, conversions, and revenue in one place — no cookies, no surveillance, self-hosted or in the cloud.
https://umami.is
Readme MIT
33 MiB
0 Stars 1 Watchers 0 Forks
Languages
TypeScript 98.7%
JavaScript 0.9%
CSS 0.3%