Commit Graph

50 Commits

Author SHA1 Message Date
3cdb95e488 feat: rebuild voice agent UI — larger layout, contact card, reconnect, no chips
- Larger orb (w-24), taller transcript (max-h-72), proper scrollIntoView
- On-screen contact confirmation card replaces verbal spell-back
- Reconnect button on connection loss
- Selection chips removed (structured data captured silently)
- Mobile-sticky controls for thumb reach

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-06 14:44:28 -04:00
cdb89553e0 feat: add contact card, deferred tool responses, and reconnection logic
- request_contact tool shows on-screen card for name/email verification
- Deferred tool responses let the UI wait for user confirmation
- WebSocket close preserves transcript and enables reconnection
- Reconnect seeds new Gemini session with prior conversation context

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-06 14:43:27 -04:00
28d063e251 feat: rewrite voice agent to consultative tone, add request_contact tool
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-06 14:41:07 -04:00
94a5876e7d i18n: add discovery section translations, update voice strings
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-06 14:39:42 -04:00
bcc24d0f40 refactor: remove ModeToggle from configurator, make it typed-form-only
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-06 14:38:43 -04:00
a5570a90b2 docs: add voice discovery pivot implementation plan
9-task plan covering: ModeToggle removal, i18n, system prompt rewrite,
contact card tool, reconnection logic, UI rebuild, Discovery section,
landing page integration, and email template verification.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-06 12:47:52 -04:00
81675335ad docs: add voice discovery mode design spec
Captures the pivot from form-filling voice mode to a standalone
consultative discovery experience with separate entry point, rewritten
system prompt, on-screen contact verification, and reconnection handling.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-01 13:46:47 -04:00
3bf07674ad fix: end voice call when brief generation completes
All checks were successful
Build & Push / build-and-push (push) Successful in 1m58s
The WebSocket, mic, and audio contexts were never torn down after
complete_brief succeeded, so the Gemini agent kept listening and
responding in the background. Now endConversation() fires as soon as
the brief arrives, and the Start button is hidden during the 1.5s
transition so it doesn't flash.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-31 20:35:48 -04:00
600f1a5241 feat: deeper discovery questions + conversation summary in briefs
All checks were successful
Build & Push / build-and-push (push) Successful in 1m35s
- Agent now asks probing follow-up questions (pain points, current tools, vision, decision context)
- complete_brief tool includes conversationSummary field capturing ALL discussion details
- Summary merges into scope context for richer, more targeted briefs
- Updated both EN and FR system prompts

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-28 15:11:18 +01:00
9b8f0a7f7f feat: agent spells back name and email for confirmation before generating brief
All checks were successful
Build & Push / build-and-push (push) Successful in 1m33s
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-28 15:06:45 +01:00
3eae92e1c1 feat: show "Generating your brief..." badge during brief generation
All checks were successful
Build & Push / build-and-push (push) Successful in 1m57s
Visual feedback while the complete_brief API call runs (~15s).
Badge appears below the orb with a spinner animation.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-28 14:58:56 +01:00
7fb3d85103 fix: prevent duplicate brief submissions, add completion logging
All checks were successful
Build & Push / build-and-push (push) Successful in 1m43s
- briefSubmittedRef prevents multiple complete_brief calls
- Added logging throughout completion flow for debugging
- Reset ref on new conversation start

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-28 14:51:26 +01:00
1e41c1c07c fix: use predefined values for tool calls, improve completion flow
Some checks failed
Build & Push / build-and-push (push) Has been cancelled
- System prompt now specifies exact predefined values for services/industries/timelines
- Agent instructed to call complete_brief IMMEDIATELY when name+email confirmed
- Chip labels fall back to raw value for unknown keys instead of showing i18n path
- Added completion transition logging

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-28 14:49:56 +01:00
66949c07d8 fix: accumulate transcript chunks into single messages per turn
All checks were successful
Build & Push / build-and-push (push) Successful in 1m23s
Streaming transcription words now merge into one bubble per agent/user turn
instead of creating separate entries for each chunk.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-28 14:42:04 +01:00
c48313ad91 fix: prevent page scroll when transcript updates
Some checks failed
Build & Push / build-and-push (push) Has been cancelled
Scroll only within transcript container, not the entire page.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-28 14:40:31 +01:00
015ae49d2d fix: use realtimeInput.text for intro prompt, handle Blob WebSocket data
Some checks failed
Build & Push / build-and-push (push) Has been cancelled
- Introduction prompt uses realtimeInput.text format (not clientContent)
- Agent now successfully introduces itself and sends audio responses
- Playback AudioContext created in user gesture for mobile

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-28 14:40:08 +01:00
6fcebe74af fix: create playback AudioContext in user gesture for mobile support
All checks were successful
Build & Push / build-and-push (push) Successful in 1m40s
- Playback AudioContext created during startConversation (button click)
- Removed sampleRate constraint from getUserMedia (let browser choose)
- Added audio chunk logging for debugging

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-28 14:34:19 +01:00
34a78e7d4a fix: remove unused debugLog from VoiceAgentContextValue interface
All checks were successful
Build & Push / build-and-push (push) Successful in 2m0s
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-28 14:29:45 +01:00
edb765e0e1 fix: prompt voice agent to introduce itself after connection
Some checks failed
Build & Push / build-and-push (push) Failing after 1m31s
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-28 14:27:35 +01:00
0a20d1e243 fix: correct WebSocket setup format and handle Blob messages
Some checks failed
Build & Push / build-and-push (push) Has been cancelled
- Setup uses "generationConfig" field (not "config") inside "setup" object
- Handle Blob data from WebSocket (Gemini sends binary, not text)
- Voice agent now successfully connects and receives setupComplete

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-28 14:27:11 +01:00
bbf534cf4f fix: reduce rate limit to 5s, add 10s connection timeout
All checks were successful
Build & Push / build-and-push (push) Successful in 1m56s
- Rate limit reduced from 30s to 5s for testing
- WebSocket setup times out after 10s instead of hanging forever
- Added connection logging

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-28 14:19:57 +01:00
0e3c92f873 fix: correct WebSocket setup and audio format for Gemini Live API
All checks were successful
Build & Push / build-and-push (push) Successful in 1m30s
- Setup message uses "config" key (not "setup")
- Audio sent as realtimeInput.audio (not mediaChunks)
- Added message logging for debugging

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-28 14:15:42 +01:00
15136080ed fix: add detailed error logging to voice agent for debugging
All checks were successful
Build & Push / build-and-push (push) Successful in 1m29s
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-28 14:04:20 +01:00
b4a265077e fix: split gemini-token into GET health check + POST token request
All checks were successful
Build & Push / build-and-push (push) Successful in 1m33s
Health check no longer triggers rate limiter, fixing toggle not appearing.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-28 14:02:06 +01:00
067164645b fix: add GEMINI_API_KEY to docker-compose prod environment
All checks were successful
Build & Push / build-and-push (push) Successful in 1m36s
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-28 13:58:51 +01:00
d1d5b7e124 fix: simplify gemini token endpoint to avoid SDK instantiation errors
All checks were successful
Build & Push / build-and-push (push) Successful in 1m42s
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-28 13:52:11 +01:00
bab45b981e feat: website analysis pipeline, voice agent, configurator improvements
All checks were successful
Build & Push / build-and-push (push) Successful in 6m2s
- Site analysis: cheerio HTML parsing, inline tech stack detection (~20 CMS/framework/analytics signatures), Google PageSpeed API integration
- Gemini Live voice agent: WebSocket-based real-time voice mode with live transcript, selection chips, and mid-conversation website analysis
- Type/Talk mode toggle with silent capability detection
- Stepped progress animation during brief generation (4 animated steps)
- URL + thoughts fields in Step 2, phone + contact preference in Step 3
- AI prompt improvements: dedicated website analysis section, 30-min call, concrete benefits, industry depth
- Email redesign: branded templates with logo, proper markdown rendering for both client and admin
- French locale support for AI-generated briefs
- Smaller checkmark, compact booking CTA, expanded brief area

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-28 13:41:35 +01:00
16cd2a74ee fix: add proper logging for SMTP and AI brief generation
All checks were successful
Build & Push / build-and-push (push) Successful in 1m30s
Logs now show:
- Whether SMTP is configured and which addresses emails go to
- Success/failure for each email (client brief + admin notification)
- Whether OpenRouter API key is set
- AI generation success/failure with status codes
- Fallback to template brief when AI is unavailable

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-26 19:02:14 +01:00
d971c5905f fix: make .next/cache writable in Docker container
All checks were successful
Build & Push / build-and-push (push) Successful in 1m55s
The nextjs user couldn't write to .next/cache at runtime because
the directory was created by root during the build stage.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-26 18:59:35 +01:00
ff3c1594fa fix: regenerate package-lock.json for CI compatibility
All checks were successful
Build & Push / build-and-push (push) Successful in 5m37s
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-26 18:48:31 +01:00
bdb664633d polish: configurator visual redesign + copy cleanup
Some checks failed
Build & Push / build-and-push (push) Failing after 29s
- Redesigned progress bar: numbered circles with connectors, checkmarks on completion,
  line only fills up to current step, centered layout
- Redesigned service cards: horizontal 3-column grid, border-based selection state,
  check badges, staggered entrance animations
- Fixed card border clipping (ring → border)
- Fixed height stability (selection hint stays in DOM)
- Removed all em dashes, replaced with regular dashes
- Removed all Côte d'Azur / Riviera / France location references sitewide
- Philosophy quote attributed to "Matt Ciaccio, Founder"
- Footer: "American-founded. Serving clients worldwide."
- Email template: LetsBe Solutions LLC
- AI prompt: removed Côte d'Azur reference

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-26 18:44:37 +01:00
bbe5b6c67e feat: multi-select AI types in configurator
Some checks failed
Build & Push / build-and-push (push) Failing after 34s
- Changed aiType (string|null) to aiTypes (string[]) across all components
- StepServices: chips now toggle on/off independently, descriptions show for all selected
- StepContact: summary tags show all selected AI types
- API route: handles array of AI types for both AI and fallback brief generation

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-26 18:06:44 +01:00
acefb70b68 feat: configurator overhaul — full i18n, AI brief generation, redesigned UI
Configurator:
- Full i18n: industries, timelines, AI types, field labels, error messages,
  complete screen — all translated to French
- Real AI brief generation via OpenRouter (DeepSeek V3.2) with fallback template
- Fixed email notification bug (was sending to client instead of admin)
- Added wizard reset capability ("Start Over" button on success screen)
- Redesigned section shell with refined card, accent line, step indicators
- All step components use translation keys instead of hardcoded strings

Hero:
- Tighter spacing to keep CTAs above the fold
- Reduced bottom gradient height

Footer:
- Removed GitHub link
- Legal name in copyright
- "American-founded" location text

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-26 17:52:09 +01:00
4aa357a999 polish: nav scroll threshold, footer cleanup, hero gradient
- Nav: trigger solid background at 10px scroll (was 100px) to prevent logo/text overlap
- Footer: copyright uses legal name "LetsBe Solutions LLC"
- Footer: location changed to "American-founded. Serving the Côte d'Azur and beyond."
- Footer: remove GitHub social link (no public GitHub)
- Hero: smooth gradient fade into trust bar section (no hard color gap)
- Services: "SEO & Digital Marketing" replaces "SEO & Performance"

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-26 16:40:15 +01:00
683e0b3e43 polish: complete copy rewrite + i18n fixes + dead link cleanup
All checks were successful
Build & Push / build-and-push (push) Successful in 1m47s
- Rewrite all site copy based on founder interview: honest, outcome-focused,
  premium but approachable tone
- Hero: "Websites, software, and infrastructure — designed and built entirely around you."
- Services: "Design. Build. Run." with clear pillars (Websites, Custom Software, Infrastructure)
- Philosophy: "Your tools should belong to you." — removed Kubernetes reference
- Trust bar: concrete value props (Built From Scratch, You Own Everything, One Team, AI)
- CTA: "Ready to build something?" — direct, no fluff
- Projects: honest descriptions of what was actually delivered
- Fix all French translation gaps: hero accent word, configurator cards,
  project descriptions, footer links, philosophy quote
- Fix dead links: footer service links → /#services, work/about → anchors
- Restore case study links (dynamic route exists)
- Fix mobile hero padding (pt-40 → pt-24)
- AI narrative positioned honestly as add-on capability

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-26 16:12:50 +01:00
b2f9fd3222 polish: remove 'View all work' link (page doesn't exist)
All checks were successful
Build & Push / build-and-push (push) Successful in 1m31s
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-26 14:20:56 +01:00
ed4174d198 polish: performance optimizations + layout fixes
Some checks failed
Build & Push / build-and-push (push) Has been cancelled
- Hero: convert 7 infinite framer-motion JS animations to GPU-composited CSS @keyframes
- Hero: remove blur filter from word reveal animation (expensive paint)
- Hero: remove eyebrow text overlapping navbar, add top padding
- Process: widen header column (2/5) so title doesn't crowd step cards
- TrustBar: center icons and text in cards
- Fonts: add Google Fonts @import with display=swap + preconnect hints

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-26 14:19:15 +01:00
7559128d5f polish: remove generic icons from Process cards
All checks were successful
Build & Push / build-and-push (push) Successful in 1m27s
Let the ghosted numerals + gradient top bar carry the visual identity.
Tighter layout: numeral flows directly into title into description.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-25 22:18:43 +01:00
9e4afd215b polish: tighten spacing + visual refinements across all sections
All checks were successful
Build & Push / build-and-push (push) Successful in 1m23s
- Reduced py-24 → py-20 on Services, Configurator, Process, Works, Philosophy
- TrustBar: py-16 → py-12, gradient bridge adjusted
- Services: pillar divider opacity increased (outline/20), header gap tightened
- Configurator: added subtle dividers between service cards
- SelectedWorks: darkened coming-soon text and border opacity
- Philosophy: confirmed 2px primary border on pillars

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-25 21:55:23 +01:00
d033927896 polish: rebuild hero with asymmetric layout + animated geometric composition
All checks were successful
Build & Push / build-and-push (push) Successful in 1m24s
- Asymmetric layout: text left-aligned (58%), geometric right (42%)
- SVG background: scaled down, pushed right, cleaner architectural lines
- Right column: 3 concentric rings rotating at different speeds/directions
- Orbiting accent dots tracing circular paths
- Tick marks, crosshair center, corner brackets, dimension lines
- Radial glow backdrop for atmospheric warmth
- Word-by-word headline stagger animation preserved

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-25 21:51:13 +01:00
d76ecbda7a feat: wire up email sending for configurator submissions
All checks were successful
Build & Push / build-and-push (push) Successful in 1m22s
- Created src/lib/email.ts with Nodemailer + Poste.io SMTP
- sendBriefToClient: formatted HTML brief email to the lead
- sendLeadNotification: admin notification with submission details
- Emails fire non-blocking (don't delay the brief response)
- Only sends if SMTP_HOST and SMTP_PASS are configured

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-25 21:35:47 +01:00
fcd5e51276 infra: change host port to 6974
All checks were successful
Build & Push / build-and-push (push) Successful in 1m24s
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-25 21:31:59 +01:00
c7d466f9ef infra: change host port from 3000 to 3847
All checks were successful
Build & Push / build-and-push (push) Successful in 1m31s
Port 3000 is already in use on the server.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-25 21:17:49 +01:00
ba94ae1fed polish: darken ghosted numerals (6% → 12% opacity)
All checks were successful
Build & Push / build-and-push (push) Successful in 1m25s
Process and Services section numerals were too faint against white.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-25 21:14:12 +01:00
7ca9f6f5e2 polish: deep visual pass across all homepage sections
All checks were successful
Build & Push / build-and-push (push) Successful in 1m26s
Hero:
- Removed fake trust proof avatars
- Added decorative gradient separator line
- Pushed content down for better vertical rhythm
- More visible secondary CTA button

TrustBar:
- Icon circles with primary tint backdrops
- Gradient top accent bar on hover
- Gradient fade transition from hero section
- Increased card padding

Services:
- Subtle grid texture background
- Larger primary-colored feature dots
- Enhanced AI narrative with horizontal decorative rules
- Hover shadow elevation on pillars

Configurator:
- Step numbers in tinted circles with vertical rail
- ShieldCheck trust icon
- Radial gradient glow on wizard panel
- Sparkles icon on AI toggle
- Empty-state hint message
- Service card icons in circular primary backdrops

Process:
- Gradient top accent strips on cards
- Icon containers with primary tint
- Vertical accent bar on section heading
- Dashed SVG connector lines between cards

SelectedWorks:
- Distinct geometric compositions per card (Monaco, Nimara, Amador)
- Bottom gradient fade on placeholder images
- Dot separators between tags
- Animated background pulse on coming-soon cards
- Enhanced CTA hover animations

Philosophy:
- Enriched decorative panel (circle rings, diagonal lines, navy gradient)
- Primary-colored pillar numbers
- Left border accent on pull-quote card

CTABanner:
- Grid pattern + circle ring overlays
- Email link underline-on-hover animation

Footer:
- Full logo image replacing text wordmark
- Larger social icons
- Gradient divider line
- Larger nav logo (h-14 desktop, h-11 mobile)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-25 21:11:30 +01:00
a6882d517a feat: integrate Cal.com popup booking via @calcom/embed-react
All checks were successful
Build & Push / build-and-push (push) Successful in 4m52s
- CalButton component: loads Cal.com embed script, triggers popup on click
- Configured for scheduling.letsbe.solutions (self-hosted)
- Wired into configurator completion step (Book a Call)
- Wired into footer Book a Call button
- Brand colors: #006494 light, #5BA4D9 dark

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-25 20:57:09 +01:00
cc69085320 ci: remove deploy job, build & push only
All checks were successful
Build & Push / build-and-push (push) Successful in 6m14s
CI only builds the Docker image and pushes to Gitea registry.
Server deployment is manual via docker compose pull + up.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-25 20:42:18 +01:00
e034bdf7d3 ci: add Gitea Actions workflow + production compose
Some checks failed
Build & Deploy / build-and-push (push) Failing after 33s
Build & Deploy / deploy (push) Has been skipped
- .gitea/workflows/deploy.yml: build, push to Gitea registry, SSH deploy
- docker-compose.prod.yml: pulls pre-built image from registry (for server)
- docker-compose.yml: kept for local development (builds from source)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-25 20:40:54 +01:00
93c97da4d0 infra: add Docker, Compose, and Nginx for staging deployment
- Dockerfile: multi-stage build (deps → builder → runner), standalone output
- docker-compose.yml: app + postgres services, health checks
- nginx/staging.letsbe.biz.conf: reverse proxy ready for certbot SSL
- Updated .env.example with all required secrets

Deploy steps:
1. Copy nginx conf to /etc/nginx/sites-enabled/
2. nginx -t && systemctl reload nginx
3. certbot --nginx -d staging.letsbe.biz
4. Create .env from .env.example
5. docker compose up -d --build

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-25 20:38:29 +01:00
a1f9eca76c feat: complete agency site build (Phases 1-7)
Full Next.js 16 + Payload CMS 3.x agency site with:
- Homepage: Hero, TrustBar, Services, Configurator wizard, Process,
  Selected Works, Philosophy, CTA Banner
- Sub-pages: /services (3 pillars + AI Layer), /work/[slug] (case
  studies), /about (philosophy + story)
- Configurator: 3-step wizard with AI brief generation API
- i18n: Full EN/FR bilingual with next-intl
- Design system: Cormorant Garamond + Inter, celestial blue palette,
  glassmorphism nav, Framer Motion animations
- Payload CMS collections: Projects, Services, Submissions, Media

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-25 20:37:38 +01:00