2025September

PostHog configuration in Codebuff codebase.

In this article, we review PostHog configuration in Codebuff codebase. We will look at:

  1. What is PostHog?

  2. analytics.ts in Codebuff.

I study patterns used in an open source project found on Github Trending. For this week, I reviewed Codebuff codebase and wrote this article.

What is PostHog?

PostHog is a single platform for people who build things. They help product engineers build successful products. Literally every piece of SaaS that a product engineer needs. This includes tools for building products, talking to customers, and making sense of all your customer data.

PostHog provides as apps by stage.

Startup/side project

Growth

Scale

Explore all their apps in Product OS.

analytics.ts in Codebuff

I found trackEvent function being called in recreateShell as shown below:

export const recreateShell = async (cwd: string) => {
  persistentProcess = await createPersistentProcess(cwd)
  trackEvent(AnalyticsEvent.SHELL_RECREATED, { persistentProcess })
}

This trackEvent function is imported as shown below at the top of the file:

import { trackEvent } from '../utils/analytics'

trackEvent definition

This trackEvent function is defined as shown below in utils/analytics.ts:

export function trackEvent(
  event: AnalyticsEvent,
  properties?: Record<string, any>,
) {
  const distinctId = currentUserId
  if (!distinctId) {
    return
  }
  if (!client) {
    if (process.env.NEXT_PUBLIC_CB_ENVIRONMENT === 'prod') {
      throw new Error('Analytics client not initialized')
    }
    return
  }
 
  if (process.env.NEXT_PUBLIC_CB_ENVIRONMENT !== 'prod') {
    if (DEBUG_DEV_EVENTS) {
      console.log('Analytics event sent', {
        event,
        properties,
      })
    }
    return
  }
 
  client.capture({
    distinctId,
    event,
    properties,
  })
}

The below block prevents sending events in any env other than prod by simply logging it:

if (process.env.NEXT_PUBLIC_CB_ENVIRONMENT !== 'prod') {
    if (DEBUG_DEV_EVENTS) {
      console.log('Analytics event sent', {
        event,
        properties,
      })
    }
    return
  }

client is a global variable in initialized as shown below:

let client: PostHog | undefined 
...
export function initAnalytics() {
...
  client = new PostHog(process.env.NEXT_PUBLIC_POSTHOG_API_KEY, {
    host: process.env.NEXT_PUBLIC_POSTHOG_HOST_URL,
    enableExceptionAutocapture:
      process.env.NEXT_PUBLIC_CB_ENVIRONMENT === 'prod',
  })
...

About me:

Hey, my name is Ramu Narasinga. I study codebase architecture in large open-source projects.

Email: ramu.narasinga@gmail.com

Want to learn from open-source? Solve challenges inspired by open-source projects.

References:

  1. https://github.com/CodebuffAI/codebuff/blob/main/npm-app/src/index.ts#L48

  2. https://github.com/CodebuffAI/codebuff/blob/main/npm-app/src/terminal/run-command.ts#L279

  3. https://github.com/CodebuffAI/codebuff/blob/main/npm-app/src/utils/analytics.ts#L60

  4. https://github.com/CodebuffAI/codebuff/blob/main/npm-app/src/index.ts#L53

  5. https://github.com/CodebuffAI/codebuff/blob/main/npm-app/src/utils/analytics.ts#L38

We use cookies
We use cookies to ensure you get the best experience on our website. For more information on how we use cookies, please see our cookie policy.

By clicking "Accept", you agree to our use of cookies.

Learn more