KATURA
Your browser is not supported. Please update your iPad to the latest iOS version, or visit us on a newer device.
How to update your iPad Skip to main content JOIN THE WORLD OF KATURA Be the first to discover new collections, exclusive events, and the stories behind our legendary creations.
KaturaβCrafting timeless treasures since 1999.
Are You a Jewelry Business? E-commerce, CRM, marketing, payroll, analytics, and AI β everything you need to run a modern jewelry business, all in one platform.
Β© 2026 KATURA. All rights reserved.
πΊπΈ English EN πΊπΈ USD $
Software Updates Β· KATURA | KATURA
Live from GitHub Β· Refreshed continuously
Software Updates Every change we ship to katura1999.com β features, fixes, security patches, the lot. Pulled straight from our private GitHub repository so you can see exactly what was built and when.
By the numbers Lines of code
751,820
across the entire repo (equivalent to 37.0 King James Bibles)
Characters written
29.13M
29,126,188 total characters
Updates pushed
1,573
exact commit count on main
Current version
v1.15.73
build 1573 Β· 6d58963
Database models
366
across 47 schema files β most SaaS platforms have 20β50
API endpoints
854
individually routed β Stripe's public API has ~400
Translated strings
79,872
every string, in 24 languages
System permutations
10^257
2^854 endpoint combinations β more than atoms in the observable universe (10^80)
Project age
4mo 29d
since Dec 14, 2025
Pre-AI dev hours
25.1K hrs
751,820 lines Γ· 30 LOC/hr β equivalent to 12.0 years (senior engineer, no AI)
With-AI dev hours
6.3K hrs
4Γ AI productivity multiplier (2024β2026 studies) β equivalent to 783 days
Equivalent firm cost
$6,479,066
live ticker Β· $60/hr ongoing
Hours estimated from source line count at 30 LOC/hr (industry benchmark for production-quality TypeScript/React without AI assistance), with a 4Γ multiplier for AI-assisted development per published 2024β2026 enterprise studies. Equivalent Firm Cost uses a $250/hr loaded billable rate reflecting a premium engineering firm building enterprise-grade SaaS β and ticks up live, because the project is still being actively built.
Commit history
1,573 updates pushed Showing page 9 of 33 Β· 401β450 of 1,643 fetched
Sunday, April 5, 2026 3 updates pushed
6:31 PM Β· ZRosserMcIntosh
add detailed diamond specs to Izzy necklace descriptions 3Γ 0.50ct round brilliant, 1Γ 1ct round brilliant, 1Γ 1ct cut stone Colored necklaces (orange, pink, blue): princess cut diamond Classic necklaces (rose gold, platinum, yellow gold): asscher cut diamond Include metal + 'setting and chain' to match earring description style Feature 5:51 PM Β· ZRosserMcIntosh
add Atlanta Magazine logo to press rows Copy white-on-transparent ATLA logo to public/brand/press/ Add to homepage 'As Featured In' section with CSS invert Add to in-the-press page publication logos bar Add to about page 'As Featured In' section Links to https://www.modernluxury.com/ Update 5:29 PM Β· ZRosserMcIntosh
replace isomorphic-dompurify with zero-dep sanitizer (fixes blog SSR 500) Uses the same ALLOWED_TAGS and ALLOWED_ATTRS as before Strips disallowed tags, filters attributes, neutralises javascript: URIs Zero dependencies, works everywhere (Node, Edge, browser) Keeps isomorphic-dompurify in serverExternalPackages (not bundled) Saturday, April 4, 2026 9 updates pushed
Update 2:18 PM Β· ZRosserMcIntosh
resolve all 5 critical production failures from health alert Blog article SSR 500: findUnique cannot filter on non-unique fields. Article.status is not part of any unique constraint, so prisma.article.findUnique({ slug, status: 'PUBLISHED' }) throws a Prisma validation error at runtime. Changed to findFirst in both [slug]/page.tsx (generateMetadata + ArticlePage) and /api/articles/[slug]/route.ts. Vector Search 500: runLexicalSearch() is a module-level function that referenced `db` (tenantPrisma scoped inside GET handler). The variable was undefined when the function executed. Replaced all `db.product` with `prisma.product` and removed unused tenantPrisma/TENANT_ZERO_ID imports. Slug test crash: prisma.product.count({ slug: null as unknown as string }) was invalid because slug is a required String (never null) in the schema. Removed the null check, kept empty-string check only. 2:09 PM Β· ZRosserMcIntosh
add inline Add to Bag + trust strip to Izzy journey page Meta ad traffic from /journeys/izzy now converts faster: 1. INLINE ADD TO BAG β every product card now has a direct 'Add to Bag' button alongside 'View Details'. Visitors can purchase without navigating away from the landing page. The button resolves the product slug β DB ID via a new /api/products/by-slug/[slug] endpoint (cached 1hr) then calls cart context addItem, which fires Meta Pixel Friday, April 3, 2026 3 updates pushed
Update 6:17 PM Β· ZRosserMcIntosh
check-email synthetic test failure β www redirect causing 500 Root cause: APP_URL fallback was 'https://www.katura1999.com' but Vercel 308-redirects www β non-www. POST body gets lost in redirect, causing request.json() to throw β caught β 500. Feature 1:46 AM Β· ZRosserMcIntosh
unified admin vector + lexical search API, hook, and command palette Add /api/admin/search with blended vector+lexical product search, customer search (User model, role=CUSTOMER), order search, article search Add useAdminSearch hook with debounced queries and AbortController Rewrite admin command palette to show live data results grouped by type with product images, prices, search method badge, and response time Fix schema mismatches: User not Customer, total not totalAmount, user relation not customer, email directly on Order Thursday, April 2, 2026 8 updates pushed
Feature 7:22 PM Β· ZRosserMcIntosh
journeys analytics β sitemap, Meta Pixel tracking, Stella dashboard section Add /journeys and /journeys/izzy to sitemap with weekly changefreq Add Meta Pixel ViewContent + custom ViewIzzyJourney event to Izzy page Add GA4 view_journey custom event to Izzy page Create Izzy layout with OG metadata for social sharing Add Journeys Performance section to Stella marketing dashboard Tracking status badges (Meta Pixel, GA4, Sitemap) Copyable landing URL and UTM example 7-step Meta Custom Conversion setup instructions Add 13 new i18n keys (EN + PT) for journeys section Security deep-audit-v5 6:03 PM Β· ZRosserMcIntosh
10 vulnerabilities fixed Fix open redirect in login callbackUrl (CVE-class: CWE-601) Fix JSON-LD XSS via </script> injection in serializeJsonLd Fix SSRF in ShipStation webhook resource_url fetch Fix Brevo admin webhook db scoping bug (ReferenceError) Brevo admin webhook: fail-closed when secret not configured Hero-aggregation cron: timing-safe secret comparison Upload endpoints: magic byte validation (not just MIME type) Wednesday, April 1, 2026 7 updates pushed
Feature 11:35 PM Β· ZRosserMcIntosh
Izzy White β 5 white-themed luxury landing pages with real product images Cinematic scroll, Reveal curtains, Gallery exhibition, Editorial magazine, Lookbook grid All 13 ACTIVE Izzy products with real Supabase CDN images (no placeholders) Orange first β Yellow last per Stella's direction Fixed lookbook filter bug (necklaces β necklace) Added Izzy White entry to developer hub 6:54 PM Β· ZRosserMcIntosh
Fix burst stars: zero animation delay β all 20 fire at the exact same instant Burst stars: removed animationDelay entirely, all 20 start at frame 0 Visual variety comes from different durations (0.6-2.0s), not stagger Meteors: reduced stagger from 0.12s to 0.02s (all 15 within 0.28s) cBurst keyframe starts at opacity:1 so stars are visible immediately
Tuesday, March 31, 2026 9 updates pushed
Update 9:28 PM Β· ZRosserMcIntosh
auto-play video plays once then stops (no loop) Feature 8:19 PM Β· ZRosserMcIntosh
hero mosaic β necklace top-row expansion, top-row lock, auto-play video 'Top Row' toggle: locks a product to the top row of the grid 'Auto-Play' toggle: one product's video auto-plays on page load without requiring mouse hover (loops continuously) Feature 8:03 PM Β· ZRosserMcIntosh
i18n (PT) + mobile optimization for all Stella pages Fix browser locale detection: pass Accept-Language header instead of null Monday, March 30, 2026 3 updates pushed
Docs 5:40 PM Β· ZRosserMcIntosh
add K99 platform launch checklist with infrastructure config steps Feature k99 5:33 PM Β· ZRosserMcIntosh
wire demo form API, mobile nav, Stuller integration in pitch deck POST /api/platform/demo: saves to SaasFormSubmission + sends Brevo notification email with rate limiting demo/page.tsx: real API call replacing simulated submit, form name attributes, error handling mobile-nav.tsx: hamburger menu client component with animated overlay for all nav links layout.tsx: import MobileNav, add Pitch Deck to footer pitch-deck-client.tsx: hero Stuller+Nivoda trust badge, Slide 7 expanded with Nivoda & Stuller side-by-side cards, comparison table row, solution module update, tech logos list
Thursday, March 26, 2026 8 updates pushed
Update 7:38 PM Β· ZRosserMcIntosh
resolve ambiguous createdAt column in product analytics cart_series CTE The cart_series CTE joins CartItem with Cart, both of which have a createdAt column. The unqualified date_trunc('day', "createdAt") was ambiguous (PostgreSQL error 42702). Added a qualified timeSeriesTruncCi variable using ci."createdAt" for JOINed queries. Update 7:16 PM Β· ZRosserMcIntosh
restore missing model declarations in Prisma schemas CartItem and Review model headers were accidentally dropped when adding @@index lines β Prisma saw floating fields without a model. Update 7:11 PM Β· ZRosserMcIntosh
AddToCart + GA4 add_to_cart events automatically.
2. TRUST STRIP β below the hero: Complimentary Shipping, Secure Checkout,
Handcrafted to Order, Lab-Grown Diamonds. Addresses cold-traffic
hesitations immediately.
3. FIXED BROKEN OG IMAGE β was pointing to wrong Supabase project
(wjsjbnxfkzcmfnpbdaqs β dpbrczhugdkvchigxxqs). Facebook/Instagram
ad previews were showing a broken image.
4. STRONGER CLOSING CTA β 'Find Your Izzy' with 'Shop All 13 Pieces'
primary button + 'Need Help Choosing?' email secondary.
5. SEO TITLE FIX β removed '| Katura' from layout title to avoid
double suffix from root layout template. Added 'starting at $7,000'
to OG/Twitter descriptions for price anchoring in social previews.
New API: GET /api/products/by-slug/[slug] β returns { id, name, price }
for Katura storefront products. Cached aggressively. 2:00 PM Β· ZRosserMcIntosh
fix sitemap β stable lastModified, 4 missing pages, product images Replace new Date() with concrete STATIC_CONTENT_DATE (2025-06-15) for all 39 static pages. Google ignores lastModified when every crawl shows 'just now' β a stable date makes the signal trustworthy. Add 4 missing public pages to sitemap: /precious-metals, /high-jewelry, /timepiece-sourcing, /wedding-sites Include product hero image in sitemap via images[] property, which Next.js renders as <image:image> tags β helps Google Image Search index jewelry product photography. Clean up explicit type annotations on Prisma map callbacks (inferred). Feature 1:52 PM Β· ZRosserMcIntosh
add missing structured data and OG images for SEO Add Organization JSON-LD (Google Knowledge Panel, brand entity) Add WebSite JSON-LD (sitelinks search box in Google) Add LocalBusiness/JewelryStore JSON-LD (local results, rich data) These 3 schemas were already built in structured-data.ts but never wired up to any page β now on the homepage. Add OG image to OpenGraph metadata so social shares show the brand image instead of blank preview Add BreadcrumbList JSON-LD for breadcrumb rich results in Google Update 1:31 PM Β· ZRosserMcIntosh
remove duplicate KATURA suffix from all SEO titles Remove '| KATURA' from all 267 title strings in SEO_TEMPLATES and CATEGORY_SEO across all 24 locales Remove '| KATURA' from getProductSEO, getBlogPostSEO, getCollectionSEO, and getCategorySEO fallback Change homepage from { absolute: seo.title } to seo.title so it goes through the layout template uniformly Fix 2 platform marketing pages with same issue Fix AI description seoTitle generator Perf 1:14 PM Β· ZRosserMcIntosh
fix 3 slow synthetic tests β search API, products API, PDP TTFB pg_trgm GIN indexes on name, description, metalType, gemstone, slug (accelerates ILIKE/contains in search API from seq scan to index scan) Composite B-tree: (status, createdAt DESC) for product listings Composite B-tree: (status, featured DESC, name) for featured sort Partial index: shopifyHandle WHERE NOT NULL (PDP fallback) Expression index: lower(slug) for case-insensitive PDP lookup Partial index: (jewelryType, status) WHERE ACTIVE (related products) 12:30 PM Β· ZRosserMcIntosh
unify navy color (#0B1527), replace text press logos with images, add Flower Magazine Brand Story section: bg-[#030712] β bg-[#0B1527] to match footer navy Hero tile: text-black/bg-black β text-[#0B1527]/bg-[#0B1527] for heading & buttons Homepage 'As Featured In': replace text-only JCK & Garden & Gun with actual logo images Add Flower Magazine to homepage press bar and /in-the-press page Add Flower Magazine logo SVG to public/brand/press/ Update press page metadata, structured data, and designer bio for Flower Magazine Feature monitoring 12:14 PM Β· ZRosserMcIntosh
add 40+ non-critical defense-in-depth synthetic tests /en/authenticate, /en/precious-metals, /en/timepiece-sourcing /en/checkout/success, /en/education (hub), /en/employee-login /en/wholesale-login, /en/journeys, /en/journeys/izzy /en/account, /en/account/orders, /en/account/settings Blog article SSR with real slug from /api/articles Collection detail SSR with real slug from /api/collections /api/articles/categories, /api/products/collage /api/search/vector, /api/reports, /api/developer/cert-parse /api/developer/metal-prices, /video-sitemap.xml Article by slug (real), Collection by slug (real) Product social proof (real), Wedding site public lookup Articles have content (not empty bodies) Collections have products (not all empty) Active products have slugs (PDP links work) Active products have variants (add-to-cart works) Articles API returns array with slug+title fields Cart API returns valid JSON object Checkout page TTFB (<5s), Blog hub TTFB (<5s) Product detail page TTFB (<5s, with real slug) Blog article has <title> and meta description Product page has JSON-LD structured data Homepage has canonical URL Video sitemap is valid XML OpenAI embeddings configured + vector search alive Supabase Storage public endpoint reachable Arabic (RTL) page has dir=rtl attribute Hebrew (RTL) page has dir=rtl attribute Japanese page has lang=ja attribute 404 page renders (not 500 crash, not soft 200) API 404 returns JSON (not HTML error page) Feature monitoring 1:30 AM Β· ZRosserMcIntosh
add 8 mission-critical synthetic tests Gap-fill for identified monitoring blind spots: 1. Stripe webhook signature verification β ensures constructEvent() returns 400 (not 500), proving signature checking actually runs. Tests both missing header and fake signature scenarios. 2. Order-by-payment-intent lookup β post-checkout critical path. If this 500s, customers see blank success page after paying. 3. Order-by-session lookup β fallback checkout success path. Used when payment_intent param is missing. 4. Product authentication (invalid serial) β public endpoint where customers verify pieces are authentic. Must return 200 with authenticated:false, never 500. 5. Product authentication (empty body) β must return 400 for missing serial number, not crash. 6. Checkout page render β verifies /en/checkout loads (200/3xx), catches SSR crashes that block all purchases. 7. Product detail page render (real slug) β fetches a real product slug from API, then verifies the actual Next.js PDP renders. Catches SSR/metadata/structured-data failures. Total test count: ~505 β ~513 Update 1:29 AM Β· ZRosserMcIntosh
hero mosaic pin search broken β variants.select.price β variantPrice Fixed variant field name (price β variantPrice) Added jewelryType, gemstone, description to searchable fields Added word-splitting for multi-word queries ('gold ring' β OR match) Added limit query parameter support Better error logging and UI feedback (no more silent failures) Shows 'No products found' message instead of empty silence
Upload endpoints: filename extension sanitization
Remove debug-mw page (information disclosure)
Remove empty upload-test route (dead code) Update 12:57 PM Β· ZRosserMcIntosh
add isomorphic-dompurify/jsdom to serverExternalPackages Fixes Turbopack build error: NftJsonAsset: cannot handle filepath node:worker_threads jsdom (used by isomorphic-dompurify for SSR) references node:worker_threads which Turbopack's Node File Trace cannot resolve. Marking these as external skips the trace and uses the installed node_modules at runtime. 12:54 PM Β· ZRosserMcIntosh
Security audit fixes + Izzy Journey page + developer password protection Fix GraphQL injection in Nivoda client (parameterized auth, sanitizeGqlString) Remove hardcoded fallback JWT secrets Add auth gates to 6 unprotected developer/admin test endpoints Add auth to Brevo products admin, cert-parse, Stripe webhook test Change fail-open to fail-closed: reCAPTCHA, cron auth, webhook auth Add Brevo webhook secret verification Create sanitize-html.ts (DOMPurify) and sanitize-css.ts Sanitize all dangerouslySetInnerHTML: blog, products, email builder, section renderer Sanitize tenant custom CSS Remove /__mw_debug information disclosure endpoint Add /journeys landing page and /journeys/izzy cinematic product page Izzy page leads with products (not hero text), tighter spacing per Stella Add 'Journeys' link to footer Company column (all 24 locales) Password-protect /developer pages (static passwords: lee, stella, rosser) Persists auth in localStorage for session convenience Feature 10:31 AM Β· ZRosserMcIntosh
Katura Authentication & Serialization system Serial number generator (K99-YYMM-NNNN-CC format with check digits) Prisma schema: SerializedUnit, StoneCertificate, SerialNumberCounter Admin inventory management (/admin/products/[id]/inventory) Add/edit/delete serialized units with auto-generated serials Per-unit cost breakdown (diamond, setting, labor, metal, other) Attach multiple GIA/IGI certificates per unit Status tracking (IN_STOCK, RESERVED, SOLD, RETURNED, etc.) Public authentication page (/authenticate) Cream-themed luxury verification page Serial number lookup with product & certificate display Never exposes costs or internal data API routes: CRUD for units + certificates, public verify endpoint Product editor: replaced Inventory + Diamond Cert with link card Footer: added Katura Authentication link in Company column Updated all 24 i18n locale files SQL migration executed (tables, indexes, RLS policies) Feature 9:57 AM Β· ZRosserMcIntosh
engagement ring checkbox + engagement-only switch in product editor Shows on /creations/engagement-rings alongside jewelryType matches Unchecking auto-removes engagement-only tag too Only visible when Engagement Ring is checked Hides product from /creations/rings while keeping it on engagement page Styled with indented rose border for clear parent/child relationship /creations/engagement-rings now includes products tagged 'engagement-ring' /creations/rings now excludes products tagged 'engagement-only' Uses existing tags system (no schema migration needed) Update 9:35 AM Β· ZRosserMcIntosh
timepiece sourcing hero mosaic β missing images, Cartier logo, right cutoff 1. Added 3 missing watch images: jaeger.jpg, rolex-daytona.jpg, submariner.jpg 2. Added Cartier brand logo (cartier.png) for brand carousel 3. Replaced Vacheron Constantin (non-white bg) with Rolex Day-Date Rose Gold 128235 4. Fixed right-side image cutoff: overflow-hidden on cells, overflow-clip on section 5. Changed object-cover β object-contain so watches display fully without cropping 6. Grid rows changed from 1fr β auto for proper aspect ratio sizing Update 8:47 AM Β· ZRosserMcIntosh
white header for izzy-white pages, move Pre-Owned Watches to Shop, richer navy footer 1. Header: izzy-white sub-pages now get the light header instead of dark developer header 2. Footer: moved 'Pre-Owned Luxury Timepieces' from Client Care to Shop column (below Trunk Show) 3. Footer: changed bg from #030712 (near-black) to #0B1527 (rich navy, vintage Tiffany-inspired) 6:47 PM Β· ZRosserMcIntosh
Fix constellation: instant burst stars on click, stable background star positions Added one-shot 'burst' shooting stars (cBurst animation) that start at opacity:1 β no fade-in delay, fires immediately on product click 20 burst stars with tight 0.04s stagger feel instantaneous Removed shootKey from ambient shooting star keys β they loop continuously without remounting, preventing visual glitches Fixed cTwinkle keyframe: removed transform:scale() that caused background stars to appear to shift position on re-render Background stars now only animate opacity (0.3β1β0.3), positions are rock solid 6:43 PM Β· ZRosserMcIntosh
Fix extra closing brace in constellation onClick handler 6:35 PM Β· ZRosserMcIntosh
Split Journey pages into separate routes for faster loading /developer/journeys β hub page linking to all 5 journeys /developer/journeys/cinematic β Cinematic Scroll (parallax editorial) /developer/journeys/reveal β The Reveal (curtain unwrap) /developer/journeys/constellation β Constellation (star map with working stars) /developer/journeys/runway β Runway (auto-advance fashion show) /developer/journeys/atelier β Atelier (behind the craft chapters) Shared product data in data.ts (IzzyProduct interface, 13 products) Fixed constellation: proper CSS class animations, memoized star data Each page loads independently β no more 1800-line monolith 4:12 PM Β· ZRosserMcIntosh
Remove Antar Hall from investors page, remove attribution from design-your-ring Removed Antar Hall team card from investor pitch page (contracts unsettled) Changed inline text from 'master jeweler Antar' to 'in-house CAD design studio' Adjusted team grid from 4 columns to 3 columns Archived Antar Hall bio content to docs/archived/antar-hall-bio.md Removed 'Rosser McIntosh, Master Artisan' attribution from design-your-ring page Removed same hardcoded attribution from developer ring-builder page Added RLS migration script (from previous session) Update analytics 10:05 AM Β· ZRosserMcIntosh
complete GA4 e-commerce funnel wiring Fix .env.production placeholder GA ID β G-3X3V1JVLSM Add missing add_payment_info event to google-analytics.ts Wire trackAddPaymentInfo in payment-form.tsx on Pay click Add purchase event deduplication (useRef + sessionStorage) Use dynamic order currency instead of hardcoded USD Add currency field to all 3 order success API endpoints
Add 18 new media translation keys (EN + PT) for photos/videos pages
Rewrite photos page with full i18n + responsive grid + 44px touch targets
Rewrite videos page with full i18n + responsive grid + 44px touch targets
Marketing layout: translate error/retry strings, responsive sub-nav (2-col mobile)
Add min-h-[44px] touch targets on all interactive elements for iPhone 7:18 PM Β· ZRosserMcIntosh
Boost media page image quality: quality=95, wider sizes hint Root cause: Next.js <Image> served 288px thumbnails at 75% quality for the media grid. Bumped to quality=95 and sizes='33vw' so the on-screen display matches what Stella sees on the storefront. Downloads were already full HD (raw Supabase/Shopify CDN fetch). 7:13 PM Β· ZRosserMcIntosh
Split media into photos + videos pages, HD downloads /admin/stella/media β Photos only (was combined tabs) /admin/stella/media/videos β New dedicated videos page HD downloads: prefers 'large' URL > 'url', strips transform params API now returns 'large' field for ProductImage Cross-links between photos β videos pages Sidebar: 'Stella Photos' + 'Stella Videos' nav items Updated EN + PT translations Update 4:53 PM Β· ZRosserMcIntosh
move media buttons below image name in vertical column Remove all floating overlay buttons from photos and videos Buttons now live below image name/SKU in CardContent Stacked vertically (flex-col) so they never fight screen width Full-width outline buttons with left-aligned icons + labels: Save to Camera Roll (share icon) Download (arrow icon) View Product (external link icon, photos only) Clean image/video display with no overlapping UI Feature 4:40 PM Β· ZRosserMcIntosh
add Download button + Stella Media sidebar link Add dedicated Download button (arrow icon) alongside Save/Share button Save (share icon) β Camera Roll on iPhone via Web Share API Download (arrow icon) β Downloads folder via blob download Both buttons visible on mobile (always) and desktop (hover overlay) Works for both photos and videos Add 'Stella Media' nav item below 'Stella Marketing' with Film icon Links to /admin/stella/media Added EN + PT translations for nav.stellaMedia Feature 3:23 PM Β· ZRosserMcIntosh
split media page into Photos + Videos tabs with camera roll save Split /admin/stella/media into Photos tab and Videos tab Videos tab fetches from /api/admin/media/videos, shows auto-playing cards Videos auto-play muted with loop and playsInline for mobile Replace Download button with Save button using Web Share API On iPhone: triggers native share sheet β Save Image / Save Video to Camera Roll On desktop: falls back to blob download Extracted PhotoCard and VideoCard as separate components Both show mobile-always-visible save button + desktop hover overlay Save confirmation with green checkmark on success Grid size slider shared across both tabs Feature 8:49 AM Β· ZRosserMcIntosh
major site builder overhaul + 8 new themes Fix +Add Section: inline searchable section picker with categorized grid Add InsertBetweenButton for inserting sections between existing ones Redesign EmptyCanvas with quick-start section grid + browse all picker Make Style Panel fully editable: color pickers, font selectors, theme switcher Implement drag-from-palette-to-canvas via DraggablePaletteItem + CanvasDropZone Move DndContext to wrap both palette and canvas for cross-container DnD DragOverlay shows section name chip for palette drags, preview for reorder drags Save now persists custom colors/fonts/theme alongside page sections Fix bootstrap creating sections with empty props (now uses SECTION_DEFINITIONS defaultProps) Add 8 new themes: Estate, Gallery, Art Deco (premium), Rosé, Noir (premium), Coastal, Studio, Bohème Total: 13 themes across luxury, minimal, modern, artisan, feminine, classic categories Fix createdAt/updatedAt null constraint in theme seed SQL Feature
k99
4:17 PM Β· ZRosserMcIntosh
add /pitch deck page for jeweler sales presentations New scrollable 10-section pitch deck at k99.katura1999.com/pitch Covers: problem, solution, Stella marketing, CAD/casting, diamonds, tech stack, onboarding Comparison table: K99 vs Shopify vs DIY with 19 feature rows Framer Motion animations, scroll progress bar, animated counters Added Pitch Deck link to platform footer
remove CONCURRENTLY from index SQL (Supabase runs in txn) Perf 7:08 PM Β· ZRosserMcIntosh
dramatically accelerate Stella Marketing page load Merge 5 sequential Promise.all batches β 2 (excluded-users, then one mega-batch of ~40 queries running fully in parallel) Add 3-minute in-memory cache with X-Cache header (marketing data is stale-tolerant; ?noCache=1 bypasses) Add take limits on order/wishlist findMany (200/100) to prevent unbounded result sets with N+1-like joins Cart: (referrerChannel, createdAt), (tenantId, createdAt) CartItem: (tenantId, createdAt), (productId, createdAt) Order: (tenantId, createdAt), (tenantId, isShopifyImport, source, status, createdAt), (tenantId, status, createdAt), (email, createdAt) WishlistItem: (tenantId, addedAt), (productId, addedAt) HeroEvent: (tenantId, createdAt), (visitorId) Update 5:55 PM Β· ZRosserMcIntosh
resolve 3 failing health tests Env: AUTH_SECRET β NEXTAUTH_SECRET (correct env var name used everywhere) Database: Active Products Have Prices β price is NOT NULL in schema, check for zero/negative price instead of null Database: Write Test β insert parent SyntheticTestRun row first to satisfy FK constraint before inserting SyntheticTestResult Feature 5:43 PM Β· ZRosserMcIntosh
comprehensive health tests + live streaming progress UI Add ~130 new synthetic health tests covering auth, CRM, HR, analytics, treasury, payroll, admin APIs, SEO, DB integrity, crons, webhooks, security headers, MCP, settings, CORS, env vars, and performance Add SSE streaming endpoint /api/admin/monitoring/stream Add runSyntheticTestsStreaming() with callback-based progress reporting Replace spinner with LiveProgressPanel: real progress bar, ETA, current test name, pass/fail/slow counters, live results feed Update critical alert patterns for new test categories Feature 5:13 PM Β· ZRosserMcIntosh
comprehensive audit logging with IP/UA across 32 API routes Added createAuditLog + IP/UA capture to all unaudited mutation routes: account (change-password, delete, profile), feature-flags, inventory, contractors (CRUD), imports, customers (CRUD), commissions (create + bulk), appointments (CRUD), articles, blog (CRUD), careers, assets, goals (CRUD), promotions (CRUD), services (CRUD), invite, purchase-orders Enhanced existing audit logs with IP/UA: products (update/delete), orders (manual create), collections (CRUD), categories (CRUD) Added 60+ new action label mappings to getActionLabel in audit API route for all new entity types (Inventory, Import, Customer, Commission, Appointment, Article, BlogPost, JobPosting, Asset, SalesGoal, ServiceRequest, PurchaseOrder, ProductCategory) All routes capture x-forwarded-for/x-real-ip for IP address tracking All routes capture user-agent for device/browser identification Categories: auth, crm, data, hr, payroll, system as appropriate Update audit 4:39 PM Β· ZRosserMcIntosh
correct clock-in/out action labels, show IP address, expand event types Root cause: clock-in route was creating audit logs with action='create' entity='User' instead of action='clock_in' entity='TimeEntry', so the audit page showed 'Created User' instead of 'Clocked In'.