From 31bc96cc775cf90ea5e2830e24b459fbda5388c3 Mon Sep 17 00:00:00 2001 From: Andrey Avtomonov Date: Fri, 22 May 2026 17:00:26 +0200 Subject: [PATCH] feat(telemetry): wire ktx PostHog project for live ingestion --- docs-site/content/docs/community/telemetry.mdx | 5 +++-- packages/cli/src/telemetry/emitter.test.ts | 9 +++++++-- packages/cli/src/telemetry/emitter.ts | 5 +++-- python/ktx-daemon/src/ktx_daemon/telemetry/emitter.py | 7 +++++-- 4 files changed, 18 insertions(+), 8 deletions(-) diff --git a/docs-site/content/docs/community/telemetry.mdx b/docs-site/content/docs/community/telemetry.mdx index 51d6810f..bf5c4865 100644 --- a/docs-site/content/docs/community/telemetry.mdx +++ b/docs-site/content/docs/community/telemetry.mdx @@ -84,5 +84,6 @@ emits the event; if it is sampled out, none do. ## Storage and retention -Telemetry is sent to the GTX PostHog project. Raw event data is retained for -90 days in PostHog. Aggregated counts may be retained indefinitely. +Telemetry is sent to the **ktx** PostHog project at +`https://us.i.posthog.com`. Raw event data is retained for 90 days in PostHog. +Aggregated counts may be retained indefinitely. diff --git a/packages/cli/src/telemetry/emitter.test.ts b/packages/cli/src/telemetry/emitter.test.ts index 4bb3dab2..861c4ab4 100644 --- a/packages/cli/src/telemetry/emitter.test.ts +++ b/packages/cli/src/telemetry/emitter.test.ts @@ -71,7 +71,7 @@ describe('telemetry emitter', () => { expect(captures).toEqual([]); }); - it('does not send when config constants are blank', async () => { + it('sends to PostHog by default once config constants are populated', async () => { await trackTelemetryEvent({ event: commandEvent(), distinctId: 'install-1', @@ -80,7 +80,12 @@ describe('telemetry emitter', () => { stderr: { write: () => {} }, }); - expect(captures).toEqual([]); + expect(captures).toHaveLength(1); + expect(captures[0]).toMatchObject({ + distinctId: 'install-1', + event: 'command', + groups: { project: 'project-1' }, + }); }); it('group-identifies once per project when live config is supplied', async () => { diff --git a/packages/cli/src/telemetry/emitter.ts b/packages/cli/src/telemetry/emitter.ts index 70af1586..dc2ccc81 100644 --- a/packages/cli/src/telemetry/emitter.ts +++ b/packages/cli/src/telemetry/emitter.ts @@ -21,8 +21,9 @@ type PostHogClient = { shutdown(): Promise | void; }; -const POSTHOG_PROJECT_API_KEY = ''; -const POSTHOG_HOST = ''; +// PostHog public project ingestion key — safe to embed; capture-only, no read access. +const POSTHOG_PROJECT_API_KEY = 'phc_xbvZpbu8ZNLnogTbY7MEMWhCF2rzzApYsDndjKaRBXXx'; // pragma: allowlist secret +const POSTHOG_HOST = 'https://us.i.posthog.com'; const SHUTDOWN_TIMEOUT_MS = 1500; let clientPromise: Promise | undefined; diff --git a/python/ktx-daemon/src/ktx_daemon/telemetry/emitter.py b/python/ktx-daemon/src/ktx_daemon/telemetry/emitter.py index c77acb75..2fc965f8 100644 --- a/python/ktx-daemon/src/ktx_daemon/telemetry/emitter.py +++ b/python/ktx-daemon/src/ktx_daemon/telemetry/emitter.py @@ -10,8 +10,11 @@ from collections.abc import Mapping from ktx_daemon.telemetry.events import build_telemetry_event from ktx_daemon.telemetry.identity import load_telemetry_identity -POSTHOG_PROJECT_API_KEY = "" -POSTHOG_HOST = "" +# PostHog public project ingestion key - safe to embed; capture-only, no read access. +POSTHOG_PROJECT_API_KEY = ( + "phc_xbvZpbu8ZNLnogTbY7MEMWhCF2rzzApYsDndjKaRBXXx" # pragma: allowlist secret +) +POSTHOG_HOST = "https://us.i.posthog.com" def _host(env: Mapping[str, str]) -> str: