Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
90 commits
Select commit Hold shift + click to select a range
819308d
fix(rpc): scope insight audit targets after authorization
izadoesdev Aug 21, 2026
a296419
fix(rpc): scope insight audit targets after authorization
izadoesdev Aug 21, 2026
1fbd8cc
fix(sdk): preserve flag variant telemetry identity
izadoesdev Aug 21, 2026
57df4f7
feat(dashboard): add MCP setup and quick access
izadoesdev Aug 21, 2026
b99bdc8
fix(api-keys): enforce organization ownership for scoped resources
izadoesdev Aug 21, 2026
bb15bd6
feat(mcp): expand public workspace tool contract
izadoesdev Aug 21, 2026
859fe13
feat(dashboard): configure MCP action capabilities
izadoesdev Aug 21, 2026
d101d6c
fix(mcp): validate query ranges and usage accounting
izadoesdev Aug 21, 2026
6a661ad
refactor: simplify MCP contracts and discovery (#663)
izadoesdev Aug 22, 2026
29a7c9a
chore(staging): sync promoted changes from main
izadoesdev Aug 24, 2026
226c1ed
fix(staging): harden audit export consistency
izadoesdev Aug 24, 2026
b8124b2
fix(dashboard): align web vitals breakdown values (#652)
akash3444 Aug 24, 2026
44dcdcd
fix(dashboard): correct appearance chart selects (#653)
akash3444 Aug 24, 2026
1818df4
refactor(dashboard): dedupe audit filter menus
izadoesdev Aug 25, 2026
6395ffa
refactor(audit): simplify redaction, filter, and member detail helpers
izadoesdev Aug 25, 2026
ddaf49b
feat(rpc): rate limit audit csv export
izadoesdev Aug 25, 2026
aaf635d
test(rpc): isolate module mocks to stop cross-file leakage
izadoesdev Aug 25, 2026
17ad4a6
Merge pull request #669 from databuddy-analytics/codex/sync-main-to-s…
izadoesdev Aug 25, 2026
2c42731
cleanup: delete typescript file (#648)
sundaram2021 Aug 25, 2026
a39306d
fix(dev): build devtools before dashboard dev startup (#644)
MiirzaBaig Aug 25, 2026
25d637d
chore(tooling): add Knip configuration to detect unused files and dep…
sundaram2021 Aug 25, 2026
5bdf92c
fix(sdk): catch storage errors in getAnonymousId and getSessionId (#641)
r69shabh Aug 25, 2026
6010afa
fix(dashboard): invalidate flag list with route website id (#665)
r69shabh Aug 25, 2026
4ba5ab5
docs: document minimum bun version requirement (#642)
r69shabh Aug 25, 2026
aeaa2b3
fix(ai): allow public audience queries (#654)
sanskritisingh245 Aug 25, 2026
22932da
fix(shared): respect trackOnlyCategories in generic isBot() fallback …
aditya3799 Aug 25, 2026
febc699
feat(notifications): add Discord provider (#637)
FindMalek Aug 25, 2026
39824f9
fix(rpc): align funnel cache invalidation key and re-enable caching (…
FindMalek Aug 25, 2026
b4bb162
chore: delete 109 unused files flagged by knip
izadoesdev Aug 25, 2026
b3c752d
chore(deps): remove unused dependencies and catalog entries
izadoesdev Aug 25, 2026
de23a08
chore: strip unused exports and delete orphaned code
izadoesdev Aug 25, 2026
e11a0cc
chore: remove last dead files and orphaned symbols
izadoesdev Aug 25, 2026
012dd9a
fix(dashboard): resolve react-doctor correctness errors
izadoesdev Aug 25, 2026
d090862
chore: strip narrative comments and fix lazy names
izadoesdev Aug 25, 2026
bb2bac4
fix(deps): pin tokenlens and restore biome binary, keep compliance icons
izadoesdev Aug 26, 2026
6c8fcfd
fix(deps): declare tokenlens models in ai and restore docs tracker bu…
izadoesdev Aug 26, 2026
bd783e9
test(sdk): pin per-call user flag isolation contract
izadoesdev Aug 26, 2026
a7cdb81
ci: run sdk and tracker playwright suites on PRs
izadoesdev Aug 26, 2026
69ae2ea
fix(basket): reject prototype-polluting pixel query keys
izadoesdev Aug 26, 2026
4bfcbf5
fix(shared): close audit redaction bypass for uppercase field names
izadoesdev Aug 26, 2026
0eb18f1
fix(shared): classify bracketed ipv6 literals in ssrf guard
izadoesdev Aug 26, 2026
61baa2a
test(basket): prune tautologies and pin ingestion behaviors
izadoesdev Aug 26, 2026
795755c
test(redis): overhaul infra suites and pin rate-limit and cache seman…
izadoesdev Aug 26, 2026
496057e
test(shared): behavior-driven rewrites for audit, bot detection, and …
izadoesdev Aug 26, 2026
b82e67e
test(rpc): real workspace grant coverage and audit export paging edges
izadoesdev Aug 26, 2026
6dcfc58
test(api): api-key resolution coverage and integration helper dedupe
izadoesdev Aug 26, 2026
cfdee4f
fix(basket): accept compressed ipv6 in geo validation
izadoesdev Aug 26, 2026
bf3df66
fix(services): emit BOM and CRLF in audit csv exports
izadoesdev Aug 26, 2026
e22e1b7
fix(validation): align sanitizeString tag stripping with basket
izadoesdev Aug 26, 2026
aa41886
fix(basket): fail closed when ip allowlist is set but ip is unknown
izadoesdev Aug 26, 2026
9575596
feat(rpc): author billing gate error copy from shared feature metadata
izadoesdev Aug 26, 2026
3348397
fix(api): fail error tracking gate toward free plan and name the feature
izadoesdev Aug 26, 2026
0bc5fc0
fix(dashboard): surface actionable plan and billing errors in toasts
izadoesdev Aug 26, 2026
2bd4de7
feat(dashboard): pre-empt gated creates at plan limit with usage-awar…
izadoesdev Aug 26, 2026
c13faf6
Revert "cleanup: delete typescript file (#648)"
izadoesdev Aug 26, 2026
55f8326
feat(docs): add proof chips with live GitHub stars to landing hero
izadoesdev Aug 26, 2026
a4058a8
feat(docs): add proactive Databunny and MCP agent section to homepage
izadoesdev Aug 26, 2026
7c295b3
feat(docs): embed pricing estimator preview on homepage
izadoesdev Aug 26, 2026
c46f127
refactor(dashboard): remove measurement recommendation drafts and page
izadoesdev Aug 26, 2026
8d8f831
refactor(insights): remove measurement recommendation pipeline and sp…
izadoesdev Aug 26, 2026
d2f3224
fix(dashboard): address fresh-account QA nits in sidebar, setup, and …
izadoesdev Aug 26, 2026
66c4c3b
feat(docs): add free-tier footnote to feature page heroes
izadoesdev Aug 26, 2026
3dc5285
feat(docs): rework Databunny page proactive-first with accurate demos
izadoesdev Aug 26, 2026
034bcce
fix(docs): remove false claims from links page and sharpen copy
izadoesdev Aug 26, 2026
f9af977
fix(docs): market uptime as shipped and remove fabricated claims
izadoesdev Aug 26, 2026
424b994
fix(docs): correct feature flags claims and lead with no-second-SDK w…
izadoesdev Aug 26, 2026
41ebc8b
fix(docs): correct web vitals claims and reframe alerts as daily checks
izadoesdev Aug 26, 2026
e0d8c24
fix(docs): remove false error tracking claims and lead with affected …
izadoesdev Aug 26, 2026
db6db24
feat(insights): gate interrupts and measurement publishes behind wort…
izadoesdev Aug 26, 2026
65cbdaf
feat(docs): add typewriter, tool-call checks, and chip entrances to l…
izadoesdev Aug 26, 2026
a8a8768
feat(docs): loop MCP terminal through alternating agent scenarios
izadoesdev Aug 26, 2026
8972630
fix(docs): replace fabricated vitals API calls with real trackWebVita…
izadoesdev Aug 26, 2026
4b7c42c
fix(docs): drop custom-event anti-patterns from vitals guide
izadoesdev Aug 26, 2026
87ebfbc
fix(docs): correct API reference drift against shipped query and auth…
izadoesdev Aug 26, 2026
ad445b6
fix(docs): align SDK reference with real exports, flag APIs, and erro…
izadoesdev Aug 26, 2026
689537f
fix(docs): correct core pages against shipped product and add uptime …
izadoesdev Aug 26, 2026
7eed473
fix(docs): drop JSON health parsing claim from uptime landing page
izadoesdev Aug 26, 2026
f1bb8ed
fix(docs): repair broken integration snippets and align with tracker …
izadoesdev Aug 26, 2026
a85ae02
fix(docs): reframe privacy claims around anonymous-by-default with op…
izadoesdev Aug 27, 2026
8fefb5d
fix(dashboard): make Last 90 days preset end today instead of last month
izadoesdev Aug 27, 2026
2fb7f44
fix(docs): remove leftover branded links claim from structured data
izadoesdev Aug 27, 2026
014feb1
fix(docs): remove fabricated comparison claims and unify marketing nu…
izadoesdev Aug 27, 2026
b0a59cf
fix(docs): correct machine-readable surfaces for AI agents
izadoesdev Aug 27, 2026
ef0d0d5
fix(dashboard): make deletion, localhost, security, and anomaly copy …
izadoesdev Aug 27, 2026
4ad2779
fix(dashboard): correct plan names, overage math, and stale live status
izadoesdev Aug 27, 2026
e92efbb
fix(basket): normalize IPv6 before allowlist comparison
izadoesdev Aug 27, 2026
86576f0
refactor(uptime): harden checks and retries, drop JSON health parsing
izadoesdev Aug 27, 2026
b35c472
refactor(rpc): tighten uptime schemas, permissions, and status-page c…
izadoesdev Aug 27, 2026
6f47c8d
fix(dashboard): align monitors UI with uptime schema changes
izadoesdev Aug 27, 2026
00cdd39
fix(insights): update queue failure test to match explicit rpc error …
izadoesdev Aug 27, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
1 change: 1 addition & 0 deletions .agents/skills/databuddy-internal/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,7 @@ Keep additions **minimal**: one bullet, a new `rg` hint, or a routing note—eno
- `packages/sdk`: published analytics SDK for React, Vue, and Node
- `packages/tracker`: internal tracker script build and release package
- `packages/encryption`, `packages/notifications`, `packages/cache`, `packages/redis`, `packages/services`, `packages/validation`, `packages/api-keys`: shared infra and domain packages
- Knip is configured in root `knip.json` (run `bun run knip`); per-workspace test globs are required because the root `test:watch` (`bun test --watch ./apps`) script shadows the Bun plugin's per-workspace script parsing; `apps/cron` is ignored (standalone scripts, no package.json)

Read [codebase-map.md](./references/codebase-map.md) when you need deeper routing guidance.

Expand Down
5 changes: 5 additions & 0 deletions .changeset/sdk-storage-error-fix.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@databuddy/sdk": patch
---

`getAnonymousId` and `getSessionId` now return `null` instead of throwing when `localStorage` or `sessionStorage` access raises a `DOMException`. Follows the same try/catch pattern already used by `getProfileId`. URL params continue to take priority without touching storage.
63 changes: 63 additions & 0 deletions .github/workflows/sdk-e2e.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
name: SDK E2E

on:
push:
branches: [main]
paths:
- ".github/workflows/sdk-e2e.yml"
- "packages/sdk/**"
- "packages/tracker/**"
- "bun.lock"
- "package.json"
- "turbo.json"
pull_request:
branches: [main, staging]
paths:
- ".github/workflows/sdk-e2e.yml"
- "packages/sdk/**"
- "packages/tracker/**"
- "bun.lock"
- "package.json"
- "turbo.json"

permissions:
contents: read

concurrency:
group: sdk-e2e-${{ github.event_name == 'pull_request' && github.event.pull_request.head.repo.full_name || github.repository }}-${{ github.head_ref || github.ref_name }}
cancel-in-progress: true

jobs:
sdk-e2e:
name: SDK Playwright
runs-on: blacksmith-4vcpu-ubuntu-2404
timeout-minutes: 15
steps:
- uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7
- uses: oven-sh/setup-bun@0c5077e51419868618aeaa5fe8019c62421857d6 # v2
with:
bun-version: "1.3.14"
- uses: actions/cache@27d5ce7f107fe9357f9df03efb73ab90386fccae # v5
with:
path: ~/.bun/install/cache
key: ${{ runner.os }}-bun-${{ hashFiles('bun.lock') }}
restore-keys: ${{ runner.os }}-bun-
- run: bun install --frozen-lockfile --ignore-scripts
- name: Build sdk and tracker
run: bunx turbo run build --filter @databuddy/sdk --filter @databuddy/tracker
- name: Install Playwright browser
run: bun run --cwd packages/sdk playwright install --with-deps chromium
- name: Run sdk E2E
run: bun run --cwd packages/sdk playwright test --project=chromium
- name: Run tracker E2E
run: bun run --cwd packages/tracker playwright test --project=chromium
- name: Upload Playwright artifacts
if: failure()
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
with:
name: sdk-e2e-artifacts
path: |
packages/sdk/test-results
packages/tracker/test-results
if-no-files-found: ignore
retention-days: 7
5 changes: 4 additions & 1 deletion CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -18,12 +18,15 @@ git clone https://github.com/databuddy-analytics/Databuddy.git
cd databuddy
```

2. Install dependencies:
2. Install dependencies (requires Bun 1.2.0+, check with `bun --version`):

```bash
bun install
```

> [!NOTE]
> Bun 1.2.0 is the minimum for `catalog:` dependency support. The repo pins an exact version in the `packageManager` field of `package.json`; match it with `bun upgrade` or by installing that version from https://bun.sh.

3. Set up environment variables:

```bash
Expand Down
6 changes: 0 additions & 6 deletions apps/api/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,6 @@
"test:watch": "TZ=UTC bunx --bun vitest"
},
"dependencies": {
"@ai-sdk/provider": "^3.0.5",
"@contextcompany/otel": "^1.0.13",
"@databuddy/ai": "workspace:*",
"@databuddy/api-keys": "workspace:*",
Expand All @@ -22,7 +21,6 @@
"@databuddy/notifications": "workspace:*",
"@databuddy/redis": "workspace:*",
"@databuddy/rpc": "workspace:*",
"@databuddy/sdk": "workspace:*",
"@databuddy/services": "workspace:*",
"@databuddy/shared": "workspace:*",
"@databuddy/validation": "workspace:*",
Expand All @@ -37,21 +35,17 @@
"ai": "^6.0.188",
"autumn-js": "catalog:",
"bullmq": "^5.78.0",
"dayjs": "^1.11.19",
"elysia": "catalog:",
"evlog": "catalog:",
"jszip": "^3.10.1",
"keypal": "0.2.0",
"lru-cache": "^11.2.7",
"resend": "^4.0.1",
"supermemory": "^4.17.0",
"svix": "^1.84.1",
"zod": "catalog:"
},
"devDependencies": {
"@databuddy/test": "workspace:*",
"@types/bun": "catalog:",
"mitata": "^1.0.34",
"vitest": "^4.1.5"
},
"peerDependencies": {
Expand Down
2 changes: 1 addition & 1 deletion apps/api/src/http/cors.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ const DATABUDDY_HOST_RE = /(?:^|\.)databuddy\.cc$/;
const allowedApiOrigins = new Set(config.cors.apiOrigins);
const MCP_PATHS = new Set(["/v1/mcp", "/v1/mcp/", "/mcp", "/mcp/"]);

export function isMcpRequest(request: Request): boolean {
function isMcpRequest(request: Request): boolean {
return MCP_PATHS.has(new URL(request.url).pathname);
}

Expand Down
8 changes: 2 additions & 6 deletions apps/api/src/integration/cache-auth-bypass.test.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import "@databuddy/test/env";

import { flags, targetGroups } from "@databuddy/db/schema";
import { appRouter, type Context } from "@databuddy/rpc";
import { appRouter } from "@databuddy/rpc";
import {
addToOrganization,
apiKeyContext,
Expand All @@ -16,16 +16,12 @@ import {
signUp,
userContext,
} from "@databuddy/test";
import { createProcedureClient } from "@orpc/server";
import { randomUUIDv7 } from "bun";
import { afterAll, beforeEach, describe, expect, it } from "vitest";
import { call } from "./helpers";

const iit = hasTestDb ? it : it.skip;

function call<T>(procedure: T, ctx: Context) {
return createProcedureClient(procedure as any, { context: ctx });
}

async function setupOwnedSite(siteOverrides?: { isPublic?: boolean }) {
const user = await signUp();
const org = await insertOrganization();
Expand Down
6 changes: 6 additions & 0 deletions apps/api/src/integration/helpers.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
import type { Context } from "@databuddy/rpc";
import { type AnyProcedure, createProcedureClient } from "@orpc/server";

export function call<T extends AnyProcedure>(procedure: T, context: Context) {
return createProcedureClient(procedure, { context });
}
Loading
Loading