Address Greptile review on PR #4262. P2 (line 62): the value read back from localStorage was typed as any and trusted blindly, so a value written by an extension or a manual edit could end up as the chart's displayMode. Read it once, keep only 'table' or 'cards', otherwise fall back to null and let the existing useMobile-driven default decide. Self-correcting on the next click is no longer necessary because the next render is already clean. P2 (line 114): the empty <span /> was a flex placeholder that existed only to make justify-content: space-between push the toggle button to the right when allowSearch was false. Drop the span, drop space-between, and put marginLeft: auto on the inner Row holding the actions and the toggle. The toggle now hugs the right edge whether search is rendered or not, with no extra DOM node. style={{}} is used because the react-zen Row marginLeft prop only accepts spacing tokens, not auto. Verified in Playwright at 1400 viewport: the toggle is now flush with the right edge of the action row, the toggle still flips between table and cards on click, and a deliberately invalid localStorage value ({"malicious":true}) is rejected on reload so the page falls back to the table default.
Umami
Umami is a simple, fast, privacy-focused alternative to Google Analytics.
🚀 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
