Add public lead intake endpoint for 3rd-party lead submission
Adds LeadIntakePublicController at /api/public/lead-intake/{token} that accepts lead data in any format (JSON, form-urlencoded) from 3rd-party vendors and forwa...
Add Lead Intake system entities, repos, DTOs, and service
Adds the complete data layer for the automated lead intake system: - 4 entities: LeadIntakeEndpoint, LeadIntakeFieldMapping, LeadIntakeRawPayload, LeadIntakePro...
Bump version to trigger rebuild with updated kamo-shared-library
Rebuilds the Docker image with the fixed Member entity (memberType field removed) so the Hibernate SQL no longer selects security_level from the member_team_mem...
Replace paginated count loop with single backend today-count endpoint call
Chat *** — fix verify timing and improve banner copy
- ***Provider: triggerVerify effect now depends on challengeUrl so verify() is only called after the widget is mounted; uses rAF to ensure the DOM has paint...
Remove totalPages dependency in today count — paginate until empty page or older entry found
Integrate kamo *** (proof-of-work) into contact form, demo form, and chat widget
- Add ***Provider reusable component wrapping Capcha-widget with dark theme styling - Contact form: auto-verify on focus, gate submission until verified - Demo ...
Remove memberType field entirely to prevent Hibernate duplicate column
The previous fixes (@Transient on field, @Access(AccessType.FIELD) on class) were insufficient. Bytecode inspection revealed Lombok's @Setter generated a public...
Email as paid add-ons, not included free
- KamoMail Hosting: $5/user/mo add-on on all plans - 3rd Party Email Integration: $2/user/mo add-on on all plans - Email hosting feature reverted to "Add-on" in...
Email as paid add-on, update all fallback pricing data
- KamoMail Hosting: $5/user/mo add-on (not free — liability concern) - 3rd Party Email Integration: $2/user/mo add-on - Updated calculator page fallback data (w...
Add animated cookie consent banner with glassmorphism design
Floating bottom-left card with spring animations, essential/analytics cookie toggles, localStorage persistence, and a Cookie Settings link in the footer to re-o...
Use 18DOFF promo code, update expiry to April 30, 2026
Reverted promo code from EARLYBIRD back to 18DOFF to match nav headers. Updated nav text from "Prelaunch" to "Early Bird" for consistency. Set offer expiry to 2...
Update fallback pricing data to match new production prices
The API returns 401 so the marketing site uses hardcoded fallback data. Updated all fallback plans, addons, bundles, and comparison table to match the new prici...
Update marketing site for new production pricing
- Added eSignatures to addon icon maps and calculator toggle - Email hosting shown as "Included Free" instead of paid add-on toggle - Updated FAQs: added TCO co...
Update KamoCRM pricing to production go-to-market rates
- Starter: $34/mo ($28 annual), Business: $72/mo ($59 annual), Enterprise: from $109/mo ($99 annual) - Business plan expanded from 50 to 100 users - Added eSign...
Add @Access(AccessType.FIELD) to Member to stop Hibernate mapping getMemberType() as a column
The previous fix (@Transient on the memberType field) was insufficient. Hibernate 6 was still discovering the public getMemberType() method via property scannin...
Show uploader name, widen date column, merge extension icon into file name
- Uploaded By: was always empty — field name was correct but backend never set createdByName; now resolved on the backend side - File Name column: prepend fil...
Populate createdByName in DocumentMetadata from uploader member
convertToMetadata() now reads **************** and sets createdByName so the Uploaded By column in the doc manager shows the actual uploader's name.
Track uploaded-by member on Img entity
Add createdByMember (ManyToOne) field to Img so the uploader is persisted at upload time. ImageService.uploadDocument() now sets it from the calling member. Hib...
Resolve security_level SQL error caused by duplicate MEMBER_TYPE column in Hibernate 6
Member.java mapped MEMBER_TYPE both as @DiscriminatorColumn and as an explicit @Column field. Hibernate 6 selected the column twice in the parent table projecti...
update RRWebplayer config to fix seek issues and warning suppression
Expose thumb and converted file sizes in DocumentMetadata
Adds thumbFileSize, convertedFileSize, and convertedThumbFileSize to the DocumentMetadata DTO and populates them in convertToMetadata() from the ImgDat and its ...
Add stored size tooltip to Size cell in doc manager
Tooltip shows the breakdown of actual storage used per document: original file, thumbnails (original + converted combined), and converted doc — plus a total. Th...
fix blank screen by using router.replace instead of redirect in useEffect
Skip loading screen for file downloads in NavigationInterceptor
Blob URLs and links with the download attribute never cause page navigation, so the global click handler now returns early for these — preventing the "Loading K...
Surface save errors and revert optimistic update in email provider selector
When saving a non-configurable provider (KamoMail, ParentOrg, NotConfigured) failed, the error was set in state but never displayed in the list view, and the op...
Move doc manager action buttons to toolbar search row
- Removed Create Document, Upload Document, Bulk Upload, and Refresh from the gradient hero header - Hero header is now title/description only - Create Document...
Correct security_level column reference in login SQL
security_level is on the members table (m), not member_team_member (e). The wrong alias e.security_level caused the entire SQL to fail silently, so memberType w...
Restore team-member/member permission model for share dialog
Team members (memberType=TEAM_MEMBER) bypass all gates. Regular members are gated by SHARE_DOCS_* rights. Legacy sessions without memberType get temporary full ...
Allow any authenticated member to share documents
Remove role-based gate on share dialog — any logged-in member can share. The previous check required isTeamMember (from session memberType) or specific SHARE_DO...
Correct member name access in resolveAlias endpoint
member.getNameFirst() doesn't exist — name is on User.getName(). Use getMemberDisplayName() helper which correctly navigates the member -> user -> EmbNameFull p...
Store memberType in Redis session at login
Adds CASE WHEN e.id IS NOT NULL THEN 'TEAM_MEMBER' ELSE 'MEMBER' END to the login SQL query and passes the result through createSession into Redis, so frontend ...
Import blake3 from blake3/browser to initialize WASM correctly
blake3/esm/browser requires manual WASM provisioning; blake3/browser does it automatically.
Add document sharing endpoints to ImagingController
Adds: shares/by-image, shares/create, shares/update/{id}, shares/delete/{id}, shares/shared-with-me, **************** **************** shares/resolve-alias
Add findActiveSharesForSwMember and countNewSharesForSwMember queries to ImgShareRepository
Add null safety checks in MemberRightsAppliedService and fix role save in MemberService
Add ?next= forward parameter support for post-login redirect
Captures ?next=/path from URL and carries it through both manual login and auto-login flows, appending it to the OTK redirect URL so kamo-internal can redirect ...
Like what you see shipping?
Every one of these updates lands in your workspace automatically. Start free and watch it grow week after week.