Add GET **************** endpoint to serve per-page PNG thumbnails
Generate per-page thumbnails for all PDF pages, store as {id}_thumb_p{n}.png
Add thumbPageCount field and findNeedingPageThumbnails query for per-page thumbnail support
Eager PDF rendering, natural scale normalisation, no horizontal scroll
- PdfCanvas: replace IntersectionObserver with eager render-all-pages. The observer-based approach was unreliable when the design tab starts with display:no...
Upgrade to Next.js 16.2.3, TypeScript 6.0.2, Node 24, React 19 types
- Next.js 16.2.3 with Turbopack as default dev server - TypeScript 6.0.2 with erasableSyntaxOnly and ES2022 target - @types/react@^19 and @types/react-dom@^19 (...
Eliminate removeChild DOM conflict in PDF thumbnail rendering
Replace container.innerHTML + appendChild pattern in ThumbnailCanvas with a React-managed <canvas> ref. The old approach cleared React-owned DOM nodes directly,...
Handle applicablePlanIds and applicableBillingCycles as string arrays
These fields are typed as string[] but had .split(",") calls on them, causing TypeScript build failures.
Add CockroachDB transaction retry for template init endpoint
CockroachDB serializable isolation can trigger RETRY_SERIALIZABLE on the read-then-write pattern in initTemplate. Retries up to 3 times with backoff when detect...
Revert proxy routes to OTK auth, remove unused esigProxy helper
OTK is the correct auth mechanism — the prior session-header approach bypassed the established security pattern. All esig proxy routes now use generateOTK from ...
Correct OTK Redis key format and add imaging template list endpoint
OTK keys use OTK<id> and ***<id> (no colon) matching the Next.js proxy. Added POST /api/esig/templates/list to query imaging templates via shared library ImgRep...
Use direct session headers instead of OTK for ESigService proxy routes
Read *** session from Redis in Next.js and pass orgId/memberId as trusted headers to ESigService via internal K8s DNS. Removes OTK dependency.
Replace OTK auth with trusted session headers for internal K8s calls
ESigService is internal — the Next.js backend reads the session from Redis and passes orgId/memberId/userId as X-Org-Id, X-Member-Id, X-User-Id headers. No OTK ...
Use init endpoint to find-or-create template by imgId on editor load
The create page passes imgId in the URL. The edit page now calls the init endpoint to find or create the ESignTemplate, then uses the returned UUID for design o...
Add template init endpoint to find-or-create templates by imgId
The create page uploads to the imaging system and redirects with imgId. The edit page now calls POST /api/esig/templates/init with the imgId to find an existing...
Scan all shared library repository packages to resolve bean dependencies
ComponentScan picks up shared library services which depend on repos in donotmodify.dao.repos and commerce packages — must scan those too.
Remove .mvn/ copy from Dockerfile — directory does not exist in this project
Add e-signature template editor with design canvas, signers, and versioning
Complete rewrite of /doc/sign/edit page with tabbed interface (Settings & Signers, Design), PDF.js canvas with draggable field overlay, annotation tools, signer...
Initial ESigService Spring Boot project for e-signature template management
New microservice with REST API for e-signature template CRUD, signer management, design version snapshots, and field link tracking. Includes OTK auth filter, Fo...
Add e-signature template entities, enums, and repositories
New JPA entities for the e-signature template design system: ESignTemplate, ESignTemplateSigner, ESignTemplateDesignVersion, and ESignTemplateFieldLink with sup...
Correct field name mapping between backend and frontend for access level API
Map backend securityLevelId→accessLevel, isOrganizationOwner→isOwner, memberType→isTeamMember in API route. Fix right check to use EDIT_MEMBER_ACCESS_LEVEL inst...
Add static fallback for offer page when subscription API unavailable
The **************** table doesn't exist in production yet, so the API returns an error. Fall back to hardcoded promotion and plan data so the offer page works ...
Update ApiPromotion type to match new List<String> backend response
applicablePlanIds and applicableBillingCycles are now arrays, not JSON strings.
Extend 18DOFF promotion end date to 2026-12-31
The April 14 end date was causing the offer page to show as expired.
Remove redundant webhook secret validation, APIService handles HMAC auth
Validate Forgejo HMAC-SHA256 signature instead of plain secret header
Forgejo sends webhook secret as X-Gitea-Signature / X-Forgejo-Signature HMAC-SHA256 hash, not as a plain header value. Read body, verify HMAC, then forward to S...
Server-side stats for real totals, infinite scroll, accurate filter counts
Stats bar and filter pill counts now come from /api/changelog/public/stats (real DB aggregates, not loaded-page counts). Replaced Load More button with Intersec...
Remove KamoGamesRoboCluck from changelog public projects, add backfill scripts
Add /api/changelog/public/stats endpoint for aggregate counts by type and project
Add findByProjectIn query to CommitLogRepository for stats endpoint
Force changelog page to render dynamically, not statically at build time
Truncate commit titles exceeding 500 chars to prevent DB insert failures
Add webhook secret validation to changelog endpoint
Defense-in-depth: validates *** header on the SecurityService side in addition to APIService gateway validation.
Expose changelog webhook through APIService with secret key auth
Adds POST /api/changelog/webhook route that validates *** header before forwarding to SecurityService. Secret configured via CHANGELOG_WEBHOOK_SECRET env var / ...
Remove JSON parsing workarounds for subscription plan ID arrays
Backend now returns proper arrays instead of JSON strings, so the try/parse/catch fallback logic is no longer needed in add-on, bundle, and promotion grid cell ...
Use List<String> instead of manual JSON strings for promotion plan/cycle IDs
Update KamoCRMPricingLoader to use List.of() for applicablePlanIds and applicableBillingCycles, matching the shared library's migration from JSON strings to ent...
Migrate subscription JSON fields to entity-based @ManyToMany relationships
Replace jsonb string columns (compatiblePlanIds, includedInPlanIds, applicablePlanIds, applicableBillingCycles) with proper JPA @ManyToMany join tables and @Ele...
Add case-insensitive text replacements for changelog display
Replaces internal tool names with public-facing names (Docs->Docs, Meet->Meet, Capcha->Capcha, Avatar Creator->Avatar Creator, etc.) in titles and descriptions ...
Add Live Change Log page with timeline UI, filters, and stats
Server-side fetches changelog from SecurityService, client component provides project/type filtering, date grouping, expandable descriptions, and paginated load...
Like what you see shipping?
Every one of these updates lands in your workspace automatically. Start free and watch it grow week after week.