Prove the deploy by digest, not by tag
The preceding commit stops `set image` being a silent no-op. This asserts the outcome: after the rollout, the tag is resolved to a digest at the registry and th...
A rebuild of the same commit deployed nothing and reported success
The image is tagged with the commit SHA, so rebuilding the same commit produces an identical image reference. `kubectl set image` then changes nothing, the Depl...
Let a rollout finish what the old pod was doing
Deploys replaced the only pod of each service with nothing to catch the requests in flight. Three settings, applied across the fleet: - preStop sleeps 10s befo...
The signed-in session becomes per-tab
analytics.auth lived in localStorage, which every tab of this origin shares. Analytics is reached by an OTK handoff from a workspace and each handoff mints a to...
Stop listing every visitor twice
Performance (web vitals) events were saved with no hostname β the collector's performance branch never passed one, unlike the pageview branch. All 803 stored pe...
Harden the kubectl download against flaky egress [skip ci]
dl.k8s.io over the runner's egress intermittently drops mid-transfer: curl: (56) OpenSSL SSL_read: decryption failed or bad record mac which fails the deploy ...
Alias ALL turbopack content-hashed externals, not just prisma
The prior fix only aliased @prisma/client-<hash>; the build also externalizes pg-<hash> (node-postgres, via @prisma/adapter-pg) under the same content-hashed sc...
Alias Prisma 7 content-hashed client so DB routes stop 500ing
The prisma-client generator (engineType=client) bakes a content-hashed runtime specifier (@prisma/client-<hash>) into the Next build. The builder satisfied it v...
Install script deps after standalone copy; bump PRISMA_VERSION to 7.6.0
The runner stage installed script deps (semver/chalk/prisma/...) BEFORE copying the Next.js standalone output. Next traces a partial, index.js-less semver into ...
Pin pnpm to 10.34.3 so build-script review lists are honored
Unpinned 'npm install -g pnpm' now resolves to pnpm 11.8.0, which dropped **************** in favour of allowBuilds. The repo's review lists were therefore igno...
Copy pnpm-workspace.yaml + review remaining build scripts
The deps stage only copied package.json+lockfile, so pnpm could not see the **************** review lists (they live in pnpm-workspace.yaml). With strictDepBuil...
Allow prisma build script so pnpm add does not exit non-zero
Newer pnpm fails the build with ERR_PNPM_IGNORED_BUILDS when prisma's postinstall is ignored. Only @prisma/engines was allow-listed, so every image build since ...
Use pg Pool options instead of connection string for geo DB
CockroachDB rejects insecure connections and node-pg can't verify self-signed certs via connection string alone. Parse the URL into Pool options and pass ssl:{r...
*** session check, loading spinner, rebrand analytics to Kamo Analytics
Use redis get instead of exists for more reliable *** validation on logout. Replace "Authenticating..." text with an animated spinner on the OTK auth page. Rena...
Copy GeoLite2 database to production image for country detection
The /geo/ directory containing GeoLite2-City.mmdb was built during the builder stage but never copied to the runner stage, so all country/region lookups returne...
Move CSP to proxy.ts instead of middleware.ts to avoid build conflict
Next.js 16 doesn't allow both middleware.ts and proxy.ts. The Docker build copies proxy.ts as the middleware, so add CSP frame-ancestors header there instead. T...
Use Next.js middleware for CSP so frame-ancestors works at runtime
The standalone build bakes next.config.ts headers at build time, so ALLOWED_FRAME_URLS was always empty. Move CSP to a Next.js middleware that reads the env var...
Read ALLOWED_FRAME_URLS at runtime so CSP frame-ancestors works in standalone mode
The env var was being read at module scope during build, baking an empty value into the standalone server. Move CSP and all header construction into functions c...
Use iframe-compatible middleware to allow embedding from kamo-internal
Add explicit AS keyword for PostgreSQL column alias in session and event queries
The session and event expanded metrics queries use implicit column aliasing (`${column} name`) which causes a PostgreSQL syntax error when the column name (like...
Use settings timezone in revenue chart date range
The revenue chart was using the browser's local timezone instead of the timezone configured in analytics settings. This caused the chart to show different time ...
Remove searchValue from ValueSelect queryKey to avoid unnecessary refetches
Apply same null referrer fix to link tracking route
The same bug exists in the link route (q/[slug]) where request.headers.get("referer") returns null for requests without a Referer header, causing silent Zod val...
Handle null referrer in pixel tracking route
request.headers.get("referer") returns null when the header is absent (e.g. email clients). The Zod schema uses .optional() which accepts undefined but rejects ...
Correct autocomplete attributes to enable password manager autofill
Quote "event" reserved keyword in journey queries
Fixes PostgreSQL syntax error by quoting the "event" column alias. This was causing the journey query to fail. "event" is a reserved keyword in PostgreSQL. Add...
Parse netlify ip header by default: `x-nf-client-connection-ip`
This header is not clearly documented, but it is mentioned in semi-official sources, and I have tested it to ensure it's working properly. Without this, analyt...
Improve URL normalization and handling in tracking functions
Prevent multiple initialization when script injected more than once
Use safeDecodeURIComponent for location fields in user detection
Like what you see shipping?
Every one of these updates lands in your workspace automatically. Start free and watch it grow week after week.