Breadcrumbs render inline on single line, footer moved inside main
- Breadcrumbs now use inline-flex with whitespace-nowrap to prevent wrapping - Footer moved inside <main> to match homepage DOM structure for consistent renderi...
Sub-page nav visibility, breadcrumb wrapping, and background consistency
- Set shouldAnimate=true on Navigation so it's visible without preloader - Add flex-wrap and whitespace-nowrap to breadcrumbs for clean line handling - Set expl...
Use LucideIcon type in roadmap page — verified with local build
All 24 routes compile and generate successfully.
Use React.JSX namespace for React 19 compatibility
JSX.Element is not a global namespace in React 19; must use React.JSX.Element.
Add public article query methods to KbArticleRepository
Add three new repository methods for fetching published articles with aiVisibleToPublic=true, used by the new KBService public endpoints: - **************** - *...
Add unauthenticated public endpoints for KB articles
Add KbPublicArticleController with endpoints for the marketing site to fetch published articles where aiVisibleToPublic=true, without requiring OTK authenticati...
Add 17 sub-pages, KB integration, tool replacement section, SEO, and UX improvements
Major additions: - Shared sub-page layout with PageHero, breadcrumbs, and consistent nav/footer - About, Contact, Features, Pricing, Roadmap, Security/Infrastru...
update meta title, description, keywords, and OpenGraph/Twitter cards for BOS rebrand
Achievement badge z-index so it renders above the navbar
Nav uses zIndex 10001; badge was at z-100 and getting clipped underneath.
Trust bar z-index, remove Docs/Microsoft branding, deduplicate trademark notice, fix Most Popular badge clipping
- Increase TrustBar z-index so hexagon graphics don't overlap text - Replace Word/Excel/PowerPoint with generic terms (documents, spreadsheets, presentations) -...
rebrand marketing site from CRM to all-in-one white label Business Operating System
Reposition the entire marketing site around the concept of a unified BOS rather than merely a CRM. Remove unsubstantiated claims (Fortune 500 trust, 6.7M leads,...
Remove stepper, overlay loading bar, persistent controls panel, font replacement toggle
Layout: - Removed step indicator (Select Area / Remove Background / Review) for more room - Loading bar now overlays on top of the preview image, hidden when co...
Side-by-side review layout with compact controls and auto-reprocess
Review step: - Preview on left, scrollable controls panel on right (240px) - Controls scroll independently while preview stays visible - No need to scroll below...
Pre-select entire image on crop, default to color vectorization
- Crop tool now starts with the full image pre-selected with 8 handles - Users can adjust from there or continue immediately — no "Use full image" needed - Defa...
User-friendly vector conversion flow with auto-convert for vector formats
UX improvements: - Replaced all "SVG" terminology with "vector" for non-technical users - Added educational guidance explaining why conversion is needed - Steps...
Add 8 draggable resize handles on crop selection edges and corners
- 4 corner handles (tl, tr, bl, br) with diagonal resize coders - 4 edge midpoint handles (tc, bc, ml, mr) with horizontal/vertical coders - Handles are draggab...
Replace react-easy-crop with freeform drag-to-select rectangle tool
react-easy-crop forced square/fixed-aspect selections. New canvas-based tool lets users click and drag any rectangle at any aspect ratio. Shows dimmed overlay o...
Show logo image on background picker step using img element
Canvas element wasn't rendering because it started with 0x0 dimensions. Use a visible <img> for display and an offscreen canvas for pixel sampling.
Combine docker login, build, and push in single step to preserve auth
Separate steps lose docker credentials between Forgejo runner step boundaries. Running login+build+push in a single shell ensures the auth config persists.
Add background color picker step and improve SVG conversion UX
- Added "Pick Background" step between Crop and Process - Users click on the image to select the background color to remove - Shows selected color swatch with R...
Use docker build/push directly instead of build-push-action
The docker/build-push-action with driver:docker loses auth credentials during the push phase. Using plain docker build + docker push ensures the login credentia...
Use path-based WebSocket routing via /vector-ws/ instead of separate subdomain
Connect WebSocket directly to vector.{domain} subdomain
Next.js rewrites don't proxy WebSocket upgrade requests. Connect directly to the VectorService via its own subdomain, same pattern as media WebSocket.
Add image-to-SVG conversion pipeline with reusable modal component
- New ImageToSVGConverter modal component with 3-step flow: Crop → Process → Review - WebSocket hook (useImagePipeline) for streaming pipeline communication - C...
Lower embedding batch size to 8 to match model backend limit
The TEI backend forces max_batch_requests=8 regardless of client config. Batches of 32 were still failing with connection errors.
Batch embedding requests to respect model's max batch size of 32
The embedding model rejects requests with more than 32 inputs, but articles with large content produce 46-198 chunks. All embedding attempts were failing with 4...
Lower RAG min-score threshold from 0.5 to 0.25 to stop filtering relevant KB results
The 0.5 threshold was silently discarding valid results from the embedding model, especially for domain-specific content with smaller 384-dim vectors.
Defer NATS event publishing until after transaction commits to prevent RAG race condition
Events were firing inside @Transactional methods, causing RAGService to read stale data from CockroachDB before the commit. Also auto-defaults aiVisibleToMember...
JVB_ADVERTISE_IPS must be public IP, not Wireguard IP
Was 10.8.1.1 (Wireguard private) — guests' browsers can't reach this. Changed to 75.83.113.11 (public IP). This is why guests kept getting ICE restarts every ~1...
Disable mod_token_verification via custom plugin override to stop guest kicks
The MUC token_verification module re-validates tokens and demotes guests from PARTICIPANT to VISITOR after ~60 seconds, causing Jicofo to kick them. The module ...
Add guest domain to token_verification_allowlist, increase smacks timeout
Guests authenticate via Meet-anonymous on guest.meet.Meet but the MUC token_verification module was re-checking them and demoting their role from PARTICIPANT to...
Disable Jicofo auth module to prevent 1-minute participant kick
Jicofo's AbstractAuthAuthority has a hardcoded 1-minute auth session lifetime that ignores the config file setting. After 60 seconds, Prosody demotes participan...
Use room names (not full JIDs) for all brewery MUC configs
Both Jicofo and JVB Docker images append @XMPP_INTERNAL_MUC_DOMAIN to the brewery room name automatically. Using full JIDs like **************** caused double-d...
Use TCP probe on port 9090 for JVB health checks instead of HTTP on 8080
JVB's REST API port 8080 conflicts with CockroachDB's admin UI on the same hostNetwork. The JVB_OHTTP_SERVER_PORT env var is not recognized by this JVB image ve...
Resolve JVB crash loop — wrong MUC JID + port 8080 conflict
Two issues causing JVB to crash in a loop for 43+ hours: 1. JVB_BREWERY_MUC was **************** (full JID) but JVB appends XMPP_INTERNAL_MUC_DOMAIN automat...
JVB_BREWERY_MUC should be room name only, not full JID
Was **************** which caused JVB to construct a double-domain JID **************** with an @ in the domain part — crashing JVB with XmppStringprepException...
Extend JWT expiry from 5 minutes to 24 hours
Prosody re-validates the JWT when new participants join or conference state changes. With a 5-minute expiry, the presenter's JWT expired mid-meeting causing "Un...
Force-set avatar via Redux dispatch after JWT redirect
The JWT delayed-load pipeline for avatars fails silently with disableThirdPartyRequests. Three-layer approach now: 1. Avatar.tsx _mapStateToProps falls back to...
Use participant avatarURL directly as fallback in Avatar component
The loadableAvatarUrl pipeline (preload check → setLoadableAvatarUrl) was never setting the URL due to disableThirdPartyRequests and the delayed-load flow clear...
Query avatar_photos extension via SQL instead of Hibernate proxy
avatarRepository.findById() returns a Hibernate proxy (Avatar$HibernateProxy) that fails instanceof AvatarPhoto check. This caused the file extension to always ...
Like what you see shipping?
Every one of these updates lands in your workspace automatically. Start free and watch it grow week after week.