mirror of
https://github.com/stack-auth/stack.git
synced 2026-06-21 21:09:49 +08:00
## Stack Auth → Hexclave rename — PR 5 (internal symbols, paths,
packages, brand strings)
PR 5 finishes the **internal / non-wire** half of the Stack→Hexclave
rename. It only touches things where nothing outside the repo depends on
the exact name: internal symbols, file/dir names, the
`@stackframe/template` package, and residual brand strings. Plan +
progress are in `HEXCLAVE-RENAME-PR5-PLAN.md`.
Every step was verified green (`pnpm typecheck` + `pnpm lint`, 28/28)
and committed as its own checkpoint, then a fan-out of review agents
audited all commits and the findings were fixed.
### What changed
- **Internal symbols** (`@hexclave/shared`, `packages/template`, apps):
`stack*`/`Stack*` → `hexclave*`/`Hexclave*` — incl.
`stackGlobalsSymbol`, the `_Stack*AppImpl` classes,
`stackAppInternalsSymbol`, `StackContext`, `getStackStripe`, etc. The
`stack*App` local-variable convention
(`stackServerApp`/`stackClientApp`/…) was renamed across 175
source/example/doc files.
- **File renames**: `hexclave-handler/provider/context.tsx`,
`backend/hexclave.tsx`, `internal-tool/hexclave.ts`,
`hexclave-app-internals.ts`.
- **Directory renames**: `lib/hexclave-app`, `hexclave-companion`,
`[...hexclave]` route segment, `skills/hexclave`,
`dashboard/src/hexclave`, and the package dirs
**`packages/{next,shared,ui,sc,cli}`** (dropping the `stack-` prefix to
match the `@hexclave/*` npm names).
- **Packages**: `@stackframe/template` → `@hexclave/template`; **deleted
`packages/init-stack`** (onboarding lives in `@hexclave/cli init`; the
published npm package is untouched).
- **Brand strings**: reworded `Stack Auth`/`Stack dashboard` prose in
code + docs-mintlify, renamed `hexclave-app.mdx`/`use-hexclave-app.mdx`
with redirects, regenerated OpenAPI, updated coupled e2e assertions;
`doctor`/`init` now prefer `hexclave.config.ts`.
### Intentionally kept (verified, not oversights)
Wire/compat identifiers (`x-stack-*` headers, `stack-*` cookies,
`STACK_*` env names, `*.stack-auth.com`, `stackauth_`, `ask_stack_auth`,
query params), public `Stack*` SDK aliases, crypto/JWT/vault
domain-separation tags, `*-brand-sentinel`s, the
`Symbol.for("StackAuth--…")` string, `_stack_sync_metadata`, Postgres
`stackframe` / docker image names, the `stack-auth-logo*.svg` (used by
the rebrand modal), and `migration.mdx` / "formerly known as Stack Auth"
notes. False positives (Phosphor `StackIcon`/`StackSimple`, `TanStack`,
`OrbStack`, `stackable`/`Stacked` charts) left alone.
### Review pass
Six review agents audited all commits. Found + fixed one real bug — a
build script (`bundle-type-definitions.ts`) hardcoded the old
`lib/stack-app` glob path (not an import, so typecheck/lint were blind),
silently emptying the dashboard AI type bundle — plus stale comments, a
dead CI env var, and stale `.gitignore`/`.dockerignore` entries.
Cross-cutting audit confirmed **zero wire-compat identifiers were
accidentally renamed**.
### ⚠️ Verification note
`typecheck` + `lint` are fully green locally. The **e2e suite was not
run** (needs a live backend+DB), so the brand-string assertion +
OpenAPI-regen changes are verified by grep/codegen only — please let CI
exercise e2e to confirm.
### Base-branch note
This branch was forked from the local-only `cl/friendly-lewin-72293f`
(not on origin, no separate PR), so this PR against `dev` also carries
that branch's ~11 preceding Hexclave-rename commits (config-file rename,
env-var dual-read, AI setup-prompt rebrand). If those should land
separately, re-parent before merge.
<!-- This is an auto-generated description by cubic. -->
---
## Summary by cubic
Finishes the internal Stack Auth → Hexclave rename and cleans up
remaining stragglers, including dev-tool and prompt copy. All changes
are internal-only; public/wire APIs remain unchanged. Re-merged `dev`
and resolved the payments create-purchase-url conflict.
- **Refactors**
- Internal symbols: stack*/Stack* → hexclave*/Hexclave* (e.g.,
`getHexclaveServerApp` via `@/hexclave`, `getHexclaveStripe`,
`hexclaveAppInternalsSymbol`, `hexclaveSchemaInfo`, Prisma
`__hexclave_*`, `data-hexclave-handler-page`, Stripe mock
`hexclavePortPrefix`).
- Files/dirs: moved to `lib/hexclave-app`; handler route
`[...hexclave]`; backend entry `src/hexclave.tsx`; dashboard internals
`hexclave-app-internals`; companion `hexclave-companion`; dropped
`stack-` prefix across package dirs
(`packages/{shared,ui,sc,cli,next}`); workflows/emulator paths now
`packages/cli`; Quetzal codegen env at `packages/next/.env.local`.
- Packages/docs: `@stackframe/template` → `@hexclave/template`; removed
`packages/init-stack`; regenerated OpenAPI and updated docs
slugs/redirects for hexclave-app/use-hexclave-app.
- Brand strings/prompts: reworded remaining “Stack” dashboard strings to
Hexclave; updated dev-tool copy and prompts; `doctor/init` now prefer
`hexclave.config.ts`. Kept all wire-compat identifiers and public
aliases (`x-stack-*`, `stack-*` cookies, `STACK_*` env,
`*.stack-auth.com`, `Stack*` SDK names).
- Rebased/merged onto latest `dev`: retained `@hexclave/template`, kept
`src` in published files, refreshed setup-prompt imports and docs JSON,
adopted 1.0.5 version bumps, and re-merged `dev` again (resolved
`create-purchase-url` with `getHexclaveStripe`).
- **Bug Fixes**
- Restored dashboard AI type bundle by pointing the glob to
`packages/template/src/lib/hexclave-app`.
- Addressed rename leftovers: updated lingering `@/stack` imports and
CSS selector, fixed schema/meta and port-prefix expansions, and aligned
emulator commands to `packages/cli`.
- CI/build: removed a dead env var and stale ignore entries; fixed
Docker by renaming `STACK_SKIP_TEMPLATE_GENERATION` →
`HEXCLAVE_SKIP_TEMPLATE_GENERATION`.
<sup>Written for commit 3c1af3bff3.
Summary will update on new commits.</sup>
<a
href="https://cubic.dev/pr/hexclave/hexclave/pull/1547?utm_source=github"
target="_blank" rel="noopener noreferrer"
data-no-image-dialog="true"><picture><source
media="(prefers-color-scheme: dark)"
srcset="https://cubic.dev/buttons/review-in-cubic-dark.svg"><source
media="(prefers-color-scheme: light)"
srcset="https://cubic.dev/buttons/review-in-cubic-light.svg"><img
alt="Review in cubic"
src="https://cubic.dev/buttons/review-in-cubic-dark.svg"></picture></a>
<!-- End of auto-generated description by cubic. -->
113 lines
4.2 KiB
Plaintext
113 lines
4.2 KiB
Plaintext
---
|
|
title: "Analytics"
|
|
description: "Explore events, session replays, and SQL queries in your project's analytics dataset"
|
|
icon: "/images/app-icons/analytics.svg"
|
|
---
|
|
|
|
The Analytics app gives you direct access to your project's analytics dataset in Hexclave. You can inspect raw event tables, run ClickHouse SQL queries, and watch session replays to debug real user behavior.
|
|
|
|
## Overview
|
|
|
|
Analytics is organized into three areas in the dashboard:
|
|
|
|
- **Tables**: Browse event rows with sorting, search, and incremental loading
|
|
- **Queries**: Run and save reusable ClickHouse SQL queries
|
|
- **Replays**: Watch session replays and filter by user, team, duration, activity window, and click count
|
|
|
|
## How Analytics Works
|
|
|
|
Stack records analytics events and replay chunks, then exposes them through the Analytics app for read-only querying and investigation.
|
|
|
|
User activity in your app flows into Stack event ingestion, which stores data in ClickHouse. This data powers the Tables view, the SQL query runner, and the Session replay UI.
|
|
|
|
### What Gets Tracked
|
|
|
|
Stack collects both client-side and server-side analytics events:
|
|
|
|
- **Client-side events**: browser interaction events like `$page-view` and `$click`
|
|
- **Server-side events**: currently `$token-refresh` and `$sign-up-rule-trigger`
|
|
|
|
## Enabling the Analytics App
|
|
|
|
To use analytics in your project:
|
|
|
|
1. Open your Hexclave dashboard
|
|
2. Go to **Apps**
|
|
3. Open **Analytics**
|
|
4. Click **Enable**
|
|
|
|
## Quick Start
|
|
|
|
1. Enable Analytics in your Hexclave dashboard (**Apps -> Analytics**)
|
|
2. Initialize Hexclave on your frontend with `HexclaveClientApp`/`HexclaveProvider`
|
|
3. Sign in with a real user session
|
|
4. Open the app and navigate/click around
|
|
5. Check **Analytics -> Tables** to confirm events are arriving
|
|
|
|
After setup, Stack automatically captures client-side `$page-view` and `$click` events.
|
|
|
|
If you want replay recordings, also enable `analytics.replays.enabled` in your client app config.
|
|
|
|
## Tables
|
|
|
|
The **Tables** screen is the fastest way to inspect recent analytics records.
|
|
|
|
- Currently shows the `events` table
|
|
- Built-in ordering and client-side search
|
|
- Relative/absolute timestamp display toggle
|
|
- Row detail dialog for inspecting full JSON payloads
|
|
|
|
Use this view when you need to quickly answer "what just happened?" without writing SQL.
|
|
|
|
## Queries
|
|
|
|
The **Queries** screen is a ClickHouse SQL workspace for deeper analysis.
|
|
|
|
- Run read-only SQL queries with a timeout budget
|
|
- Query the users and analytics tables
|
|
- Save reusable queries into folders
|
|
- Re-run saved queries with one click
|
|
- Edit and overwrite saved query definitions
|
|
|
|
## Session Replays
|
|
|
|
The **Replays** screen helps you move from "an event happened" to "what the user actually saw."
|
|
|
|
- Filter sessions by user, team, duration, recency, and click count
|
|
- Play back multi-tab sessions
|
|
- Control playback speed
|
|
- Optionally skip inactive ranges
|
|
- Jump across click/page-view timeline markers
|
|
|
|
Use replays when metrics alone are not enough to explain user behavior.
|
|
|
|
### Enabling Replay Recording in the SDK
|
|
|
|
Session replay recording is disabled by default. To enable it, pass `analytics.replays.enabled: true` when creating your client app.
|
|
|
|
```ts
|
|
import { HexclaveClientApp } from "@hexclave/next";
|
|
|
|
export const hexclaveClientApp = new HexclaveClientApp({
|
|
projectId: process.env.NEXT_PUBLIC_STACK_PROJECT_ID!,
|
|
publishableClientKey: process.env.NEXT_PUBLIC_STACK_PUBLISHABLE_CLIENT_KEY!,
|
|
tokenStore: "nextjs-cookie",
|
|
analytics: {
|
|
replays: {
|
|
enabled: true,
|
|
// Optional. Defaults to true.
|
|
maskAllInputs: true,
|
|
},
|
|
},
|
|
});
|
|
```
|
|
|
|
`maskAllInputs` defaults to `true`, so form fields are masked unless you explicitly disable it.
|
|
|
|
## Best Practices
|
|
|
|
1. **Use Tables for quick incident triage**: the Tables UI is the fastest way to inspect recent `events` rows without writing SQL.
|
|
2. **Use Queries for repeatable analysis**: save important SQL in folders, and scope queries with filters/`LIMIT` so they stay within result and timeout limits.
|
|
3. **Use Replays for behavioral debugging**: start from an event pattern, then inspect matching session replays to understand what users actually did.
|
|
4. **Keep replay privacy defaults on**: leave `maskAllInputs` enabled unless you have a specific reason and a data-handling policy for unmasked inputs.
|