Skip to content

Conversation

@ian
Copy link
Owner

@ian ian commented Nov 1, 2025

Summary by cubic

Adds OpenPanel analytics. Home now uses OpenPanel, and the analytics template sends events to both OpenPanel and PostHog (Startup-91).

  • New Features

    • Home: Replaced GA/Plausible/PostHog plugins with OpenPanel via @openpanel/web and custom handlers (identify, track, page, reset). Pageviews are sent as $pageview. Added OpenPanel to the integrations list and an SVG logo.
    • Templates: Added a React OpenPanel provider and hook. AnalyticsProvider now wraps OpenPanelProvider and PostHogProvider and dual-sends. Identify/page/track/reset forward to both providers. Enabled link tracking; disabled automatic screen views.
  • Migration

    • Set NEXT_PUBLIC_OPENPANEL_CLIENT_ID (or OPENPANEL_CLIENT_ID) to enable OpenPanel.
    • For templates, keep POSTHOG_API_KEY and POSTHOG_HOST to continue dual-sending (optional).

Written for commit c2fc022. Summary will update automatically on new commits.

@linear
Copy link

linear bot commented Nov 1, 2025

STARTUP-91 Add OpenPanel

Copy link
Contributor

@cubic-dev-ai cubic-dev-ai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

1 issue found across 8 files

Prompt for AI agents (all 1 issues)

Understand the root cause of the following 1 issues and fix them.


<file name="templates/repo/packages/analytics/src/components/analytics-provider.tsx">

<violation number="1" location="templates/repo/packages/analytics/src/components/analytics-provider.tsx:24">
`OPENPANEL_CLIENT_ID` is never defined in this client component, so this fallback always resolves to `&#39;&#39;` and leaves OpenPanel without a clientId. Please remove this branch or plumb the value to the client via a `NEXT_PUBLIC` env or props.</violation>
</file>

React with 👍 or 👎 to teach cubic. Mention @cubic-dev-ai to give feedback, ask questions, or re-run the review.

@ian
Copy link
Owner Author

ian commented Nov 2, 2025

PR opened to port OpenPanel implementation to public repo: Openpanel-dev/openpanel#225

@ian ian merged commit db1d906 into 0.5.X Nov 2, 2025
8 checks passed
@ian ian deleted the startup-91-add-openpanel branch November 2, 2025 17:03
ian added a commit that referenced this pull request Nov 3, 2025
* Refactor to shadcn-style direct imports (STARTUP-93) (#24)

* feat: refactor to shadcn-style direct imports (STARTUP-93)

- Refactor @startupkit/analytics to minimal core with peer dependencies
- Update @startupkit/auth to use flexible peer dependencies (>=1.3.0)
- Update @repo/analytics to import directly from posthog-js and rudderstack
- Update @repo/auth to import directly from better-auth
- Remove version lock-in - projects control all upstream dependencies
- Add comprehensive documentation of shadcn principle
- Both packages build successfully

The shadcn principle: Import directly from upstream. Only use @startupkit/*
when it adds real value (utilities, orchestration, conventions).

Closes STARTUP-93

* lockfile

* lockfile

* lint

* fixes

* lint

* drop top level analytics

* fix

* lockfile

* typecheck

* feat: implement shadcn-style package strategy (STARTUP-93)

- Remove @startupkit/analytics entirely (not needed)
- Remove RudderStack dependency (PostHog handles everything)
- Update @startupkit/auth to use flexible peer dependencies (>=1.3.0)
- Update @repo/analytics to import directly from posthog-js/posthog-node
- Update @repo/auth to import directly from better-auth
- Add comprehensive package strategy documentation
- Add withAuth and handler exports to @repo/auth/server
- Fix email template props and types

The shadcn principle: Import directly from upstream libraries.
Only use @startupkit/* when it adds real value (like @startupkit/auth helpers).

Benefits:
- No version lock-in - upgrade posthog/better-auth anytime
- You own the code - @repo/* packages are yours to customize
- Simpler architecture - PostHog only, no RudderStack
- Better TypeScript support with direct imports

Closes STARTUP-93

* revert

* revert

* revert

* chore: upgrade to Next.js 16.0.0 and React 19

- Upgrade Next.js from 15.3.0 to 16.0.0
- Update @types/node to 22.12.0 (for vite compatibility)
- Update @types/react to 19.0.1
- Update @types/react-dom to 19.0.2
- Fix @startupkit/auth peer dependency to support Next.js >=14.0.0
- React 19 peer warnings from Radix UI are expected (React 19 is backward compatible)

* bump next/react

* add otp client again

* fix readme

* fix: add type assertions for better-auth client plugins

The adminClient and emailOTPClient plugins have complex type signatures
that require type assertions to work properly. This is a better-auth
type system limitation.

* cleanup

* wip analytics package

* analytics clenaup

* lockfile

* remove markdown spam

* lint

* package

* fix type errors

* actually error on pnpm install fail

* fix repo where we pull templates from

* better phrase

* Ditch prisma, switch to drizzle (#25)

* switch to drizzle

* fix: add allowEmptyPaths to replace-in-file to handle edge cases

Addresses STARTUP-92

* fix: prevent duplicate /templates/repo in degit source path

When --repo includes /templates/repo with a branch, don't append it again.

Addresses STARTUP-92

* feat: export TypeScript types from Drizzle schema

Export User, Account, Session, Team, TeamMember, and Verification types
for use by other packages.

Addresses STARTUP-92

* fix: add drizzle-orm dependency and fix AuthConfig types

- Add drizzle-orm to @repo/auth dependencies
- Update AuthConfig users type to accept table definitions

Addresses STARTUP-92

* fix: use Record<string, never> for users type to allow build

The more restrictive type with unknown fields was preventing TypeScript
from compiling the eq() operations with Drizzle columns.

Addresses STARTUP-92

* fix: use any type for users to accept Drizzle table types

Record<string, never> was too restrictive and prevented Drizzle
PgTableWithColumns from being assigned. Using any allows full compatibility.

Addresses STARTUP-92

* fix: use proper Drizzle PgTableWithColumns type instead of any

Import PgTableWithColumns from drizzle-orm/pg-core for type safety
while maintaining compatibility with Drizzle table structures.

Addresses STARTUP-92

* fix: use minimal type interface for users parameter

Avoid importing Drizzle types in @startupkit/auth to prevent
version conflicts between package and template instances.
Use minimal interface with just { id: unknown } since that's
all we need for the eq() operation.

Addresses STARTUP-92

* fix: use generic object type with ts-expect-error for Drizzle tables

Use TUsers extends object as a generic parameter to accept Drizzle
tables without importing Drizzle types (which causes version conflicts).
Use @ts-expect-error for accessing users.id in implementation since
TypeScript can't verify the generic has this property at compile time,
but it will exist at runtime.

This avoids any/unknown types while maintaining type safety.

Addresses STARTUP-92

* adding centralized config

* refactor auth

* get rid of erroneous docs

* fix types

* readme updated, type fixes

* update readme

* add biome to packages (#27)

* add biome

* adding biome

* fixing lint

* fix lint

* lint typecheck step

* lint fix

* fix typecheck

* lint

* Add agents.md management (#28)

* adding ruler for agents

* add missing gemini and qwen

* ignore

* fix gitignore

* baseline ruler

* wip agents.md

* updates

* add missing ignores for template

* set prefs for startupkit agents

* remove jobs (#29)

* remove (#30)

* remove

* fix tests

* run parallel

* cleanup

* rename

* rename (#31)

* Remove packages/utils (#32)

* remove utils we dont need this anymore:

* more

* remove this junk

* Add OpenPanel (#33)

* add openpanel

* memo

* lint

* fixing typecheck

* adding link/unlink

* convert github action to use script

* make proper react component

* refactor openpanel

* we've ported readme to public repo, we can remove this

* Next@16 (#34)

* Refactor project configuration and dependencies

- Removed ESLint configuration file (.eslintrc.json).
- Updated Next.js configuration in apps/home/next.config.mjs to use turbopack and simplified rewrites.
- Changed build script in apps/home/package.json to use webpack.
- Updated package dependencies in apps/home/package.json to use catalog references for various libraries.
- Modified TypeScript configuration in apps/home/tsconfig.json to include target and updated JSX settings.
- Updated pnpm-lock.yaml with new package versions and resolved dependencies.
- Adjusted workspace configuration in pnpm-workspace.yaml to include new catalogs and dependencies.
- Cleaned up template configurations for Next.js to align with new standards.

* use sk next tsconfig

* fix next tsconfig

* fix

* fixes

* fixes

* lint

* remove webpack and turbo not required

* Adding GA, refactor OpenMeter (#35)

* adding GA

* Refactor GA

* moving openpanel

* add missing

* refactor

* much simpler analytics setup

* remove dupe openpanel

* fix, lint

* cleanup

* lint

* simplify

* fix

* add second param

* fix email, fixes STARTUP-103

* Adding ahrefs provider (#36)

* adding ahrefs

* lint

* lockfile

* mby fix

* remove admin client for now
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants