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 slide...
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.
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 count...
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 FormRecoveryEn...
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 s...
Implement SP4 email verification and registration wiring
- Delete legacy email/VerificationEmail.java (hardcoded SMTP stub) - Add **************** (mirrors recovery package pattern) - Add **************** — token gene...
Add EmailVerificationToken entity + repo + User.alias/emailVerified + UserRepo queries; bump 1.4.0 (SP4)
Add SP4 email_verification_tokens DDL + User alias/email_verified columns
Add account settings pages for phone + security questions (SP3)
Adds **************** with API wiring to SecurityService /api/account/*. Syncs nav across all 3 locations.
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.
Add AccountSettingsController + Service for phone + security questions (SP3)
Allows logged-in users to set/verify phone and configure 3 security questions. Routes to /api/account/* (session-authenticated via KSESSION_DATA).
Add BulkTextSmsClient + EmailTemplateServiceClient + PasswordRecoveryController (SP3)
Full password recovery flow: email-link, SMS OTP, security questions, seed phrase. Routes to /api/recover/* (unauthenticated). Uses SP1 email pipeline + VOIPSer...
Add InternalAuthFilter + POST /api/bulktext/send for service-to-service SMS (SP3)
Add recovery entities + repos; bump to 1.3.0 (SP3)
Adds PasswordResetToken, SmsOtp, RecoverySession, AccountVerificationCode JPA entities with corresponding repositories for SP3 recovery flow.
Add SecurityQuestionCatalog enum + sq1/2/3 + seedPhraseHash to User (SP3)
Add SP3 recovery table DDL + User column additions to SchemaCleanupRunner
Route preview through Browser's backend-rendered modal (part of SP2)
The EmailTemplateBrowser now owns the Preview modal directly, so the Manager no longer needs to intercept row-level preview requests and redirect to edit mode.
Wire EmailTemplateEdit to real API
Hydrates from templateApi.get, saves via templateApi.update. Category dropdown is API-driven with inline category-create affordance. Variables picker reads from...
Wire EmailTemplateBrowser to real API + add System Defaults tab
Replaces ~140 lines of mock data with templateApi.list() calls. Conditional fifth tab 'System Defaults' appears only for top-level-org admins and renders from r...
Add EmailTemplatePreview modal
Opens on row-action Preview. Backend-rendered via templateApi.preview(); result displayed in a sandboxed iframe for style isolation. Matches the exact code path...
Add templateApi + categoryApi + variableContracts client modules
Wraps SP1's /api/email/templates/* and **************** endpoints with typed TypeScript helpers. variableContracts mirrors SP1's TemplateKeys Javadoc so the edi...
Wire EmailTemplateSeedClient into ****************
Thin RestTemplate client that POSTs to EmailService's **************** after an org + owner TeamMember are persisted. Retries twice with backoff; failure throws...
Add EmailTemplateCategoryController REST endpoints
**************** CRUD. Delete response includes reassignedCount — the number of templates that became uncategorized as a result of removing the category. Sessio...
Add EmailTemplateController REST endpoints + DTOs
Exposes /api/email/templates/* CRUD + preview + duplicate + reset-to-default + service-to-service /send + /seed-org/{orgId}. Top-level orgs (no parent) addition...
Add InternalAuthFilter for service-to-service endpoints
Validates X-Internal-Auth header on /api/email/templates/send and /api/email/templates/seed-org/* paths. Other paths bypass this filter (user session auth handl...
Add EmailTemplateCategoryService — CRUD for org-scoped categories
Case-insensitive name uniqueness per org enforced at service layer (matches the partial unique index in the DB). Deletion nulls category_id on affected template...
Add EmailTemplateService — CRUD + send + seed + reset-to-default
Core orchestrator for transactional email. sendToUser resolves the template, renders subject/body, picks the org's primary domain from Organization.domains, and...
Add NoReplySenderService for 'NoReply@{domain}' from-address
Single source of truth for transactional-email from addresses. Accepts a domain string, lowercase-normalizes it, returns "NoReply@<domain>". Callers must resolv...
Add TemplateRenderer for {{var}} substitution
Stateless regex-based renderer. Missing vars substitute empty string and emit a WARN log with templateKey + orgId for attribution. No HTML escaping in v1 — valu...
Add EmailTemplateSeedRunner for SYSTEM + per-org seeding
Runs at @Order(20) on KamoInitializerService startup. Loads canonical templates from kamo-shared-library resources; upserts SYSTEM rows (no clobber); backfills ...
Add partial unique indexes + CHECK constraints for email_templates
Hibernate ddl-auto can't generate partial unique indexes or computed-CHECK constraints. This commit adds them via the existing idempotent DDL runner pattern aft...
Add CanonicalTemplateLoader + CanonicalTemplate record
Reads the three REQUIRED templates (WELCOME, PASSWORD_RESET, EMAIL_VERIFICATION) from classpath resources at **************** Consumed by KamoInitializerService...
Add canonical HTML + JSON for WELCOME, PASSWORD_RESET, EMAIL_VERIFICATION
Source-of-truth content for SYSTEM rows. Loaded at KamoInitializerService startup by CanonicalTemplateLoader and UPSERTed into email_templates. Part of SP1.
Add EmailTemplate entity + repository
Stores one SYSTEM row per template_key (org_id NULL, is_system TRUE) plus one clone per org per template_key. Soft-reference org_id/category_id. DB- driven time...
Add EmailTemplateCategory entity + repository
Org-scoped categories for email templates. Soft BIGINT org_id (no FK) matches existing patterns. Case-insensitive name uniqueness per-org is enforced via a part...
Add TemplateStatus enum + TemplateKeys constants for transactional templates
Declares the REQUIRED/CUSTOM/ARCHIVED lifecycle states and the three required template keys (WELCOME, PASSWORD_RESET, EMAIL_VERIFICATION). Variable contracts fo...
Seed KamoCRM with ALL_WORK_ELIGIBLE on fresh installs
The createOrg() helper applies this single argument to both ageReqTypeMember and ageReqTypeTeamMember; consistent with platform convention. Pairs with KamoCRMAg...
Add one-time runner to migrate KamoCRM agereq to ALL_WORK_ELIGIBLE
Conditional idempotent UPDATE runs on service startup; WHERE clause checks the expected old value so re-runs are no-ops. Errors are logged and swallowed — start...
Add Powered by KamoCRM backlink to /welcome landing page
The actual meet.{domain} landing page is welcome/index.html — a static HTML page served directly by nginx that handles the pre-auth flow (capture display name /...
Integration logos + accurate /integrations metadata
Integration pages and hub now display vendor logos (reusing the existing **************** assets that the homepage TechStackBanner already uses). Removed stale ...
Expand /integrations to all homepage-listed providers
Aligns the /integrations page with the actual integrations exposed by the homepage (TechStackBanner). Adds 28 new integration pages matching what the product ac...
Add Home Mortgage Brokers industry page
New industry solution page at /solutions/mortgage-brokers for mortgage brokerages and loan originators. Follows the honest platform framing: core CRM + comms + ...
Add 92 SEO pages — industries, integrations, glossary
Implements Tier 1 of the SEO content expansion plan: three new content subsystems with a total of 92 new crawlable URLs plus 3 hub pages. 1. /solutions — 36 in...
Like what you see shipping?
Every one of these updates lands in your workspace automatically. Start free and watch it grow week after week.