From 3c00c5453f16ed37f5031fe1ef6355092160a4d5 Mon Sep 17 00:00:00 2001 From: Aman Varshney Date: Tue, 12 Aug 2025 08:21:26 +0530 Subject: [PATCH] feat(cli): add disable analytics option (#496) --- .changeset/honest-results-tease.md | 5 +++++ .../project-generation/command-handlers.ts | 2 +- apps/cli/src/index.ts | 6 ++++++ apps/cli/src/types.ts | 1 + apps/cli/src/utils/analytics.ts | 4 ++-- apps/cli/test/programmatic-api.test.ts | 12 ++++++++++++ .../web/content/docs/cli/programmatic-api.mdx | 19 +++++++++++++++++++ 7 files changed, 46 insertions(+), 3 deletions(-) create mode 100644 .changeset/honest-results-tease.md diff --git a/.changeset/honest-results-tease.md b/.changeset/honest-results-tease.md new file mode 100644 index 0000000..c03f0fb --- /dev/null +++ b/.changeset/honest-results-tease.md @@ -0,0 +1,5 @@ +--- +"create-better-t-stack": patch +--- + +add disable analytics option diff --git a/apps/cli/src/helpers/project-generation/command-handlers.ts b/apps/cli/src/helpers/project-generation/command-handlers.ts index 19fcffe..2e6bdb6 100644 --- a/apps/cli/src/helpers/project-generation/command-handlers.ts +++ b/apps/cli/src/helpers/project-generation/command-handlers.ts @@ -178,7 +178,7 @@ export async function createProjectHandler( ), ); - await trackProjectCreation(config); + await trackProjectCreation(config, input.disableAnalytics); const elapsedTimeMs = Date.now() - startTime; const elapsedTimeInSeconds = (elapsedTimeMs / 1000).toFixed(2); diff --git a/apps/cli/src/index.ts b/apps/cli/src/index.ts index 1b12d04..57bc7d5 100644 --- a/apps/cli/src/index.ts +++ b/apps/cli/src/index.ts @@ -90,6 +90,11 @@ export const router = t.router({ webDeploy: WebDeploySchema.optional(), directoryConflict: DirectoryConflictSchema.optional(), renderTitle: z.boolean().optional(), + disableAnalytics: z + .boolean() + .optional() + .default(false) + .describe("Disable analytics"), }), ]), ) @@ -198,6 +203,7 @@ export function createBtsCli() { * packageManager: "bun", * install: false, * directoryConflict: "increment", // auto-handle conflicts + * disableAnalytics: true, // disable analytics * }); * * if (result.success) { diff --git a/apps/cli/src/types.ts b/apps/cli/src/types.ts index caee699..2f5d57d 100644 --- a/apps/cli/src/types.ts +++ b/apps/cli/src/types.ts @@ -134,6 +134,7 @@ export type CreateInput = { webDeploy?: WebDeploy; directoryConflict?: DirectoryConflict; renderTitle?: boolean; + disableAnalytics?: boolean; }; export type AddInput = { diff --git a/apps/cli/src/utils/analytics.ts b/apps/cli/src/utils/analytics.ts index 5738898..cafcb5f 100644 --- a/apps/cli/src/utils/analytics.ts +++ b/apps/cli/src/utils/analytics.ts @@ -5,8 +5,8 @@ import { isTelemetryEnabled } from "./telemetry"; const POSTHOG_API_KEY = process.env.POSTHOG_API_KEY || ""; const POSTHOG_HOST = process.env.POSTHOG_HOST; -export async function trackProjectCreation(config: ProjectConfig) { - if (!isTelemetryEnabled()) return; +export async function trackProjectCreation(config: ProjectConfig, disableAnalytics = false) { + if (!isTelemetryEnabled() || disableAnalytics) return; const sessionId = `cli_${crypto.randomUUID().replace(/-/g, "")}`; // biome-ignore lint/correctness/noUnusedVariables: `projectName`, `projectDir`, and `relativePath` are not used in the event properties diff --git a/apps/cli/test/programmatic-api.test.ts b/apps/cli/test/programmatic-api.test.ts index 5fecf98..3fe7c45 100644 --- a/apps/cli/test/programmatic-api.test.ts +++ b/apps/cli/test/programmatic-api.test.ts @@ -213,6 +213,18 @@ describe("Programmatic API - Fast Tests", () => { addons: ["biome"], }); }, 15000); + + test("creates project with analytics disabled", async () => { + const result = await init("no-analytics-app", { + yes: true, + disableAnalytics: true, + install: false, + git: false, + }); + + expect(result.success).toBe(true); + expect(result.projectConfig.projectName).toBe("no-analytics-app"); + }, 15000); }); describe("Error scenarios", () => { diff --git a/apps/web/content/docs/cli/programmatic-api.mdx b/apps/web/content/docs/cli/programmatic-api.mdx index 85434a5..3538e65 100644 --- a/apps/web/content/docs/cli/programmatic-api.mdx +++ b/apps/web/content/docs/cli/programmatic-api.mdx @@ -36,6 +36,7 @@ async function createProject() { auth: true, packageManager: "bun", install: false, // Don't install deps automatically + disableAnalytics: true, // Disable analytics }); if (result.success) { @@ -62,6 +63,23 @@ const result = await init("existing-folder", { }); ``` +### Disabling Analytics + +You can disable analytics: + +```typescript +import { init } from "create-better-t-stack"; + +const result = await init("my-private-project", { + yes: true, + disableAnalytics: true, // No analytics data will be sent + frontend: ["tanstack-router"], + backend: "hono", +}); +``` + +> **Note:** Analytics help improve Better-T Stack by providing insights into usage patterns. When disabled, no data is collected or transmitted. + ## API Reference ### `init(projectName?, options?)` @@ -130,6 +148,7 @@ interface CreateInput { webDeploy?: WebDeploy; // Web deployment setup directoryConflict?: DirectoryConflict; // "merge" | "overwrite" | "increment" | "error" renderTitle?: boolean; // Show ASCII art title + disableAnalytics?: boolean; // Disable analytics and telemetry } ```