Open doc editor tab synchronously to avoid popup blocker
window.open() after an async fetch is blocked by browsers because it's no longer in the user-gesture context. Open a blank tab immediately on click, then naviga...
Add DOCS_EDITOR to fallback org features in layout and API route
The layout's server-side org fetch often uses the fallback org (no auth context during SSR), which was missing DOCS_EDITOR. This prevented the New Document butt...
Remove COPY .mvn/ from Dockerfile to fix CI build
The .mvn directory was empty and untracked, causing builds to fail. Maven is already provided by the base image.
Enable Hibernate schema auto-creation for email_metadata
Add **************** property so Hibernate creates missing PostgreSQL schemas before creating tables.
Add OTK auth, org-branded WOPI, cached MinIO client
- WopiController: look up org title from JWT orgId claim for dynamic BrandName ("{orgTitle} Docs") in CheckFileInfo response - DocumentController: require OTK...
Change ddl-auto from none to update for auto schema management
Hibernate was not creating the email_metadata schema and conversations table because ddl-auto was set to none in the k8s configmap.
Add New Document button to NavTop with DocsService integration
Adds DOCS_EDITOR app type (ID 16), NewDocumentButton component with document type picker popover, API proxy route for DocsService, and NavTop integration gated ...
Review fixes - dialect, error handling, CI/CD manifests
- Fix Hibernate dialect to CockroachDialect (matching K8s configmap) - Separate token validation from business logic in checkFileInfo - Add Docs and ingress man...
Add wopi-*** for DocsService
Adds WOPI JWT signing secret used by DocsService for Docs access tokens. Deployed to both K1M1 and K2M1 clusters.
Use native query for markConversationRead to resolve Hibernate 6.2 type mismatch
CURRENT_TIMESTAMP in JPQL returns java.sql.Timestamp which doesn't match the Instant-typed updatedAt field. Native query with NOW() bypasses this.
Use database-level timestamps instead of Instant.now()
Replace all @Builder.Default Instant.now() and @PreUpdate methods with @CreationTimestamp(source=DB) and @UpdateTimestamp(source=DB) so the database is the sing...
Migrate JPA entities and repos to kamo-shared-library
Entities and repositories moved to **************** in the shared library. All imports updated to reference shared lib.
Add email metadata entities and repositories
Migrate JPA entities and repos from EmailService to shared library so KamoInitializerService can manage all schemas via ddl-auto.
Use native query for PostgreSQL text[] column in ConversationRepository
MEMBER OF is not supported by Hibernate for @JdbcTypeCode(ARRAY) fields. Switch to native SQL with ANY() for folder_ids array lookup.
Add search UI, virtual scrolling, IndexedDB caching, and offline mode
- Add SearchBar with operator autocomplete, saved/recent search suggestions - Add AdvancedSearchPanel with structured field-based query builder - Add VirtualMes...
Add IMAP connection pool, search intelligence, and delta sync endpoints
- Add Apache Commons Pool2 keyed connection pool for IMAP Store reuse (3/account, 500 total, 10min idle eviction) - Migrate EmailImapService from ConcurrentHash...
Add enterprise email organization — labels, filters, shortcuts, quick actions
Plans 2-3: conversation threading views, email API layer with zustand store, label picker, filter rule builder, smart folder modal, keyboard shortcuts with help...
Like what you see shipping?
Every one of these updates lands in your workspace automatically. Start free and watch it grow week after week.