Files
memind/docs/local-analytics.md
T
john c7718c683b
Memind CI / Test, build, and release guards (push) Successful in 1m36s
fix: inject Rybbit tracking on m.tkmind.cn publication pages
Publication routes and share shells were missing the Rybbit tracker, and
bootstrap now reuses the stored MindSpace analytics secret when Rybbit env
secret is absent.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-27 22:10:07 +08:00

3.2 KiB

Local Memind analytics (Umami + Rybbit)

Umami (optional)

Memind can still proxy /analytics/* to a local Umami service at http://127.0.0.1:3100.

MEMIND_ANALYTICS_ENABLED=true
MEMIND_ANALYTICS_URL=http://127.0.0.1:3100
MEMIND_ANALYTICS_WEBSITE_ID=<website-id>
MEMIND_ANALYTICS_ID_SECRET=<random-local-secret>
MEMIND_ANALYTICS_IDENTITY_MODE=raw
MEMIND_ANALYTICS_DOMAINS=127.0.0.1,localhost

MEMIND_ANALYTICS_IDENTITY_MODE=raw sends the stable Memind user ID to an explicitly approved first-party analytics service. Omit it elsewhere to keep the pseudonymous default.

Create a second Umami Website for the Memind product shell. Keeping it separate prevents chat, MindSpace, and feedback navigation from inflating generated-page views. Do not create a Website per page or per user.

MEMIND_PRODUCT_ANALYTICS_ENABLED=true
MEMIND_PRODUCT_ANALYTICS_WEBSITE_ID=<product-website-id>

The product shell loads its tracker from the same-origin /analytics/script.js endpoint. It records one standard page view per SPA route transition, product_click for links/buttons, and 10/30-second route engagement events. Query strings are restricted to a small allowlist and click labels never copy arbitrary chat or generated-page text. Authenticated product events use the same configured identity as generated pages while remaining in the separate product Website.

Rybbit runs on 105 as https://rybbit.tkmind.cn. Local Memind does not talk to 103 for analytics. It proxies same-origin /rybbit/* to Rybbit /api/* so the browser script stays first-party:

Generated Page
  -> /rybbit/script.js  -> https://rybbit.tkmind.cn/api/script.js
  -> /rybbit/track      -> https://rybbit.tkmind.cn/api/track
  1. In Rybbit, create one Site for the local host you use (127.0.0.1 or localhost). Do not create a Site per page or per user.

  2. Put the numeric Site ID and a local pseudonymization secret in Memind .env:

    MEMIND_RYBBIT_ENABLED=true
    MEMIND_RYBBIT_URL=https://rybbit.tkmind.cn
    MEMIND_RYBBIT_SITE_ID=2
    MEMIND_RYBBIT_ID_SECRET=<random-local-secret>
    

    If MEMIND_RYBBIT_ID_SECRET is omitted, Portal bootstrap reuses the MindSpace analytics secret stored in mindspace_config (the same value configured below in memind_adm → Analytics 配置).

  3. Restart the local Memind server. Full generated HTML pages receive a same-origin /rybbit/script.js tracker. Publication routes under /u/:owner/pages/:slug and /MindSpace/:user/public/... both receive the tracker. The tracker identifies the visitor with a stable pseudonymous owner ID, then records engagement events such as page_click, scroll depth, and dwell time. Initial pageviews come from Rybbit's site setting trackInitialPageView.

  4. Open Rybbit from local memind_adm → Analytics 配置 →「打开 Rybbit 分析后台」 (SSO). That path requires matching MEMIND_RYBBIT_SSO_SECRET / RYBBIT_SSO_EMAIL with the 105 Rybbit deployment.

Both integrations are fail-open: missing configuration or a down analytics service leaves page generation and page delivery unchanged. Do not expose the Rybbit or Umami dashboards directly to end users.