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 14d
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,858,492
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 2 of 40 Β· 51β100 of 2,000 fetched
Thursday, June 4, 2026
14 updates pushed
Featureinvoices8:47 PM Β· ZRosserMcIntosh
mark SalesInvoice PAID via Stripe webhook + fix all outstanding issues
Add recordStripePayment() to lib/invoices/repo.ts
Inserts SalesInvoicePayment with STRIPE_CARD or STRIPE_PIX method
Recomputes amountPaid/amountDue and flips status to PAID when fully covered
Uses ON CONFLICT DO NOTHING to prevent duplicate payments
Wire Stripe webhook to handle kind=sales_invoice_public
Calls recordStripePayment() when checkout session is completed
Logs invoiceId, payment status, and Stripe payment intent ID
Client component β fetches GET /api/account/unpaid-invoices on mount
Appears 1.2s after page load (avoids layout flash on first render)
Shows the most urgent unpaid invoice in a centered modal with backdrop blur
Overdue invoices get a red icon; others get amber
BRL invoices show 'Pix available Β· instant payment' sub-line
Dismissal stored per-invoice in localStorage with 24h TTL
'Remind me later' link dismisses for 24h; backdrop click also dismisses
Wednesday, June 3, 2026
2 updates pushed
Feature7776:15 PM Β· ZRosserMcIntosh
8-point conversion improvement pass
Replaced non-existent db.cRMContact.upsert() with db.crmContact find-then-create-or-update pattern (matching booking.ts)
Fixed db.engagementLead.create() to use correct Prisma field names (firstName, lastName, email, crmContactId) instead of the wrong contactId/kind/source fields that were causing silent Saturday slot failures
Added missing sender field to sendBrevoTransactionalEmail call
Changed errorMap callback to message string (Zod v4 API)
Removes the consentGiven type error downstream
Added lightweight 'Not ready to pick a time?' panel above the calendar
Collects name + phone/email with a single CTA: 'GET AVAILABILITY'
POSTs to new /api/consultation/availability-request with full campaign attribution (UTM, fbclid, fbp, fbc, smartLinkId, offerVariant)
On success: pre-fills the full form fields to reduce friction for users who continue to schedule
Submit button is still disabled until all required fields are complete
A live checklist now appears below the button when it is disabled
Items: 'Choose a date', 'Choose a time', 'Enter name', 'Enter email', 'Enter phone', 'Accept privacy terms'
Checklist disappears as each field is completed
Button now reads 'REQUEST 7.77 AVAILABILITY' on the 777 route
Matches the buyer's intent (checking availability/pricing) vs the lower-intent 'SCHEDULE CONSULTATION'
Non-777 routes still show 'SCHEDULE CONSULTATION'
When all slots on a date are taken, a 'Have concierge text me' panel now appears alongside the existing email option
Collects name + phone, POSTs to new /api/consultation/concierge-text with full attribution
Concierge receives a priority notification to open a private slot within 2 hours
Success state shown inline; lead saved to CRM
Hero now shows two side-by-side price cards: Lab Grown from $9,900 / Natural from $700,000
Tuesday, June 2, 2026
21 updates pushed
Update9:23 PM Β· ZRosserMcIntosh
go/[slug] bot filtering + missing-slug warning
Add bot/crawler UA detection β 20+ patterns covering Meta crawler, social preview fetchers, search bots, scanners, headless clients. Bots still get the redirect but are NOT logged and CAPI does NOT fire. This fixes the ~10x click inflation vs Meta Landing Page Views.
Unknown slug now logs a server-side warning instead of silently redirecting to homepage β makes misconfigured ad URLs visible in logs.
Move userAgent read to top of handler (used for both bot check + logging)
clickId skipped for bots so no spurious ?sid= param on bot redirects
Root cause: initialTranslationLang was set to null for English-speaking hosts (line 3560: isNonEnglish ? spokenLanguage : null). This meant the condition on line 1494 (translationLang && msg.sourceLanguage && translationLang !== msg.sourceLanguage) always failed β remote captions from non-English guests were never translated for the host.
Fix: Always set initialTranslationLang to the host's own spokenLanguage. The useRealtimeTranslation hook already guards against useless self- translation (disabled when translationLang === sttLang), so English hosts won't waste cycles translating their own speech back into English. But when a guest speaks Japanese/Spanish/etc., the host now correctly triggers the /translate endpoint and sees translated subtitles.
go/[slug]: generate clickId BEFORE building redirect URL so it can be appended as ?sid=<clickId> β fixes the smart_link_click_id always being empty in the consultation attribution hook
go/[slug]: remove duplicate clickId generation in logging section
links/[id]/page: add inline CAPI ViewContent toggle (was badge-only, no way to enable/disable without direct DB access)
apply smart-link click-duration migration to prod + relocate
Smart link detail page: performance analytics never load
Smart link list page: 'hasn't updated since last night' (same root cause β when the detail card 500s the list page's per-row stats appear frozen because totals can't refresh on next view)
conversion-first layout reorder + hero image for OG
Diamond Studs bonus section moved UP (now immediately after hero)
Consultation form (SCHEDULE YOUR PRIVATE CONSULTATION) moved to position 3 β right below the studs. Users see offer β bonus β form without scrolling past testimonials and social proof first.
Testimonial ('I never thought I'd be able to own a 7-carat diamond') moved BELOW the form as post-form social reinforcement.
Value summary, video, Love Stories carousel, and 'How It Works' section now sit below the form as supporting content.
FAQ, wedding site CTA, and contact sections remain at bottom.
brand+seo: new Katura logo + fix iMessage/WhatsApp/Twitter previews
Replaces /brand/header-logo.png, /brand/katura-logo.png, /brand/logo.png, and /katura-logo.png with the new blue-gem KATURA EST 1999 wordmark.
All header and footer logo references update automatically (they all point at /brand/header-logo.png and /brand/logo.png).
New buildOfferMetadata(offer) helper in _shared/offer-config.ts generates a full Metadata object with openGraph + twitter, including the offer's hero image (1200x1200) and a Katura-branded fallback OG (1200x630) so previews always render even if the hero image fails.
All 5 offer pages now use this helper β one line each, no duplication.
New /engagement/consultation/layout.tsx adds proper metadata to the main consultation page (which is a client component and can't export metadata itself).
/g/[token]/page.tsx now adds the static /brand/katura-og.png as a SECOND OpenGraph image. Scrapers fall back to it when the dynamic card is slow.
Title now personalises with the actual meeting title when available ('Bespoke Consultation | Katura' vs the generic 'Join Meeting | Katura'); description includes the invited guest's name.
Root cause: The Loupe360 iframe used fixed offsets (top: -25%, left: -25% with width/height: 150%) to 'zoom in' past the viewer chrome. This only works when the container is roughly square. In the guest pop-out window (tall/narrow aspect ratio), the stone appeared clipped in the top-right corner with empty white space elsewhere.
Fix: Replace fixed offsets with proper centering (top: 50%, left: 50%, transform: translate(-50%, -50%)). The 150% scale is preserved so the zoom effect still works, but now the stone is always centered regardless of the container's aspect ratio.