Mint a visitor id when a referral code arrives without one
RegisterFlow already read `?discount=` for visitors who reached the form without passing through the marketing middleware β a code pasted into an ad, an email o...
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...
Tell the server which organization the resend is for
The verification screen's Resend button has been reporting success and sending nothing for every organization except the platform's own. `host` already rides i...
The rollout-safety settings had to go where CI actually reads them
kamo-register is the only service on the platform whose CI generates its Deployment inline, with a heredoc, instead of applying k8s/deployment.yaml. Two consequ...
Give the rollout room for the 15s minReadySeconds now costs
progressDeadlineSeconds was 60. That is the window a rollout has to show progress before Kubernetes gives up and marks it failed, and the previous commit added ...
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...
Paint a white-label signup screen from the host's organization
Same defect as kamo-login a200fc6, same cause. getThemePath()'s last resort derives a theme folder from the hostname - the name folders had BEFORE the 2026-08-2...
Clip the background carousel so its zoom-in stops flashing a scrollbar
The incoming frame animates in from scale 1.04, and its wrapper did no clipping, so the overscale hung ~2% of the viewport past the bottom edge. A transform ove...
Restore the verification screen's wallpaper, drop its ***, modernise its status plate
Three things wrong with /verification, all visible on one screen. The wallpaper never loaded. PostCompletionScreen called **************** but that parameter i...
YearEst is optional on the org, so admit the null that arrives
Year established is nullable on the Organization entity and SecurityService serializes the null explicitly, so the declared `number` was never the whole wire sh...
Brand the signup screen from the org's alias, not the host
register.kamocrm.com is the signup page for every organization with no register host of its own, so a host-derived theme folder painted all of them in the platf...
Hold the token's int64 ids as digits, not as numbers
KToken could not verify a real token. The four ids it carries are int64s, and the Java signer (kamo-shared-library KToken#canonicalForMac) appends each as a raw...
Unblock portrait phones, add analytics funnel analytics, fix plan handoff
- Remove the portrait-phone gate and "rotate your phone" dialog that hid the entire wizard on portrait phones; the wizard now renders single-column below th...
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 ...
Send the registrant's hostname in the body so the account lands under the right org
The resolved org was available on the client but never sent to the backend β the org was conveyed only implicitly via X-Forwarded-Host, which the ingress rewrit...
Resolve subdomain-tenant org bucket to its own MinIO folder
getThemePath() was reducing the hostname to apex+tld for both the themed host and the bucket folder, so subdomain tenants like gnosia.demo.kamocrm.com loaded th...
Only show Account Recovery seed phrase step for under-13
Why: 13+ users already provide email, phone, and security questions as recovery methods, making the seed phrase step redundant for them. Under-13 accounts have ...
Enable Finish button by polling widget.getState() and switching to auto=onload
The statechange event listener was not reliably enabling the Finish button after *** verification. Two root causes: 1. The drain logic read widgetAny.state whi...
Cache-bust logo URLs using themeRevision from config.json
DynamicMetaLoader now stores themeRevision in sessionStorage and fires KAMO_THEME_CONFIG_LOADED after fetching config.json. ThemeLogo listens for that event and...
Upload Avatar Creator avatar to server after registration
Avatar Creator avatars were only stored as SVG data URLs in local form state and never sent to the server, leaving new users with no avatar set. Convert the SVG...
Restore verification page layout by zeroing hidden input dimensions
MUI Box interprets numeric width/height values 0β1 as percentages, so width:1 made the hidden input cover the full card. Changed to 0 so the input is invisible ...
Token link auto-verifies and redirects to login; add code focus indicator
- /verification?token=xxx now calls verifyEmailByToken on mount and redirects to login on success; falls back to code entry on failure - Active code box shows...
Lift *** widget above click-to-focus overlay (z-index)
The overlay (position:absolute, z-index:0) was covering the Capcha widget because it appeared later in DOM order. Adding z-index:1 to the *** container lets poi...
Redirect to /verification after registration instead of rendering inline
Keeps the URL accurate β browser shows /verification not /member.
Pass upstream error body through security proxy instead of generic message
Previously returned {error: "Upstream error"} on non-2xx, losing the real error message from SecurityService. Now forwards status code and body directly.
Prevent stale ageReqType cache from showing age check incorrectly
- Org route: reduce Redis TTL from 24h to 5min and add ageReqTypeMember to stale detection so security fields stay fresh after DB changes - RegisterFlow: defa...
Set browser tab title to 'Register - {org name}'
DynamicMetaLoader now calls useThemeConfig and updates document.title to 'Register - {org.title}' once the org loads. Static fallback in layout.tsx changed from...
Resolve TS errors from steps used before declaration and Capcha style cast
Move **************** useMemos above the useEffects that depend on them; import CSSVariables type and use it for the Capcha-widget style prop.
Apply SP6 correctness and implementation quality fixes
C1: use NEXT_PUBLIC_H***_SITE_KEY env var instead of hardcoded placeholder C2: change RegisterResponse.userId and all API params from number to string (Cockroac...
Invalidate stale Redis cache missing org label fields
Cached org data from before the SecurityService update lacks the memberTitleNonPlural field. Detect this and re-fetch fresh data so custom member/team labels di...
Proxy all external API calls through Next.js to avoid CORS
Added catch-all /api/security/[...path] proxy route and updated ThemeConfig, FormAccountRecovery, FormPassportID, FormPersonalInfo, and FormRecoveryEnforcement ...
Proxy countries API through Next.js and disable testing mode
Direct fetch to api.kamocrm.com failed due to CORS. Added /api/countries proxy route (same pattern as /api/org) and disabled USE_TESTING_MODE.
Use full GitHub URLs for action references in Forgejo workflow
Shorthand refs (e.g. actions/checkout@v4) can fail to resolve on Forgejo runners. Aligned with kamo-internal's working format.
Force light mode to override external dark mode CSS
- Set Tailwind darkMode to 'class' to prevent OS preference from triggering dark utilities - Add !important overrides in globals.css to lock light mode variable...
Force light mode regardless of OS color scheme preference
Removed prefers-color-scheme dark media query so the site always renders in light mode.
Add Buildx setup with insecure registry config to resolve 401 auth errors
Use npm install instead of npm ci to handle dependency conflicts
Add preStop hooks and increase termination grace period to prevent deployment timeouts
Remove unused helper functions and duplicate declarations from Theme.tsx
Like what you see shipping?
Every one of these updates lands in your workspace automatically. Start free and watch it grow week after week.