Changelog
What's new.
Every improvement to the platform, as it ships.
· kamo-shared-library
Add 7 module-access rights (IDs 112-118)
ACCESS_COMMERCE, VIEW_CALENDAR, ACCESS_CHAT, ACCESS_MAIL, ACCESS_VOIP, VIEW_SUPPORT, VIEW_ANALYTICS
· SecurityService
Pass human-readable expiry time to email verification template
Add humanizeMinutes() helper that formats minutes as days/hours/minutes (e.g. "1 day" for 1440 min). Pass as {{expiryText}} to match updated canonical template variable.
· kamo-shared-library
Improve email verification template — URL fallback, expiry text, subject
- Add plain-text verification link below button as copy-paste fallback - Switch expiry variable from {{expiryMinutes}} to {{expiryText}} for human-readable format (e.g. "1 day" instead of "1440 minutes") - Update subject to "Verify the email associated with your {{orgName}} account"
· kamo-internal
Serialize full email HTML with outer frame on template save
- serializeFullEmailHtml wraps inner blocks in the branded outer frame (header logo, title/subtitle, content area, footer logo + org name) using absolute URLs so email clients can fetch the images - Outer frame settings (logo options, title, subtitle) are saved to bodyBlocks.outerFrame and restored on template load - handleSave now uses serializeFullEmailHtml so sent emails match the builder preview
· SecurityService
Add code-based email verification path to /verify-email endpoint
The endpoint now handles both token (link click) and userId+code (manual 6-digit entry). Token path unchanged; code path hashes the supplied code and matches against the active token for that userId.
· KlusterServices
Add weekly image prune and journal vacuum CronJob for k1m1
CronJob runs every Sunday 3am, privileged, pinned to k1m1. - crictl rmi --prune removes unused container images - nsenter journal vacuum enforces 500MB cap - CI/CD step added to deploy-services workflow
· KlusterServices
Add Docs deploy step to workflow
· kamo-register
Require *** on verification page before each verify/resend attempt
*** is reset after every action (success or failure) so a fresh solve is required for each subsequent attempt.
· kamo-register
Rename /resend-verification page to /verification
· kamo-register
Add /resend-verification page for login redirects
Creates a standalone /resend-verification route that accepts ?email and ?userId query params, reusing PostCompletionScreen for a consistent email verification UX. Makes RegisterResponse.alias optional so the page works without a registration alias available.
· kamo-register
Redesign email verification screen + fix resend email bug
- PostCompletionScreen: full-page layout with animated org background, glassmorphism card, logo, visual 6-digit code boxes, success/verified states - resendVerification: pass email in request body (backend requires it)
· kamo-register
Match kamo-internal avatar storage — 3 sizes, MinIO, separate upload step
Crop dialog now produces three PNG blobs (50/150/350px) via canvas, identical to kamo-internal's AvatarManager. After registration returns userId, the blobs are POSTed to **************** (new unauthenticated endpoint guarded by emailVerified=false). avatarUrl is no longer sent in the registration JSON body. Avatar upload failure is non-fatal so registration still completes.
· SecurityService
Add register-photo endpoint for unauthenticated post-registration avatar upload
POST **************** accepts userId + file/fileSm/fileMd/fileLg without a session. Guards: user must be unverified and have no avatar yet, preventing abuse against existing accounts. Stores files to MinIO with the same path structure and sized variants as the authenticated /avatars/photo endpoint.
· kamo-login
Replace EMAIL_NOT_VERIFIED error with rich verification card
When login fails with EMAIL_NOT_VERIFIED the login card is now replaced by a polished "Check your inbox" screen: animated envelope SVG with opening flap and floating sparkles, masked email display, resend-email button with a 30-second SVG countdown ring, success/error/rate-limit feedback alerts, and a "Back to sign in" link. All transitions use AnimatePresence with scale+fade. - app/api/login/route.ts: pass all backend error fields (not just message) so userId reaches the client - **************** new proxy to SecurityService **************** - app/page.tsx: EmailVerifyCard component, emailVerifyState / resendLoading / resendCooldown / resendStatus state, resendVerification callback, 30-second cooldown useEffect, EMAIL_NOT_VERIFIED detection in performLogin
· kamo-register
Extend photo upload to support AVIF and SVG formats
Adds image/avif and image/svg+xml to the file input accept list and validation regex. Updates the hint label to list all six formats. kamo-internal already accepts image/* so no changes needed there.
· kamo-register
Add react-easy-crop photo editor to registration upload step
Mirrors the PhotoCropDialog from kamo-internal's AvatarManager: - crop dialog opens immediately after file selection - pan by dragging, zoom via scroll or slider (1–5×) - dashed circular overlay guide shows the cropped area - canvas produces a 400×400 PNG stored as base64 avatarUrl - re-crop button on the preview lets user adjust after saving
· kamo-register
Add /api/geoip route and wire country auto-detection
Proxies client IP to SecurityService GeoLite2 lookup, then sets the detected country in FormMyCountry automatically on page load.
· SecurityService
Add GET /api/security/geoip/me for client IP country lookup
Reads real client IP from X-Forwarded-For / X-Real-IP headers, does a GeoLite2 lookup, and returns { country_code, country_name }. Used by kamo-register's country auto-detection step.
· kamo-register
Replace h*** with kamo-capcha-widget inline in Finish step
· kamo-register
Add /api/capcha/challenge proxy route
· kamo-register
Add kamo-capcha-widget vendor, remove h*** packages
· kamo-register
SP6 register wizard refactor — split PersonalInfo, add real registration API
- Replace FormPersonalInfo with FormName (name fields) and FormAvatar (Avatar Creator generator with generate/upload/skip modes for 13+) - Delete FormRecoveryEnforcement (recovery fields removed from flow) - Refactor FormPassportID to dual-field layout: alias always shown, email only for 13+; callbacks replace window global - Add registerApi.ts with typed **************** - Add PostCompletionScreen for email verification code entry and SIGNED_IN redirect - Refactor RegisterFlow: dynamic step list based on shouldIncludeAgeCheck and isUser13Plus, replace handle***Submit stub with real API call, render PostCompletionScreen on success
· InitializerService
SP5 migrate KamoCRM agereq to ALL_WORK_ELIGIBLE
Add KamoCRMAgeReqUpdateRunner (order 10) — conditional idempotent UPDATE on startup; WHERE clause checks old value so re-runs are no-ops. Errors are swallowed so startup is not blocked. Update DataLoader to seed ALL_WORK_ELIGIBLE on fresh installs.
· SecurityService
Implement SP4 email verification and registration wiring
- Delete legacy email/VerificationEmail.java (hardcoded SMTP stub) - Add **************** (mirrors recovery package pattern) - Add **************** — token generation/SHA-256 hashing, send/verify/resend flows backed by **************** - Add **************** — alias+email uniqueness checks, User creation, triggers verification email on register - SecurityController: wire RegistrationService into /register endpoint, add EMAIL_NOT_VERIFIED (403) gate on login, add POST /verify-email and POST /register/resend-verification endpoints - Bump kamo-shared-library to 1.4.0
· kamo-shared-library
Add EmailVerificationToken entity + repo + User.alias/emailVerified + UserRepo queries; bump 1.4.0 (SP4)
· InitializerService
Add SP4 email_verification_tokens DDL + User alias/email_verified columns
· kamo-marketing
Add trademark disclaimer to footer legal text
· kamo-internal
Add account settings pages for phone + security questions (SP3)
Adds **************** with API wiring to SecurityService /api/account/*. Syncs nav across all 3 locations.
· kamo-login
Wire real API calls into /recover page (SP3)
Replaces all fakeSubmit() stubs with recoveryApi calls. Adds SMS OTP verify phase, seed email input, new-password step, and token landing via ?token= URL param.
· kamo-login
Add /api/recover proxy + recoveryApi client (SP3)

Your universe is waiting.
Start free in minutes. Add products whenever you are ready — no migration, no new logins.
Free forever — no credit card required