Skip to content

posthog migration: part 1 #7363

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Jun 19, 2025
Merged

Conversation

jnsdls
Copy link
Member

@jnsdls jnsdls commented Jun 17, 2025

Migrate to PostHog US Instance

This PR updates our PostHog integration across all apps to use the US-based PostHog instance instead of the previous self-hosted solution. Key changes include:

  • Upgraded PostHog JS SDK from 1.67.1 to 1.252.0
  • Added API proxying via Next.js rewrites to route PostHog requests through /_ph endpoints
  • Implemented a new initialization approach using instrumentation-client.ts files
  • Removed custom PostHog components and providers in favor of the official SDK's auto-capture functionality
  • Configured PostHog to capture page views on history changes automatically
  • Disabled session recording and exception capturing for privacy and performance
  • Removed the flat dependency which is no longer needed

These changes will provide more reliable analytics while improving performance by using PostHog's official CDN and modern SDK features.

Summary by CodeRabbit

  • New Features

    • Added support for proxying analytics-related requests to external services across multiple apps, enabling seamless integration with analytics providers.
  • Chores

    • Upgraded the analytics library dependency to the latest version in several apps.
    • Updated environment variable examples to support new analytics configuration.
  • Refactor

    • Replaced in-app analytics instrumentation with new centralized clients for improved control and consistency.
  • Bug Fixes

    • Minor CSS z-index syntax adjustments for improved styling consistency.
  • Removed

    • Eliminated legacy analytics components and tracking from layouts, providers, hooks, and feedback forms, simplifying application structure and reducing external tracking.

PR-Codex overview

This PR focuses on the removal of several Posthog components and their related files across multiple applications, as well as updating the posthog-js library version to 1.252.0. It also introduces new rewrites in various configuration files to accommodate the updated tracking.

Detailed summary

  • Deleted files related to Posthog from:
    • apps/portal/src/lib/env.ts
    • apps/portal/src/lib/posthog/Posthog.tsx
    • apps/dashboard/src/lib/posthog/Posthog.tsx
    • apps/playground-web/src/lib/posthog/Posthog.tsx
    • apps/dashboard/src/components/wallets/PosthogIdentifier.tsx
  • Updated posthog-js version to 1.252.0 in:
    • apps/nebula/package.json
    • apps/playground-web/package.json
    • apps/portal/package.json
    • apps/dashboard/package.json
  • Added NEXT_PUBLIC_POSTHOG_KEY and NEXT_PUBLIC_POSTHOG_HOST to apps/nebula/.env.example.
  • Introduced new rewrites in next.config.mjs for apps/playground-web, apps/dashboard, apps/nebula, and apps/portal to direct traffic for Posthog.
  • Removed Posthog components from various layouts and providers, simplifying the structure in apps/dashboard/src/app/pay/components/client/Providers.client.tsx and apps/dashboard/src/app/bridge/components/client/Providers.client.tsx.

✨ Ask PR-Codex anything about this PR by commenting with /codex {your question}

Copy link

vercel bot commented Jun 17, 2025

The latest updates on your projects. Learn more about Vercel for Git ↗︎

Name Status Preview Comments Updated (UTC)
docs-v2 ✅ Ready (Inspect) Visit Preview 💬 Add feedback Jun 19, 2025 1:01am
login ✅ Ready (Inspect) Visit Preview 💬 Add feedback Jun 19, 2025 1:01am
nebula ✅ Ready (Inspect) Visit Preview 💬 Add feedback Jun 19, 2025 1:01am
thirdweb_playground ✅ Ready (Inspect) Visit Preview 💬 Add feedback Jun 19, 2025 1:01am
thirdweb-www ✅ Ready (Inspect) Visit Preview 💬 Add feedback Jun 19, 2025 1:01am
wallet-ui ✅ Ready (Inspect) Visit Preview 💬 Add feedback Jun 19, 2025 1:01am

Copy link

changeset-bot bot commented Jun 17, 2025

⚠️ No Changeset found

Latest commit: 6b24fed

Merging this PR will not cause a version bump for any packages. If these changes should not result in a new version, you're good to go. If these changes should result in a version bump, you need to add a changeset.

This PR includes no changesets

When changesets are added to this PR, you'll see the packages that this PR includes changesets for and the associated semver types

Click here to learn what changesets are, and how to add one.

Click here if you're a maintainer who wants to add a changeset to this PR

Copy link
Contributor

coderabbitai bot commented Jun 17, 2025

## Walkthrough

This change removes all PostHog analytics React components, providers, and tracking logic from the codebase across multiple apps. Instead, PostHog is now initialized directly in new instrumentation client modules. Next.js configuration files are updated to proxy certain PostHog API and asset requests. Related environment variables and dependencies are updated accordingly.

## Changes

| File(s)                                                                                                 | Change Summary                                                                                     |
|--------------------------------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------------|
| .../next.config.{ts,mjs} (dashboard, nebula, playground-web, portal, wallet-ui)                        | Added async `rewrites` functions to proxy `/_ph` paths to external PostHog domains.              |
| .../package.json (dashboard, nebula, playground-web, portal)                                           | Updated or added `posthog-js` dependency; removed `flat` from dashboard.                         |
| .../src/app/layout.tsx (dashboard, playground-web, portal)                                             | Removed all PostHog-related imports and components from root layouts.                            |
| .../src/app/(app)/layout.tsx, .../team/[team_slug]/layout.tsx (dashboard)                              | Removed PostHog provider and identifier server from layouts.                                     |
| .../src/app/bridge/components/client/Providers.client.tsx, .../pay/components/client/Providers.client.tsx (dashboard) | Removed PostHog provider and pageview tracking from providers.                                  |
| .../src/components/wallets/PosthogIdentifier{,Server}.tsx (dashboard)                                  | Deleted PostHog identifier client and server components.                                         |
| .../src/hooks/analytics/useTrack.ts (dashboard)                                                        | Removed all PostHog tracking logic from the `useTrack` hook.                                    |
| .../src/instrumentation-client.ts (dashboard, nebula, playground-web, portal)                          | Added new modules to directly initialize PostHog analytics via side effect.                      |
| .../src/lib/posthog/Posthog{,HeadSetup,PageView}.tsx (dashboard, playground-web, portal)               | Deleted all PostHog React provider, head setup, and pageview tracking components.                |
| .../src/utils/errorParser.tsx (dashboard)                                                              | Removed PostHog error capture logic.                                                            |
| .../src/components/others/Feedback.tsx (portal)                                                        | Removed PostHog analytics tracking from feedback component.                                     |
| .../src/lib/env.ts (portal)                                                                            | Deleted `isProd` environment utility.                                                           |
| .../src/components/code/RenderCode.tsx, .../app/Header.tsx (portal)                                    | Minor Tailwind z-index syntax updates (unrelated to analytics).                                 |
| .../.env.example (nebula)                                                                              | Added PostHog environment variables for local development.                                      |

## Sequence Diagram(s)

```mermaid
sequenceDiagram
    participant User
    participant App
    participant InstrumentationClient
    participant PostHogCloud

    User->>App: Loads page
    App->>InstrumentationClient: (side effect) Initialize PostHog if env key present
    InstrumentationClient->>PostHogCloud: Connects with config (API host, options)
    Note over App,InstrumentationClient: No React PostHog providers/components used
    App->>User: Renders UI (no PostHog wrappers)
    User->>App: Navigates/interacts
    App->>InstrumentationClient: (PostHog tracks events via SDK, if enabled)

Possibly related PRs

  • thirdweb-dev/js#7135: Updates useTrack to use the usePostHog hook for PostHog integration; this PR removes PostHog from useTrack, making them directly related but in opposite directions.
  • thirdweb-dev/js#7232: Adds PHProvider and PostHogPageView components to dashboard providers; this PR removes those components, making them directly related but with opposing changes.
  • thirdweb-dev/js#7267: Modifies PHProvider to add session recording control; this PR removes PHProvider entirely, undoing those changes.

Suggested reviewers

  • jnsdls

<!-- walkthrough_end -->


---

<details>
<summary>📜 Recent review details</summary>

**Configuration used: CodeRabbit UI**
**Review profile: CHILL**
**Plan: Pro**


<details>
<summary>📥 Commits</summary>

Reviewing files that changed from the base of the PR and between 38cb3c929f1d48482a06c9e22bae8d9c366cb0a7 and 6b24fed21f4ec0f97ce9f2a7b20888104d5857cf.

</details>

<details>
<summary>⛔ Files ignored due to path filters (1)</summary>

* `pnpm-lock.yaml` is excluded by `!**/pnpm-lock.yaml`

</details>

<details>
<summary>📒 Files selected for processing (37)</summary>

* `apps/dashboard/next.config.ts` (1 hunks)
* `apps/dashboard/package.json` (1 hunks)
* `apps/dashboard/src/app/(app)/layout.tsx` (1 hunks)
* `apps/dashboard/src/app/(app)/team/[team_slug]/layout.tsx` (0 hunks)
* `apps/dashboard/src/app/bridge/components/client/Providers.client.tsx` (1 hunks)
* `apps/dashboard/src/app/pay/components/client/Providers.client.tsx` (1 hunks)
* `apps/dashboard/src/components/wallets/PosthogIdentifier.tsx` (0 hunks)
* `apps/dashboard/src/components/wallets/PosthogIdentifierServer.tsx` (0 hunks)
* `apps/dashboard/src/hooks/analytics/useTrack.ts` (1 hunks)
* `apps/dashboard/src/instrumentation-client.ts` (1 hunks)
* `apps/dashboard/src/lib/posthog/Posthog.tsx` (0 hunks)
* `apps/dashboard/src/lib/posthog/PosthogHeadSetup.tsx` (0 hunks)
* `apps/dashboard/src/lib/posthog/PosthogPageView.tsx` (0 hunks)
* `apps/dashboard/src/utils/errorParser.tsx` (0 hunks)
* `apps/nebula/.env.example` (1 hunks)
* `apps/nebula/next.config.ts` (1 hunks)
* `apps/nebula/package.json` (1 hunks)
* `apps/nebula/src/instrumentation-client.ts` (1 hunks)
* `apps/playground-web/next.config.mjs` (1 hunks)
* `apps/playground-web/package.json` (1 hunks)
* `apps/playground-web/src/app/layout.tsx` (1 hunks)
* `apps/playground-web/src/instrumentation-client.ts` (1 hunks)
* `apps/playground-web/src/lib/posthog/Posthog.tsx` (0 hunks)
* `apps/playground-web/src/lib/posthog/PosthogHeadSetup.tsx` (0 hunks)
* `apps/playground-web/src/lib/posthog/PosthogPageView.tsx` (0 hunks)
* `apps/portal/next.config.mjs` (1 hunks)
* `apps/portal/package.json` (1 hunks)
* `apps/portal/src/app/Header.tsx` (1 hunks)
* `apps/portal/src/app/layout.tsx` (1 hunks)
* `apps/portal/src/components/code/RenderCode.tsx` (1 hunks)
* `apps/portal/src/components/others/Feedback.tsx` (1 hunks)
* `apps/portal/src/instrumentation-client.ts` (1 hunks)
* `apps/portal/src/lib/env.ts` (0 hunks)
* `apps/portal/src/lib/posthog/Posthog.tsx` (0 hunks)
* `apps/portal/src/lib/posthog/PosthogHeadSetup.tsx` (0 hunks)
* `apps/portal/src/lib/posthog/PosthogPageView.tsx` (0 hunks)
* `apps/wallet-ui/next.config.mjs` (1 hunks)

</details>

<details>
<summary>💤 Files with no reviewable changes (14)</summary>

* apps/dashboard/src/app/(app)/team/[team_slug]/layout.tsx
* apps/dashboard/src/utils/errorParser.tsx
* apps/portal/src/lib/env.ts
* apps/playground-web/src/lib/posthog/PosthogHeadSetup.tsx
* apps/dashboard/src/lib/posthog/PosthogHeadSetup.tsx
* apps/dashboard/src/lib/posthog/Posthog.tsx
* apps/playground-web/src/lib/posthog/PosthogPageView.tsx
* apps/dashboard/src/lib/posthog/PosthogPageView.tsx
* apps/dashboard/src/components/wallets/PosthogIdentifier.tsx
* apps/portal/src/lib/posthog/PosthogPageView.tsx
* apps/portal/src/lib/posthog/Posthog.tsx
* apps/portal/src/lib/posthog/PosthogHeadSetup.tsx
* apps/dashboard/src/components/wallets/PosthogIdentifierServer.tsx
* apps/playground-web/src/lib/posthog/Posthog.tsx

</details>

<details>
<summary>✅ Files skipped from review due to trivial changes (1)</summary>

* apps/playground-web/src/instrumentation-client.ts

</details>

<details>
<summary>🚧 Files skipped from review as they are similar to previous changes (22)</summary>

* apps/playground-web/package.json
* apps/nebula/package.json
* apps/dashboard/package.json
* apps/portal/src/components/code/RenderCode.tsx
* apps/portal/src/components/others/Feedback.tsx
* apps/nebula/.env.example
* apps/portal/next.config.mjs
* apps/nebula/src/instrumentation-client.ts
* apps/portal/src/instrumentation-client.ts
* apps/portal/src/app/Header.tsx
* apps/dashboard/src/app/bridge/components/client/Providers.client.tsx
* apps/portal/src/app/layout.tsx
* apps/dashboard/src/instrumentation-client.ts
* apps/playground-web/src/app/layout.tsx
* apps/dashboard/src/app/(app)/layout.tsx
* apps/dashboard/src/app/pay/components/client/Providers.client.tsx
* apps/nebula/next.config.ts
* apps/dashboard/next.config.ts
* apps/dashboard/src/hooks/analytics/useTrack.ts
* apps/portal/package.json
* apps/playground-web/next.config.mjs
* apps/wallet-ui/next.config.mjs

</details>

<details>
<summary>⏰ Context from checks skipped due to timeout of 90000ms (8)</summary>

* GitHub Check: E2E Tests (pnpm, vite)
* GitHub Check: E2E Tests (pnpm, webpack)
* GitHub Check: Size
* GitHub Check: E2E Tests (pnpm, esbuild)
* GitHub Check: Unit Tests
* GitHub Check: Build Packages
* GitHub Check: Lint Packages
* GitHub Check: Analyze (javascript)

</details>

</details>
<!-- internal state start -->


<!-- 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 -->

<!-- internal state end -->
<!-- finishing_touch_checkbox_start -->

<details open="true">
<summary>✨ Finishing Touches</summary>

- [ ] <!-- {"checkboxId": "7962f53c-55bc-4827-bfbf-6a18da830691"} --> 📝 Generate Docstrings

</details>

<!-- finishing_touch_checkbox_end -->
<!-- tips_start -->

---



<details>
<summary>🪧 Tips</summary>

### Chat

There are 3 ways to chat with [CodeRabbit](https://coderabbit.ai?utm_source=oss&utm_medium=github&utm_campaign=thirdweb-dev/js&utm_content=7363):

- Review comments: Directly reply to a review comment made by CodeRabbit. Example:
  - `I pushed a fix in commit <commit_id>, please review it.`
  - `Explain this complex logic.`
  - `Open a follow-up GitHub issue for this discussion.`
- Files and specific lines of code (under the "Files changed" tab): Tag `@coderabbitai` in a new review comment at the desired location with your query. Examples:
  - `@coderabbitai explain this code block.`
  -	`@coderabbitai modularize this function.`
- PR comments: Tag `@coderabbitai` in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
  - `@coderabbitai gather interesting stats about this repository and render them as a table. Additionally, render a pie chart showing the language distribution in the codebase.`
  - `@coderabbitai read src/utils.ts and explain its main purpose.`
  - `@coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.`
  - `@coderabbitai help me debug CodeRabbit configuration file.`

### Support

Need help? Create a ticket on our [support page](https://www.coderabbit.ai/contact-us/support) for assistance with any issues or questions.

Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments.

### CodeRabbit Commands (Invoked using PR comments)

- `@coderabbitai pause` to pause the reviews on a PR.
- `@coderabbitai resume` to resume the paused reviews.
- `@coderabbitai review` to trigger an incremental review. This is useful when automatic reviews are disabled for the repository.
- `@coderabbitai full review` to do a full review from scratch and review all the files again.
- `@coderabbitai summary` to regenerate the summary of the PR.
- `@coderabbitai generate docstrings` to [generate docstrings](https://docs.coderabbit.ai/finishing-touches/docstrings) for this PR.
- `@coderabbitai generate sequence diagram` to generate a sequence diagram of the changes in this PR.
- `@coderabbitai resolve` resolve all the CodeRabbit review comments.
- `@coderabbitai configuration` to show the current CodeRabbit configuration for the repository.
- `@coderabbitai help` to get help.

### Other keywords and placeholders

- Add `@coderabbitai ignore` anywhere in the PR description to prevent this PR from being reviewed.
- Add `@coderabbitai summary` to generate the high-level summary at a specific location in the PR description.
- Add `@coderabbitai` anywhere in the PR title to generate the title automatically.

### CodeRabbit Configuration File (`.coderabbit.yaml`)

- You can programmatically configure CodeRabbit by adding a `.coderabbit.yaml` file to the root of your repository.
- Please see the [configuration documentation](https://docs.coderabbit.ai/guides/configure-coderabbit) for more information.
- If your editor has YAML language server enabled, you can add the path at the top of this file to enable auto-completion and validation: `# yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json`

### Documentation and Community

- Visit our [Documentation](https://docs.coderabbit.ai) for detailed information on how to use CodeRabbit.
- Join our [Discord Community](http://discord.gg/coderabbit) to get help, request features, and share feedback.
- Follow us on [X/Twitter](https://twitter.com/coderabbitai) for updates and announcements.

</details>

<!-- tips_end -->

@github-actions github-actions bot added Dashboard Involves changes to the Dashboard. Playground Changes involving the Playground codebase. Portal Involves changes to the Portal (docs) codebase. labels Jun 17, 2025
Copy link
Member Author

jnsdls commented Jun 17, 2025


How to use the Graphite Merge Queue

Add either label to this PR to merge it via the merge queue:

  • merge-queue - adds this PR to the back of the merge queue
  • hotfix - for urgent hot fixes, skip the queue and merge this PR next

You must have a Graphite account in order to use the merge queue. Sign up using this link.

An organization admin has enabled the Graphite Merge Queue in this repository.

Please do not merge from GitHub as this will restart CI on PRs being processed by the merge queue.

This stack of pull requests is managed by Graphite. Learn more about stacking.

Copy link

socket-security bot commented Jun 17, 2025

Review the following changes in direct dependencies. Learn more about Socket for GitHub.

Diff Package Supply Chain
Security
Vulnerability Quality Maintenance License
Updatedposthog-js@​1.67.1 ⏵ 1.252.099100100 +496 +1100

View full report

Copy link
Contributor

github-actions bot commented Jun 17, 2025

size-limit report 📦

Path Size Loading time (3g) Running time (snapdragon) Total time
thirdweb (esm) 62.53 KB (0%) 1.3 s (0%) 336 ms (+123.99% 🔺) 1.6 s
thirdweb (cjs) 350.55 KB (0%) 7.1 s (0%) 1.3 s (+2.48% 🔺) 8.3 s
thirdweb (minimal + tree-shaking) 5.7 KB (0%) 114 ms (0%) 118 ms (+952.51% 🔺) 232 ms
thirdweb/chains (tree-shaking) 531 B (0%) 11 ms (0%) 39 ms (+1199.1% 🔺) 49 ms
thirdweb/react (minimal + tree-shaking) 19.59 KB (0%) 392 ms (0%) 132 ms (+460.36% 🔺) 524 ms

Copy link

codecov bot commented Jun 17, 2025

Codecov Report

All modified and coverable lines are covered by tests ✅

Project coverage is 52.35%. Comparing base (cc3fbba) to head (6b24fed).
Report is 5 commits behind head on main.

Additional details and impacted files
@@           Coverage Diff           @@
##             main    #7363   +/-   ##
=======================================
  Coverage   52.35%   52.35%           
=======================================
  Files         939      939           
  Lines       63161    63161           
  Branches     4213     4217    +4     
=======================================
  Hits        33070    33070           
  Misses      29984    29984           
  Partials      107      107           
Flag Coverage Δ
packages 52.35% <ø> (ø)
🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

Copy link

@cursor cursor bot left a comment

Choose a reason for hiding this comment

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

Bug: PostHog Rewrite Rules Order Issue

The PostHog rewrite rules are incorrectly ordered. The specific /_ph/decide rule is placed after the general /_ph/:path* rule, causing requests to /_ph/decide to be caught by the general pattern and never reach the intended specific rule. The /_ph/decide rule should precede the /_ph/:path* rule.

apps/dashboard/next.config.ts#L148-L165

return [
{
source: "/_ph/static/:path*",
destination: "https://us-assets.i.posthog.com/static/:path*",
},
{
source: "/_ph/:path*",
destination: "https://us.i.posthog.com/:path*",
},
{
source: "/_ph/decide",
destination: "https://us.i.posthog.com/decide",
},
{
source: "/thirdweb.eth",
destination: "/deployer.thirdweb.eth",
},
{

apps/nebula/next.config.ts#L51-L68

serverExternalPackages: ["pino-pretty"],
async rewrites() {
return [
{
source: "/_ph/static/:path*",
destination: "https://us-assets.i.posthog.com/static/:path*",
},
{
source: "/_ph/:path*",
destination: "https://us.i.posthog.com/:path*",
},
{
source: "/_ph/decide",
destination: "https://us.i.posthog.com/decide",
},
];
},
async headers() {

apps/portal/next.config.mjs#L60-L77

redirects,
async rewrites() {
return [
{
source: "/_ph/static/:path*",
destination: "https://us-assets.i.posthog.com/static/:path*",
},
{
source: "/_ph/:path*",
destination: "https://us.i.posthog.com/:path*",
},
{
source: "/_ph/decide",
destination: "https://us.i.posthog.com/decide",
},
];
},
webpack: (config) => {

apps/wallet-ui/next.config.mjs#L57-L74

},
async rewrites() {
return [
{
source: "/_ph/static/:path*",
destination: "https://us-assets.i.posthog.com/static/:path*",
},
{
source: "/_ph/:path*",
destination: "https://us.i.posthog.com/:path*",
},
{
source: "/_ph/decide",
destination: "https://us.i.posthog.com/decide",
},
];
},
webpack: (config) => {

Fix in Cursor


Was this report helpful? Give feedback by reacting with 👍 or 👎

Copy link
Contributor

graphite-app bot commented Jun 19, 2025

Merge activity

# Migrate to PostHog US Instance

This PR updates our PostHog integration across all apps to use the US-based PostHog instance instead of the previous self-hosted solution. Key changes include:

- Upgraded PostHog JS SDK from 1.67.1 to 1.252.0
- Added API proxying via Next.js rewrites to route PostHog requests through `/_ph` endpoints
- Implemented a new initialization approach using `instrumentation-client.ts` files
- Removed custom PostHog components and providers in favor of the official SDK's auto-capture functionality
- Configured PostHog to capture page views on history changes automatically
- Disabled session recording and exception capturing for privacy and performance
- Removed the `flat` dependency which is no longer needed

These changes will provide more reliable analytics while improving performance by using PostHog's official CDN and modern SDK features.

<!-- This is an auto-generated comment: release notes by coderabbit.ai -->
## Summary by CodeRabbit

- **New Features**
  - Added support for proxying analytics-related requests to external services across multiple apps, enabling seamless integration with analytics providers.

- **Chores**
  - Upgraded the analytics library dependency to the latest version in several apps.
  - Updated environment variable examples to support new analytics configuration.

- **Refactor**
  - Replaced in-app analytics instrumentation with new centralized clients for improved control and consistency.

- **Bug Fixes**
  - Minor CSS z-index syntax adjustments for improved styling consistency.

- **Removed**
  - Eliminated legacy analytics components and tracking from layouts, providers, hooks, and feedback forms, simplifying application structure and reducing external tracking.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->

<!-- start pr-codex -->

---

## PR-Codex overview
This PR focuses on the removal of several `Posthog` components and their related files across multiple applications, as well as updating the `posthog-js` library version to `1.252.0`. It also introduces new `rewrites` in various configuration files to accommodate the updated tracking.

### Detailed summary
- Deleted files related to `Posthog` from:
  - `apps/portal/src/lib/env.ts`
  - `apps/portal/src/lib/posthog/Posthog.tsx`
  - `apps/dashboard/src/lib/posthog/Posthog.tsx`
  - `apps/playground-web/src/lib/posthog/Posthog.tsx`
  - `apps/dashboard/src/components/wallets/PosthogIdentifier.tsx`
- Updated `posthog-js` version to `1.252.0` in:
  - `apps/nebula/package.json`
  - `apps/playground-web/package.json`
  - `apps/portal/package.json`
  - `apps/dashboard/package.json`
- Added `NEXT_PUBLIC_POSTHOG_KEY` and `NEXT_PUBLIC_POSTHOG_HOST` to `apps/nebula/.env.example`.
- Introduced new `rewrites` in `next.config.mjs` for `apps/playground-web`, `apps/dashboard`, `apps/nebula`, and `apps/portal` to direct traffic for `Posthog`.
- Removed `Posthog` components from various layouts and providers, simplifying the structure in `apps/dashboard/src/app/pay/components/client/Providers.client.tsx` and `apps/dashboard/src/app/bridge/components/client/Providers.client.tsx`.

> ✨ Ask PR-Codex anything about this PR by commenting with `/codex {your question}`

<!-- end pr-codex -->
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Dashboard Involves changes to the Dashboard. Ecosystem Portal Involves changes to the Ecosystem Portal Playground Changes involving the Playground codebase. Portal Involves changes to the Portal (docs) codebase.
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants