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,108
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 13 of 33 Β· 601β650 of 1,643 fetched
Monday, March 2, 2026 2 updates pushed
Refactor 2:13 PM Β· ZRosserMcIntosh
remove all `any` types from tenant-prisma.ts Created AllModelsQueryArgs interface for $allModels extension callbacks Replaced 18 `: any` destructured params with typed AllModelsQueryArgs Added explicit `as Record<string, unknown>` casts for result/data access Zero `any` remaining in tenant-prisma.ts (core tenant isolation layer) All 39 existing tests pass unchanged Update 12:16 AM Β· ZRosserMcIntosh
cap table β run migrations directly, remove fs.readFileSync from Vercel Ran all 5 cap table SQL migrations against Supabase directly 15 cap_* tables created with seeded data (October Skies Benediction LLC) Rewrote handleInitializeTables to check for existing tables instead of reading files Removed fs/path imports and outputFileTracingIncludes from next.config.ts handleReseed returns 501 with instructions for local execution Sunday, March 1, 2026 24 updates pushed
Feature 11:26 PM Β· ZRosserMcIntosh
cap table valuation estimator + fix initialization + debug sales rep Industry-comparable multiplier presets (Luxury Jewelry/DTC, E-Commerce, SaaS, Small Business, Manufacturing, Custom) AI-assisted notes explaining each industry's valuation dynamics Revenue or Earnings based (auto-switches per industry) Interactive slider for multiplier with bear/base/bull scenario table Per-share price based on fully diluted count Reference points from last funding round and SAFE caps Legal disclaimer about non-409A nature Copied SQL migration files to migrations/cap-table/ where the initialize handler expects them Added outputFileTracingIncludes in next.config.ts so Vercel bundles the SQL files in the serverless function Better console output for team members fetch to diagnose why the dropdown only shows 'Unassigned' Handles both array and wrapped response formats Update 11:00 PM Β· ZRosserMcIntosh
order detail page β mark-paid for DELIVERED orders, tenantId on all creates Allow DELIVERED orders to be marked as paid (keeps DELIVERED status, just updates payment to SUCCEEDED) Added tenantId to auditLog.create Added tenantId to OrderItem creates (when editing items) Saturday, February 28, 2026 19 updates pushed
Feature 11:26 PM Β· ZRosserMcIntosh
design-process page theme update + carousel implementation + new Stella portfolio images Theme: Switch from green (emerald) to dark blue (sapphire) color scheme Updated hero, phases, cards, badges, stats, dividers across all sections Radial gradients, hover states, and accent colors now blue-based Carousels: Auto-rotating image galleries for Stella's portfolio AutoCarousel: Single image with crossfade, nav arrows, dot indicators MultiCarousel: 5-image sliding window with auto-advance (3.5s interval) All images pause on hover for better UX Images: Added 5 new Stella design work samples (jewelry/brand concepts) stella-work-6 through stella-work-10 now in rotation All 10 images display in auto-advancing multi-carousel Maintains Framer Motion animations, responsive layout, accessibility Update rsvp 8:18 PM Β· ZRosserMcIntosh
seamless auth flow for wedding RSVP Remove upfront 'Katura Account Required' banner from invite code step Add 'auth' step that appears only when RSVP submission returns 401 Store RSVP selections in localStorage before redirecting to auth Friday, February 27, 2026 5 updates pushed
Docs 8:58 PM Β· ZRosserMcIntosh
rewrite Stella strategy β 70/30 split, R$1M/year target, equity vesting, team hiring, physical stores 70% Stella / 30% Katura revenue split on all marketing services R$1,000,000 BRL/year personal income target (~$20K USD/month) Performance-based equity vesting: 1% β 7% over 2-3 years Path from Creative Director β Executive Director of Marketing β Shareholder Team hiring roadmap: 5 hires funded by revenue growth (BR-based) South American physical locations: SP popup β SP permanent β RJ β BH OpenClaw cost comparison: $430/month vs $28K-38K traditional agency 46x ROI on OpenClaw infrastructure spend Detailed service catalog with 70% take-home per deal 6-phase implementation timeline with equity milestone triggers Cap table integration at /admin/cap-table for equity tracking Feature openclaw 8:45 PM Β· ZRosserMcIntosh
individual experiment pages with guardrails, token limits & Stella marketing strategy Created docs/integrations/OPENCLAW_STELLA_MARKETING_STRATEGY.md Comprehensive strategy for using OpenClaw to promote Stella's marketing services (Meta ads, brand identity, cold outreach, follow-up sequences, portfolio-powered emails, spending limits)
Added tenantId to AuditLog create (was causing 500 on source update)
Added tenantId to CommissionRecord create
Added tenantId to DELETE audit log
Improved error response with details
Show 'Mark as Paid' button for DELIVERED orders when payment hasn't been collected (checks payment status, not order status)
Removed DELIVERED from the status blocker list Update 10:48 PM Β· ZRosserMcIntosh
disable Command built-in filtering for server-side search The shadcn Command component has its own client-side filter that was racing with our server-side search. When results came back from the API, Command's internal filter couldn't match them because they weren't present when the filter string was first evaluated. Added shouldFilter={false} to both customer and product Command components so only our useEffect debounced API search controls what's shown. Feature 10:07 PM Β· ZRosserMcIntosh
update rexandkate wedding site hero text Changed the top line from 'Request the Pleasure of Your Company' to 'We Request the Pleasure of Your Company' Update 10:04 PM Β· ZRosserMcIntosh
align order and payment status enums with schema CONFIRMED β PAID (schema uses PAID, not CONFIRMED) Added REFUNDED option PAID β SUCCEEDED (schema uses SUCCEEDED, not PAID) Added PROCESSING and PARTIALLY_REFUNDED options Update 7:30 PM Β· ZRosserMcIntosh
correct import path for TENANT_ZERO_ID 7:15 PM Β· ZRosserMcIntosh
add detailed logging to order creation flow Update 6:37 PM Β· ZRosserMcIntosh
add missing tenantId to Order, OrderItem, Payment, and AuditLog creates prisma.order.create() nested items.create (OrderItem) nested payments.create (Payment) prisma.auditLog.create() Feature 6:13 PM Β· ZRosserMcIntosh
replace Create Order dialog with full page at /admin/orders/new Sticky header with back arrow, cancel, and create buttons 2-column layout: main content (2/3) + sticky sidebar (1/3) Left column: Customer, Products, Shipping/Billing Address, Notes Right sidebar: Order Summary with live totals, Status & Payment, Date Extracted reusable AddressForm component Mobile-responsive: single column with bottom submit button Expanded country list (30 countries) Added Cash payment method option 'Billing same as shipping' defaults to checked Old dialog component preserved for reference but no longer imported Update 5:34 PM Β· ZRosserMcIntosh
include tenantId in ProductImage.create() during upload ProductImage.tenantId is required (NOT NULL). The upload route was omitting it, causing Prisma to reject the scalar productId and demand a relation connect instead. Now fetches tenantId from the parent Product and passes it through. Update 5:30 PM Β· ZRosserMcIntosh
upload UX β show detailed errors, detect video files in image uploader Upload route: detect video MIME types and hint to use 'Product Video' section Client: show each server-reported error detail as a toast notification Remove diagnostic endpoint (upload-test) and debug script (check-product) Expanded allowed MIME types on client (avif, heic, heif, tiff, svg+xml) Update 5:22 PM Β· ZRosserMcIntosh
upload route β trim productId, add raw SQL fallback, return details on 404 5:15 PM Β· ZRosserMcIntosh
add productId logging to upload route 5:12 PM Β· ZRosserMcIntosh
add upload diagnostic endpoint Chore 4:56 PM Β· ZRosserMcIntosh
remove test script Update 4:56 PM Β· ZRosserMcIntosh
expand image upload to accept AVIF/HEIC + add maxDuration for Vercel Client-side allowlist expanded: AVIF, HEIC, HEIF, TIFF, SVG Added fallback: any image/* type accepted if not in explicit list HTML accept attribute updated to include new formats Added maxDuration=60 to upload route for Vercel serverless Better error messages include file type for diagnosis Update 4:38 PM Β· ZRosserMcIntosh
product image upload β expand Supabase MIME types + better logging Updated Supabase bucket to also allow: image/avif, image/heic, image/heif, image/tiff, image/svg+xml Added file name, MIME type, and size logging on every upload attempt Error messages now include the MIME type for easier diagnosis Update 4:11 PM Β· ZRosserMcIntosh
exclude 'Custom Rings' category from homepage and search Added EXCLUDE_CUSTOM_RINGS_CATEGORY and CUSTOM_RINGS_CATEGORY_SLUG constants to product-visibility.ts Applied category filter in getDynamicCollections (home-cache.ts) Applied to search API (categories + products) Custom rings category remains visible in admin Update 3:41 PM Β· ZRosserMcIntosh
exclude custom ring orders from all public product listings Homepage dynamic collections (home-cache getDynamicCollections) Homepage new arrivals (home-cache getNewArrivals) Hero product collage (/api/products/collage) Collections listing page (/collections) Collection detail page (/collections/[id]) Collection API (/api/collections/[slug]) Creations/shop page (/creations) Category pages (category-page.tsx) Products API (/api/products) 3:07 PM Β· ZRosserMcIntosh
Phase 5: Build tenantPrisma() client extension for 184 tenant-scoped models Rewrote src/lib/saas/tenant-prisma.ts from Phase 0 (4 SaaS models, manual per-model hooks) to Phase 5 (184 models, $allModels extension with runtime Set lookup) TENANT_SCOPED_MODELS: Set of 184 PascalCase model names covering all models with NOT NULL tenantId (156 core + 27 SaaS + 1 DesignFile) Covers all 16 Prisma operations: findMany, findFirst, findFirstOrThrow, findUnique, findUniqueOrThrow, create, createMany, createManyAndReturn, update, updateMany, upsert, delete, deleteMany, count, aggregate, groupBy findUnique/findUniqueOrThrow use post-fetch verification (can't inject tenantId into unique where clause) create/createMany strip tenant relation field to avoid Prisma conflicts upsert handles where + create + update sections, prevents tenantId mutation Throws on empty tenantId to prevent accidental global queries withTenant() preserved as deprecated alias for backward compatibility Exported: tenantPrisma, withTenant, isTenantScoped, TENANT_SCOPED_MODELS, TenantPrismaClient type checkLimit() now uses tenantPrisma for product counts (was TODO in Phase 0) Updated barrel export in src/lib/saas/index.ts 39 unit tests passing (registry correctness, hook behavior, cross-tenant guards) npx tsc --noEmit: zero source errors npx prisma validate: schemas valid 2:15 PM Β· ZRosserMcIntosh
Phase 4: Make tenantId NOT NULL on 156 tenant-scoped models Updated 31 .prisma schema files: tenantId String? β String, SaasTenant? β SaasTenant Applied ALTER COLUMN SET NOT NULL to all 156 tables in production DB Used race-condition-safe strategy: SET DEFAULT β backfill NULLs β SET NOT NULL β DROP DEFAULT Caught and backfilled 2 straggler rows in ShipStationSyncLog during transaction 20 hybrid models intentionally left nullable (User, Article, GiftCard, etc.) Zero TypeScript compilation errors Prisma validate β
| Prisma generate β
Feature 12:59 PM Β· ZRosserMcIntosh
Phase 3 complete β backfill 13,000 NULL tenantIds β tenant_katura Dry-run mode by default (--execute flag to run) Verifies tenant_katura exists before touching data Counts NULLs per table before executing Single SERIALIZABLE transaction β all-or-nothing Post-execution validation confirms zero NULLs remain 39 of 155 tables had NULL tenantIds 13,000 rows backfilled to 'tenant_katura' 117 tables were already clean (empty or pre-populated) Post-run validation: 0 NULLs remaining across all 155 tables Docs 12:35 PM Β· ZRosserMcIntosh
Phase 2 complete β classify all 252 models for tenant isolation 155 models β tenantId String (make required) 21 models β tenantId String? (keep nullable β hybrid/shared) 9 join tables β no tenantId (inherit from parents) 22 global models β no tenantId (platform/reference data) 11 user-scoped β no tenantId (scoped by userId/siteId) 34 SaaS models β already correctly configured Backfill SQL generated for all 155 tables (using tenant_katura) Refactor 12:23 PM Β· ZRosserMcIntosh
split monolithic schema.prisma into 31 domain files Split 7,249-line monolith into 31 domain-specific .prisma files 252 models + 106 enums across: analytics, assets, audit, auth, content, crm, customers, design-studio, engagement, expansion, finance, hr, integrations, inventory, marketing, notifications, orders, payroll, products, projects, promotions, saas-*, storefront, weddings, wholesale Updated prisma.config.ts to point to prisma/schema/ folder Prisma validate + generate confirmed working Zero TypeScript errors in source code Added split-schema.ts script for reproducibility Added SCHEMA_REFACTOR_PLAN.md documenting phases 1-6
On return from login/register, auto-submit stored RSVP data
Auth redirect uses callbackUrl pointing back to wedding site #rsvp
Register link includes wedding-guest promo for $100 gift card
Back button lets guests return to RSVP form from auth prompt
Cache siteId after first resolve to avoid redundant API calls Feature wedding 6:35 PM Β· ZRosserMcIntosh
invitation email management system Add inviteSentAt DateTime? field to WeddingGuest schema Create migration SQL for inviteSentAt column Create invitations API (GET status + POST send/resend/test) Actions: send, send-all, resend, test, test-reminder Supports personal message and email type (save-the-date vs reminder) Tracks inviteSentAt timestamp per guest Add Invitations tab to wedding dashboard Summary cards (total, have email, sent, pending, physical mail) Test email section with invitation and reminder preview Email settings (type selector, personal message) Guest table with checkboxes, invite codes, status, sent dates Bulk send, individual send, resend, select all controls Tips section for physical card workflow Fix venueAddress references to use venueCity/venueState Fix async state bug in individual send button Feature wedding 5:36 PM Β· ZRosserMcIntosh
editable invite codes, guest mailing addresses, CSV export, GoDaddy domain wiring Fix middleware: redirect /wedding-sites, /account, /wishlist from subdomains to main domain Add address fields to WeddingGuest schema (addressLine1, addressLine2, city, state, zipCode, country) Create migration SQL: prisma/add-guest-address-fields.sql Update guest PATCH API: allow inviteCode + address fields in allowedFields Update guest POST API: accept address fields and optional custom invite codes Add CSV export endpoint: GET /api/wedding-sites/[siteId]/guests/export Rewrite GuestListManager (builder): expandable detail rows, inline editable invite codes, address fields, CSV download Rewrite GuestsTab (dashboard): same features - editable codes, expandable address panel, CSV export Create GoDaddy domain reseller client: src/lib/domains/godaddy.ts (mock when no API keys) Create domain API route: GET/POST /api/wedding-sites/[siteId]/domain (check, suggest, purchase, DNS) Update 5:03 PM Β· ZRosserMcIntosh
share auth session cookie across *.katura1999.com subdomains sessionToken: __Secure-authjs.session-token with domain=.katura1999.com callbackUrl: __Secure-authjs.callback-url with domain=.katura1999.com csrfToken: __Host-authjs.csrf-token (no domain - __Host- prefix forbids it) Added trustHost: true for Vercel deployment Only applies in production (dev uses default localhost cookies) Update 4:51 PM Β· ZRosserMcIntosh
cross-origin callback loop after login on wedding subdomains Three root causes of the login loop on belvedere.katura1999.com: 1. NextAuth redirect callback blocked cross-origin callbackUrls by default. Added explicit redirect callback that allows *.katura1999.com and *.katura.com. 2. Login form used router.push(callbackUrl) which can't navigate cross-origin. Added navigateToCallback() helper: uses window.location.href for absolute URLs (https://...) and router.push for relative paths. 3. Register form had the same issue β fixed identically. Flow now works: subdomain β middleware redirects /login to katura1999.com/login β user signs in β window.location.href redirects back to subdomain/my-wedding Update 4:42 PM Β· ZRosserMcIntosh
redirect subdomain auth paths to main Katura login, add My Wedding Sites to account page Middleware: /login, /register, /signout on tenant subdomains (e.g. belvedere.katura1999.com/login) now redirect to katura1999.com/login with same query params (callbackUrl preserved) my-wedding dashboard: unauthenticated users redirect to full URL https://katura1999.com/login?callbackUrl=https://slug.katura1999.com/my-wedding Account page: new 'My Wedding Sites' card shows owned + shared sites with dashboard links and 'Create Another Site' button. Uses PartyPopper icon. Organizer sign-in links on Belvedere and Rex&Kate now use absolute subdomain URLs 4:30 PM Β· ZRosserMcIntosh
Wire wedding builder to API, add organizer sign-in boxes, fix dashboard stats Feature 4:09 PM Β· ZRosserMcIntosh
wedding photo uploads with public/private visibility Add WeddingPhoto model + WeddingPhotoVisibility enum to Prisma schema Add migration SQL (prisma/add-wedding-photos.sql) Create Supabase Storage helper (src/lib/storage/wedding-photos.ts) Uses 'weddings' bucket, path: {siteId}/photos/{uuid}_{filename} Supports upload, signed URLs, batch signed URLs, delete Max 10MB, JPEG/PNG/WebP/HEIC/AVIF allowed Create photos API route (GET/POST/DELETE /api/wedding-sites/[siteId]/photos) Auth required + must be RSVP'd guest or owner/admin Guests upload PUBLIC (all guests see/download) or PRIVATE (bride & groom only) Owner/admin can see all photos; guests see PUBLIC + their own Guests can delete own photos; owner/admin can delete any Add Photos tab to my-wedding dashboard with upload, filter, grid, delete Create standalone /t/[slug]/photos page with full gallery UI Upload with visibility toggle, caption support, multi-file upload Filter by all/public/private/mine Lightbox viewer with download Responsive grid layout Feature 3:52 PM Β· ZRosserMcIntosh
wedding auth flows, promos, custom domain upgrade, my-wedding dashboard Wire 'Get Started Free' CTA to /wedding-sites/build (auth-gated) Add ?promo=wedding-guest ( gift card) and ?promo=wedding registration flows Support ?callbackUrl= param in register form for post-signup redirect Add custom domain upgrade section in builder settings Update A&D site RSVP section with wedding-guest promo sign-up link Create /t/[slug]/my-wedding dashboard (auth-gated): Overview tab with stats, response rate, dietary summary, recent RSVPs Guest list tab with add/remove, filter by RSVP status Events tab with create/delete Settings tab with domain management and site details Feature wedding-sites 2:50 PM Β· ZRosserMcIntosh
belvedere.katura1999.com as canonical domain for A&D Add /t/belvedere route (re-exports anthonyanddelaney page) Add /t/belvedere/layout.tsx with correct metadata Update SITE_SLUG from 'anthonyanddelaney' β 'belvedere' Add 'belvedere' to RESERVED_SLUGS in wedding-sites API Add 301 redirects: /t/anthonyanddelaney β /t/belvedere in next.config.ts Middleware already handles *.katura1999.com β /t/[slug] rewrite Feature wedding-sites 2:44 PM Β· ZRosserMcIntosh
Brevo email notifications, OpenAI hotel suggestions, wire A&D RSVP Add wedding email templates (src/lib/email/wedding-emails.ts): 1. Editor/planner invitation email 2. RSVP acceptance/decline notification to couple & admins 3. RSVP confirmation to guest 4. Save the Date / Invitation with invite code 5. RSVP deadline reminder 6. Post-wedding thank you Add OpenAI hotel suggestion API (POST /api/wedding-sites/suggest-hotels): Uses gpt-4o-mini to recommend 5-6 hotels near venue address Returns name, description, price range, distance, amenities, tier Wire admin invite route to send Brevo invitation email on POST Wire RSVP route to send notification to couple/admins + confirmation to guest Update Anthony & Delaney page: RSVP section now verifies invite code via API, shows party members, collects per-guest attendance/dietary, song request, submits to API Travel section now has AI-powered hotel lookup by venue address with live OpenAI suggestions rendered in a card grid Feature wedding-sites 2:21 PM Β· ZRosserMcIntosh
Prisma schema, API routes, Michelin stars UI Add 5 Prisma models: WeddingSite, WeddingSiteAdmin, WeddingEvent, WeddingGuest, WeddingRSVP Add WeddingSiteRole enum (OWNER, EDITOR, VIEWER) Add migration SQL: prisma/add-wedding-sites.sql Add 10 API route files under /api/wedding-sites: CRUD for sites, admins, events, guests RSVP verify (public) + submit (auth required) Dashboard stats endpoint Public site data by slug Replace text '3 Michelin Stars' badge with actual michelin.avif star images linked to Michelin Guide on Rex & Kate reception card Copy michelin.avif to public/ Chore 1:39 PM Β· ZRosserMcIntosh
archive deprecated messenger pages Feature 1:37 PM Β· ZRosserMcIntosh
Katura Wedding Sites β marketing page, builder, Rex & Kate demo, Anthony & Delaney site /wedding-sites marketing landing page with interactive demo preview /wedding-sites/build auth-protected drag-and-drop site builder rexandkate.katura1999.com demo site (Rex & Kate, Napa Valley, sage/gold theme) anthonyanddelaney.katura1999.com site (Anthony & Delaney, Wisconsin, midnight blue theme) Wedding site builder: sections, themes, settings, guest list management RSVP with optional invite code + Katura account requirement Katura branding in footer: logo + 'Provided by Katura Luxury Jewelry' Footer link: 'Personal Wedding Site' in Love & Engagement column en.json translations for wedding sites feature Subdomain routing via existing middleware (*.katura1999.com β /t/[slug]) Feature 1:34 PM Β· ZRosserMcIntosh
notification bell, Messages label, @mention resolution, smart Slack integrations HeaderChat: replaced tiny chat bubble icon with labeled 'Messages' button with external link indicator (border-slate-300, proper dark mode support) NotificationBell: enabled in both desktop and mobile admin headers (was commented out with TODO, now wired to real Prisma Notification table) GET /api/admin/notifications: real Prisma queries with limit/unread filters POST /api/admin/notifications: create notification (internal use) POST /api/admin/notifications/[id]/read: mark single as read POST /api/admin/notifications/read-all: mark all as read for user Added User.slackUserId (String?, unique) for @mention resolution db push applied, Prisma client regenerated resolveSlackMention(): maps @Rosser/@Stella to <@UXXXX> Slack mentions (DB lookup first via User.slackUserId, then Slack API user list with cache) resolveAllMentions(): regex-based bulk @mention replacement in message text listSlackUsers(): returns all workspace members for admin UI autocomplete notify(): dual-write helper β posts to Slack AND creates in-app Notification records for multiple users (fire-and-forget Slack, await DB writes) NotificationType enum: 17 event types (order_placed, support_ticket, etc.) postDailySalesDigest(): EOD sales summary β #orders (for cron job) notifyLowStock(): inventory alerts β #alerts with product link notifyNewReview(): review posted β #general (celebrates 4-5β, flags 1-2β) notifyAppointmentBooked(): appointment β #general with @mention of assignee notifyDeployment(): deploy events β #engineering with commit info Feature 1:18 PM Β· ZRosserMcIntosh
Slack integration Phase 2 β utility lib, webhooks, tenant support src/lib/slack.ts β Full Slack Web API client with: Β· Channel management (create, find, archive, invite) Β· Message posting (channels, threads, ephemeral) Β· Tenant lifecycle hooks (onTenantCreated β #tenant-{slug}, onTenantDeactivated β archive) Β· Order notifications β #orders + #tenant-{slug} Β· Support ticket routing β #support + #tenant-{slug} with Block Kit cards Β· System alerts β #alerts Β· OpenClaw reports β #openclaw Β· Well-known channel constants (GENERAL, ENGINEERING, ORDERS, SUPPORT, etc.) src/app/api/webhooks/slack/route.ts β Incoming Slack events webhook Β· URL verification challenge Β· Signature verification via SLACK_SIGNING_SECRET Β· Event callback handler (ready for support reply sync) src/app/platform/admin/support/page.tsx β Tenant support form Β· Tenants submit tickets without needing Slack Β· Subject, body, priority, category fields Β· Response time guide sidebar Β· POST β creates SaasSupportTicket + routes to Slack src/app/api/saas/support/route.ts β Wired routeSupportTicket() into existing POST handler (fire-and-forget, non-blocking) src/lib/saas/constants.ts β Added SLACK_CONNECT feature flag .env.example β Added SLACK_BOT_TOKEN + SLACK_SIGNING_SECRET placeholders Feature 12:59 PM Β· ZRosserMcIntosh
replace internal messenger with Slack migration (Phase 1) What gets removed (~29 files, ~5,740 lines) Slack channel architecture OpenClaw integration points 5-phase migration timeline Cost comparison Update 12:13 PM Β· ZRosserMcIntosh
repair dead onboarding links on /platform/admin /admin/settings/branding β /platform/admin/settings /admin/products/new β /platform/admin/products /admin/collections β /platform/admin/collections /admin/settings/shipping β /platform/admin/settings /admin/settings/payments β /platform/admin/settings /admin/settings/domains β /platform/admin/settings /admin/customers/import β /platform/admin/customers /admin/marketing/campaigns/new β /platform/admin/marketing /admin/settings/reviews β /platform/admin/settings /admin/analytics β /platform/admin/analytics Added href for 'Preview your store' β /platform/admin/design
Extracted experiment data to experiments-data.ts (single source of truth) All 17 experiments now have: longDescription, setupSteps, guardrails, tokenLimits, whatItCanDo, whatItCannotDo, riskLevel, estimatedMonthlyCost, rollbackProcedure, and URL slug
Created /admin/openclaw/[slug] dynamic route with ExperimentDetail component Each experiment now has its own URL: /admin/openclaw/concierge /admin/openclaw/outreach /admin/openclaw/cart-recovery /admin/openclaw/trials /admin/openclaw/reviews /admin/openclaw/ads /admin/openclaw/revenue /admin/openclaw/referrals /admin/openclaw/health /admin/openclaw/trade-shows /admin/openclaw/support /admin/openclaw/seo /admin/openclaw/store /admin/openclaw/wholesale /admin/openclaw/content /admin/openclaw/sentry /admin/openclaw/deploy
Each experiment detail page has 4 tabs: 1. Overview: long description, can/cannot do lists, technical details 2. Setup Guide: step-by-step with terminal commands, env vars, verification 3. Guardrails: organized by severity (critical/high/medium/low) with type icons (rate-limit, approval-required, spending-cap, kill-switch, scope-restriction, data-boundary) 4. Token Limits: table with monthly/daily caps, alert thresholds, hard stops
Safety philosophy: 'machine gun to a chimpanzee' prevention 4 universal guardrails on ALL experiments: kill switch, token hard stop, audit log, no PII export. Critical-risk agents (outreach, ads, deploy, sentry) have extra guardrails and prominent risk banners.
Refactored dashboard to import from shared experiments-data.ts Added arrow-right link buttons on each card to navigate to detail pages Feature 8:14 PM Β· ZRosserMcIntosh
add 7 Growth & Revenue experiments to OpenClaw dashboard Jeweler Outreach (B2B Prospecting) β autonomous lead discovery, research, and personalized cold email sequences via Brevo for 4 segments: Platform SaaS, Stella marketing, Antar CAD, and wholesale Trial-to-Paid Conversion Agent β monitors trial tenants, identifies friction, sends personalized conversion nudges Google & Meta Ads Concierge β AI-managed ad campaigns for both B2C (jewelry buyers) and B2B (jeweler signups), auto-pauses low ROAS Referral & Affiliate Engine β jeweler-to-jeweler and customer affiliate programs with commission tracking and dormant re-engagement Trade Show Lead Capture β mobile-first lead capture at JCK, AGTA, Couture with auto-research and 5-minute personalized follow-up SEO Content Engine β long-tail content for Jewel Vox targeting both B2C buyers and B2B jewelers searching for platform alternatives Wholesale Pipeline Automation β application review, credential verification, line sheet generation, and dormant account reactivation New 'growth' category with rose-colored badges 9 new skills in the Growth & Revenue catalog column Simulation prompts and detailed mock responses for all 7 experiments Dashboard now shows 17 total experiments across 5 categories Feature 7:11 PM Β· ZRosserMcIntosh
OpenClaw experiments dashboard + admin sidebar entry Add OpenClaw admin page at /admin/openclaw with interactive experiments dashboard Implement 10 OpenClaw use cases across 4 categories (storefront, platform, tenant, engineering) Add chat simulator with 23 skills catalog and quick prompts for each experiment Wire up sidebar navigation entry with search keywords Add i18n translations (EN + PT) for OpenClaw nav entry Create ATTN-PEDRO.md status report documenting that pr-1 branch is fully superseded Experiments tab: 10 cards with status badges, expandable tech details, copy SKILL.md template Simulator tab: Chat interface with mock responses, quick prompts per experiment Skills Catalog tab: 23 Katura skills across 3 categories, infrastructure requirements Feature mcp 6:34 PM Β· ZRosserMcIntosh
complete 27-tool MCP infrastructure β Phase 1 done POST /api/mcp/tools/tasks/{id}/complete β mark task done GET /api/mcp/tools/tasks/search β full-text search GET /api/mcp/tools/tasks/mine β my assigned tasks GET /api/mcp/tools/tasks/blocked β blocked/critical tasks POST /api/mcp/tools/ideas β create idea POST /api/mcp/tools/ideas/{id}/convert β convert idea to task POST /api/mcp/tools/sprints/{id}/complete β close sprint w/velocity DELETE /api/mcp/tools/sprints/{id}/tasks/{taskId} β remove from sprint POST /api/mcp/tools/projects β create project w/default columns Wired dispatchWebhookEvent into all write operations (task.created/updated/completed/moved/commented, sprint.created/completed, idea.created/converted) All webhook calls are fire-and-forget (.catch(() => {})) 18 β 27 tools cataloged in /api/mcp/manifest New categories: complete_task, search_tasks, get_my_tasks, get_blocked_tasks, create_idea, convert_idea_to_task, complete_sprint, remove_task_from_sprint, create_project