Skip to content
KAMOUniverse

Changelog

What's new.

Every improvement to the platform, as it ships.

  1. · SecurityService

    Implement hash-based file storage for avatars

    - Generate SHA-256 hash from avatar ID after persistence - Store hash in database fileHash field - Upload files to MinIO using hash-based naming: {hash}.{fileExtension} - Update all URL generation to use hash instead of ID - Add backward compatibility: generate hash for old avatars without hash - Update photo upload, Avatar Creator creation, update, and delete operations - Prevents enumeration attacks by making file names unpredictable

  2. · kamo-shared-library

    Add fileHash field to Avatar entity for secure file storage

    - Add fileHash column to store SHA-256 hash of avatar ID - Hash is used for MinIO file naming to prevent enumeration attacks - Format: {hash}.{fileExtension} instead of {id}.{fileExtension}

  3. · kamo-internal

    Rebuild avatar UI - modern, interactive, polished. Backend returns URLs directly

  4. · SecurityService

    Rebuild avatar system - backend generates presigned URLs directly like backgrounds

  5. · kamo-internal

    Add MinIO credentials to k8s configmap

  6. · kamo-internal

    Generate presigned URLs in Next.js using MinIO SDK with theme domain

  7. · kamo-shared-library

    Add getPresignedUrlWithEndpoint method for custom endpoint presigned URLs

  8. · kamo-internal

    Add Avatar Creator avatar creation, background management with reordering, and full avatar/background library support

  9. · SecurityService

    Add avatar and background management endpoints

  10. · kamo-shared-library

    Add AvatarPhoto and AvatarAvatar Creator classes, refactor Avatar inheritance structure

  11. · SecurityService

    Organize MinIO storage with folder structure and add Avatar Creator SVG support

    - Updated storage paths to use organized folder structure: * members/avatars/photos/ for photo avatars * members/avatars/vector/ for Avatar Creator SVG avatars * members/backgrounds/ for background images - Added SVG file generation and storage for Avatar Creator avatars - Avatar Creator avatar creation/update now accepts SVG string and saves to MinIO - All presigned URL generation updated to use new folder paths - SVG files are saved when Avatar Creator avatars are created or updated

  12. · SecurityService

    Add avatar, background, and member profile management endpoints

    - Added AvatarController with CRUD operations for avatars (photo and Avatar Creator) - Added UserBackgroundController for managing user background images - Extended MemberController with GET/PUT endpoints for member profile data - All endpoints support MinIO uploads to 'internal' bucket with presigned URL generation - Avatar endpoints support photo uploads and Avatar Creator avatar creation - Background endpoints support member-specific backgrounds - Member profile endpoints support updating avatar selection from user's collection

  13. · kamo-shared-library

    Add Avatar and UserBackground repositories and presigned URL support

    - Added AvatarRepository with methods to find avatars by user - Added UserBackgroundRepository with methods to find backgrounds by user/member - Added getPresignedUrl methods to MinIOStorageService for generating temporary access URLs - Presigned URLs default to 7 days expiry, configurable expiry time

  14. · kamo-shared-library

    Add UserPhoto and UserBackground entities with User/Member relationships

    - Created UserPhoto entity for storing user and member profile photos - Created UserBackground entity for storing user and member background images - Both entities support user-level (member=null) and member-level (member set) associations - UserPhoto includes isSet field to indicate which photo is currently active - UserBackground includes sortId field for ordering multiple backgrounds - Both entities use EmbRecordState embeddable for tracking creation, updates, and active status - Added appropriate database indexes for performance optimization

  15. · kamo-internal

    Add shared MemberHeader component with member-level avatar/background overrides

    - Created shared MemberHeader component with background images and avatar display - Added member-level override options for avatar and background (use default user vs member-specific) - Updated ProfileTab to use shared MemberHeader component - Updated MembershipPermissionsTab to use shared MemberHeader component - Header now appears on both profile and membership-permissions tabs - Added toggle switches for "Use Default User Avatar" and "Use Default User Background" - Supports custom background image URL when not using default theme background

  16. · kamo-marketing

    Add touch support to Magneticcoder for mobile devices

  17. · kamo-internal

    Change grid to autoHeight layout to show all records without scrollbar

    - Set domLayout to autoHeight so grid expands to fit all rows - Remove overflow: hidden from grid container boxes - Remove height: 100% constraint from grid wrapper box - Grid now shows all records on current page without vertical scrollbar

  18. · kamo-internal

    Replace Address column with State and Street columns

    - Remove Address column and AddressRenderer - Add State column after Contact (shows subdivision/state code) - Add Street column after State (shows 'street, city' format) - Replace addressFilterValue with stateFilterValue and streetFilterValue - Add State dropdown filter with all US states - Add Street text filter field - Update filtering logic for State and Street columns - Remove address filtering from resetFilters

  19. · kamo-internal

    Update column widths to specified values

    - Change Lead ID column width from 300px to 245px - Contact column remains flex: 1 to take up remaining width - Change Status column width from 200px to 65px - Change Sub Status column width from 200px to 120px - Change Agent column width from 150px to 120px - Update corresponding filter field container widths to match columns - Add explicit minWidth and maxWidth constraints where needed

  20. · kamo-internal

    Update mock lead IDs to random alphanumeric and set address column to 170px

    - Add generateRandomLeadId function to create random alphanumeric strings of length 13 - Change mock lead IDs from sequential numbers to random alphanumeric (e.g., '34FDK69HWGPPK') - Update address column width from 250px to 170px with explicit min/max - Update address filter container width to match 170px

  21. · kamo-internal

    Update date column widths and replace action buttons

    - Change date column widths from 155px to 170px (Created and Assigned) - Update date filter field containers to match 170px width - Replace 'Export Selected', 'Share', and 'Delete Selected' buttons with: - 'Reassign Selected ({amount selected})' with People icon - 'Change Status of Selected ({amount selected})' with SwapHoriz icon - Import People and SwapHoriz icons from Material-UI - Buttons dynamically show selected count in labels

  22. · kamo-internal

    Add thin light gray border bottom to secondary tabs

    - Add borderBottom: '1px solid rgba(0, 0, 0, 0.12)' to status tabs container - Matches the styling found on /leads/view/ page - Creates visual separation between tabs and content below

  23. · kamo-internal

    Add gray backgrounds to remaining filter fields and align to bottom

    - Change filter row alignment from center to flex-end (bottom alignment) - Add gray background (#f8fafc) to all remaining filter field containers - Add border radius and padding to match date filter styling - Regular filter fields align to bottom, matching height of bottom date field - Date fields remain taller with stacked layout - All filter fields now have consistent gray background treatment

  24. · kamo-internal

    Stack date filter fields vertically with isolated gray background

    - Change date filter fields from horizontal to vertical layout (flexDirection: column) - Add gray background (#f8fafc) only to date filter boxes, not entire filter row - Set explicit width of 220px for date filter fields - Remove gray background from main filter row container - Add border radius to date filter boxes for better visual separation

  25. · kamo-internal

    Improve UI layout and increase mock data

    - Make text smaller for date filter fields (fontSize: 0.75rem for input, 0.7rem for labels) - Move Quick Search to same line as status tabs, aligned to the right - Increase mock leads from 50 to 250 - Remove Actions column from grid - Clean up layout by removing duplicate search bar section

  26. · kamo-internal

    Add date range filter components for Created and Assigned columns

    - Add state variables for Created and Assigned date range filters (start/end dates) - Create date range filter components with Start Date and End Date fields - Add date range filter components to custom filter row for Created and Assigned columns - Update filteredRowData logic to filter by date ranges - Empty date fields mean no restriction (all dates for that end) - Update resetFilters function to clear date range filters - Date filters support partial ranges (only start, only end, or both)

  27. · kamo-internal

    Make contact names clickable links and add double-click to open lead

    - Update ContactRenderer to display first and last name as underlined clickable links - Add onClick handler to contact names that opens the lead via onViewLead or navigates to /leads/view/:id - Add onRowDoubleClicked handler to AgGridReact to open lead when row is double-clicked - Contact names now have primary color, underline, and hover effect - Double-clicking anywhere on a row opens the lead

  28. · kamo-internal

    Add icons to sub-status dropdown filter and update Contracts Sent

    - Update 'Contracts Signed' to 'Contracts Sent' to match Java enum - Change icon for Contracts Sent from Assignment to Send icon - Add icons to sub-status dropdown filter menu items - Import Send icon from Material-UI - Icons display next to each sub-status option in the dropdown filter

  29. · kamo-internal

    Add unique icons for each sub-status with parent status colors

    - Add unique, relevant icons for each sub-status (e.g., PersonAdd for New Lead, Message for Left Message) - Icons maintain parent status color (green for Fresh, blue for Reckoning, orange for Farm, red for Grim, gray for Void) - Import additional Material-UI icons for sub-statuses - Update getSubStatusIcon to map each sub-status to its unique icon - Fresh: PersonAdd, Message, Event, Schedule, PlayArrow, Description, ShoppingCart, Payment - Reckoning: Sync, Assignment, AssignmentTurnedIn, Build, LocalShipping - Farm: LocalFlorist, ThumbDown, PhoneDisabled, Business, AttachMoney, AccessibilityNew, Block - Grim: Print, SignalWifiOff, PersonOff, Warning, DoNotDisturb, RestoreFromTrash - Void: Science, ContentCopy

  30. · kamo-internal

    Add icons to sub-status column matching parent status colors

    - Add getSubStatusIcon helper function to determine icon based on parent status - Sub-status icons use same icons and colors as their parent status - Fresh sub-statuses: green NewReleases icon - Reckoning sub-statuses: blue Gavel icon - Farm sub-statuses: orange Agriculture icon - Grim sub-statuses: red raven icon - Void sub-statuses: gray Cancel icon

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