Skip to content

feat(metrics): suggest a service and host health dashboard - #118081

Draft
turnipdabeets wants to merge 10 commits into
masterfrom
feat/metrics-python-runtime-dashboard
Draft

turnipdabeets wants to merge 10 commits into
masterfrom
feat/metrics-python-runtime-dashboard

Conversation

@turnipdabeets

@turnipdabeets turnipdabeets commented Oct 15, 2026 •

Copy link
Copy Markdown
Contributor

Problem

Teams that send process, host and runtime metrics from PostHog SDKs get no ready-made dashboard for them. The suggested-dashboards bank covers Node.js and Go runtimes through Prometheus client names, but nothing reads the OpenTelemetry process and system metrics that the SDKs are starting to send. These teams have to build CPU, memory, swap and GC charts by hand.

Changes

  • Teams that send OpenTelemetry process and system metrics can now be suggested a Service and host health dashboard.
  • Sections:
    • Right now: host CPU busy, memory available, total memory, memory pressure and swap used.
    • Is anything waiting?: context switches by process and type, and swap operations by host.
    • Which service?: CPU, CPU share of host, memory, memory share of host and threads, by service and instance.
    • Is it getting worse? · Python: CPython GC collections, collected objects, uncollectable objects and p95 GC duration.
    • Host detail: the host signals over time.
  • The panels copy an internal dashboard built from the Python SDK's runtime and host metrics, with OpenTelemetry semantic convention names (process.*, system.*, cpython.gc.*). Any SDK, or any app already sending OTel process and system metrics, fills the generic sections.
  • Each language runtime gets its own GC section, because OTel has no shared GC metric (cpython.gc.*, jvm.gc.duration, v8js.gc.duration, go.memory.gc.*, dotnet.gc.*). Python is the first. Panels without data are dropped when the dashboard is created, but section headers stay, so a team removes the runtime sections it doesn't use.
  • Host CPU busy is (1 - idle) * 100 from system.cpu.utilization, so it works whether an SDK reports per mode or per logical CPU.
  • Memory available is the sum of the system.memory.usage states minus used, the same formula the OTel host template uses, so it works on any OS. Memory pressure keeps the SDK's app.system.memory.pressure, because OTel has no pressure metric. On hosts that don't send it, those panels are dropped.
  • Instances are grouped by service.instance.id, the OTel resource attribute.
  • Every panel shows the last hour, with the interval on auto (1-minute buckets). SDKs sample every 10 seconds, so each bucket holds six samples. Fixed 15-second buckets would split them unevenly and make counter rates zigzag.
  • Bank templates can now hold text panels. Dashboard creation already turned them into text tiles; only the bank test required a query on every panel.
  • Service CPU and memory share of host add up all of a service's processes.
  • The Python SDK's runtime metrics (feat: add opt-in macOS runtime metrics posthog-python#1063, a draft) already send most of these OTel names as of 7bf13e6a. Two panels still need SDK changes:
    • Swap I/O by host reads system.paging.operations. The SDK still sends app.system.swap.io in bytes.
    • Memory available is the sum of system.memory.usage states minus used. The SDK sends only free and used, so it currently shows free memory. It also needs cached (inactive pages).

How did you test this code?

  • products/metrics/backend/tests/test_suggested_dashboards.py passes locally. Its parameterized bank test checks service-health: every query validates against MetricsQuery, every text panel has text, and nothing overlaps on the grid.
  • The template was exported from the internal dashboard's live tile definitions, so titles, thresholds, legends and layout match a dashboard that renders. Panels on unchanged metric names returned data from the SDK's demo. The renamed ones can't be checked until the SDK sends them.
  • Not checked: the sweep and matching against a live team's metric catalog, or how the created dashboard looks.
  • The local pre-commit hook couldn't run on the last commit because the flox environment failed to build a dev tool against the local macOS SDK. oxfmt --check and the pre-push checks passed.

Test rationale: The text-panel change updates the existing bank test rather than adding one, since that test is the only place that rejected text panels. The template itself is covered by the parameterized bank test.

Release status

  • This change is behind a feature flag and is not available to users

Docs update

None.

🤖 Agent context

Autonomy: Human-driven (agent-assisted)

Agent: Claude Code, Opus 5.5

  • Started as a Python-only runtime template. It became generic: OTel process and system panels, plus one GC section per runtime, copied from an internal dashboard that the SDK's author checked against his own.
  • The metric names were checked against the OpenTelemetry semantic conventions on main.
  • Searched for an open PR adding a process, host or runtime template to the bank and found none.
  • Opened as a draft because it depends on feat: add opt-in macOS runtime metrics posthog-python#1063.

🤖 Generated with Claude Code

Adds a curated bank template for the PostHog Python SDK runtime metrics: CPU, memory, threads and garbage collection.
@turnipdabeets turnipdabeets self-assigned this Oct 15, 2026
@trunk-io

trunk-io Bot commented Oct 15, 2026

Copy link
Copy Markdown

Merging to master in this repository is managed by Trunk.

  • To merge this pull request, check the box to the left or comment /trunk merge below.

After your PR is submitted to the merge queue, this comment will be automatically updated with its status. If the PR fails, failure details will also be posted here

@github-actions

github-actions Bot commented Oct 15, 2026 •

Copy link
Copy Markdown
Contributor

🤖 CI report

⚠️ Trunk lane — backend Python lane (py:product:metrics)

This PR is assigned to the backend Python lane (py:product:metrics). It runs backend Python tests and may merge in parallel with PRs in other lanes.

✅ Duplication (Python) — clean

New Python code duplication introduced by this branch. Fails at 70+ tokens in app code, or 150+ tokens when both copies live in test files. Advisory while the gate proves itself: extract a shared helper instead of copying.

✅ Duplication (TypeScript) — clean

New TypeScript code duplication introduced by this branch. Fails at 70+ tokens in app code, or 150+ tokens when both copies live in test files. Advisory while the gate proves itself: extract a shared helper instead of copying.

⚠️ Bundle size — 🔺 +7.3 KiB (+0.0%)

Uncompressed size of every built .js bundle, compared against the base branch.

Total: 76.74 MiB · 🔺 +7.3 KiB (+0.0%)

File Size Δ vs base
render-query/src/render-query/render-query.js 24.62 MiB 🔺 +4.2 KiB (+0.0%)
posthog-app/src/scenes/dashboard/dashboards/Dashboards.js 38.1 KiB 🔺 +1.1 KiB (+3.0%)

Posted automatically by build-bundle-size-report · uncompressed bytes from dist-report

✅ Eager graph — within budget

How much code each root ships on the eager path — downloaded and parsed before the surface is interactive. Measured from the esbuild output chunks (post-tree-shake, static imports only); lazy import() / React.lazy chunks are not counted.

Root Eager (shipped) Δ vs base Budget
entry (logged-out pages, app bootstrap)
src/index.tsx
1013.3 KiB · 24 files 🔺 +42 B (+0.0%) █████████░ 86.5% of 1.14 MiB
logged-out boot: index + App + bootApp (preloaded by every page, including /login)
src/index.tsx + src/scenes/App.tsx + src/scenes/bootApp.ts
2.88 MiB · 607 files 🔺 +240 B (+0.0%) █████████░ 94.9% of 3.03 MiB
authenticated shell (every logged-in page)
src/scenes/AuthenticatedShell.tsx
7.49 MiB · 2,543 files 🔺 +4.1 KiB (+0.1%) ██████████ 97.9% of 7.64 MiB
dashboard scene
src/scenes/dashboard/Dashboard.tsx
9.69 MiB · 3,630 files 🔺 +4.1 KiB (+0.0%) █████████░ 94.0% of 10.30 MiB
today home path
src/scenes/AuthenticatedShell.tsx + src/scenes/project-homepage/ProjectHomepage.tsx + src/scenes/project-homepage/today/TodayHome.tsx
7.87 MiB · 2,872 files 🔺 +4.1 KiB (+0.1%) ██████████ 99.7% of 7.89 MiB
events scene
src/scenes/activity/explore/EventsScene.tsx
9.26 MiB · 3,456 files 🔺 +4.1 KiB (+0.0%) █████████░ 93.8% of 9.88 MiB
replay detail scene
src/scenes/session-recordings/detail/SessionRecordingDetail.tsx
11.99 MiB · 4,300 files 🔺 +4.0 KiB (+0.0%) ████████░░ 79.6% of 15.05 MiB

🟢 node_modules/monaco-editor/ stays out of src/index.tsx
🟢 src/lib/components/ActivityLog/describers stays out of src/index.tsx
🟢 node_modules/@posthog/brand/dist/generated/hoggies/svg/ stays out of src/index.tsx
🟢 node_modules/@posthog/brand/dist/generated/hoggies/components/ stays out of src/index.tsx
🟢 node_modules/monaco-editor/ stays out of src/index.tsx + src/scenes/App.tsx + src/scenes/bootApp.ts
🟢 src/layout/navigation-3000/navigationLogic.tsx stays out of src/index.tsx + src/scenes/App.tsx + src/scenes/bootApp.ts
🟢 src/scenes/dashboard/dashboardLogic.tsx stays out of src/index.tsx + src/scenes/App.tsx + src/scenes/bootApp.ts
🟢 src/lib/lemon-ui/LemonMarkdown/ stays out of src/index.tsx + src/scenes/App.tsx + src/scenes/bootApp.ts
🟢 src/lib/components/RichContentEditor/ stays out of src/index.tsx + src/scenes/App.tsx + src/scenes/bootApp.ts
🟢 src/lib/components/CodeSnippet/ stays out of src/index.tsx + src/scenes/App.tsx + src/scenes/bootApp.ts
🟢 src/taxonomy/core-filter-definitions-by-group.json stays out of src/index.tsx + src/scenes/App.tsx + src/scenes/bootApp.ts
🟢 node_modules/zod/ stays out of src/index.tsx + src/scenes/App.tsx + src/scenes/bootApp.ts
🟢 src/scenes/billing/billingLogic.tsx stays out of src/index.tsx + src/scenes/App.tsx + src/scenes/bootApp.ts
🟢 src/lib/components/ProductEmptyState/productSetupPreloadLogic.ts stays out of src/index.tsx + src/scenes/App.tsx + src/scenes/bootApp.ts
🟢 node_modules/monaco-editor/ stays out of src/scenes/AuthenticatedShell.tsx
🟢 src/lib/components/ActivityLog/describers stays out of src/scenes/AuthenticatedShell.tsx
🟢 products/dashboards/frontend/widgets/previews/ stays out of src/scenes/AuthenticatedShell.tsx
🟢 src/scenes/session-recordings/player/sessionRecordingPlayerLogic.ts stays out of src/scenes/AuthenticatedShell.tsx
🟢 zod/v4/locales/de.js stays out of src/scenes/AuthenticatedShell.tsx
🟢 node_modules/@posthog/brand/dist/generated/hoggies/svg/ stays out of src/scenes/AuthenticatedShell.tsx
🟢 node_modules/@posthog/brand/dist/generated/hoggies/components/ stays out of src/scenes/AuthenticatedShell.tsx
🟢 src/scenes/session-recordings/playlist/SessionRecordingsPlaylist.tsx stays out of src/scenes/dashboard/Dashboard.tsx
🟢 src/scenes/web-analytics/tiles/WebAnalyticsTile.tsx stays out of src/scenes/dashboard/Dashboard.tsx
🟢 src/scenes/project-homepage/ai-first/AiFirstHomepage.tsx stays out of src/scenes/AuthenticatedShell.tsx + src/scenes/project-homepage/ProjectHomepage.tsx + src/scenes/project-homepage/today/TodayHome.tsx
🟢 src/scenes/project-homepage/today/TodayReportPage.tsx stays out of src/scenes/AuthenticatedShell.tsx + src/scenes/project-homepage/ProjectHomepage.tsx + src/scenes/project-homepage/today/TodayHome.tsx
🟢 src/queries/Query/Query.tsx stays out of src/scenes/AuthenticatedShell.tsx + src/scenes/project-homepage/ProjectHomepage.tsx + src/scenes/project-homepage/today/TodayHome.tsx
🟢 src/scenes/session-recordings/playlist/SessionRecordingsPlaylist.tsx stays out of src/scenes/activity/explore/EventsScene.tsx
🟢 src/scenes/web-analytics/tiles/WebAnalyticsTile.tsx stays out of src/scenes/activity/explore/EventsScene.tsx

Largest files eagerly shipped from src/index.tsx
Size File
126.8 KiB ../node_modules/.pnpm/[email protected][email protected]/node_modules/react-dom/cjs/react-dom.production.min.js
24.6 KiB ../node_modules/.pnpm/[email protected]/node_modules/buffer/index.js
6.3 KiB ../node_modules/.pnpm/[email protected]/node_modules/react/cjs/react.production.min.js
4.5 KiB ../node_modules/.pnpm/@[email protected]/node_modules/@jspm/core/nodelibs/browser/process.js
3.9 KiB ../node_modules/.pnpm/[email protected]/node_modules/scheduler/cjs/scheduler.production.min.js
1.4 KiB ../node_modules/.pnpm/[email protected]/node_modules/base64-js/index.js
1.3 KiB src/index.tsx
1.3 KiB src/RootErrorBoundary.tsx
912 B ../node_modules/.pnpm/[email protected]/node_modules/ieee754/index.js
904 B src/lib/utils/bootTiming.ts
Largest files eagerly shipped from src/index.tsx + src/scenes/App.tsx + src/scenes/bootApp.ts
Size File
319.8 KiB ../node_modules/.pnpm/[email protected]_@[email protected][email protected]/node_modules/posthog-js/dist/module.mjs
220.2 KiB ../node_modules/.pnpm/@[email protected][email protected][email protected][email protected]/node_modules/@posthog/icons/dist/posthog-icons.es.js
126.8 KiB ../node_modules/.pnpm/[email protected][email protected]/node_modules/react-dom/cjs/react-dom.production.min.js
105.9 KiB src/products.tsx
99.6 KiB src/lib/api.ts
69.0 KiB src/lib/lemon-ui/icons/icons.tsx
38.7 KiB ../node_modules/.pnpm/@[email protected][email protected][email protected][email protected]/node_modules/@dnd-kit/core/dist/core.esm.js
33.9 KiB ../node_modules/.pnpm/[email protected]_patch_hash=139b8d1f1304f9d9da452a9a1244c94ea679dbcb85687d8999563146879fb6f5_react@18.3.1/node_modules/kea/lib/index.cjs.js
28.9 KiB src/scenes/scenes.ts
27.9 KiB src/lib/constants.tsx
Largest files eagerly shipped from src/scenes/AuthenticatedShell.tsx
Size File
319.8 KiB ../node_modules/.pnpm/[email protected]_@[email protected][email protected]/node_modules/posthog-js/dist/module.mjs
281.1 KiB src/taxonomy/core-filter-definitions-by-group.json
220.2 KiB ../node_modules/.pnpm/@[email protected][email protected][email protected][email protected]/node_modules/@posthog/icons/dist/posthog-icons.es.js
185.5 KiB ../packages/quill/packages/quill/dist/index.js
153.7 KiB ../node_modules/.pnpm/[email protected]/node_modules/re2js/build/index.esm.js
139.9 KiB ../packages/quill/packages/primitives/dist/index.js
126.8 KiB ../node_modules/.pnpm/[email protected][email protected]/node_modules/react-dom/cjs/react-dom.production.min.js
105.9 KiB src/products.tsx
99.6 KiB src/lib/api.ts
93.3 KiB ../node_modules/.pnpm/[email protected]/node_modules/prosemirror-view/dist/index.js
Largest files eagerly shipped from src/scenes/dashboard/Dashboard.tsx
Size File
319.8 KiB ../node_modules/.pnpm/[email protected]_@[email protected][email protected]/node_modules/posthog-js/dist/module.mjs
281.1 KiB src/taxonomy/core-filter-definitions-by-group.json
220.2 KiB ../node_modules/.pnpm/@[email protected][email protected][email protected][email protected]/node_modules/@posthog/icons/dist/posthog-icons.es.js
185.5 KiB ../packages/quill/packages/quill/dist/index.js
181.9 KiB src/queries/validators.js
153.7 KiB ../node_modules/.pnpm/[email protected]/node_modules/re2js/build/index.esm.js
139.9 KiB ../packages/quill/packages/primitives/dist/index.js
126.8 KiB ../node_modules/.pnpm/[email protected][email protected]/node_modules/react-dom/cjs/react-dom.production.min.js
105.9 KiB src/products.tsx
99.6 KiB src/lib/api.ts
Largest files eagerly shipped from src/scenes/AuthenticatedShell.tsx + src/scenes/project-homepage/ProjectHomepage.tsx + src/scenes/project-homepage/today/TodayHome.tsx
Size File
319.8 KiB ../node_modules/.pnpm/[email protected]_@[email protected][email protected]/node_modules/posthog-js/dist/module.mjs
281.1 KiB src/taxonomy/core-filter-definitions-by-group.json
220.2 KiB ../node_modules/.pnpm/@[email protected][email protected][email protected][email protected]/node_modules/@posthog/icons/dist/posthog-icons.es.js
185.5 KiB ../packages/quill/packages/quill/dist/index.js
153.7 KiB ../node_modules/.pnpm/[email protected]/node_modules/re2js/build/index.esm.js
139.9 KiB ../packages/quill/packages/primitives/dist/index.js
126.8 KiB ../node_modules/.pnpm/[email protected][email protected]/node_modules/react-dom/cjs/react-dom.production.min.js
105.9 KiB src/products.tsx
99.6 KiB src/lib/api.ts
93.3 KiB ../node_modules/.pnpm/[email protected]/node_modules/prosemirror-view/dist/index.js
Largest files eagerly shipped from src/scenes/activity/explore/EventsScene.tsx
Size File
319.8 KiB ../node_modules/.pnpm/[email protected]_@[email protected][email protected]/node_modules/posthog-js/dist/module.mjs
281.1 KiB src/taxonomy/core-filter-definitions-by-group.json
220.2 KiB ../node_modules/.pnpm/@[email protected][email protected][email protected][email protected]/node_modules/@posthog/icons/dist/posthog-icons.es.js
185.5 KiB ../packages/quill/packages/quill/dist/index.js
181.9 KiB src/queries/validators.js
153.7 KiB ../node_modules/.pnpm/[email protected]/node_modules/re2js/build/index.esm.js
139.9 KiB ../packages/quill/packages/primitives/dist/index.js
126.8 KiB ../node_modules/.pnpm/[email protected][email protected]/node_modules/react-dom/cjs/react-dom.production.min.js
105.9 KiB src/products.tsx
99.6 KiB src/lib/api.ts
Largest files eagerly shipped from src/scenes/session-recordings/detail/SessionRecordingDetail.tsx
Size File
319.8 KiB ../node_modules/.pnpm/[email protected]_@[email protected][email protected]/node_modules/posthog-js/dist/module.mjs
316.0 KiB ../node_modules/.pnpm/[email protected]_@[email protected][email protected]/node_modules/posthog-js/dist/rrweb.js
281.1 KiB src/taxonomy/core-filter-definitions-by-group.json
220.2 KiB ../node_modules/.pnpm/@[email protected][email protected][email protected][email protected]/node_modules/@posthog/icons/dist/posthog-icons.es.js
185.5 KiB ../packages/quill/packages/quill/dist/index.js
181.9 KiB src/queries/validators.js
153.7 KiB ../node_modules/.pnpm/[email protected]/node_modules/re2js/build/index.esm.js
126.8 KiB ../node_modules/.pnpm/[email protected][email protected]/node_modules/react-dom/cjs/react-dom.production.min.js
105.9 KiB src/products.tsx
99.6 KiB src/lib/api.ts

Posted automatically by check-eager-graph · sizes are eager output bytes (shipped, post-tree-shake) from the esbuild metafile · part of #32479

✅ Toolbar bundle — eager 2.24 MiB within budget

What the toolbar ships to customer pages, measured from the esbuild output (minified, post-tree-shake). The eager set is the entry plus everything statically imported from it — fetched before any feature runs; deferred chunks load lazily. The eager guardrail is 5.72 MiB. Each output file must also stay below 10 MB, where CloudFront stops compressing it. The module boundary is enforced separately by check-toolbar-graph.

Metric Size Δ vs base Budget
Eager (shipped)
entry + static imports
2.24 MiB · 19 files 🔺 +240 B (+0.0%) ████░░░░░░ 39.1% of 5.72 MiB
Deferred (lazy) 2.10 MiB · 40 files no change n/a — loads on demand
Loader dist/toolbar.js 1.2 KiB no change █░░░░░░░░░ 6.0% of 19.5 KiB
Largest eagerly-shipped chunks
Size File
877.4 KiB dist/toolbar/toolbar-app-S3MAZA5Z.css
664.5 KiB dist/toolbar/chunk-chunk-WBANSWNU.js
257.8 KiB dist/toolbar/chunk-chunk-7ZYWOYNH.js
131.8 KiB dist/toolbar/chunk-chunk-FDH2IBXT.js
129.6 KiB dist/toolbar/chunk-chunk-KUQ3Z4XJ.js
74.8 KiB dist/toolbar/toolbar-app-JK46IGL3.js
69.0 KiB dist/toolbar/chunk-chunk-TSAL54PB.js
35.6 KiB dist/toolbar/chunk-chunk-SXI75RIZ.js
21.7 KiB dist/toolbar/chunk-chunk-5ZPGLKQZ.js
6.8 KiB dist/toolbar/chunk-chunk-DV7IWQNF.js

Posted automatically by check-toolbar-size · sizes are toolbar output bytes (shipped, post-tree-shake) from the esbuild metafile

✅ Dist folder size — 🔺 +174.8 KiB (+0.0%)

Total size of the built frontend/dist folder (all assets), compared against the base branch.

Total: 1017.79 MiB · 🔺 +174.8 KiB (+0.0%)

@posthog posthog Bot 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.

PostHog Review · Standard · reviewed fa8b9ba: 3 Should fix.

This is the only automatic review while this pull request is a draft. Comment @posthog review to review new changes sooner. Otherwise, a review of the new changes runs when you mark it ready for review.

{
"name": "a",
"metricName": "process.cpu.utilization",
"aggregation": "avg",

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.

P2 · Sum CPU utilization across service processes

When two processes of one service each consume 25% of the same host's CPU in one mode, this panel reports 25% instead of 50%. MetricQueryRunner applies avg across process series after selecting their latest samples, so adding workers hides the service's growing CPU consumption. Sum process utilization within each service and CPU mode.

{
"name": "a",
"metricName": "process.memory.utilization",
"aggregation": "max",

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.

P2 · Aggregate memory utilization across service processes

When a service runs multiple workers on one host, max selects only the largest worker's memory fraction. Two workers each using 20% therefore appear as 20%, despite the panel promising the service's share of host memory. MetricQueryRunner applies this maximum across series, not across time; sum the workers' fractions or explicitly label this as the largest process.

Comment on lines +194 to +201
"groupBy": [
{
"key": "service_name"
},
{
"key": "process.runtime_id"
}
]

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.

P2 · Bound the process cardinality of the default dashboard queries

With 250 continuously reporting Python processes over 24 hours, grouping by process.runtime_id produces about 12,000 bucket rows. MetricQueryRunner._raise_on_truncation rejects results at 10,000 rows, so all four per-process panels display errors on this deployment. Default these panels to service grouping or require a bounded process selection.

…ntime dashboard

The SDK samples runtime metrics every 10 seconds, and 15 seconds is the finest metrics interval.
15-second buckets split the SDK's 10-second samples unevenly, so counter rates zigzagged; auto picks 1-minute buckets for the last hour.
Dashboard creation already turns a template's text panels into text tiles; the bank test now checks those panels have text instead of requiring every panel to have a query.
Uses OpenTelemetry process metric names so any SDK fills it; CPython GC panels get their own section.
@turnipdabeets turnipdabeets changed the title feat(metrics): suggest a Python runtime dashboard feat(metrics): suggest a process metrics dashboard Oct 15, 2026
…oard

Adds the host sections and keeps the per-runtime GC section, with OpenTelemetry metric names.
@turnipdabeets turnipdabeets changed the title feat(metrics): suggest a process metrics dashboard feat(metrics): suggest a service and host health dashboard Oct 15, 2026
…states

Available is the sum of the system.memory.usage states minus used, so it works on any OS.
Matches the internal dashboard's tile with the OpenTelemetry metric.
CPU and memory share of host now add up a service's processes instead of averaging or taking the largest, and the Python section gains p95 GC duration.
@scheduled-actions-posthog

Copy link
Copy Markdown
Contributor

This PR hasn't seen activity in a week! Should it be merged, closed, or further worked on? If you want to keep it open, please remove the stale label – otherwise this will be closed in another week. If you want to permanently keep it open, use the waiting label.

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant