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,041
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 6 of 33 Β· 251β300 of 1,643 fetched
Sunday, May 3, 2026
1 update pushed
Docsmarketing4:50 PM Β· ZRosserMcIntosh
paid ads growth plan β k test β M profit roadmap
GET/POST /api/admin/marketing/qr-codes (list with totals/7d/30d, create with auto-slug)
PATCH/DELETE /api/admin/marketing/qr-codes/:id (rename / change dest / archive / delete)
GET /api/admin/marketing/qr-codes/:id/analytics?days=N (daily series + countries + recent)
GET /api/qr/:slug (public β log scan + 302 with utm/qr params)
Branded QR generator (src/lib/qr/branded-qr.ts) renders 1024Γ1024 PNG with the Katura KK logo (public/qr-logo.jpeg) on a white rounded plate in the center; uses error-correction H so the logo never breaks scanning.
QR detail dialog: live PNG preview, Download PNG, inline rename, editable destination, recharts AreaChart over 7/30/90 day window, top countries, recent scan log, archive/restore, hard delete.
Sub-nav: added 'QR Codes' tab next to Traffic/Orders/Products.
editable specs, stones delete, casting metal selector + library CAD merge, landscape PDF cert, mobile-aware STL zoom
Wednesday, April 29, 2026
1 update pushed
Updatek991:57 PM Β· ZRosserMcIntosh
graceful /cad error boundaries + carousel logo tweaks
Add route-level error.tsx so client-side runtime crashes (most likely WebGL / @react-three/drei HDR fetch / mergeVertices on a non-watertight STL) no longer trigger the full-page global-error 'Something went wrong' screen.
Add StudioErrorBoundary around MarketingStlViewer and LiveMetalPricesCard so a failure in the heavy 3D studio block degrades to a small inline placeholder while the rest of the marketing page (pipeline stages, automation grid, comparison, CTA) keeps rendering.
Android: dropped 'lg' size flag β renders at default slot (max-h ~40px, half its prior 80px footprint).
xAI: scale 0.5 (50% smaller per request).
Apple Pay: scale 0.75 (25% smaller per request).
Apple Wallet: removed from carousel entirely.
Renderer now honors an optional per-logo `scale` multiplier via inline maxHeight, no Tailwind class explosion needed.
src/lib/docs-content.tsx (K99 docs example for tenants)
src/app/[locale]/wholesale/page.tsx (B2B dealer policy β separate from consumer)
Friday, April 24, 2026
15 updates pushed
Featureagents9:13 PM Β· ZRosserMcIntosh
Sprint 0 β runtime/brandProfile schema, approval inbox, Test Agent
Schema: YenAgent gains runtime ('inline' | 'browser'), brandProfile ('katura-retail'|'katura-wholesale'|'stella-marketing'|'antar-cad'|'k99-saas'|'internal'), and category. Migration applied to prod via scripts/run-yen-agent-runtime-migration.ts.
Approval Inbox: GET /api/admin/yen/approvals lists every PENDING_APPROVAL tool call across all conversations. /admin/agents/inbox is a self-refreshing UI that deeplinks to the chat for one-click approve/reject.
Test Agent: 2 new Yen tools (httpHealthCheck with allow-listed hosts only, reportTestRun for structured pass/fail logs). Seeded YenAgent 'Platform Health Agent' (slug platform-health, brandProfile=internal, category=test) that probes the homepage/products/sitemap/admin/health endpoints and reports results. Idempotent seed script.
Landing page: replaced Mac-mini/OpenClaw copy with the new Vercel + Groq + Browserbase architecture. New cockpit with 4 quick links (Inbox, Test Agent, All Agents, Memory Bank).
include /admin/design library-linked CAD files in share viewer
Public share API now also queries CadFileLink where jewelryProjectId=..., resolves the public URL in the 'cad' bucket, and merges the entries into cadFiles[] with isLibraryLink=true and the original libraryFileName.
fileUrl still respects link.allowDownload (null when downloads disabled), while previewUrl is always streamed for the inline 3D viewer.
Viewer renders LIB badge instead of v{n} for library entries and shows the library file name in the sidebar + active-file caption.
CAD section is ALWAYS visible (was conditionally hidden when 0 files + uploads disabled). Empty state shows 'No CAD files yet β still in design' or the dashed upload zone when allowUpload=true.
New 'Dimensions' section: certificate-parsed cadJson per stone, with reviewed badge.
New 'Casting' section: per-quote summary with metal type, weight, waste, vendor, CAD version linked, costs (when showCosts), and shipping status (carrier + tracking number + ship destination).
New 'Recent activity' timeline: last 15 CAD uploads, stones added, notes, casting quotes, status changes β gives recipients a feel for project momentum without exposing sensitive ops.
casting fulfillment, metal alloy/ozt fix, zoom default 300%
Schema: JewelryProjectCastingQuote.{vendorId, invoiceUrl, invoiceUploadedAt, trackingNumber, trackingCarrier, shippedAt, receivedAt, shipDestination} with FK to JewelryProjectVendor (migration applied)
New PATCH /api/admin/jewelry-projects/:id/casting-quotes/:quoteId for vendor/tracking/dates updates
New POST .../invoice for multipart invoice upload (PDF/image, 25MB cap) stored at uploads/casting-invoices/<projectId>/...
CastingTab: top CAD download list (one-click for casting houses); each quote now has vendor selector, ship destination, invoice upload + view, tracking number/carrier/shipped+received dates with auto-save on blur
Added 'Alloy $ / ozt' column = spot Γ purity (was the missing per-troy-oz value the user expected). 'Spot / ozt' kept for reference.
is3DFile/isSTLFile regex now accepts bare extensions ('stl') in addition to full filenames ('ring.stl'). The DB stores fileType as a bare ext on JewelryProjectCadFile, so the old /\.(stl|obj|...)$/ pattern never matched and the inline viewer always fell through to 'preview not available'. Root cause of the missing 3D preview on the CAD tab.
Add JewelryProjectCadFile.displayName column (migration applied) so admins can rename CAD files internally without touching the storage filename. e.g. '1763472718-a4b5c6.stl' -> 'SIZE 8 Homage Ring'.
Pencil rename button on every project-uploaded CAD row (linked-from- library files keep their library name). Display name renders as the primary title above the version/type badges, with v{n}.{ext} as a subtitle.
10K rose gold + live metal prices on CAD tab, auto CAD library folder, AI handwritten notes OCR
stl-viewer: add 10K Rose Gold metal preset (deeper, less reflective coppery-pink than 14K/18K)
casting/calculator: add 10K Rose Gold + 10K White Gold metal definitions w/ correct SG and purity
New MetalPricesPanel component shown beneath inline 3D viewer on CAD tab β renders full alloy table ($/g, purity-adjusted) for every metal in the casting table, with live spot prices from /api/developer/metal-prices, refresh button, and source badge (LIVE/PARTIAL/FALLBACK)
cad-files POST: when first CAD file is uploaded to a project (version === 1), auto-mirror it into the cad bucket under a folder named after the project (e.g. 'PRJ-2026-0012 β Engagement Ring') and create matching CadFile + CadFileLink rows so it appears in /admin/design with no manual step
New /api/admin/jewelry-projects/[id]/notes/handwritten endpoint: accepts photo/scan/PDF, runs OCR + structured-summarization via Claude 3.5 Sonnet (preferred for handwriting) β falls back to GPT-4o, persists result as a non-internal JewelryProjectNote with link to original scan
NotesTab gains a 'Upload handwritten notes' panel at the top with optional context prompt, file picker, status feedback, and provider attribution
Provider preference: ANTHROPIC_API_KEY (Claude) β OPENAI_API_KEY (GPT-4o) β recommend setting ANTHROPIC_API_KEY for best handwriting recognition
remove stale @@map("Vera*") directives from Prisma schema
The Yen* tables were renamed from Vera* in the DB (via prisma/rename-vera-to-yen.sql), but the Prisma schema still carried @@map("Vera*") on every model and enum. Prisma was therefore querying the old (now non-existent) Vera* tables and Yen chat crashed with: 'The table public.VeraConversation does not exist in the current database.' Removing the @@map directives lets Prisma use the model names directly (YenConversation, YenMessage, YenToolCall, YenGuardrailEvent, YenExtMemory, YenExtAgent, YenExtAgentRun, YenExtHeartbeat, YenExtChannelLink + 3 enums) which match the actual table names.
Adds K99-specific metadata export to platform marketing layout, overriding the Katura store's openGraph and twitter blocks that were leaking through to k99.katura1999.com (Telegram preview was showing Katura branding on K99 pages).- Adds 10 hand-written KATURA_SEO articles in mom's Jewel Vox voice, each anchored to a real product in the catalog (martini studs, Colombian emerald pendant, chasing ring, starfish earrings, Taxco bangle, Tahitian pearls, golden South Sea pearls, 7.77ct lucky-numbers solitaire, Izzy orange diamonds, Portuguese-cut blue diamonds).- Adds 10 hand-written K99_BLOG strategy essays for indie jewelry founders (tool sprawl cost, inventory turn, bridal unit economics, custom pricing, CAC breakdown, wholesale line sheets, POS analytics, studio-note copy, repair P&L, Shopify Plus critique).- All 20 articles seeded as PUBLISHED with publishedAt staggered over 10 days (day 0 = now, days 1-9 = 09:00 UTC). Public routes already filter publishedAt <= now, so future-dated articles auto-publish on schedule.- Adds two ESM seed scripts: seed-blog-articles.mjs (OpenAI-powered, for future use when API quota is available) and seed-blog-from-static.mjs (the loader actually used here).- Article kind enum: KATURA_SEO -> /blog (public catura store), K99_BLOG -> /platform/blog (K99 SaaS journal).
customers/manage β segments vs. tags, lifetime value math with Bayesian forecast, duplicate merge, GDPR privacy actions (export/anonymize/hard-delete).
Phase 3 (API): api/overview, api/products, api/orders, api/webhooks, api/rate-limits β added base URL/versioning, Bearer token auth, response/error format with full error-code table, idempotency rules, pagination shape, curl + JS examples, status transitions, webhook payload shape, HMAC-SHA256 signature verification snippet, retry policy, 429-handling pattern with exponential backoff + jitter.
Phase 4 (i18n): verified locale fallback architecture in docs-content.tsx already returns English with isTranslated:false flag for missing es/pt keys β no code change required.
K99 Intelligence + CAD Pipeline docs sections; live Homage STL via public proxy
New /api/public-cad/[asset] route β strict whitelist, CDN-cached, no auth. Whitelists Katura_Homage_Ring_Size_8_Booleaned_STL_21d9ea69.stl as 'homage'.
Marketing STL viewer + /cad page now load the real Supabase STL through proxy.
/yen page + /cad STL viewer + live metal prices + features beautify + docs i18n fix
**MarketingStlViewer**: client-only @react-three/fiber viewer that loads /cad/homage.stl if present, otherwise falls back to a torus placeholder with an overlay note explaining how to install the real Homage ring STL. Computes mesh volume in mmΒ³ via signed-tetrahedra integration (mirrors src/components/admin/stl-viewer.tsx). Auto-rotates, 5 metal-finish presets selectable live.
**LiveMetalPricesCard**: fetches /api/developer/metal-prices and renders all 5 metals (Au/Ag/Pt/Pd/Rh) with source badge (live / partial / fallback) and refresh button. 5-min cache, COMEX/NYMEX scraper.
**'How K99 quotes a custom piece'** explainer: 5-step volume β grams β spot Γ density β quote pipeline. Plus 3 capability cards (volume, live pricing, alloy-aware densities).
TypeScript full check OOMs on this monorepo (known); per-file editor validation passes on all new files.
The Homage STL itself is NOT in this commit β production STLs live in Supabase. Drop the file at public/cad/homage.stl to swap from placeholder to live render. The marketing viewer detects it via HEAD probe + actual load attempt and surfaces the state in the UI.
Docs audit/expansion (133 articles Γ 24 locales) was scoped out of this commit β multi-day writing project, slated for a follow-up sprint.
geo-locale auto-detect + new /cad design pipeline page
On first visit to k99.katura1999.com/, read x-vercel-ip-country and 307-redirect: PT, BR β /pt ES, MX, AR, CO, PE, VE, CL, β /es EC, GT, CU, BO, DO, HN, PY, NI, SV, CR, PA, UY, PR, GQ everything else β / (English, default)
Sets k99_locale cookie (1yr) on first response so we never re-evaluate. Cookie is also set when the user manually picks a language via the LanguageSwitcher β manual choice always beats geo on subsequent visits.
Honors ?nogeo=1 query param for debugging / share-an-EN-link scenarios.
Only fires on bare '/' β deeper links keep their path/locale.
On click, writes the same k99_locale cookie before routing so the user's manual pick persists across visits and overrides any future geo-redirect attempt.
Marketing page covering the full custom-design workflow: Idea β Drawing β CAD β Sourcing β Casting β Bench β Setting β Delivery (8 stages, vertical timeline with center spine).
Each stage has 4 concrete bullets explaining what K99 does at that step (CAD upload, Nivoda + Stuller sourcing, casting quotes, bench time tracking, per-stone provenance, etc.).
'Why this changes everything' grid: customer portal, milestone notifications, live cost ledger, time tracking, provenance, cross-module integration.
Before/After comparison strip ('eight tools, zero memory' vs. 'one project, total recall').
Antar is NOT named per request β described as 'the K99 design pipeline' shipping on every plan.
Wired into desktop nav, mobile nav, and footer Product list.
wire tenant-scoped db into requireK99Admin + add Yen home section
requireK99Admin() now returns { session, tenantId, db } where db is a tenantPrisma(tenantId) instance. Route handlers get a scoped Prisma client by default β they cannot accidentally query across tenants because every read/write auto-injects WHERE tenantId = X.
No need to build it β just wire it into the guard so devs can't forget to use it.
Decision log added to docs/k99-platform-parity-plan.md: rejected physical DB separation in favor of single-DB defense-in-depth (guard + scoped client + future RLS).
New 'Meet Yen' section in platform-landing-client.tsx, inserted immediately after the existing AI/neural-net section (which is preserved per user's prior 'kept as-is' request).
Chat-bubble mockup with realistic jewelry-domain conversation (product description for 2ct emerald-cut + customer follow-up).
New requireK99Admin() in src/lib/auth.ts mirrors requireKaturaAdmin but inverts the tenant check: K99 admin endpoints reject tenantId === TENANT_ZERO_ID so Katura accounts cannot cross the boundary into per-tenant SaaS surfaces.
Returns { session, tenantId } for downstream WHERE-scoping.
12 categories now reflect what K99 actually has shipped: Storefront, CAD Studio, Diamond/Gem Sourcing (Nivoda/Stuller), Yen AI, Outbound Engine, CRM, Website Builder, Wedding Sites, Marketing & Email, Payroll, Analytics, Multi-Tenant/White-Label
New badges (New / Beta / Featured) for Yen, Outbound, CAD Studio
Featured callout linking to /marketing#design-process showcase
consolidate /marketing/design-process into /marketing#design-process
Extracted all blue-themed cinematic content (phases 1-8 + Why Katura, including FelineOrbit, AudienceVisualization, CTAFunnel, MultiCarousel, FloatingGems) into reusable <DesignProcessSection /> component
Inlined into MarketingShowcaseClient under id="design-process" anchor, placed immediately after the Stella portfolio CTA so the existing 'View Stella's Design Process' button now scrolls in-page
Rewired both internal cross-links (portfolio CTA + final CTA secondary) from /marketing/design-process -> #design-process
Deleted the standalone subpage + its es/pt locale variants:
Optional: prisma/rename-vera-to-yen.sql + runner β coordinated rename of legacy Vera* production tables to Yen* (NOT YET RUN; requires schema @@map flip in same deploy).
The chat route required a non-empty userMessage even when an image attachment was present, which broke 'send a photo with no caption'. Now: empty text is OK if attachments exist; otherwise we return a human-readable 'Type a message or attach a file to send.' instead of the cryptic 'userMessage is required'.
/admin/calendar Settings gear now opens a real dialog: list calendars + add new color category (name + GCal palette)
Yen tools: listCalendars + createCalendar (rate-limited, dup-name guarded). Now Yen can make color categories for mom on request.
System prompt: explicit instructions to NEVER emit <function=..></function> tags in text and to STOP saying 'I cant' when a tool exists. Lists the GCal palette so Yen picks sensible defaults.
Chat route: belt-and-suspenders sanitizeAssistantText() strips any leaked function/tool tags before persistence + reply.
docs/openclaw-playbooks.md: 10 ranked OpenClaw playbooks tied to revenue, build order, and Mac-mini deployment notes.
New humanizeProviderError() in chat route translates Groq/OpenAI/Ollama errors into plain English: rate limits, invalid keys, model not found, 503/502/504, context-length, generic 4xx β never leaks raw JSON.
Server returns retryAfterSeconds when applicable; UI uses it to size toast duration.
Cleaner copy for missing API keys and Ollama-unreachable states.
New <YenBubble /> component (src/components/admin/yen-bubble.tsx). Fixed bottom-right gradient FAB, hidden on /admin/yen.
Derives PageContext from pathname (product / order / project / customer / collection / etc.) and POSTs it alongside the user message. Resets conversation on navigation so each page gets its own scoped chat.
Mounted globally in src/app/admin/layout.tsx (sibling of AdminShell).
Writes seoTitle / seoDescription directly to the Product row.
System prompt now tells Yen: when on a product page and asked to improve SEO, call updateProductSeo with the in-context productId.
Rate-limited (20/min). Not soft-gated β designed for the 'write it right before my eyes' UX the user described.
Self-host studio_small_03_1k.hdr at /public/hdri/ (1.6 MB, served by Vercel CDN, same-origin, no CORS, no third-party CDN throttling)
Replace <Environment preset='studio' /> with files='/hdri/...'
Fixes 'Could not load studio_small_03_1k.hdr: NetworkError' which was caused by the drei default CDN being unreachable/throttled
Click anywhere on a CAD file row (3D-capable file types) β opens 3D preview automatically. Old explicit '3D View & Casting' button still works for keyboard/touch users; row also responds to Enter/Space.
Hover state + cursor change signal the row is interactive.
Nested buttons (View, Download, Delete, etc.) still work via closest('button, a, input, textarea') guard.
Add /admin/projects/[id]/loading.tsx skeleton so the page shows structure instantly during the client-side fetch instead of a blank screen + spinner. Doesn't change the actual API speed but makes the wait feel ~3x faster.