Umami is a modern, privacy-focused alternative to Google Analytics. https://umami.is
Find a file
2025-12-03 22:22:06 -08:00
.github New docker workflow. 2025-11-07 22:41:10 -08:00
.husky Card mode for tables. 2025-10-14 13:04:14 -07:00
cypress
db update CH view to account for new event types 2025-10-02 10:18:13 -07:00
docker Updated lang files. 2025-10-06 12:11:26 -07:00
podman
prisma
public Updated lang files. 2025-10-06 12:11:26 -07:00
scripts Merge pull request #3743 from Mintimate/master 2025-11-12 21:33:19 -08:00
src Reordered IP headers. 2025-11-18 10:25:08 -08:00
.dockerignore Fixed docker build. 2025-10-06 02:12:57 -07:00
.eslintignore
.eslintrc.json
.gitignore chore [#3699] : fix .gitignore syntax and untrack package-lock.json 2025-11-08 22:33:22 +01:00
.prettierignore
.prettierrc.json
.stylelintrc.json
app.json
cypress.config.ts
docker-compose.yml CCP-403: build from local code 2025-12-02 19:58:57 -08:00
Dockerfile Updated Dockerfile to match current Prisma version. 2025-11-03 16:54:58 -08:00
jest.config.ts
LICENSE
netlify.toml
next-env.d.ts
next.config.ts Add rewrite for script in cloud mode. 2025-10-08 16:01:47 -07:00
package.components.json Responsive everything. 2025-10-16 02:42:13 -07:00
package.json Added data-fetch-credentials attribute. Closes #3644 2025-11-13 19:42:04 -08:00
pnpm-lock.yaml Added data-fetch-credentials attribute. Closes #3644 2025-11-13 19:42:04 -08:00
pnpm-workspace.yaml
postcss.config.js
README.md Adding Mermaid database diagram to README 2025-12-03 22:22:06 -08:00
rollup.tracker.config.js
tsconfig.json
tsconfig.prisma.json
tsup.config.js

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 or newer
  • A database. Umami supports PostgreSQL (minimum v12.14) databases.

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

To build the Umami container and start up a Postgres database, run:

docker compose up -d

Alternatively, to pull just the Umami Docker image with PostgreSQL support:

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

🔄 Getting Updates

Warning

If you are updating from Umami V2, image "postgresql-latest" is deprecated. You must change it to "latest". e.g., rename docker.umami.is/umami-software/umami:postgresql-latest to docker.umami.is/umami-software/umami:latest.

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

git pull
pnpm install
pnpm run build

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

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

Database ERD

erDiagram

    WEBSITE_EVENT {
        uuid website_id
        uuid session_id
        uuid visit_id
        uuid event_id

        string hostname
        string browser
        string os
        string device
        string screen
        string language
        string country
        string region
        string city

        string url_path
        string url_query
        string utm_source
        string utm_medium
        string utm_campaign
        string utm_content
        string utm_term
        string referrer_path
        string referrer_query
        string referrer_domain
        string page_title

        string gclid
        string fbclid
        string msclkid
        string ttclid
        string li_fat_id
        string twclid

        uint event_type
        string event_name
        string tag
        string distinct_id

        datetime created_at
        uuid job_id
    }

    EVENT_DATA {
        uuid website_id
        uuid session_id
        uuid event_id

        string url_path
        string event_name
        string data_key

        string string_value
        decimal number_value
        datetime date_value

        uint data_type
        datetime created_at
        uuid job_id
    }

    SESSION_DATA {
        uuid website_id
        uuid session_id

        string data_key
        string string_value
        decimal number_value
        datetime date_value

        uint data_type
        string distinct_id
        datetime created_at
        uuid job_id
    }

    WEBSITE_EVENT_STATS_HOURLY {
        uuid website_id
        uuid session_id
        uuid visit_id

        string[] hostname
        string browser
        string os
        string device
        string screen
        string language
        string country
        string region
        string city

        string entry_url
        string exit_url

        string[] url_path
        string[] url_query
        string[] utm_source
        string[] utm_medium
        string[] utm_campaign
        string[] utm_content
        string[] utm_term
        string[] referrer_domain
        string[] page_title
        string[] gclid
        string[] fbclid
        string[] msclkid
        string[] ttclid
        string[] li_fat_id
        string[] twclid

        uint event_type
        string[] event_name
        uint views
        datetime min_time
        datetime max_time
        string[] tag
        string distinct_id

        datetime created_at
    }

    WEBSITE_REVENUE {
        uuid website_id
        uuid session_id
        uuid event_id

        string event_name
        string currency
        decimal revenue

        datetime created_at
    }

    %% RELATIONSHIPS

    %% One website_event can have many event_data rows (KV payload for events)
    WEBSITE_EVENT ||--o{ EVENT_DATA : "has event data"

    %% One session (via website_event) can have many session_data rows (session-level KV)
    WEBSITE_EVENT ||--o{ SESSION_DATA : "has session data"

    %% Hourly stats are aggregated from raw events
    WEBSITE_EVENT ||--o{ WEBSITE_EVENT_STATS_HOURLY : "aggregated into"

    %% Revenue is per event
    WEBSITE_EVENT ||--o{ WEBSITE_REVENUE : "has revenue"

    %% Revenue rows are derived from a subset of event_data rows
    EVENT_DATA ||--o{ WEBSITE_REVENUE : "revenue from"


🛟 Support

GitHub Twitter LinkedIn Discord