13 Commits

Author SHA1 Message Date
Carl-Gerhard Lindesvärd
d9f5f291d6 wip
wip
2026-02-26 21:34:08 +01:00
Carl-Gerhard Lindesvärd
4b150dd987 public: custom homepage tracking 2026-02-26 21:34:00 +01:00
Carl-Gerhard Lindesvärd
baedf4343b chore: enable session replay 2026-02-26 21:34:00 +01:00
Martin
22fb4acf12 fix: Add SELF_HOSTED variable to .env.template (#288)
Without this env var I get the Trial expired screen after upgrading to version 2.
2026-02-26 20:58:56 +01:00
ericcapella
cb3f8016df fix: remove duplicate "Cookie-Free by Default" feature in posthog comparison (#293) 2026-02-26 20:58:15 +01:00
Kien Ngo
d9afeffbf1 fix: Allow copy value as object (#299) 2026-02-26 20:56:51 +01:00
Kien Ngo
4b9852b36f docs: Update react native Installation docs (#297) 2026-02-26 20:55:05 +01:00
Carl-Gerhard Lindesvärd
00e94ecb66 sdks: bump (session replays) 2026-02-26 19:43:21 +01:00
Carl-Gerhard Lindesvärd
3d84e4e77b fix: ensure we have a body before check type 2026-02-26 15:29:19 +01:00
Carl-Gerhard Lindesvärd
791668526c fix: migration for session replay 2026-02-26 15:11:36 +01:00
Carl-Gerhard Lindesvärd
02ddcf9a3d chore: github actions 2026-02-26 14:49:20 +01:00
Carl-Gerhard Lindesvärd
55bd5c4614 fix: lock file 2026-02-26 14:30:02 +01:00
Carl-Gerhard Lindesvärd
aa81bbfe77 feat: session replay
* wip

* wip

* wip

* wip

* final fixes

* comments

* fix
2026-02-26 14:09:53 +01:00
25 changed files with 287 additions and 170 deletions

View File

@@ -3,55 +3,37 @@ name: Docker Build and Push
on: on:
workflow_dispatch: workflow_dispatch:
push: push:
# branches: [ "main" ] paths-ignore:
paths: # README and docs
- "apps/api/**" - "**/README*"
- "apps/worker/**" - "**/readme*"
- "**/*.md"
- "**/docs/**"
- "**/CHANGELOG*"
- "**/LICENSE*"
# Test files
- "**/*.test.*"
- "**/*.spec.*"
- "**/__tests__/**"
- "**/tests/**"
# SDKs (published separately)
- "packages/sdks/**"
# Public app (docs/marketing, not part of Docker deploy)
- "apps/public/**" - "apps/public/**"
- "apps/start/**" # Dev / tooling
- "packages/**" - "**/.vscode/**"
- "!packages/sdks/**" - "**/.cursor/**"
- "**Dockerfile" - "**/.env.example"
- ".github/workflows/**" - "**/.env.*.example"
- "**/.gitignore"
- "**/.eslintignore"
- "**/.prettierignore"
env: env:
repo_owner: "openpanel-dev" repo_owner: "openpanel-dev"
jobs: jobs:
changes:
runs-on: ubuntu-latest
outputs:
api: ${{ steps.filter.outputs.api }}
worker: ${{ steps.filter.outputs.worker }}
public: ${{ steps.filter.outputs.public }}
dashboard: ${{ steps.filter.outputs.dashboard }}
steps:
- uses: actions/checkout@v4
- uses: dorny/paths-filter@v2
id: filter
with:
base: "main"
filters: |
api:
- 'apps/api/**'
- 'packages/**'
- '.github/workflows/**'
worker:
- 'apps/worker/**'
- 'packages/**'
- '.github/workflows/**'
public:
- 'apps/public/**'
- 'packages/**'
- '.github/workflows/**'
dashboard:
- 'apps/start/**'
- 'packages/**'
- '.github/workflows/**'
lint-and-test: lint-and-test:
needs: changes
if: ${{ needs.changes.outputs.api == 'true' || needs.changes.outputs.worker == 'true' || needs.changes.outputs.public == 'true' || needs.changes.outputs.dashboard == 'true' }}
runs-on: ubuntu-latest runs-on: ubuntu-latest
services: services:
redis: redis:
@@ -106,8 +88,7 @@ jobs:
permissions: permissions:
packages: write packages: write
contents: write contents: write
needs: [changes, lint-and-test] needs: lint-and-test
if: ${{ needs.changes.outputs.api == 'true' }}
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- name: Checkout repository - name: Checkout repository
@@ -167,8 +148,7 @@ jobs:
permissions: permissions:
packages: write packages: write
contents: write contents: write
needs: [changes, lint-and-test] needs: lint-and-test
if: ${{ needs.changes.outputs.worker == 'true' }}
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- name: Checkout repository - name: Checkout repository
@@ -228,8 +208,7 @@ jobs:
permissions: permissions:
packages: write packages: write
contents: write contents: write
needs: [changes, lint-and-test] needs: lint-and-test
if: ${{ needs.changes.outputs.dashboard == 'true' }}
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- name: Checkout repository - name: Checkout repository

View File

@@ -14,14 +14,15 @@ export async function duplicateHook(
const ip = req.clientIp; const ip = req.clientIp;
const origin = req.headers.origin; const origin = req.headers.origin;
const clientId = req.headers['openpanel-client-id']; const clientId = req.headers['openpanel-client-id'];
const isReplay = 'type' in req.body && req.body.type === 'replay'; const body = req?.body;
const isTrackPayload = getIsTrackPayload(req);
const isReplay = isTrackPayload && req.body.type === 'replay';
const shouldCheck = ip && origin && clientId && !isReplay; const shouldCheck = ip && origin && clientId && !isReplay;
const isDuplicate = shouldCheck const isDuplicate = shouldCheck
? await isDuplicatedEvent({ ? await isDuplicatedEvent({
ip, ip,
origin, origin,
payload: req.body, payload: body,
projectId: clientId as string, projectId: clientId as string,
}) })
: false; : false;
@@ -30,3 +31,25 @@ export async function duplicateHook(
return reply.status(200).send('Duplicate event'); return reply.status(200).send('Duplicate event');
} }
} }
function getIsTrackPayload(
req: FastifyRequest<{
Body: ITrackHandlerPayload | DeprecatedPostEventPayload;
}>
): req is FastifyRequest<{
Body: ITrackHandlerPayload;
}> {
if (req.method !== 'POST') {
return false;
}
if (!req.body) {
return false;
}
if (typeof req.body !== 'object' || Array.isArray(req.body)) {
return false;
}
return 'type' in req.body;
}

View File

@@ -61,7 +61,7 @@
"notes": "OpenPanel's SDK is over 20x smaller than PostHog's core library, resulting in faster page loads and better Core Web Vitals." "notes": "OpenPanel's SDK is over 20x smaller than PostHog's core library, resulting in faster page loads and better Core Web Vitals."
}, },
{ {
"label": "Cookie-Free by Default", "label": "Cookie-Free",
"openpanel": "Yes", "openpanel": "Yes",
"competitor": "Requires Configuration", "competitor": "Requires Configuration",
"notes": "OpenPanel is truly cookie-free out of the box. PostHog requires specific configuration for cookieless tracking with reduced functionality." "notes": "OpenPanel is truly cookie-free out of the box. PostHog requires specific configuration for cookieless tracking with reduced functionality."

View File

@@ -32,7 +32,9 @@ npx expo install expo-application expo-constants
On native we use a clientSecret to authenticate the app. On native we use a clientSecret to authenticate the app.
```typescript ```typescript
const op = new Openpanel({ import { OpenPanel } from '@openpanel/react-native';
const op = new OpenPanel({
clientId: '{YOUR_CLIENT_ID}', clientId: '{YOUR_CLIENT_ID}',
clientSecret: '{YOUR_CLIENT_SECRET}', clientSecret: '{YOUR_CLIENT_SECRET}',
}); });

View File

@@ -20,7 +20,7 @@
"@opennextjs/cloudflare": "^1.16.5", "@opennextjs/cloudflare": "^1.16.5",
"@openpanel/common": "workspace:*", "@openpanel/common": "workspace:*",
"@openpanel/geo": "workspace:*", "@openpanel/geo": "workspace:*",
"@openpanel/nextjs": "^1.1.1", "@openpanel/nextjs": "^1.2.0",
"@openpanel/payments": "workspace:^", "@openpanel/payments": "workspace:^",
"@openpanel/sdk-info": "workspace:^", "@openpanel/sdk-info": "workspace:^",
"@openstatus/react": "0.0.3", "@openstatus/react": "0.0.3",

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -6,6 +6,7 @@ import { getRootMetadata } from '@/lib/metadata';
import { cn } from '@/lib/utils'; import { cn } from '@/lib/utils';
import './global.css'; import './global.css';
import { OpenPanelComponent } from '@openpanel/nextjs'; import { OpenPanelComponent } from '@openpanel/nextjs';
import { ScrollTracker } from '@/components/scroll-tracker';
const font = Geist({ const font = Geist({
subsets: ['latin'], subsets: ['latin'],
@@ -39,9 +40,13 @@ export default function Layout({ children }: { children: React.ReactNode }) {
<RootProvider> <RootProvider>
<TooltipProvider>{children}</TooltipProvider> <TooltipProvider>{children}</TooltipProvider>
</RootProvider> </RootProvider>
<ScrollTracker />
{process.env.NEXT_PUBLIC_OP_CLIENT_ID && ( {process.env.NEXT_PUBLIC_OP_CLIENT_ID && (
<OpenPanelComponent <OpenPanelComponent
clientId={process.env.NEXT_PUBLIC_OP_CLIENT_ID} clientId={process.env.NEXT_PUBLIC_OP_CLIENT_ID}
sessionReplay={{
enabled: true,
}}
trackAttributes trackAttributes
trackOutgoingLinks trackOutgoingLinks
trackScreenViews trackScreenViews

View File

@@ -0,0 +1,43 @@
'use client';
import { useOpenPanel } from '@openpanel/nextjs';
import { useRef } from 'react';
interface FeatureCardHoverTrackProps {
title: string;
children: React.ReactNode;
}
export function FeatureCardHoverTrack({
title,
children,
}: FeatureCardHoverTrackProps) {
const { track } = useOpenPanel();
const hoverTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);
const handleMouseEnter = () => {
hoverTimerRef.current = setTimeout(() => {
track('feature_card_hover', { title });
hoverTimerRef.current = null;
}, 1500);
};
const handleMouseLeave = () => {
if (hoverTimerRef.current) {
clearTimeout(hoverTimerRef.current);
hoverTimerRef.current = null;
}
};
return (
// Hover handlers for analytics only; no keyboard interaction needed
// biome-ignore lint/a11y/noNoninteractiveElementInteractions: analytics hover tracking
<div
onMouseEnter={handleMouseEnter}
onMouseLeave={handleMouseLeave}
role="group"
>
{children}
</div>
);
}

View File

@@ -1,6 +1,8 @@
import type { LucideIcon } from 'lucide-react'; import type { LucideIcon } from 'lucide-react';
import Link from 'next/link'; import Link from 'next/link';
import { cn } from '@/lib/utils'; import { cn } from '@/lib/utils';
import { FeatureCardHoverTrack } from '@/components/feature-card-hover-track';
interface FeatureCardProps { interface FeatureCardProps {
link?: { link?: {
@@ -64,41 +66,45 @@ export function FeatureCard({
}: FeatureCardProps) { }: FeatureCardProps) {
if (illustration) { if (illustration) {
return ( return (
<FeatureCardHoverTrack title={title}>
<FeatureCardContainer className={className}>
{illustration}
<div className="col gap-2" data-content>
<h3 className="font-semibold text-xl">{title}</h3>
<p className="text-muted-foreground">{description}</p>
</div>
{children}
{link && (
<Link
className="mx-6 text-muted-foreground text-sm transition-colors hover:text-primary"
href={link.href}
>
{link.children}
</Link>
)}
</FeatureCardContainer>
</FeatureCardHoverTrack>
);
}
return (
<FeatureCardHoverTrack title={title}>
<FeatureCardContainer className={className}> <FeatureCardContainer className={className}>
{illustration} {Icon && <Icon className="size-6" />}
<div className="col gap-2" data-content> <div className="col gap-2">
<h3 className="font-semibold text-xl">{title}</h3> <h3 className="font-semibold text-lg">{title}</h3>
<p className="text-muted-foreground">{description}</p> <p className="text-muted-foreground text-sm">{description}</p>
</div> </div>
{children} {children}
{link && ( {link && (
<Link <Link
className="mx-6 text-muted-foreground text-sm transition-colors hover:text-primary" className="text-muted-foreground text-sm transition-colors hover:text-primary"
href={link.href} href={link.href}
> >
{link.children} {link.children}
</Link> </Link>
)} )}
</FeatureCardContainer> </FeatureCardContainer>
); </FeatureCardHoverTrack>
}
return (
<FeatureCardContainer className={className}>
{Icon && <Icon className="size-6" />}
<div className="col gap-2">
<h3 className="font-semibold text-lg">{title}</h3>
<p className="text-muted-foreground text-sm">{description}</p>
</div>
{children}
{link && (
<Link
className="text-muted-foreground text-sm transition-colors hover:text-primary"
href={link.href}
>
{link.children}
</Link>
)}
</FeatureCardContainer>
); );
} }

View File

@@ -0,0 +1,37 @@
'use client';
import { useOpenPanel } from '@openpanel/nextjs';
import { usePathname } from 'next/navigation';
import { useEffect, useRef } from 'react';
export function ScrollTracker() {
const { track } = useOpenPanel();
const pathname = usePathname();
const hasFired = useRef(false);
useEffect(() => {
hasFired.current = false;
const handleScroll = () => {
if (hasFired.current) {
return;
}
const scrollTop = window.scrollY;
const docHeight =
document.documentElement.scrollHeight - window.innerHeight;
const percent =
docHeight > 0 ? (scrollTop / docHeight) * 100 : 0;
if (percent >= 50) {
hasFired.current = true;
track('scroll_half_way', { percent: Math.round(percent) });
}
};
window.addEventListener('scroll', handleScroll, { passive: true });
return () => window.removeEventListener('scroll', handleScroll);
}, [track, pathname]);
return null;
}

View File

@@ -38,10 +38,9 @@
"@openpanel/integrations": "workspace:^", "@openpanel/integrations": "workspace:^",
"@openpanel/json": "workspace:*", "@openpanel/json": "workspace:*",
"@openpanel/payments": "workspace:*", "@openpanel/payments": "workspace:*",
"@openpanel/sdk": "^1.0.8",
"@openpanel/sdk-info": "workspace:^", "@openpanel/sdk-info": "workspace:^",
"@openpanel/validation": "workspace:^", "@openpanel/validation": "workspace:^",
"@openpanel/web": "^1.0.12", "@openpanel/web": "^1.0.1",
"@radix-ui/react-accordion": "^1.2.12", "@radix-ui/react-accordion": "^1.2.12",
"@radix-ui/react-alert-dialog": "^1.1.15", "@radix-ui/react-alert-dialog": "^1.1.15",
"@radix-ui/react-aspect-ratio": "^1.1.7", "@radix-ui/react-aspect-ratio": "^1.1.7",

View File

@@ -102,7 +102,18 @@ export function KeyValueGrid({
<button <button
onClick={(e) => { onClick={(e) => {
e.stopPropagation(); e.stopPropagation();
clipboard(item.value); if (typeof item.value === 'object') {
try {
const value = JSON.stringify(item.value);
clipboard(value);
}
catch {
clipboard(item.value);
}
}
else {
clipboard(item.value);
}
}} }}
type="button" type="button"
className="absolute left-2 top-1/2 -translate-y-1/2 -translate-x-full opacity-0 group-hover:translate-x-0 group-hover:opacity-100 transition-all duration-200 ease-out bg-background border border-border rounded p-1 shadow-sm z-10" className="absolute left-2 top-1/2 -translate-y-1/2 -translate-x-full opacity-0 group-hover:translate-x-0 group-hover:opacity-100 transition-all duration-200 ease-out bg-background border border-border rounded p-1 shadow-sm z-10"

View File

@@ -1,17 +1,26 @@
import { QueryClient } from '@tanstack/react-query';
import { createTRPCClient, httpLink } from '@trpc/client';
import { createTRPCOptionsProxy } from '@trpc/tanstack-react-query';
import superjson from 'superjson';
import { TRPCProvider } from '@/integrations/trpc/react';
import type { AppRouter } from '@openpanel/trpc'; import type { AppRouter } from '@openpanel/trpc';
import { QueryClient } from '@tanstack/react-query';
import { createIsomorphicFn } from '@tanstack/react-start'; import { createIsomorphicFn } from '@tanstack/react-start';
import { getRequestHeaders } from '@tanstack/react-start/server'; import { getRequestHeaders } from '@tanstack/react-start/server';
import { createTRPCClient, httpLink } from '@trpc/client';
import { createTRPCOptionsProxy } from '@trpc/tanstack-react-query';
import { useMemo } from 'react'; import { useMemo } from 'react';
import superjson from 'superjson';
import { TRPCProvider } from '@/integrations/trpc/react';
export const getIsomorphicHeaders = createIsomorphicFn() export const getIsomorphicHeaders = createIsomorphicFn()
.server(() => { .server(() => {
return getRequestHeaders(); const headers = getRequestHeaders();
const result: Record<string, string> = {};
// Only forward the cookie header so the API can validate the session.
// Forwarding all headers causes problems with hop-by-hop headers like
// `Connection: upgrade` (common in NGINX WebSocket configs) which makes
// Node.js undici throw UND_ERR_INVALID_ARG ("fetch failed").
const cookie = headers.get('Cookie');
if (cookie) {
result.cookie = cookie;
}
return result;
}) })
.client(() => { .client(() => {
return {}; return {};
@@ -27,7 +36,6 @@ export function createTRPCClientWithHeaders(apiUrl: string) {
headers: () => getIsomorphicHeaders(), headers: () => getIsomorphicHeaders(),
fetch: async (url, options) => { fetch: async (url, options) => {
try { try {
console.log('fetching', url, options);
const response = await fetch(url, { const response = await fetch(url, {
...options, ...options,
mode: 'cors', mode: 'cors',
@@ -82,8 +90,8 @@ export function getContext(apiUrl: string) {
const client = createTRPCClientWithHeaders(apiUrl); const client = createTRPCClientWithHeaders(apiUrl);
const serverHelpers = createTRPCOptionsProxy({ const serverHelpers = createTRPCOptionsProxy({
client: client, client,
queryClient: queryClient, queryClient,
}); });
return { return {
queryClient, queryClient,
@@ -102,10 +110,10 @@ export function Provider({
}) { }) {
const trpcClient = useMemo( const trpcClient = useMemo(
() => createTRPCClientWithHeaders(apiUrl), () => createTRPCClientWithHeaders(apiUrl),
[apiUrl], [apiUrl]
); );
return ( return (
<TRPCProvider trpcClient={trpcClient} queryClient={queryClient}> <TRPCProvider queryClient={queryClient} trpcClient={trpcClient}>
{children} {children}
</TRPCProvider> </TRPCProvider>
); );

View File

@@ -2,7 +2,6 @@ import fs from 'node:fs';
import path from 'node:path'; import path from 'node:path';
import { TABLE_NAMES } from '../src/clickhouse/client'; import { TABLE_NAMES } from '../src/clickhouse/client';
import { import {
addColumns,
createTable, createTable,
modifyTTL, modifyTTL,
runClickhouseMigrationCommands, runClickhouseMigrationCommands,
@@ -25,8 +24,8 @@ export async function up() {
'`is_full_snapshot` Bool', '`is_full_snapshot` Bool',
'`payload` String CODEC(ZSTD(6))', '`payload` String CODEC(ZSTD(6))',
], ],
orderBy: ['project_id', 'session_id', 'chunk_index'], orderBy: ['project_id', 'session_id', 'started_at', 'chunk_index'],
partitionBy: 'toYYYYMM(started_at)', partitionBy: 'toYYYYMMDD(started_at)',
settings: { settings: {
index_granularity: 8192, index_granularity: 8192,
}, },
@@ -42,16 +41,16 @@ export async function up() {
]; ];
fs.writeFileSync( fs.writeFileSync(
path.join(__filename.replace('.ts', '.sql')), path.join(import.meta.filename.replace('.ts', '.sql')),
sqls sqls
.map((sql) => .map((sql) =>
sql sql
.trim() .trim()
.replace(/;$/, '') .replace(/;$/, '')
.replace(/\n{2,}/g, '\n') .replace(/\n{2,}/g, '\n')
.concat(';'), .concat(';')
) )
.join('\n\n---\n\n'), .join('\n\n---\n\n')
); );
if (!process.argv.includes('--dry')) { if (!process.argv.includes('--dry')) {

View File

@@ -1,6 +1,6 @@
{ {
"name": "@openpanel/astro", "name": "@openpanel/astro",
"version": "1.0.7-local", "version": "1.1.0-local",
"config": { "config": {
"transformPackageJson": false, "transformPackageJson": false,
"transformEnvs": true, "transformEnvs": true,
@@ -12,10 +12,15 @@
"scripts": { "scripts": {
"typecheck": "tsc --noEmit" "typecheck": "tsc --noEmit"
}, },
"files": ["src", "index.ts"], "files": [
"keywords": ["astro-component"], "src",
"index.ts"
],
"keywords": [
"astro-component"
],
"dependencies": { "dependencies": {
"@openpanel/web": "workspace:1.0.7-local" "@openpanel/web": "workspace:1.1.0-local"
}, },
"devDependencies": { "devDependencies": {
"astro": "^5.7.7" "astro": "^5.7.7"

View File

@@ -35,7 +35,7 @@ const methods: { name: OpenPanelMethodNames; value: unknown }[] = [
value: { value: {
...options, ...options,
sdk: 'astro', sdk: 'astro',
sdkVersion: '1.0.7', sdkVersion: '1.1.0',
}, },
}, },
]; ];

View File

@@ -1,6 +1,6 @@
{ {
"name": "@openpanel/express", "name": "@openpanel/express",
"version": "1.0.5-local", "version": "1.1.0-local",
"module": "index.ts", "module": "index.ts",
"config": { "config": {
"docPath": "apps/public/content/docs/(tracking)/sdks/express.mdx" "docPath": "apps/public/content/docs/(tracking)/sdks/express.mdx"
@@ -10,7 +10,7 @@
"typecheck": "tsc --noEmit" "typecheck": "tsc --noEmit"
}, },
"dependencies": { "dependencies": {
"@openpanel/sdk": "workspace:1.0.4-local", "@openpanel/sdk": "workspace:1.1.0-local",
"@openpanel/common": "workspace:*" "@openpanel/common": "workspace:*"
}, },
"peerDependencies": { "peerDependencies": {

View File

@@ -1,6 +1,6 @@
{ {
"name": "@openpanel/nextjs", "name": "@openpanel/nextjs",
"version": "1.1.4-local", "version": "1.2.0-local",
"module": "index.ts", "module": "index.ts",
"config": { "config": {
"docPath": "apps/public/content/docs/(tracking)/sdks/nextjs.mdx" "docPath": "apps/public/content/docs/(tracking)/sdks/nextjs.mdx"
@@ -10,7 +10,7 @@
"typecheck": "tsc --noEmit" "typecheck": "tsc --noEmit"
}, },
"dependencies": { "dependencies": {
"@openpanel/web": "workspace:1.0.7-local" "@openpanel/web": "workspace:1.1.0-local"
}, },
"peerDependencies": { "peerDependencies": {
"next": "^12.0.0 || ^13.0.0 || ^14.0.0 || ^15.0.0 || ^16.0.0", "next": "^12.0.0 || ^13.0.0 || ^14.0.0 || ^15.0.0 || ^16.0.0",

View File

@@ -1,6 +1,6 @@
{ {
"name": "@openpanel/nuxt", "name": "@openpanel/nuxt",
"version": "0.0.4-local", "version": "0.1.0-local",
"type": "module", "type": "module",
"main": "./dist/module.mjs", "main": "./dist/module.mjs",
"exports": { "exports": {
@@ -9,7 +9,9 @@
"import": "./dist/module.mjs" "import": "./dist/module.mjs"
} }
}, },
"files": ["dist"], "files": [
"dist"
],
"config": { "config": {
"transformPackageJson": false, "transformPackageJson": false,
"transformEnvs": false, "transformEnvs": false,
@@ -22,7 +24,7 @@
"typecheck": "tsc --noEmit" "typecheck": "tsc --noEmit"
}, },
"dependencies": { "dependencies": {
"@openpanel/web": "workspace:1.0.7-local" "@openpanel/web": "workspace:1.1.0-local"
}, },
"peerDependencies": { "peerDependencies": {
"h3": "^1.0.0", "h3": "^1.0.0",

View File

@@ -1,6 +1,6 @@
{ {
"name": "@openpanel/react-native", "name": "@openpanel/react-native",
"version": "1.0.6-local", "version": "1.1.0-local",
"module": "index.ts", "module": "index.ts",
"config": { "config": {
"docPath": "apps/public/content/docs/(tracking)/sdks/react-native.mdx" "docPath": "apps/public/content/docs/(tracking)/sdks/react-native.mdx"
@@ -10,7 +10,7 @@
"typecheck": "tsc --noEmit" "typecheck": "tsc --noEmit"
}, },
"dependencies": { "dependencies": {
"@openpanel/sdk": "workspace:1.0.4-local" "@openpanel/sdk": "workspace:1.1.0-local"
}, },
"devDependencies": { "devDependencies": {
"@openpanel/tsconfig": "workspace:*", "@openpanel/tsconfig": "workspace:*",

View File

@@ -1,6 +1,6 @@
{ {
"name": "@openpanel/sdk", "name": "@openpanel/sdk",
"version": "1.0.4-local", "version": "1.1.0-local",
"module": "index.ts", "module": "index.ts",
"config": { "config": {
"docPath": "apps/public/content/docs/(tracking)/sdks/javascript.mdx" "docPath": "apps/public/content/docs/(tracking)/sdks/javascript.mdx"

View File

@@ -1,6 +1,6 @@
{ {
"name": "@openpanel/web", "name": "@openpanel/web",
"version": "1.0.7-local", "version": "1.1.0-local",
"module": "index.ts", "module": "index.ts",
"config": { "config": {
"docPath": "apps/public/content/docs/(tracking)/sdks/web.mdx" "docPath": "apps/public/content/docs/(tracking)/sdks/web.mdx"
@@ -10,7 +10,7 @@
"typecheck": "tsc --noEmit" "typecheck": "tsc --noEmit"
}, },
"dependencies": { "dependencies": {
"@openpanel/sdk": "workspace:1.0.4-local", "@openpanel/sdk": "workspace:1.1.0-local",
"@rrweb/types": "2.0.0-alpha.20", "@rrweb/types": "2.0.0-alpha.20",
"rrweb": "2.0.0-alpha.20" "rrweb": "2.0.0-alpha.20"
}, },

55
pnpm-lock.yaml generated
View File

@@ -285,8 +285,8 @@ importers:
specifier: workspace:* specifier: workspace:*
version: link:../../packages/geo version: link:../../packages/geo
'@openpanel/nextjs': '@openpanel/nextjs':
specifier: ^1.1.1 specifier: ^1.2.0
version: 1.1.1(next@16.0.7(@opentelemetry/api@1.9.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react-dom@19.2.3(react@19.2.3))(react@19.2.3) version: 1.2.0(next@16.0.7(@opentelemetry/api@1.9.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react-dom@19.2.3(react@19.2.3))(react@19.2.3)
'@openpanel/payments': '@openpanel/payments':
specifier: workspace:^ specifier: workspace:^
version: link:../../packages/payments version: link:../../packages/payments
@@ -465,9 +465,6 @@ importers:
'@openpanel/payments': '@openpanel/payments':
specifier: workspace:* specifier: workspace:*
version: link:../../packages/payments version: link:../../packages/payments
'@openpanel/sdk':
specifier: ^1.0.8
version: 1.0.8
'@openpanel/sdk-info': '@openpanel/sdk-info':
specifier: workspace:^ specifier: workspace:^
version: link:../../packages/sdks/_info version: link:../../packages/sdks/_info
@@ -475,8 +472,8 @@ importers:
specifier: workspace:^ specifier: workspace:^
version: link:../../packages/validation version: link:../../packages/validation
'@openpanel/web': '@openpanel/web':
specifier: ^1.0.12 specifier: ^1.0.1
version: 1.0.12 version: 1.0.5
'@radix-ui/react-accordion': '@radix-ui/react-accordion':
specifier: ^1.2.12 specifier: ^1.2.12
version: 1.2.12(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) version: 1.2.12(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)
@@ -1484,7 +1481,7 @@ importers:
packages/sdks/astro: packages/sdks/astro:
dependencies: dependencies:
'@openpanel/web': '@openpanel/web':
specifier: workspace:1.0.12-local specifier: workspace:1.1.0-local
version: link:../web version: link:../web
devDependencies: devDependencies:
astro: astro:
@@ -1497,7 +1494,7 @@ importers:
specifier: workspace:* specifier: workspace:*
version: link:../../common version: link:../../common
'@openpanel/sdk': '@openpanel/sdk':
specifier: workspace:1.0.8-local specifier: workspace:1.1.0-local
version: link:../sdk version: link:../sdk
express: express:
specifier: ^4.17.0 || ^5.0.0 specifier: ^4.17.0 || ^5.0.0
@@ -1522,7 +1519,7 @@ importers:
packages/sdks/nextjs: packages/sdks/nextjs:
dependencies: dependencies:
'@openpanel/web': '@openpanel/web':
specifier: workspace:1.0.12-local specifier: workspace:1.1.0-local
version: link:../web version: link:../web
next: next:
specifier: ^12.0.0 || ^13.0.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 specifier: ^12.0.0 || ^13.0.0 || ^14.0.0 || ^15.0.0 || ^16.0.0
@@ -1550,7 +1547,7 @@ importers:
packages/sdks/nuxt: packages/sdks/nuxt:
dependencies: dependencies:
'@openpanel/web': '@openpanel/web':
specifier: workspace:1.0.12-local specifier: workspace:1.1.0-local
version: link:../web version: link:../web
h3: h3:
specifier: ^1.0.0 specifier: ^1.0.0
@@ -1587,7 +1584,7 @@ importers:
packages/sdks/react-native: packages/sdks/react-native:
dependencies: dependencies:
'@openpanel/sdk': '@openpanel/sdk':
specifier: workspace:1.0.8-local specifier: workspace:1.1.0-local
version: link:../sdk version: link:../sdk
expo-application: expo-application:
specifier: 5 - 7 specifier: 5 - 7
@@ -1633,7 +1630,7 @@ importers:
packages/sdks/web: packages/sdks/web:
dependencies: dependencies:
'@openpanel/sdk': '@openpanel/sdk':
specifier: workspace:1.0.8-local specifier: workspace:1.1.0-local
version: link:../sdk version: link:../sdk
'@rrweb/types': '@rrweb/types':
specifier: 2.0.0-alpha.20 specifier: 2.0.0-alpha.20
@@ -5869,8 +5866,8 @@ packages:
next: ~15.0.8 || ~15.1.12 || ~15.2.9 || ~15.3.9 || ~15.4.11 || ~15.5.10 || ~16.0.11 || ^16.1.5 next: ~15.0.8 || ~15.1.12 || ~15.2.9 || ~15.3.9 || ~15.4.11 || ~15.5.10 || ~16.0.11 || ^16.1.5
wrangler: ^4.59.2 wrangler: ^4.59.2
'@openpanel/nextjs@1.1.1': '@openpanel/nextjs@1.2.0':
resolution: {integrity: sha512-azJSB+SxL4ybj9MA1mDZkLBJ67jbZoDQB52SjaPS0lSBLVEQkcJVMO5x+sZFd9UgVVwWIvkTECdLLF+9eyXf8w==} resolution: {integrity: sha512-APHnOj34aeOM0JZMqSPWPV1oMDiY9I21MBEm+ne3G00H/fNkE2RyG4F0yxoxripn1EqiZK65a07HZH8qfLgXdQ==}
peerDependencies: peerDependencies:
next: ^12.0.0 || ^13.0.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 next: ^12.0.0 || ^13.0.0 || ^14.0.0 || ^15.0.0 || ^16.0.0
react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0
@@ -5879,15 +5876,15 @@ packages:
'@openpanel/sdk@1.0.2': '@openpanel/sdk@1.0.2':
resolution: {integrity: sha512-WvVWCBcJvJhM5MYKO5Hxjo4G/E0tnK5XK2UC+hKDHtoF+iKvtUWa5bz18pFAPQprq0u/Ev2YqirPsrMQJy5g2g==} resolution: {integrity: sha512-WvVWCBcJvJhM5MYKO5Hxjo4G/E0tnK5XK2UC+hKDHtoF+iKvtUWa5bz18pFAPQprq0u/Ev2YqirPsrMQJy5g2g==}
'@openpanel/sdk@1.0.8': '@openpanel/sdk@1.1.0':
resolution: {integrity: sha512-mr7HOZ/vqrJaATDFxcv3yyLjXcUXgsfboa0o0GlhiAYUh2B1Q0kgsm5qkfbtZhTqYP4BmNCWRkfRlpFp4pfpPQ==} resolution: {integrity: sha512-KxFEbY+s0wP5I+su1+j1AOVn6Uvw0QMO+iXbEcmW2MkFAaIuIIPYkHFELxiLPuePLI54gYfbmTr2ZMlz9GJtZw==}
'@openpanel/web@1.0.12':
resolution: {integrity: sha512-39oL19HYrw4qAzlxbtFP/rfLOaciWJXCxPwL6bk+u4SUcrrOrwmjSg0CwQYyrd2p3wp1QnsCiyv2n0EtEpjQMA==}
'@openpanel/web@1.0.5': '@openpanel/web@1.0.5':
resolution: {integrity: sha512-n/A9fKiHWcDTH2N6N8MM214ET7aoNJjgpLux0GRW+CD0KDEwI8UosQvvz3UOGHZ3jWqMMsUNdU2B7eYk2W87mg==} resolution: {integrity: sha512-n/A9fKiHWcDTH2N6N8MM214ET7aoNJjgpLux0GRW+CD0KDEwI8UosQvvz3UOGHZ3jWqMMsUNdU2B7eYk2W87mg==}
'@openpanel/web@1.1.0':
resolution: {integrity: sha512-5AUG/uBZZaeMKFNsp5l21D3Lj0ddPLK4NS/XIol7Q0jp2n6Za2wO5UlJ9MUatMoSLyLHc4a1BK9t+gbBlN7cMg==}
'@openstatus/react@0.0.3': '@openstatus/react@0.0.3':
resolution: {integrity: sha512-uDiegz7e3H67pG8lTT+op+6w5keTT7XpcENrREaqlWl5j53TYyO8nheOG1PeNw2/Qgd5KaGeRJJFn1crhTUSYw==} resolution: {integrity: sha512-uDiegz7e3H67pG8lTT+op+6w5keTT7XpcENrREaqlWl5j53TYyO8nheOG1PeNw2/Qgd5KaGeRJJFn1crhTUSYw==}
peerDependencies: peerDependencies:
@@ -25006,27 +25003,27 @@ snapshots:
- encoding - encoding
- supports-color - supports-color
'@openpanel/nextjs@1.1.1(next@16.0.7(@opentelemetry/api@1.9.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': '@openpanel/nextjs@1.2.0(next@16.0.7(@opentelemetry/api@1.9.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react-dom@19.2.3(react@19.2.3))(react@19.2.3)':
dependencies: dependencies:
'@openpanel/web': 1.0.5 '@openpanel/web': 1.1.0
next: 16.0.7(@opentelemetry/api@1.9.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) next: 16.0.7(@opentelemetry/api@1.9.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)
react: 19.2.3 react: 19.2.3
react-dom: 19.2.3(react@19.2.3) react-dom: 19.2.3(react@19.2.3)
'@openpanel/sdk@1.0.2': {} '@openpanel/sdk@1.0.2': {}
'@openpanel/sdk@1.0.8': {} '@openpanel/sdk@1.1.0': {}
'@openpanel/web@1.0.12':
dependencies:
'@openpanel/sdk': 1.0.8
'@rrweb/types': 2.0.0-alpha.20
rrweb: 2.0.0-alpha.20
'@openpanel/web@1.0.5': '@openpanel/web@1.0.5':
dependencies: dependencies:
'@openpanel/sdk': 1.0.2 '@openpanel/sdk': 1.0.2
'@openpanel/web@1.1.0':
dependencies:
'@openpanel/sdk': 1.1.0
'@rrweb/types': 2.0.0-alpha.20
rrweb: 2.0.0-alpha.20
'@openstatus/react@0.0.3(react@19.2.3)': '@openstatus/react@0.0.3(react@19.2.3)':
dependencies: dependencies:
react: 19.2.3 react: 19.2.3

View File

@@ -1,5 +1,6 @@
NODE_ENV="production" NODE_ENV="production"
VITE_SELF_HOSTED="true" VITE_SELF_HOSTED="true"
SELF_HOSTED="true"
BATCH_SIZE="5000" BATCH_SIZE="5000"
BATCH_INTERVAL="10000" BATCH_INTERVAL="10000"
ALLOW_REGISTRATION="false" ALLOW_REGISTRATION="false"