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
850,259
Web platform β TypeScript, React, Prisma, CSS
iOS
79,607
Swift + SwiftUI lines
Android
3,117
Kotlin + Jetpack Compose lines
All platforms
932,983
Web + iOS + Android combined (45.8Γ the King James Bible)
Characters written
36.05M
36,053,358 total characters
Updates pushed
2,087
exact commit count on main
Current version
v1.20.87
build 2087 Β· 40f34e0
Database models
411
across 47 schema files β most SaaS platforms have 20β50
API endpoints
988
individually routed β Stripe's public API has ~400
Translated strings
82,512
every string, in 24 languages
System permutations
10^297
2^988 endpoint combinations β more than atoms in the observable universe (10^80)
Project age
8mo 1d
since Dec 14, 2025
Pre-AI dev hours
31.1K hrs
932,983 lines Γ· 30 LOC/hr β equivalent to 15.0 years (senior engineer, no AI)
With-AI dev hours
7.8K hrs
4Γ AI productivity multiplier (2024β2026 studies) β equivalent to 972 days
Equivalent firm cost
$8,119,253
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
2,087 updates pushed
Showing page 3 of 40 Β· 101β150 of 2,000 fetched
Saturday, June 6, 2026
7 updates pushed
Chore1:12 AM Β· ZRosserMcIntosh
trigger redeploy to warm build cache after account pause
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
Handles both card and Pix payment method types
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
11 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
Phone dialog has a simple math captcha before revealing +1 (404) 455-8989
Future weekdays (2+ days out) β green 'OPEN' tint with availability legend
Shared between /engagement/consultation and all /777 offer pages
Wire ConsultationDatePicker into both page files; remove stale Calendar imports
bookConsultation: send internal notification to both rosserembrasil@gmail.com and jewelryadvisor@katura1999.com (hardcoded, de-duped against CONSULTATION_NOTIFY_EMAIL env var) β all fired in parallel, from: sales@katura1999.com
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)