feat(data-warehouse): scaffold 4 newly-requested sources - #75901
Conversation
Scaffold Hyros, Odoo, Airbridge, and Snov.io as hidden stub sources (unreleasedSource=True) in response to the posthog.com source survey and in-product "Notify me" requests. Each source registers with a category, label, and icon but ships no sync logic yet. All four enum additions land in a single AlterField migration so the chain stays linear. Skipped the non-source survey entries (an admin platform, "knowledgebase", "integrations", "api-integrations") — none map to an identifiable SaaS data source. Generated-By: PostHog Code Task-Id: 8f2233ce-c683-44e0-b734-d240f2a0c0df
|
😎 This pull request was merged. |
|
Hey @Gilbert09! 👋 It looks like your git author email on this PR isn't your
You can fix it for this repo with: git config user.email "you@posthog.com"Or set it globally with |
🦔 Hogbox preview · ✅ ready▶ Open the preview
commit |
🤖 CI report
|
| File | Size | Δ vs base |
|---|---|---|
posthog-app/src/scenes/instance/QueryPerformance/QueryPerformance.js |
34.7 KiB | 🔺 +1.6 KiB (+4.9%) |
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 |
1.25 MiB · 22 files | no change | ███░░░░░░░ 27.7% of 4.51 MiB |
authenticated shell (every logged-in page)src/scenes/AuthenticatedShell.tsx |
8.12 MiB · 3,023 files | 🔺 +36 B (+0.0%) | ████████░░ 83.6% of 9.71 MiB |
🟢 node_modules/monaco-editor/ stays out of src/index.tsx
🟢 src/lib/components/ActivityLog/describers stays out of src/index.tsx
🟢 [object Object] stays out of src/index.tsx
🟢 [object Object] stays out of src/index.tsx
🟢 node_modules/monaco-editor/ stays out of src/scenes/AuthenticatedShell.tsx
🟢 src/lib/components/ActivityLog/describers stays out of src/scenes/AuthenticatedShell.tsx
🟢 [object Object] stays out of src/scenes/AuthenticatedShell.tsx
🟢 [object Object] stays out of src/scenes/AuthenticatedShell.tsx
Largest files eagerly shipped from src/index.tsx
| Size | File |
|---|---|
| 126.8 KiB | ../node_modules/.pnpm/react-dom@18.3.1_react@18.3.1/node_modules/react-dom/cjs/react-dom.production.min.js |
| 24.6 KiB | ../node_modules/.pnpm/buffer@6.0.3/node_modules/buffer/index.js |
| 6.3 KiB | ../node_modules/.pnpm/react@18.3.1/node_modules/react/cjs/react.production.min.js |
| 4.5 KiB | ../node_modules/.pnpm/@jspm+core@2.1.0/node_modules/@jspm/core/nodelibs/browser/process.js |
| 3.9 KiB | ../node_modules/.pnpm/scheduler@0.23.2/node_modules/scheduler/cjs/scheduler.production.min.js |
| 1.4 KiB | ../node_modules/.pnpm/base64-js@1.5.1/node_modules/base64-js/index.js |
| 1.3 KiB | src/RootErrorBoundary.tsx |
| 912 B | ../node_modules/.pnpm/ieee754@1.2.1/node_modules/ieee754/index.js |
| 789 B | src/scenes/ChunkLoadErrorBoundary.tsx |
| 762 B | src/index.tsx |
Largest files eagerly shipped from src/scenes/AuthenticatedShell.tsx
| Size | File |
|---|---|
| 285.3 KiB | ../node_modules/.pnpm/posthog-js@1.409.2/node_modules/posthog-js/dist/rrweb.js |
| 267.7 KiB | ../node_modules/.pnpm/@posthog+icons@0.38.0_react-dom@18.3.1_react@18.3.1__react@18.3.1/node_modules/@posthog/icons/dist/posthog-icons.es.js |
| 235.5 KiB | src/taxonomy/core-filter-definitions-by-group.json |
| 231.4 KiB | ../node_modules/.pnpm/posthog-js@1.409.2/node_modules/posthog-js/dist/module.js |
| 154.3 KiB | ../node_modules/.pnpm/re2js@0.4.1/node_modules/re2js/build/index.esm.js |
| 126.8 KiB | ../node_modules/.pnpm/react-dom@18.3.1_react@18.3.1/node_modules/react-dom/cjs/react-dom.production.min.js |
| 105.2 KiB | src/lib/api.ts |
| 94.7 KiB | ../packages/quill/packages/quill/dist/index.js |
| 93.3 KiB | ../node_modules/.pnpm/prosemirror-view@1.40.1/node_modules/prosemirror-view/dist/index.js |
| 90.6 KiB | ../node_modules/.pnpm/@tiptap+core@3.20.6_@tiptap+pm@3.20.6/node_modules/@tiptap/core/dist/index.js |
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.19 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.19 MiB · 17 files | no change | ████░░░░░░ 38.3% of 5.72 MiB |
| Deferred (lazy) | 2.08 MiB · 33 files | no change | n/a — loads on demand |
Loader dist/toolbar.js |
1.1 KiB | no change | █░░░░░░░░░ 5.8% of 19.5 KiB |
Largest eagerly-shipped chunks
| Size | File |
|---|---|
| 717.8 KiB | dist/toolbar/toolbar-app-2QFKEBT7.css |
| 551.1 KiB | dist/toolbar/chunk-chunk-5FDJUV5A.js |
| 484.6 KiB | dist/toolbar/chunk-chunk-QCKKTYHY.js |
| 133.6 KiB | dist/toolbar/chunk-chunk-UDBJ4EGL.js |
| 131.8 KiB | dist/toolbar/chunk-chunk-T5KY5WYR.js |
| 71.0 KiB | dist/toolbar/toolbar-app-DBANC7W5.js |
| 69.0 KiB | dist/toolbar/chunk-chunk-27JL52RE.js |
| 35.6 KiB | dist/toolbar/chunk-chunk-QFZQEUXB.js |
| 20.9 KiB | dist/toolbar/chunk-chunk-HWIVFWBZ.js |
| 12.2 KiB | dist/toolbar/chunk-chunk-PIK3PADE.js |
Posted automatically by check-toolbar-size · sizes are toolbar output bytes (shipped, post-tree-shake) from the esbuild metafile
✅ Dist folder size — 🔺 +65.0 KiB (+0.0%)
Total size of the built frontend/dist folder (all assets), compared against the base branch.
Total: 1371.06 MiB · 🔺 +65.0 KiB (+0.0%)
⚠️ Playwright — 1 flaky
🎭 Playwright report · View test results →
- Duplicating a dashboard preserves text cards, date filter, and variables (chromium)
These issues are not necessarily caused by your changes.
Annoyed by this section? Help fix flakies and failures and it will go green!
⚠️ Django migration SQL — 1 new migration to review
We've detected new migrations on this PR. Review the SQL output for each migration:
products/warehouse_sources/backend/migrations/0115_scaffold_four_requested_sources.py
BEGIN;
--
-- Alter field source_type on externaldatasource
--
-- (no-op)
--
-- Alter field source_type on pendingsourcecredential
--
-- (no-op)
COMMIT;Last updated: 2026-07-31 10:03 UTC (8a3dc89)
✅ Django migration risk — migration analysis complete
We've analyzed your migrations for potential risks.
Summary: 0 Safe | 1 Needs Review | 0 Blocked
⚠️ Needs Review
May have performance impact
warehouse_sources.0115_scaffold_four_requested_sources
└─ #1 ⚠️ AlterField
Field alteration may cause table locks or data loss (check if changing type or constraints)
model: externaldatasource, field: source_type, field_type: CharField
└─ #2 ⚠️ AlterField
Field alteration may cause table locks or data loss (check if changing type or constraints)
model: pendingsourcecredential, field: source_type, field_type: CharField
Last updated: 2026-07-31 10:03 UTC (8a3dc89)
fuziontech
left a comment
There was a problem hiding this comment.
Automated review agent on behalf of @fuziontech: approved. The four unreleased source scaffolds follow the existing registry/config pattern, keep the generated enums and migration state aligned, and include valid service icons. Focused source category/generated-config tests passed (2,581 tests), as did Ruff. I found no blocking issues.
Kea-typegen expands ExternalDataSourceType inline into the NewSourceScene logic type files. Adding the four new sources changes that union, so regenerate sourceCatalogLogic.ts and sourceWizardLogic.tsx to match — the frontend typecheck's "schema up to date" diff check requires it. Generated-By: PostHog Code Task-Id: 8f2233ce-c683-44e0-b734-d240f2a0c0df
Problem
Users asked for a handful of data-warehouse sources we don't have yet, via the posthog.com "which source do you want?" survey and the in-product "Notify me" button. This scaffolds the legitimate ones so they exist as connectors we can flesh out, and so future "Notify me" interest routes to a real source entry.
Changes
Scaffold four sources as hidden stubs (
unreleasedSource=True, so users don't see them yet — there's no sync logic behind them):Each one is the standard scaffold: an enum value in
ExternalDataSourceType+externalDataSources, a stubsource.py, a generated config, an icon from Logo.dev, and aSOURCES.mdentry. All four enum additions land in oneAlterFieldmigration (0115_scaffold_four_requested_sources) so the migration chain stays linear.Skipped the survey entries that aren't real, identifiable data sources: an internal admin platform, "knowledgebase", "integrations", and "api-integrations". Snov.io was requested twice ("snovio" and "snov.io") so it's scaffolded once.
How did you test this code?
Automated only (I'm an agent — no manual/live-API testing):
pnpm run generate:source-configsregenerates my four config modules with no drift.pnpm run schema:buildpicks up the new enum values.makemigrations --check --dry-runreports no pending changes and--merge --dry-runfinds no conflicts, confirming the single linear migration.unreleasedSource=True.test_source_categories.py,test_source_versions.py,test_generated_configs.py).ruff check/ruff formatclean;hogli ci:preflightreports 0 failures.Automatic notifications
Docs update
No docs yet — these are hidden stubs, not connectable sources. Docs come when the sync logic is implemented per the
/implementing-warehouse-sourcesskill.🤖 Agent context
Autonomy: Fully autonomous
Scaffolded by Claude following the
/implementing-warehouse-sourcesskill. Each requested survey name was first checked against the existingsources/tree, theExternalDataSourceTypeenum, and open PRs (including the maintainer's own) to rule out duplicates and in-flight work — none matched. Each candidate brand was verified via Logo.dev before scaffolding; entries with no brand/logo were treated as junk and skipped. Icons were pulled from Logo.dev (key not committed). Kept strictly to scaffolding: no sync logic, and theunreleasedSourceflag stays on every source.Created with PostHog Code