Skip to content

feat(ingestion): verify events captured with the secret API key#62888

Open
Gilbert09 wants to merge 10 commits into
masterfrom
tom/secret-key-verified-events
Open

feat(ingestion): verify events captured with the secret API key#62888
Gilbert09 wants to merge 10 commits into
masterfrom
tom/secret-key-verified-events

Conversation

@Gilbert09

Copy link
Copy Markdown
Member

Problem

Server-side SDKs authenticate capture with the public project API key (phc_), which is world-readable by design — so nothing distinguishes an event genuinely sent by trusted server infrastructure from one forged by anyone holding the public key. For workflows that act automatically on ingested events (e.g. error-tracking automations), we need a way to know an event came from a holder of a server-side secret.

An earlier approach signed individual $exception events with per-team Ed25519 keys (#62750, #62751, posthog-python#657). This PR supersedes that with a much simpler transport-level mechanism: send events with the project's secret API token (phs_, already used for flags local evaluation and the conversations API), and every event ingested that way is marked verified.

Changes

  • Ingestion (plugin-server): TeamManager now also resolves teams by secret_api_token and secret_api_token_backup (so token rotation keeps working), and the shared resolve-team step sets a server-controlled $verified: true property on events captured with a secret token. Any client-supplied $verified on public-token events is stripped, so the property cannot be forged. Covers the analytics, error-tracking, and heatmap pipelines; a counter metric tracks verified/stripped events.
  • Billing / quota limiting: the quota-limit Redis sets now include each team's secret tokens alongside the public token. Capture enforces quota by the raw request token, so without this a team switching to phs_ capture would bypass billing limits.
  • Feature flags service: /flags requests now accept a phs_ token as the api_key (reusing the existing cached secret-token validation used by /flag_definitions), so an SDK configured with the secret key keeps evaluating flags. Unknown phs_ tokens 401 without polluting the public-token negative cache.
  • Taxonomy: $verified registered as a boolean event property.

No SDK changes are required — server SDKs send api_key verbatim, so setting api_key="phs_..." works as-is. Capture already accepts phs_ tokens at the edge (format-only validation) and the token is not persisted to ClickHouse.

Everything is inert until a team generates a secret token (existing rotate endpoint) and points an SDK at it; teams with NULL secret tokens see byte-identical behaviour. No migrations — unique indexes on both secret-token columns already exist.

Notes for reviewers:

  • Overflow / per-(token, distinct_id) rate-limit buckets treat phc_ and phs_ as separate keys — accepted.
  • Token-dropper blocklists are exact-string config, so ops must list a team's phs_ token too to fully block a team.
  • Session replay intentionally keeps rejecting phs_ tokens (its team service is public-token-only; server SDKs don't do replay).

How did you test this code?

  • nodejs: new parameterized unit tests for applyVerifiedProperty and the resolve-team step (secret/backup/forged/no-properties/null-secret cases), team-manager integration tests for secret-token resolution and cache warming, and two end-to-end ingestion tests (phs_ capture lands in ClickHouse with $verified: true; forged $verified via phc_ is stripped). Full event-preprocessing and error-tracking pipeline suites pass.
  • ee/billing: parameterized pytest coverage over no-secret / primary-only / primary+backup token sets for update_org_billing_quotas, update_all_orgs_billing_quotas, and the token helpers; full test_quota_limiting.py suite passes (74 tests).
  • rust/feature-flags: integration tests for /flags authenticated with the primary and backup secret token (200 + flags evaluated) and an unknown phs_ token (401 with Django-compatible error body).

Automatic notifications

  • Publish to changelog?
  • Alert Sales and Marketing teams?

Docs update

Capture enforces quota limits by the raw ingestion token, so a team
sending events with its phs_ secret API token would bypass billing
limits keyed only on the public api_token. Write every ingestion token
(api_token, secret_api_token, secret_api_token_backup) to the
quota-limit and quota-limiting-suspended zsets; change detection stays
keyed on the always-present public token.
Events captured with a team's secret API token (phs_, primary or
backup) now resolve to the team during ingestion instead of being
dropped as invalid_token, and get a server-set $verified: true
property. $verified is server-controlled: any client-supplied value
on public-token events is stripped, so it cannot be forged. Applied
in the shared resolve-team step so both the analytics and
error-tracking pipelines (and the heatmap subpipeline) are covered.

Also registers $verified in the taxonomy so it renders in the UI.
… token

An SDK configured with the phs_ secret API token as its api_key (for
verified event capture) would otherwise lose feature flags: the team
metadata HyperCache and PG lookup are keyed by the public token only,
so phs_ tokens landed in the negative cache and 401'd. Branch on the
phs_ prefix and reuse the cached secret-token validation already used
by /flag_definitions, resolving the team via its public token (or by
id for legacy cache entries).
@Gilbert09 Gilbert09 self-assigned this Jun 11, 2026
@assign-reviewers-posthog assign-reviewers-posthog Bot requested review from a team June 11, 2026 10:13
@assign-reviewers-posthog

Copy link
Copy Markdown

👀 Auto-assigned reviewers

These soft owners were skipped because they only have minor changes here. Nothing blocks merge, so self-assign if you'd like a look:

  • @PostHog/team-product-analytics (posthog/taxonomy/)

Soft owners come from CODEOWNERS-soft and each product's product.yaml. Generated files and lockfiles are ignored when deciding ownership.

@github-actions

github-actions Bot commented Jun 11, 2026

Copy link
Copy Markdown
Contributor

Size Change: 0 B

Total Size: 72.9 MB

ℹ️ View Unchanged
Filename Size Change
frontend/dist-report/decompression-worker/src/scenes/session-recordings/player/snapshot-processing/decompressionWorker 2.85 kB 0 B
frontend/dist-report/exporter/_chunks/chunk 6.75 MB 0 B
frontend/dist-report/exporter/_parent/products/actions/frontend/pages/Action 24.2 kB 0 B
frontend/dist-report/exporter/_parent/products/actions/frontend/pages/Actions 1.95 kB 0 B
frontend/dist-report/exporter/_parent/products/ai_observability/frontend/AIObservabilityScene 117 kB 0 B
frontend/dist-report/exporter/_parent/products/ai_observability/frontend/AIObservabilitySessionScene 19.7 kB 0 B
frontend/dist-report/exporter/_parent/products/ai_observability/frontend/AIObservabilityTraceScene 129 kB 0 B
frontend/dist-report/exporter/_parent/products/ai_observability/frontend/AIObservabilityUsers 1.57 kB 0 B
frontend/dist-report/exporter/_parent/products/ai_observability/frontend/clusters/AIObservabilityClusterScene 21.7 kB 0 B
frontend/dist-report/exporter/_parent/products/ai_observability/frontend/clusters/AIObservabilityClustersScene 54.3 kB 0 B
frontend/dist-report/exporter/_parent/products/ai_observability/frontend/datasets/AIObservabilityDatasetScene 20.7 kB 0 B
frontend/dist-report/exporter/_parent/products/ai_observability/frontend/datasets/AIObservabilityDatasetsScene 4.17 kB 0 B
frontend/dist-report/exporter/_parent/products/ai_observability/frontend/evaluations/AIObservabilityEvaluation 59.6 kB 0 B
frontend/dist-report/exporter/_parent/products/ai_observability/frontend/evaluations/AIObservabilityEvaluationsScene 28.5 kB 0 B
frontend/dist-report/exporter/_parent/products/ai_observability/frontend/evaluations/EvaluationTemplates 671 B 0 B
frontend/dist-report/exporter/_parent/products/ai_observability/frontend/LLMASessionFeedbackDisplay 4.81 kB 0 B
frontend/dist-report/exporter/_parent/products/ai_observability/frontend/playground/AIObservabilityPlaygroundScene 37.7 kB 0 B
frontend/dist-report/exporter/_parent/products/ai_observability/frontend/prompts/LLMPromptScene 29.8 kB 0 B
frontend/dist-report/exporter/_parent/products/ai_observability/frontend/prompts/LLMPromptsScene 5.28 kB 0 B
frontend/dist-report/exporter/_parent/products/ai_observability/frontend/tags/AIObservabilityTag 28.4 kB 0 B
frontend/dist-report/exporter/_parent/products/ai_observability/frontend/tags/AIObservabilityTagsScene 8.15 kB 0 B
frontend/dist-report/exporter/_parent/products/business_knowledge/frontend/scenes/BusinessKnowledgeScene 21.1 kB 0 B
frontend/dist-report/exporter/_parent/products/conversations/frontend/components/Assignee/CyclotronJobInputAssignee 1.38 kB 0 B
frontend/dist-report/exporter/_parent/products/conversations/frontend/components/SlaBusinessHours/CyclotronJobInputBusinessHours 2.69 kB 0 B
frontend/dist-report/exporter/_parent/products/conversations/frontend/components/TicketTags/CyclotronJobInputTicketTags 783 B 0 B
frontend/dist-report/exporter/_parent/products/conversations/frontend/scenes/settings/SupportSettingsScene 2.51 kB 0 B
frontend/dist-report/exporter/_parent/products/conversations/frontend/scenes/ticket/SupportTicketScene 34 kB 0 B
frontend/dist-report/exporter/_parent/products/conversations/frontend/scenes/tickets/SupportTicketsScene 1.78 kB 0 B
frontend/dist-report/exporter/_parent/products/customer_analytics/frontend/CustomerAnalyticsScene 80.4 kB 0 B
frontend/dist-report/exporter/_parent/products/customer_analytics/frontend/scenes/CustomerAnalyticsConfigurationScene/CustomerAnalyticsConfigurationScene 3.28 kB 0 B
frontend/dist-report/exporter/_parent/products/customer_analytics/frontend/scenes/CustomerJourneyBuilderScene/CustomerJourneyBuilderScene 2.72 kB 0 B
frontend/dist-report/exporter/_parent/products/customer_analytics/frontend/scenes/CustomerJourneyTemplatesScene/CustomerJourneyTemplatesScene 8.2 kB 0 B
frontend/dist-report/exporter/_parent/products/data_warehouse/DataWarehouseScene 46.1 kB 0 B
frontend/dist-report/exporter/_parent/products/data_warehouse/frontend/scenes/NewSourceScene/NewSourceScene 1.86 kB 0 B
frontend/dist-report/exporter/_parent/products/data_warehouse/frontend/scenes/SchemaScene/SchemaScene 26.8 kB 0 B
frontend/dist-report/exporter/_parent/products/data_warehouse/frontend/scenes/SourceScene/SourceScene 1.8 kB 0 B
frontend/dist-report/exporter/_parent/products/data_warehouse/frontend/scenes/SourcesScene/SourcesScene 6.62 kB 0 B
frontend/dist-report/exporter/_parent/products/early_access_features/frontend/EarlyAccessFeature 1.73 kB 0 B
frontend/dist-report/exporter/_parent/products/early_access_features/frontend/EarlyAccessFeatures 3.79 kB 0 B
frontend/dist-report/exporter/_parent/products/endpoints/frontend/EndpointScene 43.9 kB 0 B
frontend/dist-report/exporter/_parent/products/endpoints/frontend/EndpointsScene 23.9 kB 0 B
frontend/dist-report/exporter/_parent/products/error_tracking/frontend/scenes/ErrorTrackingFingerprintsScene/ErrorTrackingIssueFingerprintsScene 7.68 kB 0 B
frontend/dist-report/exporter/_parent/products/error_tracking/frontend/scenes/ErrorTrackingIssueScene/ErrorTrackingIssueScene 96.7 kB 0 B
frontend/dist-report/exporter/_parent/products/error_tracking/frontend/scenes/ErrorTrackingScene/ErrorTrackingScene 35.2 kB 0 B
frontend/dist-report/exporter/_parent/products/feature_flags/frontend/FeatureFlagTemplatesScene 6.91 kB 0 B
frontend/dist-report/exporter/_parent/products/games/368Hedgehogs/368Hedgehogs 5.24 kB 0 B
frontend/dist-report/exporter/_parent/products/games/FlappyHog/FlappyHog 5.7 kB 0 B
frontend/dist-report/exporter/_parent/products/legal_documents/frontend/scenes/LegalDocumentNewScene 60.6 kB 0 B
frontend/dist-report/exporter/_parent/products/legal_documents/frontend/scenes/LegalDocumentsScene 6.81 kB 0 B
frontend/dist-report/exporter/_parent/products/links/frontend/LinkScene 25.6 kB 0 B
frontend/dist-report/exporter/_parent/products/links/frontend/LinksScene 4.89 kB 0 B
frontend/dist-report/exporter/_parent/products/live_debugger/frontend/LiveDebugger 19.7 kB 0 B
frontend/dist-report/exporter/_parent/products/logs/frontend/LogsScene 19 kB 0 B
frontend/dist-report/exporter/_parent/products/logs/frontend/scenes/LogsAlertDetailScene/LogsAlertDetailScene 17.9 kB 0 B
frontend/dist-report/exporter/_parent/products/logs/frontend/scenes/LogsAlertNotificationDetailScene/LogsAlertNotificationDetailScene 8.95 kB 0 B
frontend/dist-report/exporter/_parent/products/logs/frontend/scenes/LogsSamplingDetailScene/LogsSamplingDetailScene 5.76 kB 0 B
frontend/dist-report/exporter/_parent/products/logs/frontend/scenes/LogsSamplingNewScene/LogsSamplingNewScene 2.81 kB 0 B
frontend/dist-report/exporter/_parent/products/managed_migrations/frontend/ManagedMigration 15.3 kB 0 B
frontend/dist-report/exporter/_parent/products/mcp_analytics/frontend/MCPAnalyticsScene 78.4 kB 0 B
frontend/dist-report/exporter/_parent/products/mcp_analytics/frontend/MCPAnalyticsToolDetail 19 kB 0 B
frontend/dist-report/exporter/_parent/products/metrics/frontend/MetricsScene 16.1 kB 0 B
frontend/dist-report/exporter/_parent/products/product_analytics/frontend/insights/stickiness/StickinessBarChart/StickinessBarChart 3.77 kB 0 B
frontend/dist-report/exporter/_parent/products/product_analytics/frontend/insights/stickiness/StickinessLineChart/StickinessLineChart 3.65 kB 0 B
frontend/dist-report/exporter/_parent/products/product_analytics/frontend/insights/trends/TrendsBarChart/TrendsBarChart 9.29 kB 0 B
frontend/dist-report/exporter/_parent/products/product_analytics/frontend/insights/trends/TrendsLifecycleChart/TrendsLifecycleChart 5.48 kB 0 B
frontend/dist-report/exporter/_parent/products/product_analytics/frontend/insights/trends/TrendsLineChart/TrendsLineChart 5.11 kB 0 B
frontend/dist-report/exporter/_parent/products/product_analytics/frontend/insights/trends/TrendsPieChart/TrendsPieChart 4.87 kB 0 B
frontend/dist-report/exporter/_parent/products/replay_vision/frontend/observations/ReplayObservation 14.5 kB 0 B
frontend/dist-report/exporter/_parent/products/replay_vision/frontend/replay_scanners/ReplayScanner 21.7 kB 0 B
frontend/dist-report/exporter/_parent/products/replay_vision/frontend/replay_scanners/ReplayScannersScene 18.5 kB 0 B
frontend/dist-report/exporter/_parent/products/replay_vision/frontend/replay_scanners/ScannerEditorScene 24.9 kB 0 B
frontend/dist-report/exporter/_parent/products/revenue_analytics/frontend/revenueAnalyticsLogic 1.76 kB 0 B
frontend/dist-report/exporter/_parent/products/revenue_analytics/frontend/RevenueAnalyticsScene 26 kB 0 B
frontend/dist-report/exporter/_parent/products/session_summaries/frontend/SessionGroupSummariesTable 5.5 kB 0 B
frontend/dist-report/exporter/_parent/products/session_summaries/frontend/SessionGroupSummaryScene 19.5 kB 0 B
frontend/dist-report/exporter/_parent/products/skills/frontend/LLMSkillScene 1.6 kB 0 B
frontend/dist-report/exporter/_parent/products/skills/frontend/LLMSkillsScene 1.61 kB 0 B
frontend/dist-report/exporter/_parent/products/tasks/frontend/SlackTaskContextScene 9.43 kB 0 B
frontend/dist-report/exporter/_parent/products/tasks/frontend/TaskDetailScene 25.2 kB 0 B
frontend/dist-report/exporter/_parent/products/tasks/frontend/TaskTracker 14.6 kB 0 B
frontend/dist-report/exporter/_parent/products/tracing/frontend/TracingScene 78.4 kB 0 B
frontend/dist-report/exporter/_parent/products/user_interviews/frontend/UserInterview 10.8 kB 0 B
frontend/dist-report/exporter/_parent/products/user_interviews/frontend/UserInterviewResponse 8.18 kB 0 B
frontend/dist-report/exporter/_parent/products/user_interviews/frontend/UserInterviews 6.59 kB 0 B
frontend/dist-report/exporter/_parent/products/visual_review/frontend/scenes/VisualReviewIndexScene 3.14 kB 0 B
frontend/dist-report/exporter/_parent/products/visual_review/frontend/scenes/VisualReviewRunScene 46 kB 0 B
frontend/dist-report/exporter/_parent/products/visual_review/frontend/scenes/VisualReviewRunsScene 7.79 kB 0 B
frontend/dist-report/exporter/_parent/products/visual_review/frontend/scenes/VisualReviewSettingsScene 11.6 kB 0 B
frontend/dist-report/exporter/_parent/products/visual_review/frontend/scenes/VisualReviewSnapshotHistoryScene 14.4 kB 0 B
frontend/dist-report/exporter/_parent/products/visual_review/frontend/scenes/VisualReviewSnapshotOverviewScene 19.9 kB 0 B
frontend/dist-report/exporter/_parent/products/workflows/frontend/TemplateLibrary/MessageTemplate 17 kB 0 B
frontend/dist-report/exporter/_parent/products/workflows/frontend/Workflows/WorkflowScene 109 kB 0 B
frontend/dist-report/exporter/_parent/products/workflows/frontend/WorkflowsScene 59 kB 0 B
frontend/dist-report/exporter/src/exporter/exporter 42.8 kB 0 B
frontend/dist-report/exporter/src/exporter/scenes/ExporterDashboardScene 2.66 kB 0 B
frontend/dist-report/exporter/src/exporter/scenes/ExporterHeatmapScene 20.4 kB 0 B
frontend/dist-report/exporter/src/exporter/scenes/ExporterInsightScene 3.57 kB 0 B
frontend/dist-report/exporter/src/exporter/scenes/ExporterInterviewScene 310 kB 0 B
frontend/dist-report/exporter/src/exporter/scenes/ExporterNotebookScene 2.87 MB 0 B
frontend/dist-report/exporter/src/exporter/scenes/ExporterRecordingScene 1.82 kB 0 B
frontend/dist-report/exporter/src/exporterSharedChunkAnchors 1.26 kB 0 B
frontend/dist-report/exporter/src/lib/components/Cards/TextCard/TextCardMarkdownEditor 10.6 kB 0 B
frontend/dist-report/exporter/src/lib/components/MonacoDiffEditor 533 B 0 B
frontend/dist-report/exporter/src/lib/lemon-ui/LemonMarkdown/MermaidDiagram 2 kB 0 B
frontend/dist-report/exporter/src/lib/lemon-ui/LemonTextArea/LemonTextAreaMarkdown 790 B 0 B
frontend/dist-report/exporter/src/lib/lemon-ui/Link/Link 415 B 0 B
frontend/dist-report/exporter/src/lib/monaco/CodeEditor 448 B 0 B
frontend/dist-report/exporter/src/lib/monaco/CodeEditorImpl 26 kB 0 B
frontend/dist-report/exporter/src/lib/monaco/CodeEditorInline 649 B 0 B
frontend/dist-report/exporter/src/lib/monaco/vimMode 211 kB 0 B
frontend/dist-report/exporter/src/lib/ui/Button/ButtonPrimitives 479 B 0 B
frontend/dist-report/exporter/src/queries/nodes/WebVitals/WebVitals 7.9 kB 0 B
frontend/dist-report/exporter/src/queries/nodes/WebVitals/WebVitalsPathBreakdown 4.72 kB 0 B
frontend/dist-report/exporter/src/queries/Query/Query 1.51 kB 0 B
frontend/dist-report/exporter/src/queries/schema 900 kB 0 B
frontend/dist-report/exporter/src/scenes/approvals/changeRequestsLogic 622 B 0 B
frontend/dist-report/exporter/src/scenes/authentication/shared/passkeyLogic 602 B 0 B
frontend/dist-report/exporter/src/scenes/data-pipelines/event-filtering/EventFilterScene 22.5 kB 0 B
frontend/dist-report/exporter/src/scenes/data-pipelines/TransformationsScene 6.79 kB 0 B
frontend/dist-report/exporter/src/scenes/hog-functions/misc/Diff 1.35 kB 0 B
frontend/dist-report/exporter/src/scenes/insights/views/BoxPlot/BoxPlot 5.86 kB 0 B
frontend/dist-report/exporter/src/scenes/insights/views/CalendarHeatMap/CalendarHeatMap 9.15 kB 0 B
frontend/dist-report/exporter/src/scenes/insights/views/RegionMap/RegionMap 30.2 kB 0 B
frontend/dist-report/exporter/src/scenes/insights/views/WorldMap/WorldMap 1.04 MB 0 B
frontend/dist-report/exporter/src/scenes/models/ModelsScene 19.2 kB 0 B
frontend/dist-report/exporter/src/scenes/models/NodeDetailScene 17.3 kB 0 B
frontend/dist-report/monaco-editor-worker/src/lib/monaco/workers/monacoEditorWorker 288 kB 0 B
frontend/dist-report/monaco-json-worker/src/lib/monaco/workers/monacoJsonWorker 419 kB 0 B
frontend/dist-report/monaco-typescript-worker/src/lib/monaco/workers/monacoTsWorker 7.02 MB 0 B
frontend/dist-report/posthog-app/_chunks/chunk 6.68 MB 0 B
frontend/dist-report/posthog-app/_parent/products/actions/frontend/pages/Action 25 kB 0 B
frontend/dist-report/posthog-app/_parent/products/actions/frontend/pages/Actions 2.66 kB 0 B
frontend/dist-report/posthog-app/_parent/products/ai_observability/frontend/AIObservabilityScene 118 kB 0 B
frontend/dist-report/posthog-app/_parent/products/ai_observability/frontend/AIObservabilitySessionScene 20.4 kB 0 B
frontend/dist-report/posthog-app/_parent/products/ai_observability/frontend/AIObservabilityTraceScene 130 kB 0 B
frontend/dist-report/posthog-app/_parent/products/ai_observability/frontend/AIObservabilityUsers 2.25 kB 0 B
frontend/dist-report/posthog-app/_parent/products/ai_observability/frontend/clusters/AIObservabilityClusterScene 22.4 kB 0 B
frontend/dist-report/posthog-app/_parent/products/ai_observability/frontend/clusters/AIObservabilityClustersScene 55 kB 0 B
frontend/dist-report/posthog-app/_parent/products/ai_observability/frontend/datasets/AIObservabilityDatasetScene 21.5 kB 0 B
frontend/dist-report/posthog-app/_parent/products/ai_observability/frontend/datasets/AIObservabilityDatasetsScene 4.85 kB 0 B
frontend/dist-report/posthog-app/_parent/products/ai_observability/frontend/evaluations/AIObservabilityEvaluation 60.3 kB 0 B
frontend/dist-report/posthog-app/_parent/products/ai_observability/frontend/evaluations/AIObservabilityEvaluationsScene 29.2 kB 0 B
frontend/dist-report/posthog-app/_parent/products/ai_observability/frontend/evaluations/EvaluationTemplates 671 B 0 B
frontend/dist-report/posthog-app/_parent/products/ai_observability/frontend/LLMASessionFeedbackDisplay 4.82 kB 0 B
frontend/dist-report/posthog-app/_parent/products/ai_observability/frontend/playground/AIObservabilityPlaygroundScene 38.4 kB 0 B
frontend/dist-report/posthog-app/_parent/products/ai_observability/frontend/prompts/LLMPromptScene 30 kB 0 B
frontend/dist-report/posthog-app/_parent/products/ai_observability/frontend/prompts/LLMPromptsScene 5.96 kB 0 B
frontend/dist-report/posthog-app/_parent/products/ai_observability/frontend/tags/AIObservabilityTag 29.1 kB 0 B
frontend/dist-report/posthog-app/_parent/products/ai_observability/frontend/tags/AIObservabilityTagsScene 8.83 kB 0 B
frontend/dist-report/posthog-app/_parent/products/business_knowledge/frontend/scenes/BusinessKnowledgeScene 21.8 kB 0 B
frontend/dist-report/posthog-app/_parent/products/conversations/frontend/components/Assignee/CyclotronJobInputAssignee 1.38 kB 0 B
frontend/dist-report/posthog-app/_parent/products/conversations/frontend/components/SlaBusinessHours/CyclotronJobInputBusinessHours 2.7 kB 0 B
frontend/dist-report/posthog-app/_parent/products/conversations/frontend/components/TicketTags/CyclotronJobInputTicketTags 783 B 0 B
frontend/dist-report/posthog-app/_parent/products/conversations/frontend/scenes/settings/SupportSettingsScene 3.26 kB 0 B
frontend/dist-report/posthog-app/_parent/products/conversations/frontend/scenes/ticket/SupportTicketScene 27.1 kB 0 B
frontend/dist-report/posthog-app/_parent/products/conversations/frontend/scenes/tickets/SupportTicketsScene 2.46 kB 0 B
frontend/dist-report/posthog-app/_parent/products/customer_analytics/frontend/CustomerAnalyticsScene 80 kB 0 B
frontend/dist-report/posthog-app/_parent/products/customer_analytics/frontend/scenes/CustomerAnalyticsConfigurationScene/CustomerAnalyticsConfigurationScene 4.03 kB 0 B
frontend/dist-report/posthog-app/_parent/products/customer_analytics/frontend/scenes/CustomerJourneyBuilderScene/CustomerJourneyBuilderScene 3.4 kB 0 B
frontend/dist-report/posthog-app/_parent/products/customer_analytics/frontend/scenes/CustomerJourneyTemplatesScene/CustomerJourneyTemplatesScene 8.88 kB 0 B
frontend/dist-report/posthog-app/_parent/products/data_warehouse/DataWarehouseScene 3.16 kB 0 B
frontend/dist-report/posthog-app/_parent/products/data_warehouse/frontend/scenes/NewSourceScene/NewSourceScene 2.61 kB 0 B
frontend/dist-report/posthog-app/_parent/products/data_warehouse/frontend/scenes/SchemaScene/SchemaScene 27.5 kB 0 B
frontend/dist-report/posthog-app/_parent/products/data_warehouse/frontend/scenes/SourceScene/SourceScene 2.52 kB 0 B
frontend/dist-report/posthog-app/_parent/products/data_warehouse/frontend/scenes/SourcesScene/SourcesScene 7.3 kB 0 B
frontend/dist-report/posthog-app/_parent/products/early_access_features/frontend/EarlyAccessFeature 2.55 kB 0 B
frontend/dist-report/posthog-app/_parent/products/early_access_features/frontend/EarlyAccessFeatures 4.47 kB 0 B
frontend/dist-report/posthog-app/_parent/products/endpoints/frontend/EndpointScene 44.6 kB 0 B
frontend/dist-report/posthog-app/_parent/products/endpoints/frontend/EndpointsScene 22.5 kB 0 B
frontend/dist-report/posthog-app/_parent/products/error_tracking/frontend/scenes/ErrorTrackingFingerprintsScene/ErrorTrackingIssueFingerprintsScene 8.36 kB 0 B
frontend/dist-report/posthog-app/_parent/products/error_tracking/frontend/scenes/ErrorTrackingIssueScene/ErrorTrackingIssueScene 96.5 kB 0 B
frontend/dist-report/posthog-app/_parent/products/error_tracking/frontend/scenes/ErrorTrackingScene/ErrorTrackingScene 36 kB 0 B
frontend/dist-report/posthog-app/_parent/products/feature_flags/frontend/FeatureFlagTemplatesScene 6.91 kB 0 B
frontend/dist-report/posthog-app/_parent/products/games/368Hedgehogs/368Hedgehogs 5.24 kB 0 B
frontend/dist-report/posthog-app/_parent/products/games/FlappyHog/FlappyHog 5.7 kB 0 B
frontend/dist-report/posthog-app/_parent/products/legal_documents/frontend/scenes/LegalDocumentNewScene 61.3 kB 0 B
frontend/dist-report/posthog-app/_parent/products/legal_documents/frontend/scenes/LegalDocumentsScene 7.5 kB 0 B
frontend/dist-report/posthog-app/_parent/products/links/frontend/LinkScene 26.2 kB 0 B
frontend/dist-report/posthog-app/_parent/products/links/frontend/LinksScene 5.58 kB 0 B
frontend/dist-report/posthog-app/_parent/products/live_debugger/frontend/LiveDebugger 20.4 kB 0 B
frontend/dist-report/posthog-app/_parent/products/logs/frontend/LogsScene 18.8 kB 0 B
frontend/dist-report/posthog-app/_parent/products/logs/frontend/scenes/LogsAlertDetailScene/LogsAlertDetailScene 18.6 kB 0 B
frontend/dist-report/posthog-app/_parent/products/logs/frontend/scenes/LogsAlertNotificationDetailScene/LogsAlertNotificationDetailScene 9.64 kB 0 B
frontend/dist-report/posthog-app/_parent/products/logs/frontend/scenes/LogsSamplingDetailScene/LogsSamplingDetailScene 6.45 kB 0 B
frontend/dist-report/posthog-app/_parent/products/logs/frontend/scenes/LogsSamplingNewScene/LogsSamplingNewScene 3.49 kB 0 B
frontend/dist-report/posthog-app/_parent/products/managed_migrations/frontend/ManagedMigration 16 kB 0 B
frontend/dist-report/posthog-app/_parent/products/mcp_analytics/frontend/MCPAnalyticsScene 79.1 kB 0 B
frontend/dist-report/posthog-app/_parent/products/mcp_analytics/frontend/MCPAnalyticsToolDetail 19.7 kB 0 B
frontend/dist-report/posthog-app/_parent/products/metrics/frontend/MetricsScene 16.8 kB 0 B
frontend/dist-report/posthog-app/_parent/products/product_analytics/frontend/insights/stickiness/StickinessBarChart/StickinessBarChart 4.45 kB 0 B
frontend/dist-report/posthog-app/_parent/products/product_analytics/frontend/insights/stickiness/StickinessLineChart/StickinessLineChart 4.33 kB 0 B
frontend/dist-report/posthog-app/_parent/products/product_analytics/frontend/insights/trends/TrendsBarChart/TrendsBarChart 9.97 kB 0 B
frontend/dist-report/posthog-app/_parent/products/product_analytics/frontend/insights/trends/TrendsLifecycleChart/TrendsLifecycleChart 6.16 kB 0 B
frontend/dist-report/posthog-app/_parent/products/product_analytics/frontend/insights/trends/TrendsLineChart/TrendsLineChart 5.79 kB 0 B
frontend/dist-report/posthog-app/_parent/products/product_analytics/frontend/insights/trends/TrendsPieChart/TrendsPieChart 5.55 kB 0 B
frontend/dist-report/posthog-app/_parent/products/replay_vision/frontend/observations/ReplayObservation 15.2 kB 0 B
frontend/dist-report/posthog-app/_parent/products/replay_vision/frontend/replay_scanners/ReplayScanner 22.4 kB 0 B
frontend/dist-report/posthog-app/_parent/products/replay_vision/frontend/replay_scanners/ReplayScannersScene 19.1 kB 0 B
frontend/dist-report/posthog-app/_parent/products/replay_vision/frontend/replay_scanners/ScannerEditorScene 25.6 kB 0 B
frontend/dist-report/posthog-app/_parent/products/revenue_analytics/frontend/revenueAnalyticsLogic 2.44 kB 0 B
frontend/dist-report/posthog-app/_parent/products/revenue_analytics/frontend/RevenueAnalyticsScene 26.8 kB 0 B
frontend/dist-report/posthog-app/_parent/products/session_summaries/frontend/SessionGroupSummariesTable 6.18 kB 0 B
frontend/dist-report/posthog-app/_parent/products/session_summaries/frontend/SessionGroupSummaryScene 20.2 kB 0 B
frontend/dist-report/posthog-app/_parent/products/skills/frontend/LLMSkillScene 2.28 kB 0 B
frontend/dist-report/posthog-app/_parent/products/skills/frontend/LLMSkillsScene 2.29 kB 0 B
frontend/dist-report/posthog-app/_parent/products/tasks/frontend/SlackTaskContextScene 10.1 kB 0 B
frontend/dist-report/posthog-app/_parent/products/tasks/frontend/TaskDetailScene 25.9 kB 0 B
frontend/dist-report/posthog-app/_parent/products/tasks/frontend/TaskTracker 15.3 kB 0 B
frontend/dist-report/posthog-app/_parent/products/tracing/frontend/TracingScene 79.1 kB 0 B
frontend/dist-report/posthog-app/_parent/products/user_interviews/frontend/UserInterview 10.9 kB 0 B
frontend/dist-report/posthog-app/_parent/products/user_interviews/frontend/UserInterviewResponse 8.86 kB 0 B
frontend/dist-report/posthog-app/_parent/products/user_interviews/frontend/UserInterviews 7.28 kB 0 B
frontend/dist-report/posthog-app/_parent/products/visual_review/frontend/scenes/VisualReviewIndexScene 3.82 kB 0 B
frontend/dist-report/posthog-app/_parent/products/visual_review/frontend/scenes/VisualReviewRunScene 46.6 kB 0 B
frontend/dist-report/posthog-app/_parent/products/visual_review/frontend/scenes/VisualReviewRunsScene 8.47 kB 0 B
frontend/dist-report/posthog-app/_parent/products/visual_review/frontend/scenes/VisualReviewSettingsScene 12.3 kB 0 B
frontend/dist-report/posthog-app/_parent/products/visual_review/frontend/scenes/VisualReviewSnapshotHistoryScene 15 kB 0 B
frontend/dist-report/posthog-app/_parent/products/visual_review/frontend/scenes/VisualReviewSnapshotOverviewScene 20.6 kB 0 B
frontend/dist-report/posthog-app/_parent/products/workflows/frontend/TemplateLibrary/MessageTemplate 17.7 kB 0 B
frontend/dist-report/posthog-app/_parent/products/workflows/frontend/Workflows/WorkflowScene 103 kB 0 B
frontend/dist-report/posthog-app/_parent/products/workflows/frontend/WorkflowsScene 59.8 kB 0 B
frontend/dist-report/posthog-app/src/index 61.4 kB 0 B
frontend/dist-report/posthog-app/src/layout/panel-layout/ai-first/tabs/NavTabChat 8.39 kB 0 B
frontend/dist-report/posthog-app/src/lib/components/AppShortcuts/utils/DebugCHQueriesImpl 19.2 kB 0 B
frontend/dist-report/posthog-app/src/lib/components/Cards/TextCard/TextCardMarkdownEditor 10.6 kB 0 B
frontend/dist-report/posthog-app/src/lib/components/MonacoDiffEditor 533 B 0 B
frontend/dist-report/posthog-app/src/lib/lemon-ui/LemonMarkdown/MermaidDiagram 2 kB 0 B
frontend/dist-report/posthog-app/src/lib/lemon-ui/LemonTextArea/LemonTextAreaMarkdown 790 B 0 B
frontend/dist-report/posthog-app/src/lib/lemon-ui/Link/Link 415 B 0 B
frontend/dist-report/posthog-app/src/lib/monaco/CodeEditor 448 B 0 B
frontend/dist-report/posthog-app/src/lib/monaco/CodeEditorImpl 26 kB 0 B
frontend/dist-report/posthog-app/src/lib/monaco/CodeEditorInline 649 B 0 B
frontend/dist-report/posthog-app/src/lib/monaco/vimMode 211 kB 0 B
frontend/dist-report/posthog-app/src/lib/ui/Button/ButtonPrimitives 482 B 0 B
frontend/dist-report/posthog-app/src/queries/nodes/WebVitals/WebVitals 8.59 kB 0 B
frontend/dist-report/posthog-app/src/queries/nodes/WebVitals/WebVitalsPathBreakdown 5.4 kB 0 B
frontend/dist-report/posthog-app/src/queries/Query/Query 2.19 kB 0 B
frontend/dist-report/posthog-app/src/queries/schema 900 kB 0 B
frontend/dist-report/posthog-app/src/scenes/activity/explore/EventsScene 4.34 kB 0 B
frontend/dist-report/posthog-app/src/scenes/activity/explore/SessionsScene 5.69 kB 0 B
frontend/dist-report/posthog-app/src/scenes/activity/live/LiveEventsTable 6.73 kB 0 B
frontend/dist-report/posthog-app/src/scenes/agentic/AgenticAuthorize 5.51 kB 0 B
frontend/dist-report/posthog-app/src/scenes/approvals/ApprovalDetail 17.9 kB 0 B
frontend/dist-report/posthog-app/src/scenes/approvals/changeRequestsLogic 622 B 0 B
frontend/dist-report/posthog-app/src/scenes/audit-logs/AdvancedActivityLogsScene 43.2 kB 0 B
frontend/dist-report/posthog-app/src/scenes/AuthenticatedShell 211 kB 0 B
frontend/dist-report/posthog-app/src/scenes/authentication/account/AccountConnected 3.04 kB 0 B
frontend/dist-report/posthog-app/src/scenes/authentication/account/AgenticAccountMismatch 2.43 kB 0 B
frontend/dist-report/posthog-app/src/scenes/authentication/account/credential-review/CredentialReview 5 kB 0 B
frontend/dist-report/posthog-app/src/scenes/authentication/cli/CLIAuthorize 11.3 kB 0 B
frontend/dist-report/posthog-app/src/scenes/authentication/cli/CLILive 4.05 kB 0 B
frontend/dist-report/posthog-app/src/scenes/authentication/email-mfa-verify/EmailMFAVerify 3.04 kB 0 B
frontend/dist-report/posthog-app/src/scenes/authentication/invite-signup/InviteSignup 1.3 kB 0 B
frontend/dist-report/posthog-app/src/scenes/authentication/login-2fa/Login2FA 4.74 kB 0 B
frontend/dist-report/posthog-app/src/scenes/authentication/login/Login 1.31 kB 0 B
frontend/dist-report/posthog-app/src/scenes/authentication/password-reset/PasswordReset 4.47 kB 0 B
frontend/dist-report/posthog-app/src/scenes/authentication/password-reset/PasswordResetComplete 3.03 kB 0 B
frontend/dist-report/posthog-app/src/scenes/authentication/shared/passkeyLogic 602 B 0 B
frontend/dist-report/posthog-app/src/scenes/authentication/signup/SignupContainer 1.28 kB 0 B
frontend/dist-report/posthog-app/src/scenes/authentication/two-factor-reset/TwoFactorReset 4.04 kB 0 B
frontend/dist-report/posthog-app/src/scenes/authentication/vercel/VercelConnect 5.03 kB 0 B
frontend/dist-report/posthog-app/src/scenes/authentication/vercel/VercelLinkError 2.3 kB 0 B
frontend/dist-report/posthog-app/src/scenes/authentication/verify-email/VerifyEmail 4.79 kB 0 B
frontend/dist-report/posthog-app/src/scenes/billing/AuthorizationStatus 768 B 0 B
frontend/dist-report/posthog-app/src/scenes/billing/Billing 717 B 0 B
frontend/dist-report/posthog-app/src/scenes/billing/BillingSection 22 kB 0 B
frontend/dist-report/posthog-app/src/scenes/cohorts/Cohort 29.8 kB 0 B
frontend/dist-report/posthog-app/src/scenes/cohorts/CohortCalculationHistory 7.87 kB 0 B
frontend/dist-report/posthog-app/src/scenes/cohorts/Cohorts 10.7 kB 0 B
frontend/dist-report/posthog-app/src/scenes/coupons/Coupons 895 B 0 B
frontend/dist-report/posthog-app/src/scenes/dashboard/Dashboard 3.07 kB 0 B
frontend/dist-report/posthog-app/src/scenes/dashboard/dashboards/Dashboards 20.5 kB 0 B
frontend/dist-report/posthog-app/src/scenes/dashboard/dashboards/templates/DashboardTemplateCopyScene 7.33 kB 0 B
frontend/dist-report/posthog-app/src/scenes/data-management/DataManagementScene 2.37 kB 0 B
frontend/dist-report/posthog-app/src/scenes/data-management/definition/DefinitionEdit 19 kB 0 B
frontend/dist-report/posthog-app/src/scenes/data-management/definition/DefinitionView 27.1 kB 0 B
frontend/dist-report/posthog-app/src/scenes/data-management/MaterializedColumns/MaterializedColumns 13.1 kB 0 B
frontend/dist-report/posthog-app/src/scenes/data-management/variables/SqlVariableEditScene 8.8 kB 0 B
frontend/dist-report/posthog-app/src/scenes/data-pipelines/batch-exports/BatchExportScene 66.6 kB 0 B
frontend/dist-report/posthog-app/src/scenes/data-pipelines/DataPipelinesNewScene 4.01 kB 0 B
frontend/dist-report/posthog-app/src/scenes/data-pipelines/DestinationsScene 4.34 kB 0 B
frontend/dist-report/posthog-app/src/scenes/data-pipelines/event-filtering/EventFilterScene 23.2 kB 0 B
frontend/dist-report/posthog-app/src/scenes/data-pipelines/legacy-plugins/LegacyPluginScene 22 kB 0 B
frontend/dist-report/posthog-app/src/scenes/data-pipelines/TransformationsScene 3.56 kB 0 B
frontend/dist-report/posthog-app/src/scenes/data-pipelines/WebScriptsScene 4.21 kB 0 B
frontend/dist-report/posthog-app/src/scenes/data-warehouse/DataWarehouseScene 3.14 kB 0 B
frontend/dist-report/posthog-app/src/scenes/data-warehouse/editor/EditorScene 3.05 kB 0 B
frontend/dist-report/posthog-app/src/scenes/debug/DebugScene 21.1 kB 0 B
frontend/dist-report/posthog-app/src/scenes/debug/hog/HogRepl 9.01 kB 0 B
frontend/dist-report/posthog-app/src/scenes/experiments/Experiment 211 kB 0 B
frontend/dist-report/posthog-app/src/scenes/experiments/Experiments 22.3 kB 0 B
frontend/dist-report/posthog-app/src/scenes/experiments/SharedMetrics/SharedMetric 7.6 kB 0 B
frontend/dist-report/posthog-app/src/scenes/experiments/SharedMetrics/SharedMetrics 2.28 kB 0 B
frontend/dist-report/posthog-app/src/scenes/exports/ExportsScene 5.64 kB 0 B
frontend/dist-report/posthog-app/src/scenes/feature-flags/FeatureFlag 110 kB 0 B
frontend/dist-report/posthog-app/src/scenes/feature-flags/FeatureFlags 2.48 kB 0 B
frontend/dist-report/posthog-app/src/scenes/groups/Group 16.4 kB 0 B
frontend/dist-report/posthog-app/src/scenes/groups/Groups 5.32 kB 0 B
frontend/dist-report/posthog-app/src/scenes/groups/GroupsNew 8.92 kB 0 B
frontend/dist-report/posthog-app/src/scenes/health-alerts/HealthAlertsScene 5.44 kB 0 B
frontend/dist-report/posthog-app/src/scenes/health/categoryDetail/HealthCategoryDetailScene 8.87 kB 0 B
frontend/dist-report/posthog-app/src/scenes/health/HealthScene 12.8 kB 0 B
frontend/dist-report/posthog-app/src/scenes/health/pipelineStatus/PipelineStatusScene 12.6 kB 0 B
frontend/dist-report/posthog-app/src/scenes/heatmaps/scenes/heatmap/HeatmapNewScene 6.58 kB 0 B
frontend/dist-report/posthog-app/src/scenes/heatmaps/scenes/heatmap/HeatmapRecordingScene 5.56 kB 0 B
frontend/dist-report/posthog-app/src/scenes/heatmaps/scenes/heatmap/HeatmapScene 8.13 kB 0 B
frontend/dist-report/posthog-app/src/scenes/heatmaps/scenes/heatmaps/HeatmapsScene 5.46 kB 0 B
frontend/dist-report/posthog-app/src/scenes/hog-functions/HogFunctionScene 56.2 kB 0 B
frontend/dist-report/posthog-app/src/scenes/hog-functions/misc/Diff 1.39 kB 0 B
frontend/dist-report/posthog-app/src/scenes/inbox/InboxScene 64.1 kB 0 B
frontend/dist-report/posthog-app/src/scenes/insights/InsightQuickStart/InsightQuickStart 7.06 kB 0 B
frontend/dist-report/posthog-app/src/scenes/insights/InsightScene 35.7 kB 0 B
frontend/dist-report/posthog-app/src/scenes/insights/views/BoxPlot/BoxPlot 6.54 kB 0 B
frontend/dist-report/posthog-app/src/scenes/insights/views/CalendarHeatMap/CalendarHeatMap 9.84 kB 0 B
frontend/dist-report/posthog-app/src/scenes/insights/views/RegionMap/RegionMap 30.9 kB 0 B
frontend/dist-report/posthog-app/src/scenes/insights/views/WorldMap/WorldMap 6.21 kB 0 B
frontend/dist-report/posthog-app/src/scenes/instance/AsyncMigrations/AsyncMigrations 14.5 kB 0 B
frontend/dist-report/posthog-app/src/scenes/instance/DeadLetterQueue/DeadLetterQueue 6.98 kB 0 B
frontend/dist-report/posthog-app/src/scenes/instance/QueryPerformance/QueryPerformance 10.2 kB 0 B
frontend/dist-report/posthog-app/src/scenes/instance/SystemStatus/SystemStatus 18.3 kB 0 B
frontend/dist-report/posthog-app/src/scenes/IntegrationsRedirect/IntegrationsRedirect 853 B 0 B
frontend/dist-report/posthog-app/src/scenes/marketing-analytics/MarketingAnalyticsScene 42.4 kB 0 B
frontend/dist-report/posthog-app/src/scenes/max/Max 2.42 kB 0 B
frontend/dist-report/posthog-app/src/scenes/models/ModelsScene 19.9 kB 0 B
frontend/dist-report/posthog-app/src/scenes/models/NodeDetailScene 17.9 kB 0 B
frontend/dist-report/posthog-app/src/scenes/moveToPostHogCloud/MoveToPostHogCloud 4.5 kB 0 B
frontend/dist-report/posthog-app/src/scenes/new-tab/NewTabScene 3.2 kB 0 B
frontend/dist-report/posthog-app/src/scenes/notebooks/NotebookCanvasScene 5.36 kB 0 B
frontend/dist-report/posthog-app/src/scenes/notebooks/NotebookPanel/NotebookPanel 7.3 kB 0 B
frontend/dist-report/posthog-app/src/scenes/notebooks/NotebookScene 10.6 kB 0 B
frontend/dist-report/posthog-app/src/scenes/notebooks/NotebooksScene 8.99 kB 0 B
frontend/dist-report/posthog-app/src/scenes/oauth/OAuthAuthorize 810 B 0 B
frontend/dist-report/posthog-app/src/scenes/onboarding/coupon/OnboardingCouponRedemption 1.34 kB 0 B
frontend/dist-report/posthog-app/src/scenes/onboarding/Onboarding 791 kB 0 B
frontend/dist-report/posthog-app/src/scenes/onboarding/sdks/SdkHealthScene 9.4 kB 0 B
frontend/dist-report/posthog-app/src/scenes/organization/ConfirmOrganization/ConfirmOrganization 4.5 kB 0 B
frontend/dist-report/posthog-app/src/scenes/organization/Create/Create 703 B 0 B
frontend/dist-report/posthog-app/src/scenes/organization/Deactivated 1.17 kB 0 B
frontend/dist-report/posthog-app/src/scenes/organization/PendingDeletion 2.2 kB 0 B
frontend/dist-report/posthog-app/src/scenes/persons/PersonScene 21.3 kB 0 B
frontend/dist-report/posthog-app/src/scenes/persons/PersonsScene 7.06 kB 0 B
frontend/dist-report/posthog-app/src/scenes/PreflightCheck/PreflightCheck 5.57 kB 0 B
frontend/dist-report/posthog-app/src/scenes/product-tours/ProductTour 268 kB 0 B
frontend/dist-report/posthog-app/src/scenes/product-tours/ProductTours 6.28 kB 0 B
frontend/dist-report/posthog-app/src/scenes/project-homepage/ProjectHomepage 20.1 kB 0 B
frontend/dist-report/posthog-app/src/scenes/project/Create/Create 895 B 0 B
frontend/dist-report/posthog-app/src/scenes/project/PendingDeletion 2.53 kB 0 B
frontend/dist-report/posthog-app/src/scenes/resource-transfer/ResourceTransfer 10.8 kB 0 B
frontend/dist-report/posthog-app/src/scenes/saved-insights/SavedInsights 2.39 kB 0 B
frontend/dist-report/posthog-app/src/scenes/session-recordings/detail/SessionRecordingDetail 3.41 kB 0 B
frontend/dist-report/posthog-app/src/scenes/session-recordings/file-playback/SessionRecordingFilePlaybackScene 6.03 kB 0 B
frontend/dist-report/posthog-app/src/scenes/session-recordings/kiosk/SessionRecordingsKiosk 11.5 kB 0 B
frontend/dist-report/posthog-app/src/scenes/session-recordings/player/snapshot-processing/DecompressionWorkerManager 323 B 0 B
frontend/dist-report/posthog-app/src/scenes/session-recordings/playlist/SessionRecordingsPlaylistScene 6.48 kB 0 B
frontend/dist-report/posthog-app/src/scenes/session-recordings/SessionRecordings 2.41 kB 0 B
frontend/dist-report/posthog-app/src/scenes/session-recordings/settings/SessionRecordingsSettingsScene 3.57 kB 0 B
frontend/dist-report/posthog-app/src/scenes/sessions/SessionProfileScene 16.6 kB 0 B
frontend/dist-report/posthog-app/src/scenes/settings/SettingsScene 5.32 kB 0 B
frontend/dist-report/posthog-app/src/scenes/sites/Site 1.57 kB 0 B
frontend/dist-report/posthog-app/src/scenes/startups/StartupProgram 21.1 kB 0 B
frontend/dist-report/posthog-app/src/scenes/StripeConfirmInstall/StripeConfirmInstall 3.6 kB 0 B
frontend/dist-report/posthog-app/src/scenes/subscriptions/SubscriptionScene 17.9 kB 0 B
frontend/dist-report/posthog-app/src/scenes/subscriptions/SubscriptionsScene 6.92 kB 0 B
frontend/dist-report/posthog-app/src/scenes/surveys/forms/SurveyFormBuilder 3.22 kB 0 B
frontend/dist-report/posthog-app/src/scenes/surveys/Survey 2.75 kB 0 B
frontend/dist-report/posthog-app/src/scenes/surveys/Surveys 27.4 kB 0 B
frontend/dist-report/posthog-app/src/scenes/surveys/wizard/SurveyWizard 73.1 kB 0 B
frontend/dist-report/posthog-app/src/scenes/themes/CustomCssScene 5.21 kB 0 B
frontend/dist-report/posthog-app/src/scenes/toolbar-launch/ToolbarLaunch 4.09 kB 0 B
frontend/dist-report/posthog-app/src/scenes/Unsubscribe/Unsubscribe 1.71 kB 0 B
frontend/dist-report/posthog-app/src/scenes/web-analytics/SessionAttributionExplorer/SessionAttributionExplorerScene 8.13 kB 0 B
frontend/dist-report/posthog-app/src/scenes/web-analytics/WebAnalyticsScene 16 kB 0 B
frontend/dist-report/posthog-app/src/scenes/wizard/Wizard 4.45 kB 0 B
frontend/dist-report/posthog-app/src/sharedChunkAnchors 1.33 kB 0 B
frontend/dist-report/render-query/src/render-query/render-query 27.5 MB +362 B (0%)
frontend/dist-report/toolbar/src/toolbar/toolbar 10.5 MB +362 B (0%)

compressed-size-action

@greptile-apps

greptile-apps Bot commented Jun 11, 2026

Copy link
Copy Markdown
Contributor

Reviews (1): Last reviewed commit: "feat(flags): authenticate /flags request..." | Re-trigger Greptile

Comment thread rust/feature-flags/src/handler/authentication.rs
@veria-ai

veria-ai Bot commented Jun 11, 2026

Copy link
Copy Markdown

PR overview

All previously flagged issues have been addressed. No open security concerns remain on this pull request.

Security review

No open security issues remain on this pull request.

Fixed/addressed: 1 · PR risk: 0/10

/flags now accepts a phs_ secret token as api_key, so the decoded request
body can carry one. The body logger recorded the decoded body verbatim for
opted-in teams, which would let a log reader recover the secret. Redact
phs_-prefixed tokens before logging; public phc_ tokens are world-readable
by design and left intact.

Generated-By: PostHog Code
Task-Id: c79724ba-e6b2-4100-ab76-9e05351b46bf
Generated-By: PostHog Code
Task-Id: c79724ba-e6b2-4100-ab76-9e05351b46bf
Generated-By: PostHog Code
Task-Id: c79724ba-e6b2-4100-ab76-9e05351b46bf
…date

The MaxMind GeoLite2 DB now returns postal code 44192 (was 44199) for the
test IP, breaking the inline snapshots in the geoip transformation tests.
Refresh the expected values; same maintenance pattern as the previous
GeoIP snapshot update. Unrelated to the secret-token feature, but the
tests run in this PR's Node.js shard.

Generated-By: PostHog Code
Task-Id: c79724ba-e6b2-4100-ab76-9e05351b46bf
Generated-By: PostHog Code
Task-Id: c79724ba-e6b2-4100-ab76-9e05351b46bf

@pawel-cebula pawel-cebula left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

FYI I mostly reviewed the quota-limiting part

Comment thread ee/billing/quota_limiting.py
The scheduled quota refresh already writes every ingestion token (public +
secret) to Redis, but the manual limit/unlimit and token-change paths did not,
so they could drift from the quota contract this PR introduces.

- Route `Organization.limit_product_until_end_of_billing_cycle` /
  `unlimit_product` through `get_team_ingestion_tokens` so secret tokens are
  limited/unlimited alongside the public token.
- Add `sync_team_quota_limited_tokens`, a shared helper that re-points a team's
  active quota limits onto its current ingestion tokens, and call it from the
  public token reset and the secret token rotation/backup-deletion paths. This
  closes the gap where a newly rotated token could ingest freely until the next
  scheduled refresh.

Generated-By: PostHog Code
Task-Id: a7bc377f-4621-42b8-846e-fdbec703e2b7
Generated-By: PostHog Code
Task-Id: a7bc377f-4621-42b8-846e-fdbec703e2b7
@pawel-cebula pawel-cebula self-requested a review June 12, 2026 11:34

@pawel-cebula pawel-cebula left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Looks good from quota limiting side, thx for addressing the suggestions.

@github-project-automation github-project-automation Bot moved this from In Review to Approved in Feature Flags Jun 12, 2026
@haacked haacked removed this from Feature Flags Jun 15, 2026
@haacked

haacked commented Jun 16, 2026

Copy link
Copy Markdown
Contributor

Sorry, just noticed this. Will take a look from the feature flags side.

@haacked haacked left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Looks good from the feature flags side. Just some non-blocking suggestions.

if (row.secret_api_token) {
resultRecord[row.secret_api_token] = team
}
if (row.secret_api_token_backup) {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

question: This resolves teams by the backup secret token for ingestion, and Rust /flags resolves the backup too, but Django's get_team_from_cache_or_secret_api_token still matches only secret_api_token, not the backup. After rotate_secret_token_and_save promotes the old primary into the backup slot, that token keeps authenticating ingestion and /flags but stops working anywhere the Django resolver feeds (local flag eval, conversations API).

Is the backup deliberately unsupported on the Django path, the way session replay deliberately rejects phs_? If so, a one-line comment on that method would stop the next person filing it as a bug. If not, it's a follow-up.

if (sentWithSecretToken) {
event.properties = { ...(event.properties ?? {}), $verified: true }
verifiedPropertyCounter.labels({ action: 'verified' }).inc()
} else if (event.properties && '$verified' in event.properties) {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

suggestion: This strips a client-supplied $verified from public-token events, including teams that never generated a secret token, so the description's "byte-identical behaviour" for NULL-secret teams isn't quite accurate. $-prefixed keys are only a naming convention, not reserved (the SDKs pass them through), so a client could have sent $verified before this PR.

The real-world impact looks nil though: a sampled scan of prod (~13B events over 3 days) plus an unsampled 30-minute window both found zero events carrying $verified. So not a migration concern, just naming hygiene: worth a short changelog / docs note that $verified is now reserved and server-controlled so a future sender doesn't expect it to pass through.

// body can carry one. Redact it before logging — a body-log reader must
// never be able to recover a secret token.
let decoded_body = String::from_utf8_lossy(truncated);
let request_body = redact_secret_tokens(&decoded_body);

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

suggestion: redact_secret_tokens has unit tests, but nothing sends a phs_ body through log_response and asserts the emitted line doesn't contain the raw token. This call is the only thing keeping a secret token out of the body log (the leak @veria-ai flagged); if it were ever dropped, every existing test still passes. log_response_emits_event_for_opted_in_team just above already feeds a phc_abc body and asserts it appears, so add the negative twin: a phs_ body, asserting the captured line is redacted and the raw token is absent.

it('a secret-token lookup also warms the cache for the public token, backup token and id', async () => {
const newTeamId = await createTeam(postgres, organizationId, 'phc_warmcache', {
secret_api_token: 'phs_warmcache',
secret_api_token_backup: 'phs_warmcache_backup',

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

suggestion: The tests cover resolving by both secret columns and the cache warm-through, but none asserts that after a rotation the old phs_ token stops resolving. A stale-cache bug there would let a rotated-out secret keep authenticating until the TTL expires. Mirror the warm-cache test right here: rotate secret_api_token, re-fetch, and assert the old token returns null while the new one resolves.

write_pipe = redis_client.pipeline()
has_writes = False
for index, zset_key in enumerate(zset_keys):
token_scores = raw_scores[index * len(known_tokens) : (index + 1) * len(known_tokens)]

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

suggestion: This pairs the pipeline results to zsets by index arithmetic: the build loop queues one zscore per (zset, token), and the read re-chunks the flat result with raw_scores[index * len(known_tokens) : (index + 1) * len(known_tokens)]. If anyone later queues another command on score_pipe, reorders the loops, or appends a token mid-list, the slice window shifts and existing_score silently reads another zset's results, with no error raised.

Computing the slices once next to the build loop keeps the two in lockstep:

raw_scores = score_pipe.execute()
scores_by_zset = {
    zset_key: raw_scores[i * len(known_tokens) : (i + 1) * len(known_tokens)]
    for i, zset_key in enumerate(zset_keys)
}

@Piccirello

Copy link
Copy Markdown
Member

🔒 Security review notes (via Claude)

I reviewed this PR against its core invariant — $verified: true should appear iff the event was captured with the team's secret token. The event-property path is solid: capture forwards the raw client token, every producer into the events table routes through createResolveTeamStepapplyVerifiedProperty, and forged top-level $verified is stripped. Two things worth addressing:

1. $verified is still forgeable via $set / $set_once (Medium)

applyVerifiedProperty (nodejs/src/ingestion/event-preprocessing/resolve-team.ts) only strips the top-level event.properties['$verified']. It does not touch event.properties['$set']['$verified'] or $set_once.

A holder of the world-readable phc_ key can send:

{ "event": "...", "properties": { "$set": { "$verified": true } } }

This sets a person property $verified = true that is never stripped and is sticky across events. Under person-on-events, person.properties.$verified is queryable on the events table, so an automation (or an author using the blended event/person property filter UI) could key off it. The taxonomy entry added here says "Cannot be set by clients" — that holds only for the event property, not the person-property namespace.

Suggested fix: on the non-secret-token branch, also delete $verified from $set and $set_once (and for consistency on the secret-token branch too), with a parameterized test covering the $set/$set_once forgery case.

2. ProjectSecretAPIKeys authenticate /flags with no scope check (Low)

In rust/feature-flags/src/handler/authentication.rs, validate_secret_api_token also resolves ProjectSecret tokens and the is_project_secret flag is discarded, so any valid PSAK for the project can evaluate flags regardless of its scopes. This matches the existing /flag_definitions precedent and flag eval is project-scoped + read-only, so impact is limited — but it's a silent widening of what a PSAK grants.

Suggested fix: if PSAK scopes are meant to gate flag reads, enforce a feature_flag:read scope check when the token is a PSAK; otherwise document that flag evaluation is ungated for PSAKs.


Automated security review by Claude. Worth a human sanity-check before relying on $verified in automations.

@eli-r-ph

eli-r-ph commented Jun 19, 2026

Copy link
Copy Markdown
Contributor

👋 hey folks

Billing / quota limiting: the quota-limit Redis sets now include each team's secret tokens alongside the public token. Capture enforces quota by the raw request token, so without this a team switching to phs_ capture would bypass billing limits.

Looks like this isn't an immediate blocker to this PR (no capture change yet) but FYI:

Just to confirm - at the moment no capture-rs services touch the database (we save team resolution etc. for the ingestion workers on the other side of the initial Kafka topic) to ensure we don't lose data during DB incidents or slow down the pipeline with DB calls. We do check billing quotas from Redis in capture, and drop a substantial amount of events/second on this (without linking graphs, about 16k/sec as of this hour in prod US alone) so we probably need a story for this before the e2e ships.

If we opt to move quota checks entirely downstream, we will ship those events (and future ones...sometimes this can really spike) into the topic just to drop them downstream. Not a hard blocker, but something to consider

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.

5 participants