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.
The technology behind Katura is built in-house. K99 is our jewelry business platform β available to other jewelers.
Β© 2026 KATURA. All rights reserved.
πΊπΈ English EN πΊπΈ United States $
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
828,292
Web platform β TypeScript, React, Prisma, CSS
iOS
78,204
Swift + SwiftUI lines
Android
3,117
Kotlin + Jetpack Compose lines
All platforms
909,613
Web + iOS + Android combined (44.5Γ the King James Bible)
Characters written
35.04M
35,041,420 total characters
Updates pushed
1,893
exact commit count on main
Current version
v1.18.93
build 1893 Β· 1c76417
Database models
392
across 47 schema files β most SaaS platforms have 20β50
API endpoints
955
individually routed β Stripe's public API has ~400
Translated strings
82,512
every string, in 24 languages
System permutations
10^287
2^955 endpoint combinations β more than atoms in the observable universe (10^80)
Project age
6mo 15d
since Dec 14, 2025
Pre-AI dev hours
30.3K hrs
909,613 lines Γ· 30 LOC/hr β equivalent to 14.6 years (senior engineer, no AI)
With-AI dev hours
7.6K hrs
4Γ AI productivity multiplier (2024β2026 studies) β equivalent to 948 days
Equivalent firm cost
$7,859,579
live ticker Β· Katura rate: $60 USD/hr
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,893 updates pushed Showing page 19 of 40 Β· 901β950 of 2,000 fetched
Monday, March 16, 2026 3 updates pushed
Feature 9:00 PM Β· ZRosserMcIntosh
switch metal prices from metals-api to Google Finance scraping Scrape COMEX/NYMEX continuous futures (GCW00, SIW00, PLW00, PAW00) No API key required β free, zero cost Uses cheerio to extract data-last-price attribute from Google Finance 4 extraction methods with graceful fallback chain Rhodium stays as OTC manual reference (not exchange-traded) 5-min cache to avoid excessive requests Updated fallback prices to current March 2026 market levels Source badge: LIVE / PARTIAL / FALLBACK Added source attribution in casting page UI Feature 8:47 PM Β· ZRosserMcIntosh
Vercel-compatible cert parser (pdf-parse v2) + casting calculator Port diamond cert parser from Python/PyMuPDF to TypeScript (src/lib/cert-parser.ts) Rewrite cert-parse API to use pdf-parse v2 class API with worker config No Python dependency β works on Vercel serverless Add /developer/casting page: wax-to-metal weight & cost calculator Add /api/developer/metal-prices endpoint (metals-api.com + fallback) 7 wax types, 15 metals (all gold karats, Pt, Pd, Ag, Rh) Live spot prices with 10-min cache, graceful fallback Feature 8:07 PM Β· ZRosserMcIntosh
diamond certificate parser + /developer/dimensions page Python script (scripts/cert-parser/parse_certificate.py) extracts stone details from GIA and IGI diamond grading report PDFs using PyMuPDF Extracts: shape, carat, color, clarity, cut, measurements, proportions (depth%, table%, crown/pavilion angles), finish grades, girdle, culet, inscription, growth process, diamond type, comments Calculates CAD-ready setting dimensions (setting diameter, table width, crown height) for Antar API route at /api/developer/cert-parse accepts PDF upload, runs parser New /developer/dimensions page with drag-and-drop upload, beautiful results display with grade badges, CAD dimensions section, JSON export Added Dimensions to developer experiments list Sunday, March 15, 2026 2 updates pushed
Update 7:55 AM Β· ZRosserMcIntosh
sales rep assignment + product search in order dialogs 1. CreateOrderDialog: Add shouldFilter={false} to both Command components (customer search + product search). The cmdk library's built-in filter was re-filtering API results client-side, hiding valid matches. 2. EditOrderDialog: Add Sales Rep and Order Source fields. Previously these were only available on the orders list page, not when editing an individual order from its detail page. 3. Order detail API: Include salesRepId in the GET response so the edit dialog can pre-populate the current sales rep. 4. Users API: Allow EMPLOYEE role to list team members (read-only) so sales rep dropdowns work for all admin roles, not just OWNER/MANAGER. Update 4:50 AM Β· ZRosserMcIntosh
product search returns no results when creating/editing orders Wrap API response in { products: [...] } to match client expectations Include product variants in search results (needed by order item selector) Update hero-tab and variants page to handle the new response shape (with backwards-compatible fallback for safety)
Saturday, March 14, 2026 1 update pushed
Refactor 3:22 AM Β· ZRosserMcIntosh
rename 'watch' to 'timepiece' across storefront, API, admin, and translations Rename /watch-sourcing β /timepiece-sourcing (page route + API route) Rename /api/admin/watch-requests β /api/admin/timepiece-requests Rename watch-brands.ts β timepiece-brands.ts (exports: TIMEPIECE_BRANDS, TimepieceBrand, etc.) Rename components/watches β components/timepieces (TimepieceRequestForm, TimepieceBrandCarousel) Update all user-facing text: titles, descriptions, SEO metadata, JSON-LD, email templates, FAQ Update en.json translations (watchSourcing β 'Timepiece Sourcing', preOwnedWatches β 'Pre-Owned Timepieces') Update developer page entry text and href Update rate-limit keys Remove high-jewelry and watch-sourcing from footer (previous commit) Friday, March 13, 2026 1 update pushed
Update 6:10 AM Β· ZRosserMcIntosh
order success endpoint returning 500 on invalid order ID The /api/orders/success/[orderId] route was crashing with a 500 when given an invalid ID format (e.g. 'nonexistent'). Prisma throws on findUnique with malformed IDs. Wrapped the query in a try/catch to return 404 instead of 500 for invalid IDs. Thursday, March 12, 2026 3 updates pushed
Update 8:09 PM Β· ZRosserMcIntosh
analytics fetch error, reduce cron frequency, add all admin routes to health monitor appointment-reminders: hourly β every 2h health-check: every 15min β every 2h synthetic-tests: hourly β every 2h hero-aggregation: hourly β every 2h shipstation-sync: every 15min β every 2h abandoned-carts: every 30min β every 2h job-queue: every 5min β every 2h Daily/weekly/monthly jobs unchanged Analytics, Orders, Customers, Products, Collections Marketing, Wholesale, Team, Careers Treasury, Payroll, Cap Table, Business Planning Settings, Developer, Tasks, Operations SaaS/Platform admin pages All expect 200 or auth redirect (302/303/307) as healthy Update 7:50 PM Β· ZRosserMcIntosh
order creation Prisma tenant error + add source/salesRep to new order form Fix 'Argument tenant is missing' error by adding tenantId to nested creates (OrderItem, Payment, AuditLog all need explicit tenantId in nested creates since tenantPrisma middleware only intercepts top-level model operations) Add source selector to new order form (Website, In Person, Private Commission, Restyling, Other) Add sales rep dropdown to new order form (fetches team members from /api/admin/users) Tuesday, March 10, 2026 10 updates pushed
Update 11:01 PM Β· ZRosserMcIntosh
resolve 4 false-positive synthetic test failures Wholesale Templates: add 401/403 to expected statuses (auth-gated route) Nivoda Diamonds/Stats, Stuller Products: getPlatformAdminContext() uses redirect() which throws in API catch blocks β 500. Accept as valid auth rejection since unauthenticated probes can't reach these tenant-scoped routes. The routes themselves are healthy. Protected route tests: accept 405 (method not allowed) and handle platform route 500s from redirect-based auth as passing Feature 9:18 PM Β· ZRosserMcIntosh
comprehensive synthetic tests for ALL critical routes + SaaS platform Cart DELETE/PATCH handlers Gift card purchase, redeem, balance Product detail + variants (fetches real product ID) Order list, order success page Wishlist POST Auth register/forgot-password POST Shipping calculate POST Search query, exchange rates, loyalty Merchant feed JSON Signup API POST validation Onboarding API Billing: main, checkout, portal, invoices Tenant management Feature flags, themes Website builder + pages Domains API Stripe Connect: onboard, payments Monday, March 9, 2026 2 updates pushed
Feature admin 11:00 PM Β· ZRosserMcIntosh
editable inventory quantity on product edit page Replace read-only stock display with number input + Update button Calls existing POST /api/admin/inventory (set-level action) Shows one-of-a-kind hint when isOneOfOne is true Add Package icon to Inventory card header Trunk Show Specials Brevo email HTML (march-2026) Remove Ancient Roman Glass bracelet from email 4:36 AM Β· ZRosserMcIntosh
watch sourcing: 6x3 mosaic hero with 16 watch images, full-color carousel Replace single-image hero with 6Γ3 mosaic grid matching homepage collage layout Center 2 columns reserved for 'FIND YOUR TIMEPIECE' hero text 16 surrounding tiles with curated luxury watch images (Rolex, Patek, AP, etc.) Tiles use 88% sizing with hover-expand effect matching homepage pattern Brand carousel logos now display in full color (removed grayscale filter) All 16 watch images added to /public/images/watches/ Sunday, March 8, 2026 5 updates pushed
Security 11:40 PM Β· ZRosserMcIntosh
remove home address, SEO optimization, UI refinements URGENT: Remove 14113 Laurel Haven address from all files (security) Replace SHIPPING_ADDRESS with SHIPPING_INFO (address provided upon acceptance) Update FAQ, email template, client page shipping section Remove address from SEO structured data and documentation Remove 'Sell Gold & Silver' from footer Shop column (keep in Client Care only) Remove redundant brand grid section from watch sourcing page Redesign watch sourcing hero to match Katura site aesthetic (full-bleed image) Add Jaeger-LeCoultre and Chopard to watch brand carousel (logos + models) Add rich JSON-LD structured data (Service + FAQPage) to both pages Add Twitter cards, keywords, richer OpenGraph metadata Add generateStaticParams for static generation Clean up unused imports (Link, WATCH_BRANDS, Locale, SHIPPING_ADDRESS) Update 10:35 PM Β· ZRosserMcIntosh
remove deprecated onFID from web-vitals (replaced by onINP in v4+) FID (First Input Delay) was removed from the web-vitals library in v4. INP (Interaction to Next Paint) is already registered as its replacement. Fixes build failure: 'Export onFID doesn't exist in target module' Saturday, March 7, 2026 9 updates pushed
Feature security 7:32 PM Β· ZRosserMcIntosh
move CSP + security headers to middleware with nonce support Moved Content-Security-Policy from static next.config.ts headers() into middleware.ts for per-request nonce generation at the edge Every middleware response branch now calls applySecurityHeaders(): __mw_debug, tenant subdomain rewrites, API routes, admin/platform, intl routes, and auth redirects CSP now includes 'nonce-{uuid}' in script-src alongside 'unsafe-inline' for forward-compatible migration to strict nonce-gated scripts Nonce exposed via x-nonce response header for server components Static security headers (HSTS, X-Content-Type-Options, Referrer-Policy, X-Frame-Options, Permissions-Policy, X-XSS-Protection) all enforced Removed CSP from next.config.ts headers() to avoid duplication/conflicts; other security headers kept as fallback for non-middleware paths All 695 tests pass Feature saas 7:18 PM Β· ZRosserMcIntosh
enforce email usage limits per tenant plan Created src/lib/saas/email-usage.ts: sendEmailWithUsageCheck() β soft-limit (overage billing, still sends) Friday, March 6, 2026 5 updates pushed
Update 5:00 AM Β· ZRosserMcIntosh
health monitor light-mode colors + comprehensive route test coverage Rewrite health-monitor.tsx for light-mode admin theme: Replace all dark zinc classes (text-zinc-100, bg-zinc-900, border-zinc-800) with proper light-mode equivalents (text-gray-900, bg-white, border-gray-200) Fix SVG gauge ring track from dark (#27272a) to light (#e5e7eb) Fix invisible 'Health Monitor' title, card text, history table Status colors (emerald/red/amber) now on white bg with tinted bg chips Sparkline, history table, overall badge all fully light-mode Add expand/collapse chevrons to category cards Expand synthetic test suite from ~62 to ~130+ tests: Add all public pages: creations/*, education/*, engagement/*, legal/*, loose-diamonds, high-jewelry, design-your-ring, wholesale, wedding-sites, in-the-press, jewel-vox, cart, wishlist, rosser, FAQ, careers, accessibility Add all platform pages: demo, marketing, docs Add POST-only APIs: contact, newsletter, consultation, bespoke/inquiry, wholesale/apply, custom-ring-order, engagement-design Add missing GET APIs: search, recommendations, bundles, exchange-rates, articles, health, merchant-feed, wholesale/templates, gift-cards/balance, shipping/calculate, welcome-offer, app/version, app/feature-flags, app/deep-link Add all webhook endpoints: stripe, shipstation, brevo, slack Add all 24 i18n locale homepages Add additional protected routes: user/profile, user/addresses, admin/orders, admin/products Add additional DB checks: collection count, user count
Thursday, March 5, 2026 8 updates pushed
Update 6:39 PM Β· ZRosserMcIntosh
remove dead tenantPrisma(TENANT_ZERO_ID) from platform API routes, fix all 686 tests api-keys/route.ts: removed unused tenantPrisma import, fixed PATCH/DELETE to use prisma directly (tenantPrisma(TENANT_ZERO_ID) was injecting wrong tenant scope, breaking ownership verification for non-Katura tenants) webhooks/route.ts: same fix plans.ts: added missing SLACK_CONNECT feature description onboarding.test.ts: updated for 4 onboarding groups (legal added) e2e-tenant-lifecycle.test.ts: added legal group steps to lifecycle flow middleware.test.ts: fixed stale @/proxy import β @/middleware Security 5:23 PM Β· ZRosserMcIntosh
block tenant_katura from /platform/admin + add tenant zero guard CRITICAL: Prevents Katura's orders, products, and customers from appearing in the SaaS customer dashboard (/platform/admin). Root cause: When the Katura owner (rosserembrasil@gmail.com) visits /platform/admin, getPlatformAdminContext resolves them as tenant_katura which owns both storefronts. All Katura data then appears in the SaaS customer UI β a cross-tenant data leak.
Wednesday, March 4, 2026 1 update pushed
11:35 PM Β· ZRosserMcIntosh
Create Stripe Products & Prices for all 4 SaaS plans Designer: /mo, /yr (prod_U5ZzwLEtlxbGUh) Starter: /mo, /yr (prod_U5a0dtAfAB6KxV) Professional: /mo, ,988/yr (prod_U5a0hytVhUpIr0) Enterprise: /mo, ,990/yr (prod_U5a0njkWx4C0jj) 6e47002
Auto-calculate commission on order creation when salesRepId is provided
Fix productId to allow null for custom items in POST handler Update 12:26 AM Β· ZRosserMcIntosh
assign salesperson, add private commission + restyling source, mobile optimize orders page Fix assign salesperson: replaced prisma.$queryRaw with tenant-scoped db.user.findUnique for commission rate lookup Add RESTYLING order source (pink badge, Gem icon) for jewelry restyling jobs Add Private Commission toggle on mobile cards and desktop dropdown Add updateOrderSource function for inline source toggling Fully mobile-optimized order cards with source badge, sales rep assignment, 3-col data grid Add In Person, Private Commission, Restyling to source filter dropdowns (desktop + mobile) Expand API source filter to support in_person, private_commission, restyling Add Restyling to order detail page source badge, edit dropdown, and display Add sourceRestyling to i18n provider (EN + PT) Update docs-content source documentation table
Support tickets
Storage usage
Enterprise: SSO, white-label
Billing + Connect webhooks (reject unsigned)
Tenant API v1: products, orders, customers
API keys, webhooks management, imports
Nivoda: diamonds, stats
Stuller: products
Abandoned carts, Brevo sync, ShipStation sync
Daily tasks, order cleanup, domain verification, job queue Update 6:24 PM Β· ZRosserMcIntosh
health monitoring overhaul β critical alerting, cart POST test, email routing WHY THE CART OUTAGE WAS MISSED: 1. No POST /api/cart test β only GET was tested (returns empty cart 200) 2. Alert emails went to team@katura1999.com (no inbox) 3. Alert dedup too aggressive (30min window silenced repeat failures) 4. Bespoke Inquiry & Engagement Design tests sent JSON to formData routes β false 500s Update 6:02 PM Β· ZRosserMcIntosh
cart API β move db to module scope so helper functions can access it The getOrCreateCart() and mergeGuestCart() functions were defined at module scope but referenced 'db' which was only declared inside each route handler (GET, POST, DELETE). At runtime, db was undefined when these helpers ran, causing 'Failed to add item to cart' errors. Fix: declare tenantPrisma client at module level so all handlers and helpers share the same db instance. Type db as any to avoid Prisma $extends type mismatches (tenantPrisma auto-injects tenantId at runtime). 5:47 PM Β· ZRosserMcIntosh
Allow FEED_URL env var override in merchant feed validator 5:43 PM Β· ZRosserMcIntosh
Fix Google Merchant feed for Merchant Center submission Filter out base64-encoded images (2 products had data: URIs instead of real URLs) URL-encode slugs with spaces (Peruvian Opal product had broken link) Exclude priceOnRequest and non-NORMAL purchaseMode products (Google requires real prices) Skip products with no valid image (Google requires image_link) Skip products with zero/negative price Auto-generate fallback description for products with none Add validation script: scripts/validate-merchant-feed.ts 5:56 AM Β· ZRosserMcIntosh
Add one-time script: set inventory=1 for Ships Immediately products Already executed against production DB (37 products: 25 created, 12 already correct). Kept for audit trail. 5:30 AM Β· ZRosserMcIntosh
Enforce stock requirement for Ships Immediately products New shared helper: src/lib/inventory/stock-check.ts Single source of truth: isShipsImmediately(), canPurchase(), purchaseBlockReason() Cart API: Block adding ships-immediately products with 0 stock Checkout (3 routes): Block checkout for ships-immediately with no inventory Product detail page: Show 'Out of Stock' + disable Add to Bag button Google Merchant feed: Mark ships-immediately/no-stock as out_of_stock Atelier/made-to-order products remain always purchasable regardless of stock 4:11 AM Β· ZRosserMcIntosh
Restore full description textarea on admin product edit & new pages Update admin 12:04 AM Β· ZRosserMcIntosh
inventory update now writes to correct table (InventoryItem) New PUT /api/admin/products/[id]/inventory route that directly upserts the InventoryItem row via Prisma (findFirst + update/create) Handles both existing rows and products with no inventory item yet Form now calls the correct product-specific endpoint Feature 10:32 PM Β· ZRosserMcIntosh
add precious metals gold & silver redemption page, form, CRM tab & APIs Add /precious-metals page with SEO-optimized metadata + JSON-LD schema Metal redemption form: gold (all karatages) & silver bullion only Digitized gold redemption PDF: terms/agreement, ID upload, item photos Business logic: price re-verification thresholds (gold $100/oz, silver $15/oz) 30-min response window, 10% Katura commission, ACH 3-4 week payout API routes: public submit, image upload (ID + items), admin CRUD MetalRedemption Prisma model + SQL migration (8 status stages) CRM 'Metals' tab with status management, pricing display Footer links: Sell Gold & Silver (shop + client care) Rate limit entries for metal-redemption and metal-upload Silver restriction: bullion only (no jewelry, hollowware, flatware) Customer + internal Brevo email notifications with full details How-it-works, price protection explainer, shipping info, FAQ sections Feature 10:10 PM Β· ZRosserMcIntosh
add luxury watch sourcing page, form, brand carousel, CRM tab & APIs Add /watch-sourcing page with rotating brand logo carousel (10 brands) Watch request form with brand/model selection, box/papers, photo upload API routes: public submit, image upload (Supabase), admin CRUD WatchRequest Prisma model + SQL migration CRM 'Watch Requests' tab with status management Footer links: Watch Sourcing (shop) + Pre-Owned Watches (client care) Rate limit entries for watch-sourcing and watch-upload Brand logos: Rolex, Patek Philippe, Audemars Piguet, Cartier, Omega, TAG Heuer, Breitling, Hublot, Tudor, Vacheron Constantin Feature 12:37 AM Β· ZRosserMcIntosh
add POST /api/checkout/payment-intent endpoint for iOS PaymentSheet Zod validation for cart items, shipping, billing Stripe PaymentIntent creation (not Checkout Session) Rate limiting, inventory validation with atomic reservation Wholesale pricing and promotion discount support Gift balance application Order creation in Prisma transaction with cleanup on failure Returns clientSecret, orderId, orderNumber, amount breakdown
sendEmailStrict() β hard-limit (rejects if over limit)
getEmailUsageStats() β returns sent/limit/percentUsed/isOverLimit
Updated campaign send-now route to check email limits before sending
Returns 429 with usage stats when limit exceeded
Replaced commented-out TODO with real implementation
Built on existing recordUsage() + checkLimit() infrastructure
All 695 tests pass Feature sentry 7:12 PM Β· ZRosserMcIntosh
enhanced Sentry instrumentation Added environment tagging (VERCEL_ENV) Added release tagging (VERCEL_GIT_COMMIT_SHA) Added profilesSampleRate (1%) Added captureConsoleIntegration (warn + error) Added beforeSend filter for noisy 'Failed to fetch' errors Capture env validation failures as Sentry exceptions Added environment + release tagging Added denyUrls for third-party scripts (FB, Google Ads, extensions) Added breadcrumbsIntegration (console, dom, fetch, history) Expanded ignoreErrors (chrome/moz extensions) All 695 tests pass Feature seo 7:07 PM Β· ZRosserMcIntosh
dynamic Open Graph images for 7 key pages Created opengraph-image.tsx (edge runtime, ImageResponse) for: Homepage/default (1200Γ630 branded) Collections Engagement Rings Design Your Ring Jewel Vox (blog) About Education Loose Diamonds Consistent luxury branding: dark gradient, gold (#d4af37) accents, KATURA lettermark, descriptive subtitles Next.js auto-serves these at /[locale]/opengraph-image All 695 tests pass Feature performance 7:04 PM Β· ZRosserMcIntosh
Web Vitals monitoring (CLS, LCP, FID, TTFB, INP) Installed web-vitals v5 Created WebVitalsReporter client component Reports to Sentry (setMeasurement), GA4 (gtag event), and internal API Dev mode: console.log with π’π‘π΄ rating per Google thresholds Uses sendBeacon for reliable page-unload reporting Created POST /api/analytics/vitals ingestion endpoint Logs poor metrics server-side with console.warn Captures poor metrics as Sentry warnings for alerting Returns 204 fire-and-forget Wired into root locale layout (all storefront pages) All 695 tests pass Feature notifications 7:01 PM Β· ZRosserMcIntosh
server-side notification service Created src/lib/notifications/index.ts β full notification service layer createNotification() β single user createBulkNotifications() β batch to many users notifyByRole() β target OWNER/MANAGER/EMPLOYEE roles Convenience: notifyNewOrder(), notifyLowStock(), notifySystemAlert() Typed NotificationType union (order, payment, support, inventory, etc.) Updated POST /api/admin/notifications to use the shared service Existing UI (NotificationBell) + API routes (GET, read, read-all) already complete Prisma schema already has Notification, PushToken, NotificationPreference models All 695 tests pass Feature media 6:54 PM Β· ZRosserMcIntosh
implement real Supabase Storage upload (replace stub) Replaced stub /api/admin/media/upload with full implementation Uses SUPABASE_SERVICE_ROLE_KEY for server-side uploads (bypasses RLS) Supports JPEG, PNG, WebP, GIF, AVIF, SVG, PDF, MP4, WebM 50 MB max file size, unique timestamped paths Returns public URL, path, size, type in response Audit log on successful upload Role-based access: OWNER, MANAGER, EMPLOYEE only All 695 tests pass Feature testing 6:52 PM Β· ZRosserMcIntosh
Playwright E2E test suite Installed @playwright/test with Chromium Created playwright.config.ts (auto-starts dev server, HTML reporter) 5 E2E test files covering 40+ scenarios: storefront.spec.ts β homepage, navigation, footer, 18 public page smoke tests cart-checkout.spec.ts β cart empty state, checkout auth redirect api-health.spec.ts β public API 200s, protected endpoint auth guards seo-a11y.spec.ts β meta tags, OG, heading hierarchy, img alt, lang, i18n performance.spec.ts β load times, console errors, 404 handling Added pnpm scripts: e2e, e2e:ui, e2e:headed, e2e:report Added Playwright artifacts to .gitignore All 695 unit tests still pass Feature security 6:38 PM Β· ZRosserMcIntosh
AES-256-GCM credential encryption for all integrations Created shared encryption utility (src/lib/crypto/credentials.ts) with encryptCredential(), decryptCredential(), isEncryptedFormat() Refactored Wise to use shared utility (backwards-compatible via legacy env var) Nivoda: encrypt password on save, decrypt on read (settings route + tenant-credentials) Stuller: encrypt password on save, decrypt on read (settings route + tenant-credentials) Payout accounts: encrypt routing number, account number, PIX key, and conta fields Added isEncryptedFormat() helper for migration safety (skip already-encrypted values) Added backfill script (scripts/backfills/encrypt-credentials.ts) for existing data Updated .env.example with CREDENTIAL_ENCRYPTION_KEY documentation 9 comprehensive unit tests (round-trip, unicode, tamper detection, format validation) All 695 tests pass Update
health-monitor
3:44 AM Β· ZRosserMcIntosh
fix ShipStation 401 failure + Supabase auth + status badge colors ShipStation: Accept 401 as passing connectivity check β a 401 means the API is reachable even if credentials need rotation. Increased timeout to 15s for their slow API. Supabase: Now sends the anon key (apikey + Bearer) when available. A 401 without a key is still treated as 'reachable' (pass). Dashboard UI: Status code badges now colored by TEST STATUS (pass=green, fail=red, degraded=amber) instead of raw HTTP code. Previously a passing test returning 401 showed a confusing red badge. Update health-monitor 3:26 AM Β· ZRosserMcIntosh
fix white-on-white status text + 6 false-positive test failures Fix /en/bespoke β /en/creations/bespoke (correct route) Remove /en/education/gemstones (page doesn't exist) Remove /en/education/jewelry-care (page doesn't exist) Add /en/education/4cs, /en/education/settings, /en/education/diamond-shapes API: Events GET requires auth β expect [200, 401] API: Reviews GET requires productId β expect [200, 400] Feature design-your-ring 3:05 AM Β· ZRosserMcIntosh
add 14K/18K gold karat selection with $1,000 upgrade Gold metals (Yellow, Rose, White) now default to 14K with option to upgrade to 18K $1,000 surcharge applied when 18K gold is selected Elegant segmented toggle appears on Chapter 3 when a gold metal is chosen Karat auto-resets to 14K when switching to Platinum Metal label shows karat prefix (e.g., '14K Yellow Gold') in nav bar, mini summary, and Ch7 Transparent pricing breakdown in Ch7 shows '18K Gold Upgrade' line item when applicable metalKarat sent to /api/custom-ring-order for order processing New translation keys: ch3.karatLabel, ch3.karat14K, ch3.karat18K, ch7.metalUpgrade Feature 12:41 AM Β· ZRosserMcIntosh
health monitor β synthetic test engine + wall-of-gauges dashboard Synthetic test engine (src/lib/monitoring/synthetic-tests.ts): 55+ automated probes covering public pages, API routes, auth, checkout, database integrity, i18n locales, external integrations (Stripe, Brevo, ShipStation, Supabase, Vercel), platform SaaS, and webhook endpoint validation Hourly cron job (api/cron/synthetic-tests): Vercel cron at 0 * * * * runs full suite, persists results to SyntheticTestRun + SyntheticTestResult tables (raw SQL, 7-day TTL) Email alerts on failure: Brevo email with failure list, degraded warnings, and link to dashboard. 30-min dedup to prevent spam. Admin dashboard (admin/developer/health): Wall-of-gauges UI with overall health badge, category cards with gauge rings (Pages, API, Auth, Checkout, DB, Integrations, Platform), expandable per-test detail with status codes + response times, pass/fail sparkline trend chart, run history timeline table, manual 'Run Now' button, auto-refresh every 5 min. Sidebar nav: Health Monitor added under System group Translations: EN + PT SQL migration: SyntheticTestRun + SyntheticTestResult tables with indexes Build clean, 686/686 tests pass, 0 TS errors e25a5ce
Feature 4:38 PM Β· ZRosserMcIntosh
add gift cards to footer + minimize product description section Add Gift Cards link to Client Care column in footer Add 'giftCards' translation key to en.json Minimize 'About This Piece' section: collapsed by default, text-xs, stone-400 coloring β barely visible but still fully indexable by Google Minimize 'Details' accordion to match the same subtle styling NOT using white-on-white hidden text (Google penalizes that) Feature seo 5:30 AM Β· ZRosserMcIntosh
add 'About This Piece' + Details sections to product pages Full product description now rendered in expandable <details> section Google can index the content (not hidden, just collapsible) Added Details accordion with metal type, gemstone, carat weight, jewelry type 'One of a Kind' badge for isOneOfOne products Uses native HTML <details>/<summary> β zero client JS overhead Placed between product actions and reviews for natural reading flow Feature 5:00 AM Β· ZRosserMcIntosh
replace platform blog filler with real content + individual post pages Created posts.ts with 6 substantive articles about jewelry business topics Each post has real, multi-section content (not placeholder excerpts) Topics: all-in-one platform strategy, product photography, CRM pipelines, email marketing, internationalization, trunk show management Added /platform/blog/[slug] route with individual post pages All posts statically generated via generateStaticParams Blog listing now links to individual posts with hover states Each post page includes related posts, CTA, and proper metadata Feature 4:31 AM Β· ZRosserMcIntosh
add JCK & Garden & Gun logos to press and about pages Replaced text-based publication names with actual logo images JCK logo and Garden & Gun logo link to respective articles Added aria-labels for accessibility Logos stored in public/brand/press/ Docs 4:14 AM Β· ZRosserMcIntosh
update session plan β Priority 4 SEO complete, audit infrastructure status Feature seo 4:10 AM Β· ZRosserMcIntosh
add FAQPage + BreadcrumbList JSON-LD to all 7 education pages Created shared EducationJsonLd component for consistent structured data Education hub: 5 FAQs about diamond education topics 4Cs page: 5 FAQs about cut, color, clarity, carat Diamond shapes: 5 FAQs about shape popularity, size, sparkle Metals: 5 FAQs about platinum, gold types, allergies Settings: 5 FAQs about prong vs bezel, pavΓ©, halo Ring sizing: 5 FAQs about measuring, sizing tips, conversions Diamonds guide: 5 FAQs about 4Cs, lab-grown, fluorescence, budget