Complete Choose a Plan flow end-to-end
- Wire PlanCalculator into PlansBillingTab dialog (replaces placeholder) - Fetch available plans from billing API on page load - Handle plan submission: creates...
Hide Plans & Billing tab for root KamoCRM org
KamoCRM org owners have everything enabled at no cost — they should never see the billing tab. The tab is now conditionally rendered only for child organization...
Integrate Stripe billing system across the platform
- New billingApi.ts client with full TypeScript types for all billing endpoints (subscriptions, payment methods, invoices, credits, usage, config, admin) - ...
Add concurrency group to prevent duplicate workflow runs
When a push triggers a workflow and workflow_dispatch is also fired (or two pushes arrive in quick succession), both runs would execute simultaneously. Adding a...
Add Open in Docs button for editing documents, spreadsheets, presentations
- New "Open in Docs" button (EditNote icon) in doc manager Actions column for .docx, .xlsx, .pptx, .odg, .doc, .xls, .ppt files - Opens document in Docs edito...
Build integrated auto lead imports UI with full endpoint management
Complete rewrite of LeadAutoImportManager with production-ready features: - Endpoint CRUD with unique webhook URLs for 3rd-party lead vendors - Copy-to-clipboar...
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...
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...
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...
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...
Import blake3 from blake3/browser to initialize WASM correctly
blake3/esm/browser requires manual WASM provisioning; blake3/browser does it automatically.
Implement document sharing system with share dialog, Shared With Me tab, and shareable links
- Add ShareDocumentDialog with permission-based member/team/dept/jobTitle recipient picker - Wire Share button in DocManager toolbar (MY_DOCS only) - Add Shared...
Real BLAKE3 hashing and pre-upload dedup check in doc manager
- Replace BLAKE3 placeholder with real blake3 WASM in fileHashing.ts - Add check-hashes and register-existing API proxy routes - MultiFileUploader now checks se...
Gate Folder and Doc Type columns/fields on allowFolders and allowDocType
When folder or doc type features are disabled for an assoc type, hide the corresponding datagrid columns and upload form fields consistently.
Align upload fields with consistent MUI TextFields, always show folder and doc type
Replace raw <select> elements with MUI TextField select for consistent styling and alignment with the Description field. Folder and Doc Type fields are now alwa...
Accept all file types for upload, use server-side blacklist instead of whitelist
Replace hardcoded ACCEPTED_EXTENSIONS whitelist with server-provided extBlackList from assoc-config. All file types are now uploadable unless explicitly blackli...
Redesign Prepare Selected tab with reordering, preview, and bulk download
Replace mock Options panel with functional document preparation UI. Documents are reorderable via drag-and-drop and arrow buttons, with checkboxes for deselecti...
Use systemDocsOnly flag for System Docs tab, show all docs in Original Docs
Original Docs tab now shows all docs for this org/assocType without filtering by assocObjectId. System Docs tab sends systemDocsOnly: true to only get docs with...
Default assocObjectId to current member ID for proper doc tab filtering
When no oid URL param is provided, Original Docs and Modified Docs tabs now query by the current member's ID, while System Docs queries with blank assocObjectId...
Rewrite MultiFileUploader with queue-based upload and per-file settings
Restructure DocManager tabs, add Edit icon, embed editor and multi-file uploader
Create MultiFileUploader component with per-file conversion pipeline
Remove /doc/sign/create and /doc/sign/edit routes
Editor is now embedded inline in the doc manager page.
Remove scope/assocType from SettingsSignersTab, rename to Doc Description, add Active Member signer
Add memberType to user info, rename templateName to docDescription in template settings store
Add memberType field from Member entity discriminator column to the user-info API response and useUserInfo hook. Rename templateName to docDescription in templa...
Raise annotation toolbar z-index to 1000 so it always renders above page elements
Fix watermark above-layer z-index, add page right-click menu, add page above/below, improve drag indicator
- ModifierLayer: 'above' pass now uses zIndex 20 so watermarks render on top of fields and annotations - PdfCanvas: right-click context menu with rotate, delete...
Place dropped field at ghost's exact visual position
Use active.rect.current.translated (the DragOverlay ghost's client rect) instead matches the translated rect, so the field now lands precisely where the user re...
Drag-and-drop field placement, floating annotation toolbar, and PDF page spacing
- Replace click-to-place with @dnd-kit drag-and-drop for all signature, identity, and input field tools; drag ghost matches the exact visual appearance of the...
Route all esig API calls through forwardToApi() to fix save failures
All 10 esig route handlers were pointing to ESIG_SERVICE_URL which resolves to a non-existent kamowsesig-service proxy. Replace every handler with forwardToApi(...
Add layer position option to Watermark modifier (behind / above content)
- WatermarkModifier gains a 'layer' field: 'behind' | 'above' (defaults to 'behind') - ModifierLayer now takes a 'pass' prop ('below' | 'above'): - below pass...
Add Watermark modifier to esign toolbox
- WatermarkModifier type: logoType (full/simple), startPage, endPage, rotation (−180–180), size (10–90% of page width), opacity (2–60%), solidColor toggle, colo...
Extend Label modifier to full 8-position grid with LM/RM rotation
- LabelModifier.position now uses ModifierPosition8 (same 8-position grid as Page Numbers) - LM (Middle Left): each line rendered as a vertical pill with writin...
Add Tools/Modifiers tabs to esign Toolbox with live canvas overlays
- Split Toolbox left sidebar into Tools and Modifiers tabs - Modifiers tab: split list + settings panel (Option B) - Page Numbers modifier: start/end page, 8-...
Correct rotated thumbnail positioning and restore rotation transform
Two bugs in ThumbnailCanvas: 1. Replaced `height: \`${displayAspect * 100}%\`` (percentage height on abs- positioned element — unreliable when containing bl...
Fix floating zoom control visibility and polish thumbnail placeholders
- Move floating zoom controls outside the scroll container and use position:absolute so they remain visible at all times regardless of scroll position; offs...
Page selection with animated glow border synced between canvas and thumbnail sidebar
- DesignTab holds selectedPageIndex as the single source of truth - Clicking any page in the main canvas selects it (onPageSelect) - Clicking a thumbnail select...
Move scroll ownership from PdfCanvas to canvasContainerRef
PdfCanvas root Box previously had overflow-auto + h-full, making it its own scroll container. This meant: - scrollbarGutter: stable on canvasContainerRef had no...
Like what you see shipping?
All of it arrives in your workspace on its own. Start on the free plan and read this page again in a month.
