Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
60 commits
Select commit Hold shift + click to select a range
b11bcca
feat(canvas): build and securely deliver cloud artifacts
k11kirky Aug 3, 2026
b9d2753
refactor(canvas): promote canvases and channels to first-class models
k11kirky Aug 3, 2026
aa524a4
refactor(canvas): simplify-pass cleanups on the remodel
k11kirky Aug 3, 2026
7cf14b1
feat(canvas): version history endpoint and versioned source reads
k11kirky Aug 3, 2026
c2e27c7
test(canvas): cover OAuth bearer access to the canvases API
k11kirky Aug 3, 2026
129e7b6
fix(canvas): name the cause when the local builder can't run
k11kirky Aug 3, 2026
7b82223
docs(canvas): prefer building on a matching canvas over minting dupli…
k11kirky Aug 3, 2026
86dd8fb
fix(canvas): bind sandbox-created canvases to their task and unblock …
k11kirky Aug 3, 2026
beec519
fix(canvas): serve artifacts with CORS so the sandboxed iframe can lo…
k11kirky Aug 3, 2026
24beafc
fix(canvas): point the image build and CI at the moved builder package
k11kirky Aug 3, 2026
3c99f71
chore(canvas): commit the lint and typegen artifacts CI asked for
k11kirky Aug 3, 2026
dc05aa9
chore(canvas): apply ruff format to the files this PR touched
k11kirky Aug 3, 2026
d70317f
fix(canvas): publish the canvas OAuth scopes and refresh MCP snapshots
k11kirky Aug 3, 2026
6f382f5
fix(canvas): clear the ten mypy errors in the new canvas code
k11kirky Aug 3, 2026
52f404d
chore(canvas): renumber the drop-desktop-file-system migration onto m…
k11kirky Aug 3, 2026
879f899
fix(canvas): review follow-ups — visibility, build-lifecycle races, m…
k11kirky Aug 3, 2026
6c328f8
fix(canvas): harden artifact and channel boundaries
k11kirky Aug 3, 2026
bfd3533
fix(canvas): keep private canvases out of HogQL
k11kirky Aug 3, 2026
573b060
fix(canvas): split product interface boundaries
k11kirky Aug 3, 2026
47afd17
fix(canvas): separate route and task interfaces
k11kirky Aug 3, 2026
71a47fb
fix(canvas): cover team-scoped models in IDOR checks
k11kirky Aug 3, 2026
d697966
fix(canvas): expose artifact delivery through product boundary
k11kirky Aug 3, 2026
8b62c0e
fix(canvas): acknowledge legacy presentation imports
k11kirky Aug 3, 2026
f5484d3
chore: update OpenAPI generated types
k11kirky Aug 3, 2026
e149304
chore: update OpenAPI generated types
k11kirky Aug 3, 2026
dcbb43c
fix(canvas): make migrations deployment-safe
k11kirky Aug 3, 2026
3b667cc
test(backend): update query snapshots
k11kirky Aug 3, 2026
c148718
fix(tasks): use explicit channel visibility lookups
k11kirky Aug 3, 2026
fcb4e72
fix(canvas): bound pinned artifact retention
k11kirky Aug 3, 2026
1cdf5fa
fix(canvas): prepare product test dependencies
k11kirky Aug 3, 2026
dba6784
fix(canvas): style and reload built artifacts
k11kirky Aug 3, 2026
d6ac965
fix(canvas): harden build delivery and access controls
k11kirky Aug 3, 2026
2665b93
fix(canvas): expose channel filter to MCP clients
k11kirky Aug 3, 2026
046361b
test(mcp): update unit test snapshots
k11kirky Aug 3, 2026
cb93265
fix(canvas): close build pipeline reliability gaps
k11kirky Aug 3, 2026
7dbb2bf
fix(tasks): keep channel metadata out of HogQL
k11kirky Aug 3, 2026
359a208
chore(canvas): format builder artifacts
k11kirky Aug 3, 2026
d787cf9
fix(canvas): expose sandbox failures through facade
k11kirky Aug 3, 2026
870187a
fix(canvas): rebase migration and generated severity type
k11kirky Aug 3, 2026
6835989
chore: update OpenAPI generated types
k11kirky Aug 3, 2026
6d22fb9
chore: update OpenAPI generated types
k11kirky Aug 3, 2026
2e41ac3
test(mcp): refresh canvas tool schema snapshots
k11kirky Aug 3, 2026
a01e8ec
fix(canvas): align lifecycle responses and API tests
k11kirky Aug 3, 2026
e2ae2db
chore(ci): align canvas builder Node setup
k11kirky Aug 3, 2026
46f2e4d
test(backend): update query snapshots
k11kirky Aug 3, 2026
979ec79
fix(tasks): preserve context output contracts
k11kirky Aug 3, 2026
a1b5634
fix(tasks): document channel instructions patch route
k11kirky Aug 3, 2026
533d9fe
chore: update OpenAPI generated types
k11kirky Aug 3, 2026
7a20255
fix(canvas): update renamed task migration dependency
k11kirky Aug 3, 2026
5bef83f
refactor(canvas): apply simplify-pass cleanups
k11kirky Aug 3, 2026
17e9a66
finish tasks migration renumber
k11kirky Aug 3, 2026
2ee267a
drop leftover desktop file system methods
k11kirky Aug 3, 2026
a22b632
scope channel visibility reads to team
k11kirky Aug 3, 2026
3bc44f0
silence semgrep on cross-team build sweep
k11kirky Aug 3, 2026
600261b
chore: update OpenAPI generated types
k11kirky Aug 3, 2026
e8956b9
chore(visual): update storybook baselines
k11kirky Aug 3, 2026
61b6aaa
chore: update OpenAPI generated types
k11kirky Aug 3, 2026
18e2114
fix(canvas): satisfy current repository checks
k11kirky Aug 3, 2026
2b05d3a
chore: update OpenAPI generated types
k11kirky Aug 3, 2026
f7e0e03
fix(canvas): harden artifact delivery boundaries
k11kirky Aug 3, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions .depot/workflows/ci-backend.yml
Original file line number Diff line number Diff line change
Expand Up @@ -1675,6 +1675,10 @@ jobs:
shell: bash
run: |
UV_PROJECT_ENVIRONMENT=$pythonLocation uv sync --frozen --dev
- name: Install canvas builder dependencies
if: ${{ needs.changes.outputs.backend == 'true' && matrix.segment == 'Core' }}
shell: bash
run: npm ci --ignore-scripts --omit=dev --prefix products/canvas/packages/canvas_builder
- name: Install the working version of hogql-parser
if: ${{ needs.changes.outputs.backend == 'true' && steps.hogql-parser-diff.outputs.changed == 'true' }}
shell: bash
Expand Down
1 change: 1 addition & 0 deletions .dockerignore
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
!.devcontainer
!.kearc
!bin
!common/alerting
!common/hogvm
!common/esbuilder
!common/migration_utils
Expand Down
15 changes: 15 additions & 0 deletions .github/workflows/ci-backend.yml
Original file line number Diff line number Diff line change
Expand Up @@ -161,6 +161,7 @@ jobs:
# widening or fixing the script doesn't trigger
# tests it controls.
- 'products/*/package.json'
- 'products/canvas/packages/canvas_builder/**'
- bin/build-schema-latest-versions.py
- bin/build-taxonomy-json.py
- bin/check_uv_python_compatibility.py
Expand Down Expand Up @@ -2624,6 +2625,20 @@ jobs:
run: |
UV_PROJECT_ENVIRONMENT=$pythonLocation uv sync --frozen --dev

- name: Set up Node.js for canvas builder
if: ${{ needs.changes.outputs.backend == 'true' && matrix.segment == 'Core' && hashFiles('products/canvas/packages/canvas_builder/package.json') != '' }}
uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 # v6.2.0
with:
node-version-file: .nvmrc

- name: Install canvas builder dependencies
if: ${{ needs.changes.outputs.backend == 'true' && matrix.segment == 'Core' }}
shell: bash
run: |
if [[ -f products/canvas/packages/canvas_builder/package.json ]]; then
npm ci --ignore-scripts --omit=dev --prefix products/canvas/packages/canvas_builder
fi

- name: Install the working version of hogql-parser
if: ${{ needs.changes.outputs.backend == 'true' && steps.hogql-parser-diff.outputs.changed == 'true' }}
shell: bash
Expand Down
12 changes: 12 additions & 0 deletions .semgrep/rules/security/idor-team-scoped-models.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -85,7 +85,13 @@ rules:
|BatchImport
|BriefConfig
|ButtonTile
|Canvas
|CanvasBuild
|CanvasSourceVersion
|ChangeRequest
|ChannelContextGeneration
|ChannelInstructions
|ChannelStar
|ClusteringConfig
|ClusteringJob
|Cohort
Expand Down Expand Up @@ -422,7 +428,13 @@ rules:
|BatchImport
|BriefConfig
|ButtonTile
|Canvas
|CanvasBuild
|CanvasSourceVersion
|ChangeRequest
|ChannelContextGeneration
|ChannelInstructions
|ChannelStar
|ClusteringConfig
|ClusteringJob
|Cohort
Expand Down
5 changes: 5 additions & 0 deletions Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -74,7 +74,7 @@
# curl -LsSf "https://github.com/PostHog/posthog/releases/download/posthog-cli%2Fv<X.Y.Z>/posthog-cli-installer.sh" | sha256sum
ARG POSTHOG_CLI_VERSION=0.7.22
ARG POSTHOG_CLI_INSTALLER_SHA256=9bfeafcfb6f3acd2d15e3fad267b3c22b26d6aa0a28497e3f1a214f143f66219
RUN --mount=type=secret,id=posthog_upload_sourcemaps_cli_api_key \

Check warning on line 77 in Dockerfile

View workflow job for this annotation

GitHub Actions / Lint changed Dockerfiles

Pin versions in apt get install. Instead of `apt-get install <package>` use `apt-get install <package>=<version>`
if ( \
[ -f /run/secrets/posthog_upload_sourcemaps_cli_api_key ] && \
apt-get update && \
Expand Down Expand Up @@ -119,11 +119,15 @@
NODE_OPTIONS="--max-old-space-size=4096" CI=1 pnpm --filter=@posthog/plugin-transpiler... install --frozen-lockfile --store-dir /tmp/pnpm-store-v24 && \
NODE_OPTIONS="--max-old-space-size=4096" bin/turbo --filter=@posthog/plugin-transpiler build

COPY products/canvas/packages/canvas_builder/ products/canvas/packages/canvas_builder/
RUN --mount=type=cache,id=npm,target=/root/.npm \
npm ci --ignore-scripts --omit=dev --prefix products/canvas/packages/canvas_builder

# The transpiler bundle externalizes @babel/standalone (its only external runtime require — a
# self-contained 24MB package with no deps). Materialize it as real files inside the transpiler's
# own node_modules, replacing the pnpm symlink that pointed into the root node_modules. The final
# image then carries just this package instead of the entire ~469MB root /code/node_modules.
RUN cd /code/common/plugin_transpiler && \

Check warning on line 130 in Dockerfile

View workflow job for this annotation

GitHub Actions / Lint changed Dockerfiles

Use WORKDIR to switch to a directory
BABEL_REAL=$(node -e "process.stdout.write(require('path').dirname(require.resolve('@babel/standalone/package.json')))") && \
rm -rf node_modules/@babel/standalone && \
mkdir -p node_modules/@babel && \
Expand All @@ -147,7 +151,7 @@
ENV UV_PROJECT_ENVIRONMENT=/python-runtime

# Install build dependencies
RUN apt-get update && \

Check warning on line 154 in Dockerfile

View workflow job for this annotation

GitHub Actions / Lint changed Dockerfiles

Pin versions in apt get install. Instead of `apt-get install <package>` use `apt-get install <package>=<version>`
apt-get install -y --no-install-recommends \
"build-essential" \
"git" \
Expand Down Expand Up @@ -222,7 +226,7 @@
SHELL ["/bin/bash", "-e", "-o", "pipefail", "-c"]

# Fetch the GeoLite2-City database that will be used for IP geolocation within Django.
RUN apt-get update && \

Check warning on line 229 in Dockerfile

View workflow job for this annotation

GitHub Actions / Lint changed Dockerfiles

Pin versions in apt get install. Instead of `apt-get install <package>` use `apt-get install <package>=<version>`
apt-get install -y --no-install-recommends \
"ca-certificates" \
"curl" \
Expand Down Expand Up @@ -251,7 +255,7 @@
ARG UNIT_GIT_REF=28404105810f53c570523c3e70006ad0ca210e58

# Build Unit from the upstream 1.35.0 release ref to ensure the Django 5 ASGI fix is present even when Docker tags lag.
RUN apt-get update && \

Check warning on line 258 in Dockerfile

View workflow job for this annotation

GitHub Actions / Lint changed Dockerfiles

Pin versions in apt get install. Instead of `apt-get install <package>` use `apt-get install <package>=<version>`

Check warning on line 258 in Dockerfile

View workflow job for this annotation

GitHub Actions / Lint changed Dockerfiles

Use WORKDIR to switch to a directory
apt-get install -y --no-install-recommends \
"build-essential" \
"git" \
Expand Down Expand Up @@ -292,7 +296,7 @@
# Runtime-only shared libs: lxml/xmlsec are compiled --no-binary in the build stage (which keeps
# its own -dev headers), so the final image needs the runtime .so, not the -dev headers/static libs.
# libxmlsec1-openssl provides the OpenSSL crypto backend that libxmlsec1-dev used to pull in.
RUN apt-get update && \

Check warning on line 299 in Dockerfile

View workflow job for this annotation

GitHub Actions / Lint changed Dockerfiles

Pin versions in apt get install. Instead of `apt-get install <package>` use `apt-get install <package>=<version>`
apt-get install -y --no-install-recommends --allow-downgrades \
"gettext-base" \
"libpq5" \
Expand Down Expand Up @@ -396,6 +400,7 @@
COPY --from=node-scripts-build --chown=posthog:posthog /code/common/plugin_transpiler/dist /code/common/plugin_transpiler/dist
COPY --from=node-scripts-build --chown=posthog:posthog /code/common/plugin_transpiler/node_modules /code/common/plugin_transpiler/node_modules
COPY --from=node-scripts-build --chown=posthog:posthog /code/common/plugin_transpiler/package.json /code/common/plugin_transpiler/package.json
COPY --from=node-scripts-build --chown=posthog:posthog /code/products/canvas/packages/canvas_builder /code/products/canvas/packages/canvas_builder

# Add in custom bin files and Django deps.
COPY --chown=posthog:posthog ./bin ./bin/
Expand All @@ -420,7 +425,7 @@
# Validate the Playwright client library (used to drive the remote browserless service over CDP —
# no browser binary ships in this image).
RUN /python-runtime/bin/python -c "import playwright; print('Playwright package imported successfully')"
RUN /python-runtime/bin/python -c "from playwright.sync_api import sync_playwright; print('Playwright sync API available')"

Check notice on line 428 in Dockerfile

View workflow job for this annotation

GitHub Actions / Lint changed Dockerfiles

Multiple consecutive `RUN` instructions. Consider consolidation.

# Setup ENV.
ENV NODE_ENV=production
Expand All @@ -432,5 +437,5 @@
EXPOSE 8001
COPY unit.json.tpl /docker-entrypoint.d/unit.json.tpl
# nosemgrep: dockerfile.security.last-user-is-root.last-user-is-root
USER root

Check warning on line 440 in Dockerfile

View workflow job for this annotation

GitHub Actions / Lint changed Dockerfiles

Last USER should not be root
CMD ["./bin/docker"]
2 changes: 1 addition & 1 deletion frontend/snapshots.yml
Original file line number Diff line number Diff line change
Expand Up @@ -5561,7 +5561,7 @@ snapshots:
scenes-app-dashboards--access-control-dashboard--dark:
hash: v1.k794b7964.0d8f4e16f3bcd82f492569c9d57e00e8832cf39bfed4b85d9c2aaf69e81031d6.uSc9iCdSK_l3raRHxIVu7tVsgyKSOLoGZX2jcR3UOCo
scenes-app-dashboards--access-control-dashboard--light:
hash: v1.k794b7964.f16ba333bf49a1b30216b2894b72a21cd43fba51b4ba02c52ecb12dd5130217e.lgORqVL8Rd6GEs-a3La1aIE2mFS0Adv-jpkXK9Rxodk
hash: v1.k794b7964.2a7218a37b2ddef398f5014ce00453fcdc1b4619ff85853b821c1344c8242053.DuVPcy6HzLcslw0RnsYXUbh5G_FGGYc7v2up3anNK0w
scenes-app-dashboards--edit--dark:
hash: v1.k794b7964.b85e622d121e2edfb031fec73921ba7d775a50124f5d68c8c82ad28a51985434.eFMlXYTQdWLdvwn7YobjvgCNrFbx2IMXMt2Lzs0yyo4
scenes-app-dashboards--edit--light:
Expand Down
267 changes: 58 additions & 209 deletions frontend/src/generated/core/api.schemas.ts

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading
Loading