You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
websites() / websites_async() returned only the first page of Umami's paged /api/websites listing, silently truncating the list for accounts with more websites than one page. They now follow the page parameter until the reported count is reached (or a page adds nothing new, so a server that ignores page cannot loop) and return the complete list. Single-page accounts still make one request.
Self-hosted sends (new_event(), new_page_view(), new_revenue_event() and async twins) sent the literal header Authorization: Bearer None when nobody had called login(). The header is now omitted unless a token is present; Umami's /api/send ignores it either way, so recorded data is unchanged.
login() / login_async() now reject whitespace-only usernames and passwords with ValidationError, matching set_url_base() and set_cloud_api_key(); before, they went to the server and came back as a 401. The empty-username message also now says Username cannot be empty instead of Email.
Documentation
New user guide on the docs site: Getting started, Sending events, Authentication, Querying stats, Troubleshooting, Testing and CI, Configuration, How it works, and FAQ. The guide pages are also appended to llms-full.txt.
The agent skill (skill.md, .well-known/agent-skills/umami-analytics/SKILL.md, .well-known/skills/default/SKILL.md) is now hand-written from umami/skills/umami-analytics/SKILL.md and teaches the rules of the package (setup order, self-hosted vs Cloud, what disable() silences, distinct_id, the bot filter, what each error means) instead of listing API names. The skill is renamed from umami to umami-analytics, so its .well-known path changed. umami/skill_extra_body.md is folded into it and removed.
Every public function, model, and exception now has an Example: section in its docstring, rendered on the reference pages and in llms-full.txt. The package docstring states that there is no CLI and no environment variables are read, and names the three exception types callers see.
Docstring Raises: sections for new_event(), new_revenue_event(), and their async twins now list a blank event_name as a ValidationError cause.
README: install shows uv add and pip install and warns about the unrelated umami package; the Documentation section links each guide page; the tracking-disabled bullets say exactly what still contacts the server and that the send functions return {}; the Cloud section says the two modes are exclusive; the "Login" feature bullet no longer implies username/password login works on Cloud.
scripts/build_docs.py now fails the build when llms.txt, llms-full.txt, skill.md, the .well-known skill copies, the user guide, sitemap.xml, robots.txt, or search.json are missing from the output, or when llms-full.txt lacks a guide page. The post-build patch of the generated skill's install command is removed; Great Docs fixed that in 0.16.0 and the skill is hand-written now. The great-docs dev dependency is floored at 0.17.0, the version the build was verified on, in both the [dev] extra and a new umami/requirements-dev.txt that mirrors it.