*
!Dockerfile.recording-rasterizer
!.devcontainer
!.kearc
!bin
!common/hogvm
!common/esbuilder
!common/migration_utils
!common/mosaic
!common/replay-headless
!common/replay-shared
!common/plugin_transpiler/*.*
!common/plugin_transpiler/src
!common/tailwind
!packages/quill
!dags
!docs/onboarding
!ee
!frontend/@posthog
!frontend/*.*
!frontend/.storybook
!frontend/bin
!frontend/public
!frontend/src
!frontend/types
!frontend/babel.config.js
!frontend/webpack.config.js
!gunicorn.config.py
!manage.py
!turbo.json
!package.json
!patches
!playwright.config.ts
!nodejs
!nodejs/.eslintrc.js
!nodejs/.prettierrc
!nodejs/package.json
!nodejs/pnpm-lock.yaml
!nodejs/src
!nodejs/assets
!nodejs/tsconfig.eslint.json
!nodejs/tsconfig.json
!services/mcp
!services/mcp/package.json
!services/mcp/tsconfig.json
!services/mcp/scripts
!services/mcp/src
!services/mcp/shared
!services/mcp/types.d.ts
!services/mcp/worker-configuration.d.ts
!services/mcp/public
!packages/quill
services/agent-*/node_modules
services/agent-*/dist
services/agent-*/.next
!services/agent-proxy
!services/agent-proxy/package.json
!services/agent-proxy/tsconfig.json
!services/agent-proxy/scripts
!services/agent-proxy/src
!services/agent-proxy/types.d.ts
!pnpm-lock.yaml
!pnpm-workspace.yaml
!pyproject.toml
!uv.lock
!posthog
!posthog.json
!products
!requirements-dev.txt
!requirements.txt
!rust
!share/GeoLite2-City.mmdb
!staticfiles
!tailwind.config.js
!tools/hogli
!tools/openapi-codegen
!tools/owners
!tools/pr-approval-agent
!tsconfig.json
!unit.json.tpl
common/*/*/node_modules
common/*/node_modules
common/*/*/dist
common/*/dist
packages/quill/**/node_modules
packages/quill/**/dist
products/**/node_modules
# Nested standalone workspace, not imported by any server image; `!products` above
# would otherwise pull ~56 MiB of desktop assets into every image build context.
products/desktop
nodejs/node_modules
# The image-scrub sidecar is a standalone package nested in nodejs/src; keep its deps and (Stage-2) model
# artifacts out of the plugin-server build context.
nodejs/src/ingestion/pipelines/sessionreplay/ml-mirror-image-scrub-sidecar/node_modules
nodejs/src/ingestion/pipelines/sessionreplay/ml-mirror-image-scrub-sidecar/models
nodejs/src/ingestion/pipelines/sessionreplay/ml-mirror-image-scrub-sidecar/corpus
nodejs/src/ingestion/pipelines/sessionreplay/ml-mirror-image-scrub-sidecar/test-data
nodejs/src/ingestion/pipelines/sessionreplay/ml-mirror-image-scrub-sidecar/out
nodejs/src/ingestion/pipelines/sessionreplay/ml-mirror-image-scrub-sidecar/tmp
nodejs/src/ingestion/pipelines/sessionreplay/ml-mirror-image-scrub-sidecar/*.traineddata
services/mcp/node_modules
services/mcp/dist
services/mcp/.wrangler
services/mcp/tests
services/agent-proxy/node_modules
services/agent-proxy/dist
services/agent-proxy/tests
ee/**/node_modules
docs/**/node_modules
**/__pycache__
rust/.env
rust/.github
rust/cyclotron-node/dist
rust/cyclotron-node/index.node
rust/cyclotron-node/node_modules
rust/docker
rust/target
**/__snapshots__
!docker-compose.base.yml
!docker-compose.dev.yml
!docker

# Test / story / spec sources are never needed to build or run any image. Excluding them keeps them
# out of the COPYed layers and stops test-only edits from busting the collectstatic + frontend-build
# cache. Shared by all Dockerfiles — no image build (main, node, llm-analytics, etc.) needs them.
products/**/test_*.py
products/**/*_test.py
products/**/*.test.*
products/**/*.spec.*
products/**/*.stories.*
frontend/src/**/*.test.*
frontend/src/**/*.spec.*
frontend/src/**/*.stories.*
