forked from cartsnitch/cartsnitch
Compare commits
merge into: cs_betty/cartsnitch-fork-test:betty/revert-sha256-session-hash
cs_betty/cartsnitch-fork-test:main
cs_betty/cartsnitch-fork-test:barcode-betty/car-1078-email-worker-dragonfly-reset
cs_betty/cartsnitch-fork-test:uat
cs_betty/cartsnitch-fork-test:dev
cs_betty/cartsnitch-fork-test:betty/car-964-gitea-registry-v2
cs_betty/cartsnitch-fork-test:barcode-betty/gitea-registry
cs_betty/cartsnitch-fork-test:fix/dispose-engine-import
cs_betty/cartsnitch-fork-test:carl/car-933-gitea-registry
cs_betty/cartsnitch-fork-test:barcode-betty/fix-dispose-engine-import
cs_betty/cartsnitch-fork-test:betty/fix-dead-dispose-engine-import
cs_betty/cartsnitch-fork-test:betty/car-900-gitea-workflows
cs_betty/cartsnitch-fork-test:barcode-betty/move-workflows-to-gitea
cs_betty/cartsnitch-fork-test:betty/fix-gitea-ci-secrets
cs_betty/cartsnitch-fork-test:betty/car-869-gitea-actions-cartsnitch
cs_betty/cartsnitch-fork-test:betty/car-862-fix-auth-build
cs_betty/cartsnitch-fork-test:betty/car-812-uat-seed-tooling
cs_betty/cartsnitch-fork-test:betty/car-555-health-check-db
cs_betty/cartsnitch-fork-test:feature/dragonfly-rate-limiting
cs_betty/cartsnitch-fork-test:betty/car-749-remove-auth-ci
cs_betty/cartsnitch-fork-test:fix/car-741-login-redirect-race-clean
cs_betty/cartsnitch-fork-test:fix/car-741-login-redirect-race-v2
cs_betty/cartsnitch-fork-test:fix/car-741-login-redirect-race
cs_betty/cartsnitch-fork-test:fix/car-709-receiptwitness-grype-cves
cs_betty/cartsnitch-fork-test:fix/car-620-grype-ignore-and-cache-bust
cs_betty/cartsnitch-fork-test:fix/car-656-deploy-commit-guard
cs_betty/cartsnitch-fork-test:fix/car-663-bcrypt-cost-factor
cs_betty/cartsnitch-fork-test:fix/car-676-axe-color-contrast
cs_betty/cartsnitch-fork-test:betty/car-673-fix-e2e-playwright-mock-auth
cs_betty/cartsnitch-fork-test:fix/car-665-eslint-unused-vars
cs_betty/cartsnitch-fork-test:betty/car-548-email-verification
cs_betty/cartsnitch-fork-test:betty/car-552-redis-rate-limiting
cs_betty/cartsnitch-fork-test:fix/car-620-remaining-docker-cves
cs_betty/cartsnitch-fork-test:fix/car-620-grype-only-fixed
cs_betty/cartsnitch-fork-test:fix/car-616-remediate-docker-cves
cs_betty/cartsnitch-fork-test:feature/grype-image-scanning
cs_betty/cartsnitch-fork-test:fix/car-608-auth-health-check
cs_betty/cartsnitch-fork-test:fix/auth-config-validation
cs_betty/cartsnitch-fork-test:betty/car-553-redis-cache
cs_betty/cartsnitch-fork-test:betty/car-554-audit-logging
cs_betty/cartsnitch-fork-test:betty/car-551-remove-mock-auth
cs_betty/cartsnitch-fork-test:feature/trivy-image-scanning
cs_betty/cartsnitch-fork-test:betty/car-599-vite-audit-fix
cs_betty/cartsnitch-fork-test:betty/car-580-n1-normalization-query
cs_betty/cartsnitch-fork-test:fix/receiptwitness-config-validation
cs_betty/cartsnitch-fork-test:feature/cart-550-api-lifespan-pooling
cs_betty/cartsnitch-fork-test:fix/cors-security-headers
cs_betty/cartsnitch-fork-test:feature/public-endpoint-validation
cs_betty/cartsnitch-fork-test:fix/rate-limit-token-hash
cs_betty/cartsnitch-fork-test:fix/hardcoded-secrets
cs_betty/cartsnitch-fork-test:betty/fix-alembic-create-all-commit
cs_betty/cartsnitch-fork-test:betty/car-517-domain-tables-migration
cs_betty/cartsnitch-fork-test:betty/fix-alembic-model-import
cs_betty/cartsnitch-fork-test:betty/fix-session-cookie-parsing
cs_betty/cartsnitch-fork-test:betty/fix-api-database-url-fallback
cs_betty/cartsnitch-fork-test:betty/revert-sha256-session-hash
cs_betty/cartsnitch-fork-test:betty/fix-session-token-hash
cs_betty/cartsnitch-fork-test:betty/fix-secure-session-cookie
cs_betty/cartsnitch-fork-test:fix/alembic-version-table-width
cs_betty/cartsnitch-fork-test:betty/fix-uat-users-table-bootstrap
cs_betty/cartsnitch-fork-test:betty/fix-alembic-fresh-db
cs_betty/cartsnitch-fork-test:betty/fix-libpq5-dockerfile
cs_betty/cartsnitch-fork-test:fix/alembic-percent-escape
cs_betty/cartsnitch-fork-test:betty/fix-email-inbound-token-server-default
cs_betty/cartsnitch-fork-test:betty/fix-sha-tag-format-long
cs_betty/cartsnitch-fork-test:betty/fix-ci-dev-uat-branches
cs_betty/cartsnitch-fork-test:betty/fix-alembic-dockerfile
cs_betty/cartsnitch-fork-test:betty/fix-uat-trustedorigins
cs_betty/cartsnitch-fork-test:feat/sync-common-email-inbound-token
cs_betty/cartsnitch-fork-test:fix/ci-api-dockerfile-path
cs_betty/cartsnitch-fork-test:fix/ci-deploy-race
cs_betty/cartsnitch-fork-test:fix/email-in-address-hotfix
cs_betty/cartsnitch-fork-test:feat/ci-deploy-uat
cs_betty/cartsnitch-fork-test:fix/npm-audit-vulnerabilities
cs_betty/cartsnitch-fork-test:pr108
cs_betty/cartsnitch-fork-test:fix/inbound-email-500
cs_betty/cartsnitch-fork-test:fix/email-in-address-routing
cs_betty/cartsnitch-fork-test:feat/email-in-settings
cs_betty/cartsnitch-fork-test:sync/api-2026-04-03
cs_betty/cartsnitch-fork-test:sync/receiptwitness-2026-04-03
cs_betty/cartsnitch-fork-test:fix/api-date-schema-types
cs_betty/cartsnitch-fork-test:fix/dashboard-hardcoded-product-ids
cs_betty/cartsnitch-fork-test:fix/remove-timestamp-mixin-from-mismatched-models
cs_betty/cartsnitch-fork-test:feature/dev-seed-script
cs_betty/cartsnitch-fork-test:fix/user-id-str-type
cs_betty/cartsnitch-fork-test:fix/signed-cookie-parsing
cs_betty/cartsnitch-fork-test:fix/restore-token-hash
cs_betty/cartsnitch-fork-test:fix/secure-cookie-name
cs_betty/cartsnitch-fork-test:fix/frontend-api-routes
cs_betty/cartsnitch-fork-test:fix/session-token-hash
cs_betty/cartsnitch-fork-test:fix/api-v1-prefix
cs_betty/cartsnitch-fork-test:fix/registration-redirect
cs_betty/cartsnitch-fork-test:fix/lighthouse-ci-crash
cs_betty/cartsnitch-fork-test:fix/api-auto-migration
cs_betty/cartsnitch-fork-test:feat/e2e-journey-tests
cs_betty/cartsnitch-fork-test:fix/users-id-text
cs_betty/cartsnitch-fork-test:feat/lighthouse-ci
cs_betty/cartsnitch-fork-test:feat/axe-core-playwright
cs_betty/cartsnitch-fork-test:fix/deploy-dev-resilient
cs_betty/cartsnitch-fork-test:feat/ci-npm-audit
cs_betty/cartsnitch-fork-test:fix/dockerhub-login-cicd
cs_betty/cartsnitch-fork-test:fix/deploy-dev-resilient-v2
cs_betty/cartsnitch-fork-test:fix/auth-session-table-mapping
cs_betty/cartsnitch-fork-test:fix/api-dockerfile-libpq
cs_betty/cartsnitch-fork-test:fix/deploy-dev-resilience
cs_betty/cartsnitch-fork-test:feat/ci-api-image-build-v3
cs_betty/cartsnitch-fork-test:feat/ci-api-image-build-v2
cs_betty/cartsnitch-fork-test:feat/playwright-setup
cs_betty/cartsnitch-fork-test:feat/msw-integration-tests
cs_betty/cartsnitch-fork-test:feat/ci-api-image-build
cs_betty/cartsnitch-fork-test:fix/remove-polyrepo-ci-leftovers
cs_betty/cartsnitch-fork-test:fix/receiptwitness-local-common
cs_betty/cartsnitch-fork-test:feat/api-alembic-dockerfile
cs_betty/cartsnitch-fork-test:feat/ci-receiptwitness-build
cs_betty/cartsnitch-fork-test:fix/alembic-in-dockerfile
cs_betty/cartsnitch-fork-test:docs/uat-runbook
cs_betty/cartsnitch-fork-test:fix/hashed-password-nullable
cs_betty/cartsnitch-fork-test:feat/utility-functions-tests
cs_betty/cartsnitch-fork-test:fix/auth-url-same-origin
cs_betty/cartsnitch-fork-test:fix/auth-contract-mismatch
cs_betty/cartsnitch-fork-test:feat/add-auth-image-to-deploy-dev
cs_betty/cartsnitch-fork-test:fix/deploy-dev-kustomize-install-clean
cs_betty/cartsnitch-fork-test:feat/uat-seed-user
cs_betty/cartsnitch-fork-test:fix/seed-uat-ctofixes
cs_betty/cartsnitch-fork-test:feature/better-auth
cs_betty/cartsnitch-fork-test:fix/deploy-dev-install-kustomize
cs_betty/cartsnitch-fork-test:fix/deploy-dev-github-app-token-cross-repo
cs_betty/cartsnitch-fork-test:remove-trigger-uat
cs_betty/cartsnitch-fork-test:charlie/ci-remove-trigger-uat
cs_betty/cartsnitch-fork-test:feat/deploy-dev-uat-trigger
cs_betty/cartsnitch-fork-test:feature/repo-consolidation
cs_betty/cartsnitch-fork-test:content/shrinkflation-consumer-faq
cs_betty/cartsnitch-fork-test:content/launch-marketing-pages
cs_betty/cartsnitch-fork-test:debbie/proper-cache-and-dockerhub-cleanup
cs_betty/cartsnitch-fork-test:debbie/fix-frontend-docker-cache
cs_betty/cartsnitch-fork-test:fix/dockerfile-numeric-uid
cs_betty/cartsnitch-fork-test:fix/frontend-dockerfile-user-101
cs_betty/cartsnitch-fork-test:content/what-is-unit-price
cs_betty/cartsnitch-fork-test:content/cartsnitch-vs-flipp
cs_betty/cartsnitch-fork-test:fix/non-root-nginx
cs_betty/cartsnitch-fork-test:content/shrinkflation-series-social-copy
cs_betty/cartsnitch-fork-test:content/shrinkflation-top-10
cs_betty/cartsnitch-fork-test:content/fix-launch-stats
cs_betty/cartsnitch-fork-test:content/email-welcome-sequence-links
cs_betty/cartsnitch-fork-test:content/pre-launch-social-mar25-26
cs_betty/cartsnitch-fork-test:content/shrinkflation-series-alignment
cs_betty/cartsnitch-fork-test:content/shrinkflation-series-1-cereal
cs_betty/cartsnitch-fork-test:content/founder-blog-post
cs_betty/cartsnitch-fork-test:content/launch-calendar
cs_betty/cartsnitch-fork-test:content/seo-comparison-article
cs_betty/cartsnitch-fork-test:content/phase-2-onboarding-faq
cs_betty/cartsnitch-fork-test:fix/dockerhub-auth-rate-limit
cs_betty/cartsnitch-fork-test:test/arc-runner-validation
cs_betty/cartsnitch-fork-test:calver-tagging
cs_betty/cartsnitch-fork-test:frankie/add-marketing-content
cs_betty/cartsnitch-fork-test:fix/runner-label
cs_betty/cartsnitch-fork-test:fix/ci-runner-and-mirrors
cs_betty/cartsnitch-fork-test:fix/ci-runner-label
cs_betty/cartsnitch-fork-test:revert-ghcr-mirrors
cs_betty/cartsnitch-fork-test:fix/dockerfile-use-dockerhub-images
cs_betty/cartsnitch-fork-test:fix/ghcr-mirror-base-images
cs_betty/cartsnitch-fork-test:fix/ci-remove-dockerhub-login
cs_betty/cartsnitch-fork-test:fix/ci-docker-ratelimit
cs_betty/cartsnitch-fork-test:feature/dockerfile
cs_betty/cartsnitch-fork-test:feature/core-screens
cs_betty/cartsnitch-fork-test:feature/renovate-config
cs_betty/cartsnitch-fork-test:ci/add-github-actions
cartsnitch/cartsnitch:uat
cartsnitch/cartsnitch:dev
cartsnitch/cartsnitch:barcode-betty/car-1428-revert-deploy-base
cartsnitch/cartsnitch:main
cartsnitch/cartsnitch:barcode-betty/car-1374-checkout-ref-match-base
cartsnitch/cartsnitch:barcode-betty/car-1370-deploy-base-dev
cartsnitch/cartsnitch:barcode-betty/car-1303-widen-alembic-via-migration
cartsnitch/cartsnitch:betty/car-1078-email-worker-dragonfly-reset
cartsnitch/cartsnitch:betty/car-1218-lighthouse-ci
cartsnitch/cartsnitch:betty/car-1319-sha-tag-fix
cartsnitch/cartsnitch:betty/car-1318-frontend-kustomize-bump-target
cartsnitch/cartsnitch:betty/car-1276-auth-image-build-fix
cartsnitch/cartsnitch:betty/car-1276-auth-health-error-log
cartsnitch/cartsnitch:betty/car-1216-deploy-non-fail-merge
cartsnitch/cartsnitch:betty/car-1215-react-router-audit
cartsnitch/cartsnitch:barcode-betty/car-1078-email-worker-dragonfly-reset
cartsnitch/cartsnitch:betty/car-964-gitea-registry-v2
cartsnitch/cartsnitch:barcode-betty/gitea-registry
cartsnitch/cartsnitch:fix/dispose-engine-import
cartsnitch/cartsnitch:carl/car-933-gitea-registry
cartsnitch/cartsnitch:barcode-betty/fix-dispose-engine-import
cartsnitch/cartsnitch:betty/fix-dead-dispose-engine-import
cartsnitch/cartsnitch:betty/car-900-gitea-workflows
cartsnitch/cartsnitch:barcode-betty/move-workflows-to-gitea
cartsnitch/cartsnitch:betty/fix-gitea-ci-secrets
cartsnitch/cartsnitch:betty/car-869-gitea-actions-cartsnitch
cartsnitch/cartsnitch:betty/car-862-fix-auth-build
cartsnitch/cartsnitch:betty/car-812-uat-seed-tooling
cartsnitch/cartsnitch:betty/car-555-health-check-db
cartsnitch/cartsnitch:feature/dragonfly-rate-limiting
cartsnitch/cartsnitch:betty/car-749-remove-auth-ci
cartsnitch/cartsnitch:fix/car-741-login-redirect-race-clean
cartsnitch/cartsnitch:fix/car-741-login-redirect-race-v2
cartsnitch/cartsnitch:fix/car-741-login-redirect-race
cartsnitch/cartsnitch:fix/car-709-receiptwitness-grype-cves
cartsnitch/cartsnitch:fix/car-620-grype-ignore-and-cache-bust
cartsnitch/cartsnitch:fix/car-656-deploy-commit-guard
cartsnitch/cartsnitch:fix/car-663-bcrypt-cost-factor
cartsnitch/cartsnitch:fix/car-676-axe-color-contrast
cartsnitch/cartsnitch:betty/car-673-fix-e2e-playwright-mock-auth
cartsnitch/cartsnitch:fix/car-665-eslint-unused-vars
cartsnitch/cartsnitch:betty/car-548-email-verification
cartsnitch/cartsnitch:betty/car-552-redis-rate-limiting
cartsnitch/cartsnitch:fix/car-620-remaining-docker-cves
cartsnitch/cartsnitch:fix/car-620-grype-only-fixed
cartsnitch/cartsnitch:fix/car-616-remediate-docker-cves
cartsnitch/cartsnitch:feature/grype-image-scanning
cartsnitch/cartsnitch:fix/car-608-auth-health-check
cartsnitch/cartsnitch:fix/auth-config-validation
cartsnitch/cartsnitch:betty/car-553-redis-cache
cartsnitch/cartsnitch:betty/car-554-audit-logging
cartsnitch/cartsnitch:betty/car-551-remove-mock-auth
cartsnitch/cartsnitch:feature/trivy-image-scanning
cartsnitch/cartsnitch:betty/car-599-vite-audit-fix
cartsnitch/cartsnitch:betty/car-580-n1-normalization-query
cartsnitch/cartsnitch:fix/receiptwitness-config-validation
cartsnitch/cartsnitch:feature/cart-550-api-lifespan-pooling
cartsnitch/cartsnitch:fix/cors-security-headers
cartsnitch/cartsnitch:feature/public-endpoint-validation
cartsnitch/cartsnitch:fix/rate-limit-token-hash
cartsnitch/cartsnitch:fix/hardcoded-secrets
cartsnitch/cartsnitch:betty/fix-alembic-create-all-commit
cartsnitch/cartsnitch:betty/car-517-domain-tables-migration
cartsnitch/cartsnitch:betty/fix-alembic-model-import
cartsnitch/cartsnitch:betty/fix-session-cookie-parsing
cartsnitch/cartsnitch:betty/fix-api-database-url-fallback
cartsnitch/cartsnitch:betty/revert-sha256-session-hash
cartsnitch/cartsnitch:betty/fix-session-token-hash
cartsnitch/cartsnitch:betty/fix-secure-session-cookie
cartsnitch/cartsnitch:fix/alembic-version-table-width
cartsnitch/cartsnitch:betty/fix-uat-users-table-bootstrap
cartsnitch/cartsnitch:betty/fix-alembic-fresh-db
cartsnitch/cartsnitch:betty/fix-libpq5-dockerfile
cartsnitch/cartsnitch:fix/alembic-percent-escape
cartsnitch/cartsnitch:betty/fix-email-inbound-token-server-default
cartsnitch/cartsnitch:betty/fix-sha-tag-format-long
cartsnitch/cartsnitch:betty/fix-ci-dev-uat-branches
cartsnitch/cartsnitch:betty/fix-alembic-dockerfile
cartsnitch/cartsnitch:betty/fix-uat-trustedorigins
cartsnitch/cartsnitch:feat/sync-common-email-inbound-token
cartsnitch/cartsnitch:fix/ci-api-dockerfile-path
cartsnitch/cartsnitch:fix/ci-deploy-race
cartsnitch/cartsnitch:fix/email-in-address-hotfix
cartsnitch/cartsnitch:feat/ci-deploy-uat
cartsnitch/cartsnitch:fix/npm-audit-vulnerabilities
cartsnitch/cartsnitch:pr108
cartsnitch/cartsnitch:fix/inbound-email-500
cartsnitch/cartsnitch:fix/email-in-address-routing
cartsnitch/cartsnitch:feat/email-in-settings
cartsnitch/cartsnitch:sync/api-2026-04-03
cartsnitch/cartsnitch:sync/receiptwitness-2026-04-03
cartsnitch/cartsnitch:fix/api-date-schema-types
cartsnitch/cartsnitch:fix/dashboard-hardcoded-product-ids
cartsnitch/cartsnitch:fix/remove-timestamp-mixin-from-mismatched-models
cartsnitch/cartsnitch:feature/dev-seed-script
cartsnitch/cartsnitch:fix/user-id-str-type
cartsnitch/cartsnitch:fix/signed-cookie-parsing
cartsnitch/cartsnitch:fix/restore-token-hash
cartsnitch/cartsnitch:fix/secure-cookie-name
cartsnitch/cartsnitch:fix/frontend-api-routes
cartsnitch/cartsnitch:fix/session-token-hash
cartsnitch/cartsnitch:fix/api-v1-prefix
cartsnitch/cartsnitch:fix/registration-redirect
cartsnitch/cartsnitch:fix/lighthouse-ci-crash
cartsnitch/cartsnitch:fix/api-auto-migration
cartsnitch/cartsnitch:feat/e2e-journey-tests
cartsnitch/cartsnitch:fix/users-id-text
cartsnitch/cartsnitch:feat/lighthouse-ci
cartsnitch/cartsnitch:feat/axe-core-playwright
cartsnitch/cartsnitch:fix/deploy-dev-resilient
cartsnitch/cartsnitch:feat/ci-npm-audit
cartsnitch/cartsnitch:fix/dockerhub-login-cicd
cartsnitch/cartsnitch:fix/deploy-dev-resilient-v2
cartsnitch/cartsnitch:fix/auth-session-table-mapping
cartsnitch/cartsnitch:fix/api-dockerfile-libpq
cartsnitch/cartsnitch:fix/deploy-dev-resilience
cartsnitch/cartsnitch:feat/ci-api-image-build-v3
cartsnitch/cartsnitch:feat/ci-api-image-build-v2
cartsnitch/cartsnitch:feat/playwright-setup
cartsnitch/cartsnitch:feat/msw-integration-tests
cartsnitch/cartsnitch:feat/ci-api-image-build
cartsnitch/cartsnitch:fix/remove-polyrepo-ci-leftovers
cartsnitch/cartsnitch:fix/receiptwitness-local-common
cartsnitch/cartsnitch:feat/api-alembic-dockerfile
cartsnitch/cartsnitch:feat/ci-receiptwitness-build
cartsnitch/cartsnitch:fix/alembic-in-dockerfile
cartsnitch/cartsnitch:docs/uat-runbook
cartsnitch/cartsnitch:fix/hashed-password-nullable
cartsnitch/cartsnitch:feat/utility-functions-tests
cartsnitch/cartsnitch:fix/auth-url-same-origin
cartsnitch/cartsnitch:fix/auth-contract-mismatch
cartsnitch/cartsnitch:feat/add-auth-image-to-deploy-dev
cartsnitch/cartsnitch:fix/deploy-dev-kustomize-install-clean
cartsnitch/cartsnitch:feat/uat-seed-user
cartsnitch/cartsnitch:fix/seed-uat-ctofixes
cartsnitch/cartsnitch:feature/better-auth
cartsnitch/cartsnitch:fix/deploy-dev-install-kustomize
cartsnitch/cartsnitch:fix/deploy-dev-github-app-token-cross-repo
cartsnitch/cartsnitch:remove-trigger-uat
cartsnitch/cartsnitch:charlie/ci-remove-trigger-uat
cartsnitch/cartsnitch:feat/deploy-dev-uat-trigger
cartsnitch/cartsnitch:feature/repo-consolidation
cartsnitch/cartsnitch:content/shrinkflation-consumer-faq
cartsnitch/cartsnitch:content/launch-marketing-pages
cartsnitch/cartsnitch:debbie/proper-cache-and-dockerhub-cleanup
cartsnitch/cartsnitch:debbie/fix-frontend-docker-cache
cartsnitch/cartsnitch:fix/dockerfile-numeric-uid
cartsnitch/cartsnitch:fix/frontend-dockerfile-user-101
cartsnitch/cartsnitch:content/what-is-unit-price
cartsnitch/cartsnitch:content/cartsnitch-vs-flipp
cartsnitch/cartsnitch:fix/non-root-nginx
cartsnitch/cartsnitch:content/shrinkflation-series-social-copy
cartsnitch/cartsnitch:content/shrinkflation-top-10
cartsnitch/cartsnitch:content/fix-launch-stats
cartsnitch/cartsnitch:content/email-welcome-sequence-links
cartsnitch/cartsnitch:content/pre-launch-social-mar25-26
cartsnitch/cartsnitch:content/shrinkflation-series-alignment
cartsnitch/cartsnitch:content/shrinkflation-series-1-cereal
cartsnitch/cartsnitch:content/founder-blog-post
cartsnitch/cartsnitch:content/launch-calendar
cartsnitch/cartsnitch:content/seo-comparison-article
cartsnitch/cartsnitch:content/phase-2-onboarding-faq
cartsnitch/cartsnitch:fix/dockerhub-auth-rate-limit
cartsnitch/cartsnitch:test/arc-runner-validation
cartsnitch/cartsnitch:calver-tagging
cartsnitch/cartsnitch:frankie/add-marketing-content
cartsnitch/cartsnitch:fix/runner-label
cartsnitch/cartsnitch:fix/ci-runner-and-mirrors
cartsnitch/cartsnitch:fix/ci-runner-label
cartsnitch/cartsnitch:revert-ghcr-mirrors
cartsnitch/cartsnitch:fix/dockerfile-use-dockerhub-images
cartsnitch/cartsnitch:fix/ghcr-mirror-base-images
cartsnitch/cartsnitch:fix/ci-remove-dockerhub-login
cartsnitch/cartsnitch:fix/ci-docker-ratelimit
cartsnitch/cartsnitch:feature/dockerfile
cartsnitch/cartsnitch:feature/core-screens
cartsnitch/cartsnitch:feature/renovate-config
cartsnitch/cartsnitch:ci/add-github-actions
cs_betty/cartsnitch-fork-test:v2026.05.04
cs_betty/cartsnitch-fork-test:v2026.04.20
cs_betty/cartsnitch-fork-test:v2026.04.19.4
cs_betty/cartsnitch-fork-test:v2026.04.19.3
cs_betty/cartsnitch-fork-test:v2026.04.19.2
cs_betty/cartsnitch-fork-test:v2026.04.19
cs_betty/cartsnitch-fork-test:v2026.04.15.2
cs_betty/cartsnitch-fork-test:v2026.04.15
cs_betty/cartsnitch-fork-test:v2026.04.14.4
cs_betty/cartsnitch-fork-test:v2026.04.14.3
cs_betty/cartsnitch-fork-test:v2026.04.14.2
cs_betty/cartsnitch-fork-test:v2026.04.14
cs_betty/cartsnitch-fork-test:v2026.04.05
cs_betty/cartsnitch-fork-test:v2026.04.03.8
cs_betty/cartsnitch-fork-test:v2026.04.03.7
cs_betty/cartsnitch-fork-test:v2026.04.03.6
cs_betty/cartsnitch-fork-test:v2026.04.03.5
cs_betty/cartsnitch-fork-test:v2026.04.03.4
cs_betty/cartsnitch-fork-test:v2026.04.03.3
cs_betty/cartsnitch-fork-test:v2026.04.03.2
cs_betty/cartsnitch-fork-test:v2026.04.03
cs_betty/cartsnitch-fork-test:v2026.04.02
cs_betty/cartsnitch-fork-test:v2026.04.01.9
cs_betty/cartsnitch-fork-test:v2026.04.01.8
cs_betty/cartsnitch-fork-test:v2026.04.01.7
cs_betty/cartsnitch-fork-test:v2026.04.01.6
cs_betty/cartsnitch-fork-test:v2026.04.01.5
cs_betty/cartsnitch-fork-test:v2026.04.01.4
cs_betty/cartsnitch-fork-test:v2026.04.01.3
cs_betty/cartsnitch-fork-test:v2026.04.01.2
cs_betty/cartsnitch-fork-test:v2026.04.01
cs_betty/cartsnitch-fork-test:v2026.03.31.8
cs_betty/cartsnitch-fork-test:v2026.03.31.7
cs_betty/cartsnitch-fork-test:v2026.03.31.6
cs_betty/cartsnitch-fork-test:v2026.03.31.5
cs_betty/cartsnitch-fork-test:v2026.03.31.4
cs_betty/cartsnitch-fork-test:v2026.03.31.3
cs_betty/cartsnitch-fork-test:v2026.03.31.2
cs_betty/cartsnitch-fork-test:v2026.03.31
cs_betty/cartsnitch-fork-test:v2026.03.30.10
cs_betty/cartsnitch-fork-test:v2026.03.30.9
cs_betty/cartsnitch-fork-test:v2026.03.30.8
cs_betty/cartsnitch-fork-test:v2026.03.30.7
cs_betty/cartsnitch-fork-test:v2026.03.30.6
cs_betty/cartsnitch-fork-test:v2026.03.30.5
cs_betty/cartsnitch-fork-test:v2026.03.30.4
cs_betty/cartsnitch-fork-test:v2026.03.30.3
cs_betty/cartsnitch-fork-test:v2026.03.30.2
cs_betty/cartsnitch-fork-test:v2026.03.30
cs_betty/cartsnitch-fork-test:v2026.03.29.5
cs_betty/cartsnitch-fork-test:v2026.03.29.4
cs_betty/cartsnitch-fork-test:v2026.03.29.3
cs_betty/cartsnitch-fork-test:v2026.03.29.2
cs_betty/cartsnitch-fork-test:v2026.03.29
cs_betty/cartsnitch-fork-test:v2026.03.28.6
cs_betty/cartsnitch-fork-test:v2026.03.28.5
cs_betty/cartsnitch-fork-test:v2026.03.28.4
cs_betty/cartsnitch-fork-test:v2026.03.28.3
cs_betty/cartsnitch-fork-test:v2026.03.28.2
cs_betty/cartsnitch-fork-test:v2026.03.28
cs_betty/cartsnitch-fork-test:v2026.03.24.2
cs_betty/cartsnitch-fork-test:v2026.03.24
cs_betty/cartsnitch-fork-test:v2026.03.22.2
cs_betty/cartsnitch-fork-test:v2026.03.22
cs_betty/cartsnitch-fork-test:v2026.03.21.4
cs_betty/cartsnitch-fork-test:v2026.03.21.3
cs_betty/cartsnitch-fork-test:v2026.03.21.2
cs_betty/cartsnitch-fork-test:v2026.03.21
cs_betty/cartsnitch-fork-test:v2026.03.20.3
cs_betty/cartsnitch-fork-test:v2026.03.20.2
cs_betty/cartsnitch-fork-test:v2026.03.20
cartsnitch/cartsnitch:v2026.06.08
cartsnitch/cartsnitch:v2026.06.07
cartsnitch/cartsnitch:v2026.06.06
cartsnitch/cartsnitch:v2026.06.04
cartsnitch/cartsnitch:v2026.05.04
cartsnitch/cartsnitch:v2026.04.20
cartsnitch/cartsnitch:v2026.04.19.4
cartsnitch/cartsnitch:v2026.04.19.3
cartsnitch/cartsnitch:v2026.04.19.2
cartsnitch/cartsnitch:v2026.04.19
cartsnitch/cartsnitch:v2026.04.15.2
cartsnitch/cartsnitch:v2026.04.15
cartsnitch/cartsnitch:v2026.04.14.4
cartsnitch/cartsnitch:v2026.04.14.3
cartsnitch/cartsnitch:v2026.04.14.2
cartsnitch/cartsnitch:v2026.04.14
cartsnitch/cartsnitch:v2026.04.05
cartsnitch/cartsnitch:v2026.04.03.8
cartsnitch/cartsnitch:v2026.04.03.7
cartsnitch/cartsnitch:v2026.04.03.6
cartsnitch/cartsnitch:v2026.04.03.5
cartsnitch/cartsnitch:v2026.04.03.4
cartsnitch/cartsnitch:v2026.04.03.3
cartsnitch/cartsnitch:v2026.04.03.2
cartsnitch/cartsnitch:v2026.04.03
cartsnitch/cartsnitch:v2026.04.02
cartsnitch/cartsnitch:v2026.04.01.9
cartsnitch/cartsnitch:v2026.04.01.8
cartsnitch/cartsnitch:v2026.04.01.7
cartsnitch/cartsnitch:v2026.04.01.6
cartsnitch/cartsnitch:v2026.04.01.5
cartsnitch/cartsnitch:v2026.04.01.4
cartsnitch/cartsnitch:v2026.04.01.3
cartsnitch/cartsnitch:v2026.04.01.2
cartsnitch/cartsnitch:v2026.04.01
cartsnitch/cartsnitch:v2026.03.31.8
cartsnitch/cartsnitch:v2026.03.31.7
cartsnitch/cartsnitch:v2026.03.31.6
cartsnitch/cartsnitch:v2026.03.31.5
cartsnitch/cartsnitch:v2026.03.31.4
cartsnitch/cartsnitch:v2026.03.31.3
cartsnitch/cartsnitch:v2026.03.31.2
cartsnitch/cartsnitch:v2026.03.31
cartsnitch/cartsnitch:v2026.03.30.10
cartsnitch/cartsnitch:v2026.03.30.9
cartsnitch/cartsnitch:v2026.03.30.8
cartsnitch/cartsnitch:v2026.03.30.7
cartsnitch/cartsnitch:v2026.03.30.6
cartsnitch/cartsnitch:v2026.03.30.5
cartsnitch/cartsnitch:v2026.03.30.4
cartsnitch/cartsnitch:v2026.03.30.3
cartsnitch/cartsnitch:v2026.03.30.2
cartsnitch/cartsnitch:v2026.03.30
cartsnitch/cartsnitch:v2026.03.29.5
cartsnitch/cartsnitch:v2026.03.29.4
cartsnitch/cartsnitch:v2026.03.29.3
cartsnitch/cartsnitch:v2026.03.29.2
cartsnitch/cartsnitch:v2026.03.29
cartsnitch/cartsnitch:v2026.03.28.6
cartsnitch/cartsnitch:v2026.03.28.5
cartsnitch/cartsnitch:v2026.03.28.4
cartsnitch/cartsnitch:v2026.03.28.3
cartsnitch/cartsnitch:v2026.03.28.2
cartsnitch/cartsnitch:v2026.03.28
cartsnitch/cartsnitch:v2026.03.24.2
cartsnitch/cartsnitch:v2026.03.24
cartsnitch/cartsnitch:v2026.03.22.2
cartsnitch/cartsnitch:v2026.03.22
cartsnitch/cartsnitch:v2026.03.21.4
cartsnitch/cartsnitch:v2026.03.21.3
cartsnitch/cartsnitch:v2026.03.21.2
cartsnitch/cartsnitch:v2026.03.21
cartsnitch/cartsnitch:v2026.03.20.3
cartsnitch/cartsnitch:v2026.03.20.2
cartsnitch/cartsnitch:v2026.03.20
..
pull from: cartsnitch/cartsnitch:betty/fix-api-database-url-fallback
cartsnitch/cartsnitch:uat
cartsnitch/cartsnitch:dev
cartsnitch/cartsnitch:barcode-betty/car-1428-revert-deploy-base
cartsnitch/cartsnitch:main
cartsnitch/cartsnitch:barcode-betty/car-1374-checkout-ref-match-base
cartsnitch/cartsnitch:barcode-betty/car-1370-deploy-base-dev
cartsnitch/cartsnitch:barcode-betty/car-1303-widen-alembic-via-migration
cartsnitch/cartsnitch:betty/car-1078-email-worker-dragonfly-reset
cartsnitch/cartsnitch:betty/car-1218-lighthouse-ci
cartsnitch/cartsnitch:betty/car-1319-sha-tag-fix
cartsnitch/cartsnitch:betty/car-1318-frontend-kustomize-bump-target
cartsnitch/cartsnitch:betty/car-1276-auth-image-build-fix
cartsnitch/cartsnitch:betty/car-1276-auth-health-error-log
cartsnitch/cartsnitch:betty/car-1216-deploy-non-fail-merge
cartsnitch/cartsnitch:betty/car-1215-react-router-audit
cartsnitch/cartsnitch:barcode-betty/car-1078-email-worker-dragonfly-reset
cartsnitch/cartsnitch:betty/car-964-gitea-registry-v2
cartsnitch/cartsnitch:barcode-betty/gitea-registry
cartsnitch/cartsnitch:fix/dispose-engine-import
cartsnitch/cartsnitch:carl/car-933-gitea-registry
cartsnitch/cartsnitch:barcode-betty/fix-dispose-engine-import
cartsnitch/cartsnitch:betty/fix-dead-dispose-engine-import
cartsnitch/cartsnitch:betty/car-900-gitea-workflows
cartsnitch/cartsnitch:barcode-betty/move-workflows-to-gitea
cartsnitch/cartsnitch:betty/fix-gitea-ci-secrets
cartsnitch/cartsnitch:betty/car-869-gitea-actions-cartsnitch
cartsnitch/cartsnitch:betty/car-862-fix-auth-build
cartsnitch/cartsnitch:betty/car-812-uat-seed-tooling
cartsnitch/cartsnitch:betty/car-555-health-check-db
cartsnitch/cartsnitch:feature/dragonfly-rate-limiting
cartsnitch/cartsnitch:betty/car-749-remove-auth-ci
cartsnitch/cartsnitch:fix/car-741-login-redirect-race-clean
cartsnitch/cartsnitch:fix/car-741-login-redirect-race-v2
cartsnitch/cartsnitch:fix/car-741-login-redirect-race
cartsnitch/cartsnitch:fix/car-709-receiptwitness-grype-cves
cartsnitch/cartsnitch:fix/car-620-grype-ignore-and-cache-bust
cartsnitch/cartsnitch:fix/car-656-deploy-commit-guard
cartsnitch/cartsnitch:fix/car-663-bcrypt-cost-factor
cartsnitch/cartsnitch:fix/car-676-axe-color-contrast
cartsnitch/cartsnitch:betty/car-673-fix-e2e-playwright-mock-auth
cartsnitch/cartsnitch:fix/car-665-eslint-unused-vars
cartsnitch/cartsnitch:betty/car-548-email-verification
cartsnitch/cartsnitch:betty/car-552-redis-rate-limiting
cartsnitch/cartsnitch:fix/car-620-remaining-docker-cves
cartsnitch/cartsnitch:fix/car-620-grype-only-fixed
cartsnitch/cartsnitch:fix/car-616-remediate-docker-cves
cartsnitch/cartsnitch:feature/grype-image-scanning
cartsnitch/cartsnitch:fix/car-608-auth-health-check
cartsnitch/cartsnitch:fix/auth-config-validation
cartsnitch/cartsnitch:betty/car-553-redis-cache
cartsnitch/cartsnitch:betty/car-554-audit-logging
cartsnitch/cartsnitch:betty/car-551-remove-mock-auth
cartsnitch/cartsnitch:feature/trivy-image-scanning
cartsnitch/cartsnitch:betty/car-599-vite-audit-fix
cartsnitch/cartsnitch:betty/car-580-n1-normalization-query
cartsnitch/cartsnitch:fix/receiptwitness-config-validation
cartsnitch/cartsnitch:feature/cart-550-api-lifespan-pooling
cartsnitch/cartsnitch:fix/cors-security-headers
cartsnitch/cartsnitch:feature/public-endpoint-validation
cartsnitch/cartsnitch:fix/rate-limit-token-hash
cartsnitch/cartsnitch:fix/hardcoded-secrets
cartsnitch/cartsnitch:betty/fix-alembic-create-all-commit
cartsnitch/cartsnitch:betty/car-517-domain-tables-migration
cartsnitch/cartsnitch:betty/fix-alembic-model-import
cartsnitch/cartsnitch:betty/fix-session-cookie-parsing
cartsnitch/cartsnitch:betty/fix-api-database-url-fallback
cartsnitch/cartsnitch:betty/revert-sha256-session-hash
cartsnitch/cartsnitch:betty/fix-session-token-hash
cartsnitch/cartsnitch:betty/fix-secure-session-cookie
cartsnitch/cartsnitch:fix/alembic-version-table-width
cartsnitch/cartsnitch:betty/fix-uat-users-table-bootstrap
cartsnitch/cartsnitch:betty/fix-alembic-fresh-db
cartsnitch/cartsnitch:betty/fix-libpq5-dockerfile
cartsnitch/cartsnitch:fix/alembic-percent-escape
cartsnitch/cartsnitch:betty/fix-email-inbound-token-server-default
cartsnitch/cartsnitch:betty/fix-sha-tag-format-long
cartsnitch/cartsnitch:betty/fix-ci-dev-uat-branches
cartsnitch/cartsnitch:betty/fix-alembic-dockerfile
cartsnitch/cartsnitch:betty/fix-uat-trustedorigins
cartsnitch/cartsnitch:feat/sync-common-email-inbound-token
cartsnitch/cartsnitch:fix/ci-api-dockerfile-path
cartsnitch/cartsnitch:fix/ci-deploy-race
cartsnitch/cartsnitch:fix/email-in-address-hotfix
cartsnitch/cartsnitch:feat/ci-deploy-uat
cartsnitch/cartsnitch:fix/npm-audit-vulnerabilities
cartsnitch/cartsnitch:pr108
cartsnitch/cartsnitch:fix/inbound-email-500
cartsnitch/cartsnitch:fix/email-in-address-routing
cartsnitch/cartsnitch:feat/email-in-settings
cartsnitch/cartsnitch:sync/api-2026-04-03
cartsnitch/cartsnitch:sync/receiptwitness-2026-04-03
cartsnitch/cartsnitch:fix/api-date-schema-types
cartsnitch/cartsnitch:fix/dashboard-hardcoded-product-ids
cartsnitch/cartsnitch:fix/remove-timestamp-mixin-from-mismatched-models
cartsnitch/cartsnitch:feature/dev-seed-script
cartsnitch/cartsnitch:fix/user-id-str-type
cartsnitch/cartsnitch:fix/signed-cookie-parsing
cartsnitch/cartsnitch:fix/restore-token-hash
cartsnitch/cartsnitch:fix/secure-cookie-name
cartsnitch/cartsnitch:fix/frontend-api-routes
cartsnitch/cartsnitch:fix/session-token-hash
cartsnitch/cartsnitch:fix/api-v1-prefix
cartsnitch/cartsnitch:fix/registration-redirect
cartsnitch/cartsnitch:fix/lighthouse-ci-crash
cartsnitch/cartsnitch:fix/api-auto-migration
cartsnitch/cartsnitch:feat/e2e-journey-tests
cartsnitch/cartsnitch:fix/users-id-text
cartsnitch/cartsnitch:feat/lighthouse-ci
cartsnitch/cartsnitch:feat/axe-core-playwright
cartsnitch/cartsnitch:fix/deploy-dev-resilient
cartsnitch/cartsnitch:feat/ci-npm-audit
cartsnitch/cartsnitch:fix/dockerhub-login-cicd
cartsnitch/cartsnitch:fix/deploy-dev-resilient-v2
cartsnitch/cartsnitch:fix/auth-session-table-mapping
cartsnitch/cartsnitch:fix/api-dockerfile-libpq
cartsnitch/cartsnitch:fix/deploy-dev-resilience
cartsnitch/cartsnitch:feat/ci-api-image-build-v3
cartsnitch/cartsnitch:feat/ci-api-image-build-v2
cartsnitch/cartsnitch:feat/playwright-setup
cartsnitch/cartsnitch:feat/msw-integration-tests
cartsnitch/cartsnitch:feat/ci-api-image-build
cartsnitch/cartsnitch:fix/remove-polyrepo-ci-leftovers
cartsnitch/cartsnitch:fix/receiptwitness-local-common
cartsnitch/cartsnitch:feat/api-alembic-dockerfile
cartsnitch/cartsnitch:feat/ci-receiptwitness-build
cartsnitch/cartsnitch:fix/alembic-in-dockerfile
cartsnitch/cartsnitch:docs/uat-runbook
cartsnitch/cartsnitch:fix/hashed-password-nullable
cartsnitch/cartsnitch:feat/utility-functions-tests
cartsnitch/cartsnitch:fix/auth-url-same-origin
cartsnitch/cartsnitch:fix/auth-contract-mismatch
cartsnitch/cartsnitch:feat/add-auth-image-to-deploy-dev
cartsnitch/cartsnitch:fix/deploy-dev-kustomize-install-clean
cartsnitch/cartsnitch:feat/uat-seed-user
cartsnitch/cartsnitch:fix/seed-uat-ctofixes
cartsnitch/cartsnitch:feature/better-auth
cartsnitch/cartsnitch:fix/deploy-dev-install-kustomize
cartsnitch/cartsnitch:fix/deploy-dev-github-app-token-cross-repo
cartsnitch/cartsnitch:remove-trigger-uat
cartsnitch/cartsnitch:charlie/ci-remove-trigger-uat
cartsnitch/cartsnitch:feat/deploy-dev-uat-trigger
cartsnitch/cartsnitch:feature/repo-consolidation
cartsnitch/cartsnitch:content/shrinkflation-consumer-faq
cartsnitch/cartsnitch:content/launch-marketing-pages
cartsnitch/cartsnitch:debbie/proper-cache-and-dockerhub-cleanup
cartsnitch/cartsnitch:debbie/fix-frontend-docker-cache
cartsnitch/cartsnitch:fix/dockerfile-numeric-uid
cartsnitch/cartsnitch:fix/frontend-dockerfile-user-101
cartsnitch/cartsnitch:content/what-is-unit-price
cartsnitch/cartsnitch:content/cartsnitch-vs-flipp
cartsnitch/cartsnitch:fix/non-root-nginx
cartsnitch/cartsnitch:content/shrinkflation-series-social-copy
cartsnitch/cartsnitch:content/shrinkflation-top-10
cartsnitch/cartsnitch:content/fix-launch-stats
cartsnitch/cartsnitch:content/email-welcome-sequence-links
cartsnitch/cartsnitch:content/pre-launch-social-mar25-26
cartsnitch/cartsnitch:content/shrinkflation-series-alignment
cartsnitch/cartsnitch:content/shrinkflation-series-1-cereal
cartsnitch/cartsnitch:content/founder-blog-post
cartsnitch/cartsnitch:content/launch-calendar
cartsnitch/cartsnitch:content/seo-comparison-article
cartsnitch/cartsnitch:content/phase-2-onboarding-faq
cartsnitch/cartsnitch:fix/dockerhub-auth-rate-limit
cartsnitch/cartsnitch:test/arc-runner-validation
cartsnitch/cartsnitch:calver-tagging
cartsnitch/cartsnitch:frankie/add-marketing-content
cartsnitch/cartsnitch:fix/runner-label
cartsnitch/cartsnitch:fix/ci-runner-and-mirrors
cartsnitch/cartsnitch:fix/ci-runner-label
cartsnitch/cartsnitch:revert-ghcr-mirrors
cartsnitch/cartsnitch:fix/dockerfile-use-dockerhub-images
cartsnitch/cartsnitch:fix/ghcr-mirror-base-images
cartsnitch/cartsnitch:fix/ci-remove-dockerhub-login
cartsnitch/cartsnitch:fix/ci-docker-ratelimit
cartsnitch/cartsnitch:feature/dockerfile
cartsnitch/cartsnitch:feature/core-screens
cartsnitch/cartsnitch:feature/renovate-config
cartsnitch/cartsnitch:ci/add-github-actions
cs_betty/cartsnitch-fork-test:main
cs_betty/cartsnitch-fork-test:barcode-betty/car-1078-email-worker-dragonfly-reset
cs_betty/cartsnitch-fork-test:uat
cs_betty/cartsnitch-fork-test:dev
cs_betty/cartsnitch-fork-test:betty/car-964-gitea-registry-v2
cs_betty/cartsnitch-fork-test:barcode-betty/gitea-registry
cs_betty/cartsnitch-fork-test:fix/dispose-engine-import
cs_betty/cartsnitch-fork-test:carl/car-933-gitea-registry
cs_betty/cartsnitch-fork-test:barcode-betty/fix-dispose-engine-import
cs_betty/cartsnitch-fork-test:betty/fix-dead-dispose-engine-import
cs_betty/cartsnitch-fork-test:betty/car-900-gitea-workflows
cs_betty/cartsnitch-fork-test:barcode-betty/move-workflows-to-gitea
cs_betty/cartsnitch-fork-test:betty/fix-gitea-ci-secrets
cs_betty/cartsnitch-fork-test:betty/car-869-gitea-actions-cartsnitch
cs_betty/cartsnitch-fork-test:betty/car-862-fix-auth-build
cs_betty/cartsnitch-fork-test:betty/car-812-uat-seed-tooling
cs_betty/cartsnitch-fork-test:betty/car-555-health-check-db
cs_betty/cartsnitch-fork-test:feature/dragonfly-rate-limiting
cs_betty/cartsnitch-fork-test:betty/car-749-remove-auth-ci
cs_betty/cartsnitch-fork-test:fix/car-741-login-redirect-race-clean
cs_betty/cartsnitch-fork-test:fix/car-741-login-redirect-race-v2
cs_betty/cartsnitch-fork-test:fix/car-741-login-redirect-race
cs_betty/cartsnitch-fork-test:fix/car-709-receiptwitness-grype-cves
cs_betty/cartsnitch-fork-test:fix/car-620-grype-ignore-and-cache-bust
cs_betty/cartsnitch-fork-test:fix/car-656-deploy-commit-guard
cs_betty/cartsnitch-fork-test:fix/car-663-bcrypt-cost-factor
cs_betty/cartsnitch-fork-test:fix/car-676-axe-color-contrast
cs_betty/cartsnitch-fork-test:betty/car-673-fix-e2e-playwright-mock-auth
cs_betty/cartsnitch-fork-test:fix/car-665-eslint-unused-vars
cs_betty/cartsnitch-fork-test:betty/car-548-email-verification
cs_betty/cartsnitch-fork-test:betty/car-552-redis-rate-limiting
cs_betty/cartsnitch-fork-test:fix/car-620-remaining-docker-cves
cs_betty/cartsnitch-fork-test:fix/car-620-grype-only-fixed
cs_betty/cartsnitch-fork-test:fix/car-616-remediate-docker-cves
cs_betty/cartsnitch-fork-test:feature/grype-image-scanning
cs_betty/cartsnitch-fork-test:fix/car-608-auth-health-check
cs_betty/cartsnitch-fork-test:fix/auth-config-validation
cs_betty/cartsnitch-fork-test:betty/car-553-redis-cache
cs_betty/cartsnitch-fork-test:betty/car-554-audit-logging
cs_betty/cartsnitch-fork-test:betty/car-551-remove-mock-auth
cs_betty/cartsnitch-fork-test:feature/trivy-image-scanning
cs_betty/cartsnitch-fork-test:betty/car-599-vite-audit-fix
cs_betty/cartsnitch-fork-test:betty/car-580-n1-normalization-query
cs_betty/cartsnitch-fork-test:fix/receiptwitness-config-validation
cs_betty/cartsnitch-fork-test:feature/cart-550-api-lifespan-pooling
cs_betty/cartsnitch-fork-test:fix/cors-security-headers
cs_betty/cartsnitch-fork-test:feature/public-endpoint-validation
cs_betty/cartsnitch-fork-test:fix/rate-limit-token-hash
cs_betty/cartsnitch-fork-test:fix/hardcoded-secrets
cs_betty/cartsnitch-fork-test:betty/fix-alembic-create-all-commit
cs_betty/cartsnitch-fork-test:betty/car-517-domain-tables-migration
cs_betty/cartsnitch-fork-test:betty/fix-alembic-model-import
cs_betty/cartsnitch-fork-test:betty/fix-session-cookie-parsing
cs_betty/cartsnitch-fork-test:betty/fix-api-database-url-fallback
cs_betty/cartsnitch-fork-test:betty/revert-sha256-session-hash
cs_betty/cartsnitch-fork-test:betty/fix-session-token-hash
cs_betty/cartsnitch-fork-test:betty/fix-secure-session-cookie
cs_betty/cartsnitch-fork-test:fix/alembic-version-table-width
cs_betty/cartsnitch-fork-test:betty/fix-uat-users-table-bootstrap
cs_betty/cartsnitch-fork-test:betty/fix-alembic-fresh-db
cs_betty/cartsnitch-fork-test:betty/fix-libpq5-dockerfile
cs_betty/cartsnitch-fork-test:fix/alembic-percent-escape
cs_betty/cartsnitch-fork-test:betty/fix-email-inbound-token-server-default
cs_betty/cartsnitch-fork-test:betty/fix-sha-tag-format-long
cs_betty/cartsnitch-fork-test:betty/fix-ci-dev-uat-branches
cs_betty/cartsnitch-fork-test:betty/fix-alembic-dockerfile
cs_betty/cartsnitch-fork-test:betty/fix-uat-trustedorigins
cs_betty/cartsnitch-fork-test:feat/sync-common-email-inbound-token
cs_betty/cartsnitch-fork-test:fix/ci-api-dockerfile-path
cs_betty/cartsnitch-fork-test:fix/ci-deploy-race
cs_betty/cartsnitch-fork-test:fix/email-in-address-hotfix
cs_betty/cartsnitch-fork-test:feat/ci-deploy-uat
cs_betty/cartsnitch-fork-test:fix/npm-audit-vulnerabilities
cs_betty/cartsnitch-fork-test:pr108
cs_betty/cartsnitch-fork-test:fix/inbound-email-500
cs_betty/cartsnitch-fork-test:fix/email-in-address-routing
cs_betty/cartsnitch-fork-test:feat/email-in-settings
cs_betty/cartsnitch-fork-test:sync/api-2026-04-03
cs_betty/cartsnitch-fork-test:sync/receiptwitness-2026-04-03
cs_betty/cartsnitch-fork-test:fix/api-date-schema-types
cs_betty/cartsnitch-fork-test:fix/dashboard-hardcoded-product-ids
cs_betty/cartsnitch-fork-test:fix/remove-timestamp-mixin-from-mismatched-models
cs_betty/cartsnitch-fork-test:feature/dev-seed-script
cs_betty/cartsnitch-fork-test:fix/user-id-str-type
cs_betty/cartsnitch-fork-test:fix/signed-cookie-parsing
cs_betty/cartsnitch-fork-test:fix/restore-token-hash
cs_betty/cartsnitch-fork-test:fix/secure-cookie-name
cs_betty/cartsnitch-fork-test:fix/frontend-api-routes
cs_betty/cartsnitch-fork-test:fix/session-token-hash
cs_betty/cartsnitch-fork-test:fix/api-v1-prefix
cs_betty/cartsnitch-fork-test:fix/registration-redirect
cs_betty/cartsnitch-fork-test:fix/lighthouse-ci-crash
cs_betty/cartsnitch-fork-test:fix/api-auto-migration
cs_betty/cartsnitch-fork-test:feat/e2e-journey-tests
cs_betty/cartsnitch-fork-test:fix/users-id-text
cs_betty/cartsnitch-fork-test:feat/lighthouse-ci
cs_betty/cartsnitch-fork-test:feat/axe-core-playwright
cs_betty/cartsnitch-fork-test:fix/deploy-dev-resilient
cs_betty/cartsnitch-fork-test:feat/ci-npm-audit
cs_betty/cartsnitch-fork-test:fix/dockerhub-login-cicd
cs_betty/cartsnitch-fork-test:fix/deploy-dev-resilient-v2
cs_betty/cartsnitch-fork-test:fix/auth-session-table-mapping
cs_betty/cartsnitch-fork-test:fix/api-dockerfile-libpq
cs_betty/cartsnitch-fork-test:fix/deploy-dev-resilience
cs_betty/cartsnitch-fork-test:feat/ci-api-image-build-v3
cs_betty/cartsnitch-fork-test:feat/ci-api-image-build-v2
cs_betty/cartsnitch-fork-test:feat/playwright-setup
cs_betty/cartsnitch-fork-test:feat/msw-integration-tests
cs_betty/cartsnitch-fork-test:feat/ci-api-image-build
cs_betty/cartsnitch-fork-test:fix/remove-polyrepo-ci-leftovers
cs_betty/cartsnitch-fork-test:fix/receiptwitness-local-common
cs_betty/cartsnitch-fork-test:feat/api-alembic-dockerfile
cs_betty/cartsnitch-fork-test:feat/ci-receiptwitness-build
cs_betty/cartsnitch-fork-test:fix/alembic-in-dockerfile
cs_betty/cartsnitch-fork-test:docs/uat-runbook
cs_betty/cartsnitch-fork-test:fix/hashed-password-nullable
cs_betty/cartsnitch-fork-test:feat/utility-functions-tests
cs_betty/cartsnitch-fork-test:fix/auth-url-same-origin
cs_betty/cartsnitch-fork-test:fix/auth-contract-mismatch
cs_betty/cartsnitch-fork-test:feat/add-auth-image-to-deploy-dev
cs_betty/cartsnitch-fork-test:fix/deploy-dev-kustomize-install-clean
cs_betty/cartsnitch-fork-test:feat/uat-seed-user
cs_betty/cartsnitch-fork-test:fix/seed-uat-ctofixes
cs_betty/cartsnitch-fork-test:feature/better-auth
cs_betty/cartsnitch-fork-test:fix/deploy-dev-install-kustomize
cs_betty/cartsnitch-fork-test:fix/deploy-dev-github-app-token-cross-repo
cs_betty/cartsnitch-fork-test:remove-trigger-uat
cs_betty/cartsnitch-fork-test:charlie/ci-remove-trigger-uat
cs_betty/cartsnitch-fork-test:feat/deploy-dev-uat-trigger
cs_betty/cartsnitch-fork-test:feature/repo-consolidation
cs_betty/cartsnitch-fork-test:content/shrinkflation-consumer-faq
cs_betty/cartsnitch-fork-test:content/launch-marketing-pages
cs_betty/cartsnitch-fork-test:debbie/proper-cache-and-dockerhub-cleanup
cs_betty/cartsnitch-fork-test:debbie/fix-frontend-docker-cache
cs_betty/cartsnitch-fork-test:fix/dockerfile-numeric-uid
cs_betty/cartsnitch-fork-test:fix/frontend-dockerfile-user-101
cs_betty/cartsnitch-fork-test:content/what-is-unit-price
cs_betty/cartsnitch-fork-test:content/cartsnitch-vs-flipp
cs_betty/cartsnitch-fork-test:fix/non-root-nginx
cs_betty/cartsnitch-fork-test:content/shrinkflation-series-social-copy
cs_betty/cartsnitch-fork-test:content/shrinkflation-top-10
cs_betty/cartsnitch-fork-test:content/fix-launch-stats
cs_betty/cartsnitch-fork-test:content/email-welcome-sequence-links
cs_betty/cartsnitch-fork-test:content/pre-launch-social-mar25-26
cs_betty/cartsnitch-fork-test:content/shrinkflation-series-alignment
cs_betty/cartsnitch-fork-test:content/shrinkflation-series-1-cereal
cs_betty/cartsnitch-fork-test:content/founder-blog-post
cs_betty/cartsnitch-fork-test:content/launch-calendar
cs_betty/cartsnitch-fork-test:content/seo-comparison-article
cs_betty/cartsnitch-fork-test:content/phase-2-onboarding-faq
cs_betty/cartsnitch-fork-test:fix/dockerhub-auth-rate-limit
cs_betty/cartsnitch-fork-test:test/arc-runner-validation
cs_betty/cartsnitch-fork-test:calver-tagging
cs_betty/cartsnitch-fork-test:frankie/add-marketing-content
cs_betty/cartsnitch-fork-test:fix/runner-label
cs_betty/cartsnitch-fork-test:fix/ci-runner-and-mirrors
cs_betty/cartsnitch-fork-test:fix/ci-runner-label
cs_betty/cartsnitch-fork-test:revert-ghcr-mirrors
cs_betty/cartsnitch-fork-test:fix/dockerfile-use-dockerhub-images
cs_betty/cartsnitch-fork-test:fix/ghcr-mirror-base-images
cs_betty/cartsnitch-fork-test:fix/ci-remove-dockerhub-login
cs_betty/cartsnitch-fork-test:fix/ci-docker-ratelimit
cs_betty/cartsnitch-fork-test:feature/dockerfile
cs_betty/cartsnitch-fork-test:feature/core-screens
cs_betty/cartsnitch-fork-test:feature/renovate-config
cs_betty/cartsnitch-fork-test:ci/add-github-actions
cartsnitch/cartsnitch:v2026.06.08
cartsnitch/cartsnitch:v2026.06.07
cartsnitch/cartsnitch:v2026.06.06
cartsnitch/cartsnitch:v2026.06.04
cartsnitch/cartsnitch:v2026.05.04
cartsnitch/cartsnitch:v2026.04.20
cartsnitch/cartsnitch:v2026.04.19.4
cartsnitch/cartsnitch:v2026.04.19.3
cartsnitch/cartsnitch:v2026.04.19.2
cartsnitch/cartsnitch:v2026.04.19
cartsnitch/cartsnitch:v2026.04.15.2
cartsnitch/cartsnitch:v2026.04.15
cartsnitch/cartsnitch:v2026.04.14.4
cartsnitch/cartsnitch:v2026.04.14.3
cartsnitch/cartsnitch:v2026.04.14.2
cartsnitch/cartsnitch:v2026.04.14
cartsnitch/cartsnitch:v2026.04.05
cartsnitch/cartsnitch:v2026.04.03.8
cartsnitch/cartsnitch:v2026.04.03.7
cartsnitch/cartsnitch:v2026.04.03.6
cartsnitch/cartsnitch:v2026.04.03.5
cartsnitch/cartsnitch:v2026.04.03.4
cartsnitch/cartsnitch:v2026.04.03.3
cartsnitch/cartsnitch:v2026.04.03.2
cartsnitch/cartsnitch:v2026.04.03
cartsnitch/cartsnitch:v2026.04.02
cartsnitch/cartsnitch:v2026.04.01.9
cartsnitch/cartsnitch:v2026.04.01.8
cartsnitch/cartsnitch:v2026.04.01.7
cartsnitch/cartsnitch:v2026.04.01.6
cartsnitch/cartsnitch:v2026.04.01.5
cartsnitch/cartsnitch:v2026.04.01.4
cartsnitch/cartsnitch:v2026.04.01.3
cartsnitch/cartsnitch:v2026.04.01.2
cartsnitch/cartsnitch:v2026.04.01
cartsnitch/cartsnitch:v2026.03.31.8
cartsnitch/cartsnitch:v2026.03.31.7
cartsnitch/cartsnitch:v2026.03.31.6
cartsnitch/cartsnitch:v2026.03.31.5
cartsnitch/cartsnitch:v2026.03.31.4
cartsnitch/cartsnitch:v2026.03.31.3
cartsnitch/cartsnitch:v2026.03.31.2
cartsnitch/cartsnitch:v2026.03.31
cartsnitch/cartsnitch:v2026.03.30.10
cartsnitch/cartsnitch:v2026.03.30.9
cartsnitch/cartsnitch:v2026.03.30.8
cartsnitch/cartsnitch:v2026.03.30.7
cartsnitch/cartsnitch:v2026.03.30.6
cartsnitch/cartsnitch:v2026.03.30.5
cartsnitch/cartsnitch:v2026.03.30.4
cartsnitch/cartsnitch:v2026.03.30.3
cartsnitch/cartsnitch:v2026.03.30.2
cartsnitch/cartsnitch:v2026.03.30
cartsnitch/cartsnitch:v2026.03.29.5
cartsnitch/cartsnitch:v2026.03.29.4
cartsnitch/cartsnitch:v2026.03.29.3
cartsnitch/cartsnitch:v2026.03.29.2
cartsnitch/cartsnitch:v2026.03.29
cartsnitch/cartsnitch:v2026.03.28.6
cartsnitch/cartsnitch:v2026.03.28.5
cartsnitch/cartsnitch:v2026.03.28.4
cartsnitch/cartsnitch:v2026.03.28.3
cartsnitch/cartsnitch:v2026.03.28.2
cartsnitch/cartsnitch:v2026.03.28
cartsnitch/cartsnitch:v2026.03.24.2
cartsnitch/cartsnitch:v2026.03.24
cartsnitch/cartsnitch:v2026.03.22.2
cartsnitch/cartsnitch:v2026.03.22
cartsnitch/cartsnitch:v2026.03.21.4
cartsnitch/cartsnitch:v2026.03.21.3
cartsnitch/cartsnitch:v2026.03.21.2
cartsnitch/cartsnitch:v2026.03.21
cartsnitch/cartsnitch:v2026.03.20.3
cartsnitch/cartsnitch:v2026.03.20.2
cartsnitch/cartsnitch:v2026.03.20
cs_betty/cartsnitch-fork-test:v2026.05.04
cs_betty/cartsnitch-fork-test:v2026.04.20
cs_betty/cartsnitch-fork-test:v2026.04.19.4
cs_betty/cartsnitch-fork-test:v2026.04.19.3
cs_betty/cartsnitch-fork-test:v2026.04.19.2
cs_betty/cartsnitch-fork-test:v2026.04.19
cs_betty/cartsnitch-fork-test:v2026.04.15.2
cs_betty/cartsnitch-fork-test:v2026.04.15
cs_betty/cartsnitch-fork-test:v2026.04.14.4
cs_betty/cartsnitch-fork-test:v2026.04.14.3
cs_betty/cartsnitch-fork-test:v2026.04.14.2
cs_betty/cartsnitch-fork-test:v2026.04.14
cs_betty/cartsnitch-fork-test:v2026.04.05
cs_betty/cartsnitch-fork-test:v2026.04.03.8
cs_betty/cartsnitch-fork-test:v2026.04.03.7
cs_betty/cartsnitch-fork-test:v2026.04.03.6
cs_betty/cartsnitch-fork-test:v2026.04.03.5
cs_betty/cartsnitch-fork-test:v2026.04.03.4
cs_betty/cartsnitch-fork-test:v2026.04.03.3
cs_betty/cartsnitch-fork-test:v2026.04.03.2
cs_betty/cartsnitch-fork-test:v2026.04.03
cs_betty/cartsnitch-fork-test:v2026.04.02
cs_betty/cartsnitch-fork-test:v2026.04.01.9
cs_betty/cartsnitch-fork-test:v2026.04.01.8
cs_betty/cartsnitch-fork-test:v2026.04.01.7
cs_betty/cartsnitch-fork-test:v2026.04.01.6
cs_betty/cartsnitch-fork-test:v2026.04.01.5
cs_betty/cartsnitch-fork-test:v2026.04.01.4
cs_betty/cartsnitch-fork-test:v2026.04.01.3
cs_betty/cartsnitch-fork-test:v2026.04.01.2
cs_betty/cartsnitch-fork-test:v2026.04.01
cs_betty/cartsnitch-fork-test:v2026.03.31.8
cs_betty/cartsnitch-fork-test:v2026.03.31.7
cs_betty/cartsnitch-fork-test:v2026.03.31.6
cs_betty/cartsnitch-fork-test:v2026.03.31.5
cs_betty/cartsnitch-fork-test:v2026.03.31.4
cs_betty/cartsnitch-fork-test:v2026.03.31.3
cs_betty/cartsnitch-fork-test:v2026.03.31.2
cs_betty/cartsnitch-fork-test:v2026.03.31
cs_betty/cartsnitch-fork-test:v2026.03.30.10
cs_betty/cartsnitch-fork-test:v2026.03.30.9
cs_betty/cartsnitch-fork-test:v2026.03.30.8
cs_betty/cartsnitch-fork-test:v2026.03.30.7
cs_betty/cartsnitch-fork-test:v2026.03.30.6
cs_betty/cartsnitch-fork-test:v2026.03.30.5
cs_betty/cartsnitch-fork-test:v2026.03.30.4
cs_betty/cartsnitch-fork-test:v2026.03.30.3
cs_betty/cartsnitch-fork-test:v2026.03.30.2
cs_betty/cartsnitch-fork-test:v2026.03.30
cs_betty/cartsnitch-fork-test:v2026.03.29.5
cs_betty/cartsnitch-fork-test:v2026.03.29.4
cs_betty/cartsnitch-fork-test:v2026.03.29.3
cs_betty/cartsnitch-fork-test:v2026.03.29.2
cs_betty/cartsnitch-fork-test:v2026.03.29
cs_betty/cartsnitch-fork-test:v2026.03.28.6
cs_betty/cartsnitch-fork-test:v2026.03.28.5
cs_betty/cartsnitch-fork-test:v2026.03.28.4
cs_betty/cartsnitch-fork-test:v2026.03.28.3
cs_betty/cartsnitch-fork-test:v2026.03.28.2
cs_betty/cartsnitch-fork-test:v2026.03.28
cs_betty/cartsnitch-fork-test:v2026.03.24.2
cs_betty/cartsnitch-fork-test:v2026.03.24
cs_betty/cartsnitch-fork-test:v2026.03.22.2
cs_betty/cartsnitch-fork-test:v2026.03.22
cs_betty/cartsnitch-fork-test:v2026.03.21.4
cs_betty/cartsnitch-fork-test:v2026.03.21.3
cs_betty/cartsnitch-fork-test:v2026.03.21.2
cs_betty/cartsnitch-fork-test:v2026.03.21
cs_betty/cartsnitch-fork-test:v2026.03.20.3
cs_betty/cartsnitch-fork-test:v2026.03.20.2
cs_betty/cartsnitch-fork-test:v2026.03.20
2 Commits
| Author | SHA1 | Message | Date | |
|---|---|---|---|---|
|
|
ec9deb515b |
fix(api): accept DATABASE_URL as fallback for shared DB with auth service
API config.py now reads CARTSNITCH_DATABASE_URL first, falls back to DATABASE_URL (which the infra K8s overlay sets for all pods), and finally falls back to the hardcoded default. Also normalizes plain postgresql:// to postgresql+asyncpg:// for the asyncpg driver. Fixes CAR-510. Co-Authored-By: Paperclip <noreply@paperclip.ing> |
||
|
|
cfed9b0482 |
Merge pull request #139 from cartsnitch/betty/revert-sha256-session-hash
fix(api): revert SHA-256 session token hashing — better-auth stores raw tokens |
2 changed files with 60 additions and 2 deletions
@@ -1,13 +1,16 @@
|
||||
import base64
|
||||
|
||||
from pydantic import model_validator
|
||||
from pydantic import AliasChoices, Field, model_validator
|
||||
from pydantic_settings import BaseSettings
|
||||
|
||||
|
||||
class Settings(BaseSettings):
|
||||
model_config = {"env_prefix": "CARTSNITCH_"}
|
||||
|
||||
database_url: str = "postgresql+asyncpg://cartsnitch:cartsnitch@localhost:5432/cartsnitch"
|
||||
database_url: str = Field(
|
||||
default="postgresql+asyncpg://cartsnitch:cartsnitch@localhost:5432/cartsnitch",
|
||||
validation_alias=AliasChoices("CARTSNITCH_DATABASE_URL", "DATABASE_URL"),
|
||||
)
|
||||
redis_url: str = "redis://localhost:6379/0"
|
||||
|
||||
jwt_secret_key: str = "change-me-in-production"
|
||||
@@ -49,5 +52,12 @@ class Settings(BaseSettings):
|
||||
) from None
|
||||
return self
|
||||
|
||||
@model_validator(mode="after")
|
||||
def normalize_database_url(self):
|
||||
"""Normalize postgresql:// → postgresql+asyncpg:// for the asyncpg driver."""
|
||||
if self.database_url.startswith("postgresql://"):
|
||||
self.database_url = self.database_url.replace("postgresql://", "postgresql+asyncpg://", 1)
|
||||
return self
|
||||
|
||||
|
||||
settings = Settings()
|
||||
|
||||
@@ -0,0 +1,48 @@
|
||||
"""Tests for Settings config, specifically the database_url env var fallback."""
|
||||
|
||||
import os
|
||||
|
||||
from cartsnitch_api.config import Settings
|
||||
|
||||
|
||||
def test_database_url_prefers_cartsnitch_prefix():
|
||||
"""CARTSNITCH_DATABASE_URL takes precedence over DATABASE_URL."""
|
||||
env = {
|
||||
"CARTSNITCH_DATABASE_URL": "postgresql+asyncpg://user1:pass1@host1:5432/db1",
|
||||
"DATABASE_URL": "postgresql://user2:pass2@host2:5432/db2",
|
||||
}
|
||||
settings = Settings(**env)
|
||||
assert settings.database_url == "postgresql+asyncpg://user1:pass1@host1:5432/db1"
|
||||
|
||||
|
||||
def test_database_url_falls_back_to_database_url():
|
||||
"""When CARTSNITCH_DATABASE_URL is absent, DATABASE_URL is accepted."""
|
||||
env = {
|
||||
"DATABASE_URL": "postgresql://user:pass@dbhost:5432/mydb",
|
||||
}
|
||||
settings = Settings(**env)
|
||||
assert settings.database_url == "postgresql+asyncpg://user:pass@dbhost:5432/mydb"
|
||||
|
||||
|
||||
def test_database_url_normalizes_plain_postgresql_prefix():
|
||||
"""DATABASE_URL with plain postgresql:// is normalized to postgresql+asyncpg://."""
|
||||
env = {
|
||||
"DATABASE_URL": "postgresql://cartsnitch:cartsnitch@localhost:5432/cartsnitch",
|
||||
}
|
||||
settings = Settings(**env)
|
||||
assert settings.database_url == "postgresql+asyncpg://cartsnitch:cartsnitch@localhost:5432/cartsnitch"
|
||||
|
||||
|
||||
def test_database_url_preserves_asyncpg_prefix():
|
||||
"""CARTSNITCH_DATABASE_URL with postgresql+asyncpg:// is left unchanged."""
|
||||
env = {
|
||||
"CARTSNITCH_DATABASE_URL": "postgresql+asyncpg://cartsnitch:cartsnitch@localhost:5432/cartsnitch",
|
||||
}
|
||||
settings = Settings(**env)
|
||||
assert settings.database_url == "postgresql+asyncpg://cartsnitch:cartsnitch@localhost:5432/cartsnitch"
|
||||
|
||||
|
||||
def test_database_url_default():
|
||||
"""When neither env var is set, the hardcoded default is used."""
|
||||
settings = Settings()
|
||||
assert settings.database_url == "postgresql+asyncpg://cartsnitch:cartsnitch@localhost:5432/cartsnitch"
|
||||
Reference in New Issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.