Commit Graph

61 Commits

Author SHA1 Message Date
518f86265e feat: deep SEO optimization — metadata, OG tags, sitemap, structured data, GA4
All checks were successful
Build & Push / build-and-push (push) Successful in 1m28s
- Add metadataBase and localized generateMetadata to all pages (EN/FR)
- Add Open Graph and Twitter card defaults with branded OG image
- Add canonical URLs and hreflang alternates on every page
- Create robots.ts (allow all, block /admin/ and /api/)
- Create sitemap.ts with all routes x 2 locales and hreflang
- Add Organization, WebSite, and CreativeWork JSON-LD structured data
- Add GA4 (G-LD348WF8EM) with Consent Mode v2 (default denied for EEA)
- Add llms.txt for AI discoverability
- Add production nginx config for letsbe.biz

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-07 20:38:52 -04:00
57faddc051 feat: add favicon and apple touch icon, center discovery CTA button
All checks were successful
Build & Push / build-and-push (push) Successful in 1m46s
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-07 19:15:41 -04:00
24d8ab73f5 style: increase hero SVG geometric opacity for better visibility
All checks were successful
Build & Push / build-and-push (push) Successful in 1m41s
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-07 18:34:09 -04:00
2d5e588b2e copy: rewrite site messaging to lead with design, temper infrastructure
All checks were successful
Build & Push / build-and-push (push) Successful in 1m43s
Complete copy overhaul across all pages (EN + FR):
- Hero: "Your website. Your software. Your entire digital world."
- Services: "Design. Build. Grow." with reordered pillars
- Philosophy: "We do things differently" — craft leads, ownership closes
- About: remove all Côte d'Azur/Riviera references, new story narrative
- Services page: less jargon, outcome-focused language, honest AI claims
- SEO metadata: includes all three pillars (design, AI, infrastructure)
- Trust bar, CTA, footer, configurator, case study CTAs all updated
- French translations updated to match all English changes

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-07 14:49:44 -04:00
029d3d7970 docs: add site copy redesign spec
Complete design spec for rewriting all user-facing copy to lead with
web design/development, position infrastructure as supporting
differentiator, remove geographic references, and temper AI claims.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-07 14:42:53 -04:00
2943d90ab1 fix: show project card images in full color, add hover zoom
All checks were successful
Build & Push / build-and-push (push) Successful in 1m22s
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-06 16:46:48 -04:00
40e9a257f7 feat: add hero background images to case study detail pages
Some checks failed
Build & Push / build-and-push (push) Has been cancelled
Each project page now has its image behind the hero text with a
dark gradient overlay for readability. Tags use a glass-morphism
style on the image background.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-06 16:46:21 -04:00
1f6bb7d066 feat: replace geometric placeholders with real project and brand images
All checks were successful
Build & Push / build-and-push (push) Successful in 1m35s
- Monaco Ocean: monaco_high_res.jpg in featured card
- Port Nimara: anguilla.png in small card
- Port Amador: panama.png in small card
- Philosophy section: philosophy_image.png replaces AbstractGeometry
- About "Our Story": our_story.png replaces StoryGeometry
- Removed all geometric placeholder components (GeometricPlaceholder,
  AbstractGeometry, StoryGeometry)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-06 16:32:09 -04:00
bcc09542b7 fix: respond to request_contact immediately, send confirmation as text
All checks were successful
Build & Push / build-and-push (push) Successful in 1m43s
The deferred tool response approach caused Gemini to timeout waiting.
Now request_contact responds immediately (telling the agent to wait),
and the confirm button sends a text message through the live WebSocket
to trigger complete_brief.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-06 15:52:53 -04:00
a174518496 feat: add Discovery section to landing page after Process
All checks were successful
Build & Push / build-and-push (push) Successful in 1m51s
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-06 14:45:46 -04:00
896f0eb5f4 feat: create Discovery section component with voice panel
Standalone landing page section with warm copy, CTA, and expandable
inline voice conversation panel. Shows StepComplete on brief completion.
Only renders if voice support is detected.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-06 14:45:17 -04:00
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