Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
26 commits
Select commit Hold shift + click to select a range
f56bf77
feat(analytics): add X and LinkedIn analytics on ClickHouse
mezotv Aug 2, 2026
b0b9c20
feat(analytics): add account leaderboard with tracked affiliates
mezotv Aug 2, 2026
5ea1893
feat(experiments): add social A/B tests
mezotv Aug 2, 2026
61d1cda
feat(geo): add AI visibility tracking
mezotv Aug 2, 2026
e5d0fce
fix(analytics): render verification badges and window label in leader…
mezotv Aug 2, 2026
2f5df2e
fix(analytics): show hovered day heading in chart tooltips
mezotv Aug 2, 2026
de1fe9b
fix(geo): show hovered day heading in mention rate tooltip
mezotv Aug 2, 2026
c25ac97
fix(analytics): square business avatars, header connect buttons
mezotv Aug 2, 2026
9e00afe
fix(analytics): gate account tracking behind lookup and confirm dialog
mezotv Aug 2, 2026
0470d53
feat(geo): per-model engines and model usage market share
mezotv Aug 2, 2026
204b64c
perf(analytics): latest-state materialized views and array param fix
mezotv Aug 2, 2026
3986aa2
feat(beacon): add AI traffic middleware package with signature classi…
mezotv Aug 2, 2026
ea9c0eb
feat(geo): restructure overview into sectioned dashboard
mezotv Aug 2, 2026
6deb21f
fix(geo): contain request log table in bordered wrapper
mezotv Aug 2, 2026
4017bf4
fix(geo): remove body corner notch in request log table
mezotv Aug 2, 2026
99acca4
feat(geo): classify prompt presence as training data, retrieval, or i…
mezotv Aug 2, 2026
a69c06f
feat(analytics): add impressions share donut and pie radar chart prim…
mezotv Aug 2, 2026
336d728
feat(geo): add engine radar, share of voice donut, traffic purpose donut
mezotv Aug 2, 2026
b22c73d
style(analytics): instrument panel synthesis from design tournament
mezotv Aug 2, 2026
d1302d1
style(geo): instrument panel synthesis from design tournament
mezotv Aug 2, 2026
73af75f
feat(analytics): add upstash redis cache over tinybird queries
mezotv Aug 2, 2026
521e623
fix(analytics): purge removed accounts from clickhouse and add pointe…
mezotv Aug 2, 2026
a112f9e
style(geo): rebalance overview grid and split traffic log
mezotv Aug 2, 2026
ab7cf55
feat(geo): multi-language prompt tracking with per-language performance
mezotv Aug 2, 2026
af6bcd3
chore(db): add languages column to geo settings
mezotv Aug 2, 2026
5ac2895
feat(analytics): simplify leaderboard header and columns
mezotv Aug 3, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 15 additions & 0 deletions .env.example
Original file line number Diff line number Diff line change
Expand Up @@ -85,6 +85,15 @@ UNKEY_API_ID=
# Twitter
TWITTER_BEARER_TOKEN=

# GEO grounded scanning (optional)
OPENAI_API_KEY=
ANTHROPIC_API_KEY=
PERPLEXITY_API_KEY=

# Tinybird (social analytics)
TINYBIRD_TOKEN=
TINYBIRD_BASE_URL=https://api.tinybird.co

# Social account linking provider
POST_FOR_ME_API_KEY=
POST_FOR_ME_API_KEY_TWITTER=
Expand All @@ -104,3 +113,9 @@ AXIOM_ORG_ID=""

# Notra
NOTRA_API_KEY=""

# Beacon (AI traffic detection)
BEACON_INGEST_SECRET=
BEACON_INGEST_URL="http://localhost:3002/api/beacon"
BEACON_ORG_TOKEN=
BEACON_ORG_ID=
2 changes: 1 addition & 1 deletion apps/dashboard/knip.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"$schema": "https://unpkg.com/knip@6/schema.json",
"entry": ["src/**/*.test.ts"],
"entry": ["src/**/*.test.ts", "scripts/*.ts"],
"ignoreIssues": {
"src/app/(dashboard)/**/constants/**/*.ts": ["exports"],
"src/components/**/*.tsx": ["types"],
Expand Down
4 changes: 4 additions & 0 deletions apps/dashboard/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,9 @@
"smoke:autonomy": "bun run scripts/autonomy-smoke.ts"
},
"dependencies": {
"@ai-sdk/anthropic": "3.0.84",
"@ai-sdk/openai": "3.0.71",
"@ai-sdk/perplexity": "3.0.35",
"@ai-sdk/react": "3.0.208",
"@aws-sdk/client-s3": "^3.990.0",
"@aws-sdk/s3-request-presigner": "^3.990.0",
Expand All @@ -38,6 +41,7 @@
"@lexical/utils": "^0.39.0",
"@neoconfetti/react": "^1.0.0",
"@notra/ai": "workspace:*",
"@notra/analytics": "workspace:*",
"@notra/content-generation": "workspace:*",
"@notra/db": "workspace:*",
"@notra/email": "workspace:*",
Expand Down
26 changes: 26 additions & 0 deletions apps/dashboard/scripts/register-analytics-schedule.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
import { getAppUrl } from "@notra/ai/qstash/triggers";
import { Client as QStashClient } from "@upstash/qstash";

const HOURLY_CRON = "0 * * * *";
const SCHEDULE_ID = "social-analytics-sync-hourly";

const token = process.env.QSTASH_TOKEN;
if (!token) {
throw new Error("QSTASH_TOKEN is not configured");
}

const client = new QStashClient({ token });
const destination = `${getAppUrl()}/api/workflows/social-analytics-sync`;

const result = await client.schedules.create({
scheduleId: SCHEDULE_ID,
destination,
cron: HOURLY_CRON,
body: JSON.stringify({}),
headers: { "Content-Type": "application/json" },
});

console.log(
`Registered schedule ${result.scheduleId ?? SCHEDULE_ID} -> ${destination} (${HOURLY_CRON})`
);
process.exit(0);
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
import { AnalyticsPageSkeleton } from "./skeleton";

export default function Loading() {
return <AnalyticsPageSkeleton />;
}
Loading
Loading