Update7:31 PM Β· ZRosserMcIntosh
move optimizePackageImports into experimental, rename middlewareβproxy (Next.js 16)
Feature4:24 PM Β· ZRosserMcIntosh
checkout autofill via controlled state (T-4FCCW), K99 support queue separation (T-FG74L)
Update3:50 PM Β· ZRosserMcIntosh
missing </Button> closing tag in collections mosaic image URL input (Turbopack parse error)
Update3:29 PM Β· ZRosserMcIntosh
corrupted dropdown-menu import in collections page (Turbopack parse error)
Update3:27 PM Β· ZRosserMcIntosh
dark mode text across admin panel (text-foreground on AdminShell), full PT/ES translation of support ticket detail page
Update2:48 PM Β· ZRosserMcIntosh
add missing footer.company.environment i18n key to all locales, fix dark mode text in Messenger
Update2:23 PM Β· ZRosserMcIntosh
increase Prisma connection pool to 5, add withRetry to support ticket routes (P2024 fix)
Featurei18n2:09 PM Β· ZRosserMcIntosh
T-BMAHG β translate blog page to EN/PT/ES (26 keys)
Featurei18n2:06 PM Β· ZRosserMcIntosh
T-BMAHG β translate sales hub page to EN/PT/ES (18 keys)
Featurei18n1:30 PM Β· ZRosserMcIntosh
T-BMAHG β translate collections page to EN/PT/ES (~55 keys)
Featurei18n1:18 PM Β· ZRosserMcIntosh
T-BMAHG β translate products list page to EN/PT/ES
Featurei18n1:13 PM Β· ZRosserMcIntosh
T-BMAHG β translate settings page to EN/PT/ES (68 keys)
Featurei18n12:59 PM Β· ZRosserMcIntosh
T-BMAHG β finish translating calendar page to EN/PT/ES
Featurei18n12:26 PM Β· ZRosserMcIntosh
T-BMAHG β translate customers, leads, invoices pages to EN/PT/ES
- Add customers/page.tsx β CustomersContent client component (customers section: +25 new keys)
- Add leads/page.tsx β LeadsContent client component (new 'leads' section: 30 keys)
- Add invoices/page.tsx β InvoicesContent client component (new 'invoices' section: 33 keys)
- All new keys added to AdminTranslations interface + EN + PT dictionaries in admin-i18n-provider.tsx
- All new keys added to ES dictionary in admin-i18n-es.ts
- Pipeline status labels (New/Contacted/etc.) now fully translated EN/PT/ES
- Invoice status labels now fully translated EN/PT/ES
FeatureT-MUMUQ11:34 AM Β· ZRosserMcIntosh
switch Yen to Claude Sonnet + inline spend meters
- CORE_ASSISTANT primary: Claude Sonnet-4-6 (was GPT-mini) Anthropic β GPT-mini β Grok failover chain (same priority flip)
- CLIENT_WRITING + HIGH_STAKES already preferred Claude β no change
- .env.local ANTHROPIC_API_KEY rotated to new 'Katura Yen' key (set the same key in Vercel Dashboard β Environment Variables)
- Returns per-user day/week/month token usage vs limits
- Returns today's cost in cents for the current user
- Returns org-wide monthly spend vs budget (fraction, ok, approvalRequired)
- Returns perRequestMaxOutputTokens limit (env: YEN_PER_REQUEST_MAX_OUTPUT_TOKENS, default 2048)
- size='sm': shown in Yen bubble footer (replaces 'Yen can make mistakes' text) β your-today pill + daily progress bar + day/month summary line β amber warning at 65%, red at 85%, 'Budget low' alert
- size='full': shown in /admin/yen sidebar above guardrails β per-request limit, your day/week/month bars, team budget bar β approval-required notice at 85%, hard-blocked notice at 100%
- Auto-refreshes every 60s so limits update after a conversation
- All bars use Tailwind arbitrary-width classes (no inline styles)
UpdateT-ZSRXJ,T-QFR6R11:17 AM Β· ZRosserMcIntosh
project page UX + email render fix
- Tabs reduced from 12 β 10 (removed Variants/Notes as separate tabs, merged into Product/Activity respectively). Tab bar now grouped with subtle vertical separators: Pipeline|Overview | Art|Stones|CAD | Casting|Bench|Vendors | Product|Activity.
- Tab content now wrapped in framer-motion <motion.div> that slides up (opacity 0β1, y 12β0) on mount β adds fluid feel without any extra bundle weight (framer-motion already imported).
- Root cause: email_attachments table was never migrated. The loadMessageDetailServer() include: { attachments: true } caused Postgres to throw 'relation does not exist' β server component crash.
- Migration: 20260529_add_email_attachments/migration.sql creates the table with FK β email_messages(id) ON DELETE CASCADE + messageId idx.
- Defensive fallback: if the initial query (with attachments) throws, retry without the include and set attachments=[] β so the page renders immediately on redeploy even before migration is applied.
UpdateT-ZSRXJ11:05 AM Β· ZRosserMcIntosh
pipeline tab default + connector line alignment + green glow
- Default tab: 'overview' β 'pipeline' (URL-synced, /admin/projects/[id] now opens directly on Pipeline without ?tab= in the URL)
- Connector line left position: left-6 (24px) β left-[2.75rem] (44px) β correct center for p-5 padding + w-12 circle (1.25 + 1.5 = 2.75rem)
- Green glow: once 2+ phases are marked complete the line transitions to bg-green-500 with a bright emerald box-shadow glow (duration-700 fade)
FeatureT-JV9BL10:58 AM Β· ZRosserMcIntosh
Yen Blog Writer mode on /admin/blog
- derivePageContext: /admin/blog β kind='blog'
- isBlogMode flag replaces the messages area + hides the composer
- Idle state: topic-hint textarea + Write & Schedule button β calls POST /api/admin/blog/generate directly (not Yen chat) β Enter key submits, topic is optional (Yen picks if blank)
- Writing state: Yen avatar + TypingDots + 'Writing your postβ¦'
- Done state: green scheduled card (title, excerpt, date) + 'Open draft' link to /admin/blog/[id] + 'Write another' reset
UpdateT-JV9BL10:45 AM Β· ZRosserMcIntosh
schedule drafts 1/day at 9AM EST + revert cron to hourly
- vercel.json: blog-publish cron back to '0 * * * *' (hourly, not */5)
- schedule-drafts route: 1 post per day at 09:00 EST (14:00 UTC) instead of 2/day. Simpler slot builder: one UTC date per draft, no SLOTS_PER_DAY array, no EDT/EST offset confusion.
- blog-actions-bar.tsx: toast updated to '1 per day starting tomorrow at 9 AM EST'
- blog-publish cron comment: updated to say 'hourly'
UpdateT-JCXEM10:38 AM Β· ZRosserMcIntosh
tasks dark mode audit + completion celebration animation
- Replace all hardcoded text-slate-100..600 with semantic tokens: text-slate-100/200 β text-foreground text-slate-300 β text-foreground/80 text-slate-400..600 β text-muted-foreground
- Replace bg-slate-900/50 β bg-muted/50 (non-current-month calendar cells)
- Replace bg-slate-500/20 β bg-muted (badge backgrounds)
- Replace border-slate-500 β border-border These components were originally built assuming dark mode only; they now render correctly in both light and dark themes.
- When a task is marked DONE, a green ring pulse (emerald-400 border) expands outward from the checkbox using framer-motion scale+fade. Lasts 600ms β adds visual delight without blocking interaction.
- justCompletedId state tracks which task just finished to scope the animation to exactly one row.
FeatureT-PE34Q10:33 AM Β· ZRosserMcIntosh
faster command palette + page walkthrough tour system
- Small '?' button renders in the top-right corner of the main content
- Click opens an animated step-by-step walkthrough overlay
- Spotlight: radial-gradient cutout highlights the target DOM element
- Ring: pulsing primary-color border around the highlighted element
- Popover: title, description, 'saves time/money' benefit, progress dots
- Navigation: Back / Next / Skip / Done with keyboard support
- Remembers 'seen' state in localStorage per-page (won't auto-replay)
- Uses framer-motion for all transitions (fade, scale, slide)
- CSS selectors target existing DOM elements β no markup changes needed
- KPI Dashboard (sparklines + stat cards)
- Command Palette (βK shortcut tutorial)
- Recent Activity (orders + leads)
- Today's Priority Section (appointments, promotions, services)
UpdateT-YSHB9+T-B4C2R10:24 AM Β· ZRosserMcIntosh
sign subdomain full rewrite + blog-publish every 5 min
- Rewrote the sign subdomain middleware block to handle ALL paths (not just root):
- / β /s (signatures landing page)
- /s/token β /s/token (pass through β signing page)
- Other paths β prefix with /s
- Apply proper security headers + x-pathname/x-storefront/x-tenant-id headers on every sign subdomain response (previously the rewrite had no headers)
- Return early for ALL sign subdomain paths so the request never falls through to intlMiddleware (was a latent source of broken token links)
- Blog formatting: already fixed in 0015345b via @tailwindcss/typography + ArticleContent component (prose prose-stone prose-lg + full prose-* tuning)
- Kill switch: removed in 0015345b β cron now runs unconditionally
- Schedule: change blog-publish cron from '0 * * * *' (hourly, wrong) to '*/5 * * * *' (every 5 min, as intended per BLOG-SYSTEM-OVERHAUL docs) β this means SCHEDULED posts are promoted within 5 min of their publishedAt instead of waiting up to 60 min
UpdateT-TRNM69:51 AM Β· ZRosserMcIntosh
defer time-of-day greeting to client to fix hydration mismatch
- Server renders in UTC; browsers outside UTC (e.g. SΓ£o Paulo UTC-3) see a
- different hour, so the greeting ('Good morning' vs 'Good afternoon') differed
- between SSR and client hydration. React (App Router) surfaces this as a
- runtime error that replaces the entire admin page with the error boundary.
- Fix: move greeting + today-label to useState/useEffect so both the SSR pass
- and the initial client render produce identical empty strings, and the correct
- values are applied after first paint (no visible flash, just a brief blank
- string before hydration which is imperceptible).
UpdateT-MTBH99:07 AM Β· ZRosserMcIntosh
create Address table migration, inline prefill from order history, branded delete confirm
- prisma/migrations/20260529_add_address_table/migration.sql: CREATE TABLE IF NOT EXISTS Address with FK to User (CASCADE) and SaasTenant (RESTRICT), 3 indexes, updatedAt trigger β root cause fix
- GET /api/account/addresses: embed suggestion inline (most recent order shipping addr β User denormalised fallback) so the component needs zero extra round-trips
- saved-addresses-section: drop separate /api/user/recent-order-address fetch; use server-side suggestion already loaded at mount; replace window.confirm() delete with branded AlertDialog; add Sparkles pre-fill notice when form is auto-populated from order history
PerfT-MZARD8:50 AM Β· ZRosserMcIntosh
subtitle latency optimizations
- Deepgram endpointing: 200ms β 150ms (finals fire ~50ms sooner)
- Add utterance_end_ms=1200 so long run-on sentences always finalize
- Interim translate threshold: 30 chars β 15 chars (translated subtitles appear earlier during speech, not just on long phrases)
- Add translateHealthWarning state: after 3 consecutive translation failures, show amber banner 'Translation unavailable β check DEEPL_API_KEY' so the root cause is visible in-room immediately
UpdateT-MZARD8:43 AM Β· ZRosserMcIntosh
branded force-end dialog, transcript keepalive, smart invite search
- Replace direct handleEnd() call on PhoneOff button with showEndConfirm state
- Add dark-themed Katura-branded overlay with three options: 'End for everyone' (red, destructive) 'Leave β others remain' (only shown when 2+ participants) 'Cancel β keep meeting running'
- Matches dark room UI with glass-morphism styling; no browser confirm()
- Add keepalive: true to Deepgram is_final transcript persist fetch so in-flight saves survive page navigation when host clicks end fast
- Room invite panel: search now triggers on ANY input (not just @ prefix) β team members shown first, then past guests, then clients (alphabetical)
- Room invite panel: email field auto-populated when suggestion selected
- Room invite panel: WhatsApp button added after link is generated (opens wa.me with pre-filled message and invite link)
- Schedule modal attendee search: switched from /customers/search to /meetings/suggest-participants for prioritized team-first results
- Instant launch modal: pre-loads team suggestions on open (no typing required)
Feature8:10 AM Β· ZRosserMcIntosh
integrate Stripe agent tools into Yen
- Install @stripe/agent-toolkit v0.9.0 (peer warnings non-blocking)
- New src/lib/yen/stripe-tools.ts with 4 tools: stripeGetCustomer β look up customer by email (read) stripeListSubscriptions β list subscriptions for a customer (read) stripeListInvoices β list recent invoices for a customer (read) stripeCreateInvoice β create draft invoice (soft-gated write)
- Wire STRIPE_TOOL_DEFS into YEN_TOOLS array (tools.ts)
- Wire executeStripeTool dispatch into executeYenTool switch
- Add stripeCreateInvoice to SOFT_GATED_TOOLS (guardrails.ts)
Update4:18 AM Β· ZRosserMcIntosh
CAD link dialog overflow, password reset 404, admin reset, gold color
- Add overflow-x-hidden to scrollable list
- Wrap buttons in flex-shrink-0 container
- Increase row padding (px-3βpx-4, py-2βpy-2.5) Fixes buttons appearing outside dialog border
- Add /reset-password and /forgot-password to intl bypass list
- These paths now rely solely on beforeFiles rewrites (no intl middleware conflict that could cause 404 on emailed links)
- POST /api/admin/team/reset-password β admin-initiated reset
- Generates token, emails employee a reset link (supports en/pt)
- Added KeyRound button in team table for active employees
- Only OWNER/MANAGER can trigger
- Brightened base colors (#D4A520β#F5CE4E, #C99A18β#E8BF3A, etc.)
- Increased metalness 0.88β0.92 (matches rose/white gold)
- Reduced roughness slightly for more specular shine
- Gold now looks like polished metal instead of brown/dark amber
Updatelint2:49 AM Β· ZRosserMcIntosh
resolve all ESLint errors across codebase
- eslint.config.mjs: ignore .vercel/, scripts/, prisma scripts; downgrade no-explicit-any and react-hooks/purity to warn (too widespread to fix all at once, but now visible)
- Fix React Compiler purity violations in production code:
- product-view-tracker.tsx (both copies): useRef(Date.now()) β useState lazy init
- design-your-ring/page.tsx: FloatingParticles particles β useMemo
- mobile-layout.tsx: CardSkeleton random widths β React.useMemo
- Auto-fix all prefer-const violations via eslint --fix
- Remove deprecated @types/cheerio (cheerio ships own types)