feat(presenter): add browser TTS (Web Speech API) + fix German umlauts

- Integrate Web Speech API into usePresenterMode for text-to-speech
- Speech-driven paragraph advancement (falls back to timer if TTS unavailable)
- TTS toggle button (Volume2/VolumeX) in PresenterOverlay
- Chrome keepAlive workaround for long speeches
- Voice selection: prefers premium/neural voices, falls back to any matching lang
- Fix all German umlauts across presenter-script, presenter-faq, i18n, route.ts

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
Benjamin Admin
2026-03-20 12:11:12 +01:00
parent 3a2567b44d
commit bcbceba31c
9 changed files with 370 additions and 218 deletions

View File

@@ -11,11 +11,11 @@ const SLIDE_DISPLAY_NAMES: Record<string, { de: string; en: string }> = {
'intro-presenter': { de: 'Intro', en: 'Intro' },
'cover': { de: 'Cover', en: 'Cover' },
'problem': { de: 'Das Problem', en: 'The Problem' },
'solution': { de: 'Die Loesung', en: 'The Solution' },
'solution': { de: 'Die Lösung', en: 'The Solution' },
'product': { de: 'Produkte', en: 'Products' },
'how-it-works': { de: 'So funktionierts', en: 'How It Works' },
'how-it-works': { de: 'So funktioniert\'s', en: 'How It Works' },
'market': { de: 'Markt', en: 'Market' },
'business-model': { de: 'Geschaeftsmodell', en: 'Business Model' },
'business-model': { de: 'Geschäftsmodell', en: 'Business Model' },
'traction': { de: 'Traction', en: 'Traction' },
'competition': { de: 'Wettbewerb', en: 'Competition' },
'team': { de: 'Team', en: 'Team' },
@@ -34,48 +34,48 @@ const slideCount = SLIDE_ORDER.length
const SYSTEM_PROMPT = `# Investor Agent — BreakPilot ComplAI
## Identitaet
## Identität
Du bist der BreakPilot ComplAI Investor Relations Agent. Du beantwortest Fragen von
potenziellen Investoren ueber das Unternehmen, das Produkt, den Markt und die Finanzprognosen.
potenziellen Investoren über das Unternehmen, das Produkt, den Markt und die Finanzprognosen.
Du hast Zugriff auf alle Unternehmensdaten und zitierst immer konkrete Zahlen.
## Kernprinzipien
- **Datengetrieben**: Beziehe dich immer auf die bereitgestellten Unternehmensdaten
- **Praezise**: Nenne immer konkrete Zahlen, Prozentsaetze und Zeitraeume
- **Begeisternd aber ehrlich**: Stelle das Unternehmen positiv dar, ohne zu uebertreiben
- **Präzise**: Nenne immer konkrete Zahlen, Prozentsätze und Zeiträume
- **Begeisternd aber ehrlich**: Stelle das Unternehmen positiv dar, ohne zu übertreiben
- **Zweisprachig**: Antworte in der Sprache, in der die Frage gestellt wird
## Kernbotschaften (IMMER betonen wenn passend)
1. Zielmarkt: "Maschinen- und Anlagenbauer (VDMA ~3.600 Mitglieder in DE, ~5.000 DACH) die eigene Software/Firmware entwickeln."
2. USP: "Nicht nur organisatorische Compliance, sondern auch Code-Security und Risikoanalyse fuer Eigenentwicklungen. Das koennen Proliance, DataGuard und heyData NICHT."
3. Produkt-Architektur: "Mac Mini/Studio lokal im Serverraum macht die Vorarbeit (Scanning, Analyse). Das BSI-zertifizierte 1000B Cloud-LLM in Deutschland implementiert Fixes und ist fuer alle Mitarbeiter nutzbar."
2. USP: "Nicht nur organisatorische Compliance, sondern auch Code-Security und Risikoanalyse für Eigenentwicklungen. Das können Proliance, DataGuard und heyData NICHT."
3. Produkt-Architektur: "Mac Mini/Studio lokal im Serverraum macht die Vorarbeit (Scanning, Analyse). Das BSI-zertifizierte 1000B Cloud-LLM in Deutschland implementiert Fixes und ist für alle Mitarbeiter nutzbar."
4. Regulatorik: "Cyber Resilience Act (CRA) verpflichtet Hersteller, Software in Produkten abzusichern — unser Kern-Use-Case. Plus DSGVO, AI Act und NIS2."
5. Skalierbarkeit: "AI-First — 10x Kunden ≠ 10x Personal. 380 Kunden in 2030 bei 5.5 Mio EUR Umsatz."
6. Marktchance: "8.7 Mrd EUR TAM, SOM 7.2 Mio EUR (500 DACH-Maschinenbauer x 14.400 EUR/Jahr)."
## Kommunikationsstil
- Professionell, knapp und ueberzeugend
- Professionell, knapp und überzeugend
- Strukturierte Antworten mit klaren Abschnitten
- Zahlen hervorheben und kontextualisieren
- Maximal 3-4 Absaetze pro Antwort
- Maximal 3-4 Absätze pro Antwort
## IP-Schutz-Layer (KRITISCH)
NIEMALS offenbaren: Exakte Modellnamen, Frameworks, Code-Architektur, Datenbankschema, Sicherheitsdetails, Cloud-Provider.
Stattdessen: "Proprietaere KI-Engine", "Self-Hosted Appliance auf Apple-Hardware", "BSI-zertifizierte Cloud", "Enterprise-Grade Verschluesselung".
Stattdessen: "Proprietäre KI-Engine", "Self-Hosted Appliance auf Apple-Hardware", "BSI-zertifizierte Cloud", "Enterprise-Grade Verschlüsselung".
## Erlaubt: Geschaeftsmodell, Preise, Marktdaten, Features, Team, Finanzen, Use of Funds, Hardware-Specs (oeffentlich), LLM-Groessen (32b/40b/1000b).
## Erlaubt: Geschäftsmodell, Preise, Marktdaten, Features, Team, Finanzen, Use of Funds, Hardware-Specs (öffentlich), LLM-Größen (32b/40b/1000b).
## Slide-Awareness (IMMER beachten)
Du erhaeltst den aktuellen Slide-Kontext. Nutze ihn fuer kontextuelle Antworten.
Wenn der Investor etwas fragt, was in einer spaeteren Slide detailliert wird und er diese noch nicht gesehen hat:
- Beantworte kurz, dann: "Details dazu finden Sie in Slide X: [Name]. Moechten Sie dorthin springen? [GOTO:slide-id]"
Du erhältst den aktuellen Slide-Kontext. Nutze ihn für kontextuelle Antworten.
Wenn der Investor etwas fragt, was in einer späteren Slide detailliert wird und er diese noch nicht gesehen hat:
- Beantworte kurz, dann: "Details dazu finden Sie in Slide X: [Name]. Möchten Sie dorthin springen? [GOTO:slide-id]"
- Verwende [GOTO:slide-id] mit der Slide-ID (z.B. [GOTO:financials], [GOTO:competition])
## FOLLOW-UP FRAGEN — KRITISCHE PFLICHT
Du MUSST am Ende JEDER einzelnen Antwort exakt 3 Folgefragen anhaengen.
Die Fragen muessen durch "---" getrennt und mit "[Q]" markiert sein.
JEDE Antwort ohne Folgefragen ist UNVOLLSTAENDIG und FEHLERHAFT.
Du MUSST am Ende JEDER einzelnen Antwort exakt 3 Folgefragen anhängen.
Die Fragen müssen durch "---" getrennt und mit "[Q]" markiert sein.
JEDE Antwort ohne Folgefragen ist UNVOLLSTÄNDIG und FEHLERHAFT.
EXAKTES FORMAT (keine Abweichung erlaubt):
@@ -86,9 +86,9 @@ EXAKTES FORMAT (keine Abweichung erlaubt):
[Q] Zweite Folgefrage die tiefer geht?
[Q] Dritte Folgefrage zu einem verwandten Aspekt?
KONKRETES BEISPIEL einer vollstaendigen Antwort:
KONKRETES BEISPIEL einer vollständigen Antwort:
"Unser AI-First-Ansatz ermoeglicht Skalierung ohne lineares Personalwachstum. Der Umsatz steigt von 36k EUR (2026) auf 8.4 Mio EUR (2030), waehrend das Team nur von 2 auf 18 Personen waechst.
"Unser AI-First-Ansatz ermöglicht Skalierung ohne lineares Personalwachstum. Der Umsatz steigt von 36k EUR (2026) auf 8.4 Mio EUR (2030), während das Team nur von 2 auf 18 Personen wächst.
---
[Q] Wie sieht die Kostenstruktur im Detail aus?
@@ -112,7 +112,7 @@ async function loadPitchContext(): Promise<string> {
])
return `
## Unternehmensdaten (fuer praezise Antworten nutzen)
## Unternehmensdaten (für präzise Antworten nutzen)
### Firma
${JSON.stringify(company.rows[0], null, 2)}
@@ -200,12 +200,12 @@ export async function POST(request: NextRequest) {
.filter(s => !visited.includes(s.idx))
.map(s => `${s.idx + 1}. ${s.name}`)
systemContent += `\n\n## Slide-Kontext (WICHTIG fuer kontextuelle Antworten)
systemContent += `\n\n## Slide-Kontext (WICHTIG für kontextuelle Antworten)
- Aktuelle Slide: "${currentSlideName}" (Nr. ${slideContext.currentIndex + 1} von ${slideCount})
- Bereits besuchte Slides: ${visited.map((i: number) => SLIDE_DISPLAY_NAMES[SLIDE_ORDER[i]]?.[lang] || SLIDE_ORDER[i]).filter(Boolean).join(', ')}
- Noch nicht gesehene Slides: ${notYetSeen.join(', ')}
- Ist Erstbesuch: ${visited.length <= 1 ? 'JA — Investor hat gerade erst den Pitch geoeffnet' : 'Nein'}
- Verfuegbare Slide-IDs fuer [GOTO:id]: ${SLIDE_ORDER.join(', ')}
- Ist Erstbesuch: ${visited.length <= 1 ? 'JA — Investor hat gerade erst den Pitch geöffnet' : 'Nein'}
- Verfügbare Slide-IDs für [GOTO:id]: ${SLIDE_ORDER.join(', ')}
`
}

View File

@@ -324,7 +324,7 @@ export default function ChatFAB({
bg-indigo-600 hover:bg-indigo-500 text-white
flex items-center justify-center shadow-lg shadow-indigo-600/30
transition-colors"
aria-label={lang === 'de' ? 'Investor Agent oeffnen' : 'Open Investor Agent'}
aria-label={lang === 'de' ? 'Investor Agent öffnen' : 'Open Investor Agent'}
>
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round">
<path d="M21 15a2 2 0 01-2 2H7l-4 4V5a2 2 0 012-2h14a2 2 0 012 2z" />

View File

@@ -209,6 +209,10 @@ export default function PitchDeck({ lang, onToggleLanguage }: PitchDeckProps) {
onResume={presenter.resume}
onStop={presenter.stop}
onSkip={presenter.skipSlide}
isSpeaking={presenter.isSpeaking}
ttsAvailable={presenter.ttsAvailable}
ttsEnabled={presenter.ttsEnabled}
onToggleTts={() => presenter.setTtsEnabled(!presenter.ttsEnabled)}
/>
<AnimatePresence>

View File

@@ -1,7 +1,7 @@
'use client'
import { motion, AnimatePresence } from 'framer-motion'
import { Play, Pause, Square, SkipForward } from 'lucide-react'
import { Play, Pause, Square, SkipForward, Volume2, VolumeX } from 'lucide-react'
import { Language } from '@/lib/types'
import { PresenterState } from '@/lib/presenter/types'
import { SLIDE_ORDER } from '@/lib/hooks/useSlideNavigation'
@@ -18,6 +18,10 @@ interface PresenterOverlayProps {
onResume: () => void
onStop: () => void
onSkip: () => void
isSpeaking?: boolean
ttsAvailable?: boolean
ttsEnabled?: boolean
onToggleTts?: () => void
}
export default function PresenterOverlay({
@@ -31,6 +35,10 @@ export default function PresenterOverlay({
onResume,
onStop,
onSkip,
isSpeaking,
ttsAvailable,
ttsEnabled = true,
onToggleTts,
}: PresenterOverlayProps) {
const i = t(lang)
const slideName = i.slideNames[currentIndex] || SLIDE_ORDER[currentIndex] || ''
@@ -79,11 +87,32 @@ export default function PresenterOverlay({
{/* Controls */}
<div className="flex items-center gap-1.5">
{/* TTS toggle */}
{ttsAvailable && onToggleTts && (
<button
onClick={onToggleTts}
className={`w-7 h-7 rounded-full flex items-center justify-center transition-colors ${
ttsEnabled
? 'bg-indigo-500/30 hover:bg-indigo-500/50'
: 'bg-white/10 hover:bg-white/20'
}`}
title={lang === 'de'
? (ttsEnabled ? 'Stimme ausschalten' : 'Stimme einschalten')
: (ttsEnabled ? 'Mute voice' : 'Enable voice')}
>
{ttsEnabled ? (
<Volume2 className={`w-3.5 h-3.5 ${isSpeaking ? 'text-indigo-300' : 'text-white/60'}`} />
) : (
<VolumeX className="w-3.5 h-3.5 text-white/40" />
)}
</button>
)}
<button
onClick={onSkip}
className="w-7 h-7 rounded-full bg-white/10 flex items-center justify-center
hover:bg-white/20 transition-colors"
title={lang === 'de' ? 'Naechste Folie' : 'Next slide'}
title={lang === 'de' ? 'Nächste Folie' : 'Next slide'}
>
<SkipForward className="w-3.5 h-3.5 text-white/60" />
</button>
@@ -138,7 +167,7 @@ export default function PresenterOverlay({
{/* State message */}
{state === 'paused' && (
<p className="text-xs text-yellow-400/60 mt-1">
{lang === 'de' ? 'Pausiert — stellen Sie eine Frage oder druecken Sie Play' : 'Paused — ask a question or press play'}
{lang === 'de' ? 'Pausiert — stellen Sie eine Frage oder drücken Sie Play' : 'Paused — ask a question or press play'}
</p>
)}
{state === 'answering' && (
@@ -148,7 +177,7 @@ export default function PresenterOverlay({
)}
{state === 'resuming' && (
<p className="text-xs text-indigo-400/60 mt-1">
{lang === 'de' ? 'Setze Praesentation fort...' : 'Resuming presentation...'}
{lang === 'de' ? 'Setze Präsentation fort...' : 'Resuming presentation...'}
</p>
)}
</div>

View File

@@ -53,11 +53,11 @@ export default function IntroPresenterSlide({ lang, onStartPresenter, isPresenti
transition={{ delay: 0.3, duration: 0.5 }}
>
<h1 className="text-4xl md:text-5xl font-bold mb-3">
<GradientText>{isDE ? 'KI-Praesentator' : 'AI Presenter'}</GradientText>
<GradientText>{isDE ? 'KI-Präsentator' : 'AI Presenter'}</GradientText>
</h1>
<p className="text-lg text-white/60 max-w-lg mx-auto mb-8">
{isDE
? 'Ihr persoenlicher KI-Guide durch das BreakPilot ComplAI Pitch Deck. 15 Minuten, alle Fakten, jederzeit unterbrechbar.'
? 'Ihr persönlicher KI-Guide durch das BreakPilot ComplAI Pitch Deck. 15 Minuten, alle Fakten, jederzeit unterbrechbar.'
: 'Your personal AI guide through the BreakPilot ComplAI pitch deck. 15 minutes, all facts, interruptible at any time.'}
</p>
</motion.div>
@@ -79,12 +79,12 @@ export default function IntroPresenterSlide({ lang, onStartPresenter, isPresenti
{isPresenting ? (
<>
<Pause className="w-5 h-5" />
{isDE ? 'Praesentation laeuft...' : 'Presentation running...'}
{isDE ? 'Präsentation läuft...' : 'Presentation running...'}
</>
) : (
<>
<Play className="w-5 h-5" />
{isDE ? 'Praesentation starten' : 'Start Presentation'}
{isDE ? 'Präsentation starten' : 'Start Presentation'}
</>
)}
</span>
@@ -108,7 +108,7 @@ export default function IntroPresenterSlide({ lang, onStartPresenter, isPresenti
</div>
<div className="flex items-center gap-2">
<span className="px-1.5 py-0.5 bg-white/10 rounded text-xs font-mono">ESC</span>
<span>{isDE ? 'Slide-Uebersicht' : 'Slide Overview'}</span>
<span>{isDE ? 'Slide-Übersicht' : 'Slide Overview'}</span>
</div>
</motion.div>
</div>

View File

@@ -11,6 +11,8 @@ interface UsePresenterModeConfig {
currentSlide: number
totalSlides: number
language: Language
speechRate?: number // 0.52.0, default 1.0
ttsEnabled?: boolean // default true
}
interface UsePresenterModeReturn {
@@ -24,6 +26,10 @@ interface UsePresenterModeReturn {
toggle: () => void
displayText: string
progress: number
isSpeaking: boolean
ttsAvailable: boolean
ttsEnabled: boolean
setTtsEnabled: (enabled: boolean) => void
}
export function usePresenterMode({
@@ -31,23 +37,64 @@ export function usePresenterMode({
currentSlide,
totalSlides,
language,
speechRate = 1.0,
ttsEnabled: initialTtsEnabled = true,
}: UsePresenterModeConfig): UsePresenterModeReturn {
const [state, setState] = useState<PresenterState>('idle')
const [currentParagraph, setCurrentParagraph] = useState(0)
const [displayText, setDisplayText] = useState('')
const [isSpeaking, setIsSpeaking] = useState(false)
const [ttsEnabled, setTtsEnabled] = useState(initialTtsEnabled)
const [ttsAvailable, setTtsAvailable] = useState(false)
const timerRef = useRef<NodeJS.Timeout | null>(null)
const slideIndexRef = useRef(currentSlide)
const paragraphIndexRef = useRef(0)
const stateRef = useRef<PresenterState>('idle')
const utteranceRef = useRef<SpeechSynthesisUtterance | null>(null)
const voicesRef = useRef<SpeechSynthesisVoice[]>([])
// Refs for recursive functions to avoid circular useCallback dependencies
const advanceRef = useRef<() => void>(() => {})
const speakAndAdvanceRef = useRef<(text: string, pauseAfter: number, onDone: () => void) => void>(() => {})
// Initialize Web Speech API voices
useEffect(() => {
if (typeof window === 'undefined' || !window.speechSynthesis) return
setTtsAvailable(true)
const loadVoices = () => {
voicesRef.current = window.speechSynthesis.getVoices()
}
loadVoices()
window.speechSynthesis.addEventListener('voiceschanged', loadVoices)
return () => {
window.speechSynthesis.removeEventListener('voiceschanged', loadVoices)
}
}, [])
const getVoice = useCallback((lang: Language): SpeechSynthesisVoice | null => {
const voices = voicesRef.current
if (!voices.length) return null
const langCode = lang === 'de' ? 'de' : 'en'
// Prefer high-quality voices
const premium = voices.find(v =>
v.lang.startsWith(langCode) && /premium|enhanced|neural|google|microsoft/i.test(v.name)
)
if (premium) return premium
return voices.find(v => v.lang.startsWith(langCode)) || null
}, [])
const cancelSpeech = useCallback(() => {
if (typeof window !== 'undefined' && window.speechSynthesis) {
window.speechSynthesis.cancel()
}
utteranceRef.current = null
setIsSpeaking(false)
}, [])
// Keep refs in sync
useEffect(() => {
slideIndexRef.current = currentSlide
}, [currentSlide])
useEffect(() => {
stateRef.current = state
}, [state])
useEffect(() => { slideIndexRef.current = currentSlide }, [currentSlide])
useEffect(() => { stateRef.current = state }, [state])
const clearTimer = useCallback(() => {
if (timerRef.current) {
@@ -73,81 +120,133 @@ export function usePresenterMode({
return para
}, [language, getScriptForIndex])
const advancePresentation = useCallback(() => {
if (stateRef.current !== 'presenting') return
// Update speakAndAdvance ref whenever dependencies change
useEffect(() => {
speakAndAdvanceRef.current = (text: string, pauseAfter: number, onDone: () => void) => {
const canSpeak = ttsAvailable && ttsEnabled && typeof window !== 'undefined'
const slideIdx = slideIndexRef.current
const script = getScriptForIndex(slideIdx)
if (canSpeak) {
// Chrome bug: speechSynthesis can get stuck
window.speechSynthesis.cancel()
if (!script) {
// No script for this slide, advance to next
if (slideIdx < totalSlides - 1) {
goToSlide(slideIdx + 1)
paragraphIndexRef.current = 0
// Schedule next after slide transition
timerRef.current = setTimeout(() => advancePresentation(), 2000)
const utterance = new SpeechSynthesisUtterance(text)
const voice = getVoice(language)
if (voice) utterance.voice = voice
utterance.lang = language === 'de' ? 'de-DE' : 'en-US'
utterance.rate = speechRate
utterance.pitch = 1.0
const handleEnd = () => {
setIsSpeaking(false)
utteranceRef.current = null
if (pauseAfter > 0) {
timerRef.current = setTimeout(onDone, pauseAfter)
} else {
onDone()
}
}
utterance.onstart = () => setIsSpeaking(true)
utterance.onend = handleEnd
utterance.onerror = (e) => {
if (e.error !== 'canceled') console.warn('TTS error:', e.error)
setIsSpeaking(false)
utteranceRef.current = null
handleEnd()
}
utteranceRef.current = utterance
window.speechSynthesis.speak(utterance)
} else {
setState('idle')
setDisplayText('')
}
return
}
const nextPara = paragraphIndexRef.current + 1
if (nextPara < script.paragraphs.length) {
// Show next paragraph
const para = showParagraph(slideIdx, nextPara)
if (para) {
// Calculate display time: ~150ms per word + pause
const wordCount = (language === 'de' ? para.text_de : para.text_en).split(/\s+/).length
// No TTS — use word-count-based timer
const wordCount = text.split(/\s+/).length
const readingTime = Math.max(wordCount * 150, 2000)
timerRef.current = setTimeout(() => advancePresentation(), readingTime + para.pause_after)
timerRef.current = setTimeout(onDone, readingTime + pauseAfter)
}
} else {
// All paragraphs done for this slide
// Show transition hint briefly
if (script.transition_hint_de || script.transition_hint_en) {
}
}, [ttsAvailable, ttsEnabled, language, speechRate, getVoice])
// Update advancePresentation ref whenever dependencies change
useEffect(() => {
advanceRef.current = () => {
if (stateRef.current !== 'presenting') return
const slideIdx = slideIndexRef.current
const script = getScriptForIndex(slideIdx)
if (!script) {
if (slideIdx < totalSlides - 1) {
goToSlide(slideIdx + 1)
paragraphIndexRef.current = 0
timerRef.current = setTimeout(() => advanceRef.current(), 2000)
} else {
cancelSpeech()
setState('idle')
setDisplayText('')
}
return
}
const nextPara = paragraphIndexRef.current + 1
if (nextPara < script.paragraphs.length) {
const para = showParagraph(slideIdx, nextPara)
if (para) {
const text = language === 'de' ? para.text_de : para.text_en
speakAndAdvanceRef.current(text, para.pause_after, () => advanceRef.current())
}
} else {
// All paragraphs done — transition hint then next slide
const hint = language === 'de'
? (script.transition_hint_de || '')
: (script.transition_hint_en || '')
setDisplayText(hint)
}
// Move to next slide
if (slideIdx < totalSlides - 1) {
timerRef.current = setTimeout(() => {
if (stateRef.current !== 'presenting') return
goToSlide(slideIdx + 1)
paragraphIndexRef.current = -1 // Will be incremented to 0
const goNext = () => {
if (slideIdx < totalSlides - 1) {
timerRef.current = setTimeout(() => {
if (stateRef.current !== 'presenting') return
goToSlide(slideIdx + 1)
paragraphIndexRef.current = -1
timerRef.current = setTimeout(() => {
timerRef.current = setTimeout(() => {
if (stateRef.current !== 'presenting') return
const nextScript = getScriptForIndex(slideIdx + 1)
if (nextScript && nextScript.paragraphs.length > 0) {
const para = showParagraph(slideIdx + 1, 0)
if (para) {
const text = language === 'de' ? para.text_de : para.text_en
speakAndAdvanceRef.current(text, para.pause_after, () => advanceRef.current())
}
} else {
advanceRef.current()
}
}, 1500)
}, 1000)
} else {
timerRef.current = setTimeout(() => {
cancelSpeech()
setState('idle')
setDisplayText('')
}, 3000)
}
}
if (hint) {
setDisplayText(hint)
speakAndAdvanceRef.current(hint, 0, () => {
if (stateRef.current !== 'presenting') return
const nextScript = getScriptForIndex(slideIdx + 1)
if (nextScript && nextScript.paragraphs.length > 0) {
const para = showParagraph(slideIdx + 1, 0)
if (para) {
const wordCount = (language === 'de' ? para.text_de : para.text_en).split(/\s+/).length
const readingTime = Math.max(wordCount * 150, 2000)
timerRef.current = setTimeout(() => advancePresentation(), readingTime + para.pause_after)
}
} else {
advancePresentation()
}
}, 1500)
}, 2000)
} else {
// Last slide — done
timerRef.current = setTimeout(() => {
setState('idle')
setDisplayText('')
}, 3000)
goNext()
})
} else {
goNext()
}
}
}
}, [language, totalSlides, goToSlide, getScriptForIndex, showParagraph])
}, [language, totalSlides, goToSlide, getScriptForIndex, showParagraph, cancelSpeech])
const start = useCallback(() => {
clearTimer()
cancelSpeech()
setState('presenting')
const slideIdx = slideIndexRef.current
@@ -156,41 +255,43 @@ export function usePresenterMode({
if (script && script.paragraphs.length > 0) {
const para = showParagraph(slideIdx, 0)
if (para) {
const wordCount = (language === 'de' ? para.text_de : para.text_en).split(/\s+/).length
const readingTime = Math.max(wordCount * 150, 2000)
timerRef.current = setTimeout(() => advancePresentation(), readingTime + para.pause_after)
const text = language === 'de' ? para.text_de : para.text_en
// Small delay so state is set before speaking
setTimeout(() => {
speakAndAdvanceRef.current(text, para.pause_after, () => advanceRef.current())
}, 100)
}
} else {
// No script, advance immediately
timerRef.current = setTimeout(() => advancePresentation(), 1000)
timerRef.current = setTimeout(() => advanceRef.current(), 1000)
}
}, [clearTimer, language, getScriptForIndex, showParagraph, advancePresentation])
}, [clearTimer, cancelSpeech, language, getScriptForIndex, showParagraph])
const stop = useCallback(() => {
clearTimer()
cancelSpeech()
setState('idle')
setDisplayText('')
setCurrentParagraph(0)
paragraphIndexRef.current = 0
}, [clearTimer])
}, [clearTimer, cancelSpeech])
const pause = useCallback(() => {
clearTimer()
cancelSpeech()
setState('paused')
}, [clearTimer])
}, [clearTimer, cancelSpeech])
const resume = useCallback(() => {
setState('resuming')
// Brief pause before continuing
timerRef.current = setTimeout(() => {
setState('presenting')
// Continue from where we left off
advancePresentation()
advanceRef.current()
}, 2000)
}, [advancePresentation])
}, [])
const skipSlide = useCallback(() => {
clearTimer()
cancelSpeech()
const nextIdx = slideIndexRef.current + 1
if (nextIdx < totalSlides) {
goToSlide(nextIdx)
@@ -202,15 +303,14 @@ export function usePresenterMode({
if (script && script.paragraphs.length > 0) {
const para = showParagraph(nextIdx, 0)
if (para) {
const wordCount = (language === 'de' ? para.text_de : para.text_en).split(/\s+/).length
const readingTime = Math.max(wordCount * 150, 2000)
timerRef.current = setTimeout(() => advancePresentation(), readingTime + para.pause_after)
const text = language === 'de' ? para.text_de : para.text_en
speakAndAdvanceRef.current(text, para.pause_after, () => advanceRef.current())
}
}
}, 1500)
}
}
}, [clearTimer, totalSlides, goToSlide, language, getScriptForIndex, showParagraph, advancePresentation])
}, [clearTimer, cancelSpeech, totalSlides, goToSlide, language, getScriptForIndex, showParagraph])
const toggle = useCallback(() => {
if (stateRef.current === 'idle') {
@@ -236,8 +336,23 @@ export function usePresenterMode({
// Cleanup on unmount
useEffect(() => {
return () => clearTimer()
}, [clearTimer])
return () => {
clearTimer()
cancelSpeech()
}
}, [clearTimer, cancelSpeech])
// Chrome workaround: speechSynthesis pauses after ~15s without interaction
useEffect(() => {
if (state !== 'presenting' || !ttsEnabled || !ttsAvailable) return
const keepAlive = setInterval(() => {
if (typeof window !== 'undefined' && window.speechSynthesis?.speaking) {
window.speechSynthesis.pause()
window.speechSynthesis.resume()
}
}, 10000)
return () => clearInterval(keepAlive)
}, [state, ttsEnabled, ttsAvailable])
return {
state,
@@ -250,5 +365,9 @@ export function usePresenterMode({
toggle,
displayText,
progress,
isSpeaking,
ttsAvailable,
ttsEnabled,
setTtsEnabled,
}
}

View File

@@ -11,11 +11,11 @@ const translations = {
'Intro',
'Cover',
'Das Problem',
'Die Loesung',
'Die Lösung',
'Produkte',
'So funktioniert\'s',
'Markt',
'Geschaeftsmodell',
'Geschäftsmodell',
'Traction',
'Wettbewerb',
'Team',
@@ -30,7 +30,7 @@ const translations = {
'Anhang: KI-Pipeline',
],
cover: {
tagline: 'Compliance & Code-Security fuer den Maschinenbau',
tagline: 'Compliance & Code-Security für den Maschinenbau',
subtitle: 'Pre-Seed · Q4 2026',
cta: 'Pitch starten',
},
@@ -41,12 +41,12 @@ const translations = {
{
title: 'DSGVO',
stat: '4.1 Mrd EUR',
desc: 'Bussgelder seit 2018. Maschinenbauer verarbeiten Kundendaten, Telemetrie und Wartungsprotokolle — oft ohne DSGVO-Prozesse.',
desc: 'Bußgelder seit 2018. Maschinenbauer verarbeiten Kundendaten, Telemetrie und Wartungsprotokolle — oft ohne DSGVO-Prozesse.',
},
{
title: 'AI Act',
stat: 'Aug 2025',
desc: 'Maschinen mit KI-Komponenten muessen klassifiziert werden. Embedded KI in Steuerungen und Predictive Maintenance erfordert Dokumentation.',
desc: 'Maschinen mit KI-Komponenten müssen klassifiziert werden. Embedded KI in Steuerungen und Predictive Maintenance erfordert Dokumentation.',
},
{
title: 'CRA & NIS2',
@@ -57,12 +57,12 @@ const translations = {
quote: 'Maschinenbauer brauchen keine Compliance-Berater — sie brauchen eine KI, die ihren Code scannt, Risiken bewertet und Compliance dokumentiert.',
},
solution: {
title: 'Die Loesung',
title: 'Die Lösung',
subtitle: 'ComplAI — Compliance & Code-Security auf Autopilot',
pillars: [
{
title: 'Self-Hosted Vorarbeit',
desc: 'Mac Mini oder Mac Studio im Serverraum scannt Code, analysiert Repositories und erstellt Compliance-Dokumente. Kein Byte verlaesst das Unternehmen.',
desc: 'Mac Mini oder Mac Studio im Serverraum scannt Code, analysiert Repositories und erstellt Compliance-Dokumente. Kein Byte verlässt das Unternehmen.',
icon: 'server',
},
{
@@ -79,7 +79,7 @@ const translations = {
},
product: {
title: 'Unsere Produkte',
subtitle: 'Drei Tiers fuer jede Unternehmensgroesse',
subtitle: 'Drei Tiers für jede Unternehmensgröße',
monthly: '/Monat',
hardware: 'Hardware',
llm: 'KI-Modell',
@@ -92,19 +92,19 @@ const translations = {
steps: [
{
title: 'Hardware aufstellen',
desc: 'Mac Mini oder Mac Studio im Serverraum anschliessen. Plug & Play — scannt ab Tag 1 Ihre Repositories.',
desc: 'Mac Mini oder Mac Studio im Serverraum anschließen. Plug & Play — scannt ab Tag 1 Ihre Repositories.',
},
{
title: 'Code-Repos verbinden',
desc: 'Git-Repos, CI/CD Pipelines und Firmware-Projekte anbinden. Die lokale KI scannt automatisch auf Schwachstellen und Compliance-Luecken.',
desc: 'Git-Repos, CI/CD Pipelines und Firmware-Projekte anbinden. Die lokale KI scannt automatisch auf Schwachstellen und Compliance-Lücken.',
},
{
title: 'Compliance & Security automatisieren',
desc: 'Laufende Code-Analyse und Risikoanalysen bei jeder Aenderung. Bei kritischen Fixes schaltet sich das 1000B Cloud-LLM zu und implementiert Verbesserungen.',
desc: 'Laufende Code-Analyse und Risikoanalysen bei jeder Änderung. Bei kritischen Fixes schaltet sich das 1000B Cloud-LLM zu und implementiert Verbesserungen.',
},
{
title: 'Audit bestehen',
desc: 'Vollstaendige Dokumentation fuer DSGVO, AI Act, CRA und NIS2 auf Knopfdruck. Risikobeurteilungen fuer Ihre Software inklusive.',
desc: 'Vollständige Dokumentation für DSGVO, AI Act, CRA und NIS2 auf Knopfdruck. Risikobeurteilungen für Ihre Software inklusive.',
},
],
},
@@ -121,7 +121,7 @@ const translations = {
growth: 'Wachstum p.a.',
},
businessModel: {
title: 'Geschaeftsmodell',
title: 'Geschäftsmodell',
subtitle: 'Recurring Revenue mit Hardware-Moat',
unitEconomics: 'Unit Economics',
amortization: 'Amortisation',
@@ -151,7 +151,7 @@ const translations = {
},
team: {
title: 'Das Team',
subtitle: 'Gruender mit Domain-Expertise',
subtitle: 'Gründer mit Domain-Expertise',
equity: 'Equity',
expertise: 'Expertise',
},
@@ -191,20 +191,20 @@ const translations = {
send: 'Senden',
thinking: 'Denke nach...',
suggestions: [
'Wie funktioniert die Code-Security fuer Firmware?',
'Warum koennen Proliance und DataGuard das nicht?',
'Was kostet die Loesung fuer einen Maschinenbauer?',
'Wie sieht die Risikoanalyse fuer unsere Software aus?',
'Wie funktioniert die Code-Security für Firmware?',
'Warum können Proliance und DataGuard das nicht?',
'Was kostet die Lösung für einen Maschinenbauer?',
'Wie sieht die Risikoanalyse für unsere Software aus?',
],
},
annex: {
assumptions: {
title: 'Annahmen & Sensitivitaet',
subtitle: 'Drei Szenarien fuer robuste Planung',
title: 'Annahmen & Sensitivität',
subtitle: 'Drei Szenarien für robuste Planung',
},
architecture: {
title: 'Technische Architektur',
subtitle: 'Self-Hosted KI-Stack fuer maximale Datensouveraenitaet',
subtitle: 'Self-Hosted KI-Stack für maximale Datensouveränität',
},
gtm: {
title: 'Go-to-Market Strategie',
@@ -212,7 +212,7 @@ const translations = {
},
regulatory: {
title: 'Regulatorische Details',
subtitle: 'Die vier Saeulen der EU-Compliance fuer Maschinenbauer',
subtitle: 'Die vier Säulen der EU-Compliance für Maschinenbauer',
},
engineering: {
title: 'Engineering Deep Dive',

View File

@@ -7,7 +7,7 @@ export const PRESENTER_FAQ: FAQEntry[] = [
keywords: ['was', 'macht', 'breakpilot', 'what', 'does', 'product', 'produkt'],
question_de: 'Was macht BreakPilot?',
question_en: 'What does BreakPilot do?',
answer_de: 'BreakPilot ComplAI ist eine KI-gesteuerte Compliance- und Code-Security-Plattform fuer Maschinenbauer. Eine Self-Hosted Hardware-Appliance (Mac Mini/Studio) scannt Code und erstellt Compliance-Dokumente. 57 Module decken DSGVO, AI Act, CRA und NIS2 ab — mit 2.274 indexierten Rechtstexten.',
answer_de: 'BreakPilot ComplAI ist eine KI-gesteuerte Compliance- und Code-Security-Plattform für Maschinenbauer. Eine Self-Hosted Hardware-Appliance (Mac Mini/Studio) scannt Code und erstellt Compliance-Dokumente. 57 Module decken DSGVO, AI Act, CRA und NIS2 ab — mit 2.274 indexierten Rechtstexten.',
answer_en: 'BreakPilot ComplAI is an AI-powered compliance and code security platform for machine manufacturers. A self-hosted hardware appliance (Mac Mini/Studio) scans code and creates compliance documents. 57 modules cover GDPR, AI Act, CRA and NIS2 — with 2,274 indexed legal texts.',
goto_slide: 'solution',
priority: 10,
@@ -17,7 +17,7 @@ export const PRESENTER_FAQ: FAQEntry[] = [
keywords: ['module', 'modules', 'funktionen', 'features', 'umfang', 'scope', 'wieviele', 'how many'],
question_de: 'Welche Module hat die Plattform?',
question_en: 'What modules does the platform have?',
answer_de: '57 Compliance-Module: DSGVO (VVT, DSFA, TOM, DSR, Loeschfristen), AI Act (Risikoklassifizierung, Dokumentation), CRA (Code-Security, SBOM), NIS2 (Incident Response, Notfallplan), plus Vendor Compliance, Audit-Management, Policy Generator und mehr.',
answer_de: '57 Compliance-Module: DSGVO (VVT, DSFA, TOM, DSR, Löschfristen), AI Act (Risikoklassifizierung, Dokumentation), CRA (Code-Security, SBOM), NIS2 (Incident Response, Notfallplan), plus Vendor Compliance, Audit-Management, Policy Generator und mehr.',
answer_en: '57 compliance modules: GDPR (RoPA, DPIA, TOMs, DSR, deletion deadlines), AI Act (risk classification, documentation), CRA (code security, SBOM), NIS2 (incident response, emergency plans), plus vendor compliance, audit management, policy generator and more.',
goto_slide: 'solution',
priority: 8,
@@ -27,7 +27,7 @@ export const PRESENTER_FAQ: FAQEntry[] = [
keywords: ['dsgvo', 'gdpr', 'ai act', 'unterschied', 'difference', 'versus', 'vs'],
question_de: 'Was ist der Unterschied zwischen DSGVO und AI Act Compliance?',
question_en: 'What is the difference between GDPR and AI Act compliance?',
answer_de: 'DSGVO schuetzt personenbezogene Daten (Verarbeitungsverzeichnis, Loeschfristen, Betroffenenrechte). Der AI Act reguliert KI-Systeme (Risikoklassifizierung, Transparenz, Human Oversight). Maschinenbauer mit KI in ihren Produkten brauchen beides — und genau das liefern wir.',
answer_de: 'DSGVO schützt personenbezogene Daten (Verarbeitungsverzeichnis, Löschfristen, Betroffenenrechte). Der AI Act reguliert KI-Systeme (Risikoklassifizierung, Transparenz, Human Oversight). Maschinenbauer mit KI in ihren Produkten brauchen beides — und genau das liefern wir.',
answer_en: 'GDPR protects personal data (records of processing, deletion deadlines, data subject rights). The AI Act regulates AI systems (risk classification, transparency, human oversight). Machine manufacturers with AI in their products need both — and that is exactly what we deliver.',
priority: 7,
},
@@ -35,10 +35,10 @@ export const PRESENTER_FAQ: FAQEntry[] = [
// === TECHNOLOGY ===
{
id: 'tech-llm',
keywords: ['llm', 'modell', 'model', 'ki', 'ai', 'kuenstliche intelligenz', 'artificial intelligence', 'welches', 'which'],
keywords: ['llm', 'modell', 'model', 'ki', 'ai', 'künstliche intelligenz', 'artificial intelligence', 'welches', 'which'],
question_de: 'Welches KI-Modell nutzt ihr?',
question_en: 'Which AI model do you use?',
answer_de: 'Wir setzen auf eine proprietaere KI-Engine mit verschiedenen Modellgroessen: 32B Parameter lokal auf Mac Mini, 40B auf Mac Studio, und ein BSI-zertifiziertes 1000B Cloud-LLM fuer komplexe Aufgaben. Die lokalen Modelle machen die Vorarbeit, die Cloud implementiert Fixes.',
answer_de: 'Wir setzen auf eine proprietäre KI-Engine mit verschiedenen Modellgrößen: 32B Parameter lokal auf Mac Mini, 40B auf Mac Studio, und ein BSI-zertifiziertes 1000B Cloud-LLM für komplexe Aufgaben. Die lokalen Modelle machen die Vorarbeit, die Cloud implementiert Fixes.',
answer_en: 'We use a proprietary AI engine with different model sizes: 32B parameters locally on Mac Mini, 40B on Mac Studio, and a BSI-certified 1000B cloud LLM for complex tasks. Local models do the preprocessing, the cloud implements fixes.',
goto_slide: 'product',
priority: 8,
@@ -48,16 +48,16 @@ export const PRESENTER_FAQ: FAQEntry[] = [
keywords: ['open source', 'opensource', 'quellcode', 'source code', 'lizenz', 'license'],
question_de: 'Ist die Plattform Open Source?',
question_en: 'Is the platform open source?',
answer_de: 'Die Plattform selbst ist proprietaer, nutzt aber ausschliesslich Open-Source-Dependencies mit kommerziell nutzbaren Lizenzen (MIT, Apache-2.0, BSD). Wir verwenden keine GPL/AGPL-abhaengigkeiten. Die Hardware laeuft auf Apple Silicon.',
answer_de: 'Die Plattform selbst ist proprietär, nutzt aber ausschließlich Open-Source-Dependencies mit kommerziell nutzbaren Lizenzen (MIT, Apache-2.0, BSD). Wir verwenden keine GPL/AGPL-Abhängigkeiten. Die Hardware läuft auf Apple Silicon.',
answer_en: 'The platform itself is proprietary but uses exclusively open source dependencies with commercially usable licenses (MIT, Apache-2.0, BSD). We use no GPL/AGPL dependencies. The hardware runs on Apple Silicon.',
priority: 6,
},
{
id: 'tech-security',
keywords: ['sicherheit', 'security', 'datenschutz', 'privacy', 'verschluesselung', 'encryption', 'hosting'],
keywords: ['sicherheit', 'security', 'datenschutz', 'privacy', 'verschlüsselung', 'encryption', 'hosting'],
question_de: 'Wie sicher sind die Daten?',
question_en: 'How secure is the data?',
answer_de: 'Maximale Datensouveraenitaet: Die Hardware steht im Serverraum des Kunden. Alle Daten bleiben on-premise. Nur anonymisierte Anfragen gehen an die BSI-zertifizierte Cloud. TLS 1.3 fuer alle Verbindungen, Vault fuer Secrets, Enterprise-Grade Verschluesselung.',
answer_de: 'Maximale Datensouveränität: Die Hardware steht im Serverraum des Kunden. Alle Daten bleiben on-premise. Nur anonymisierte Anfragen gehen an die BSI-zertifizierte Cloud. TLS 1.3 für alle Verbindungen, Vault für Secrets, Enterprise-Grade Verschlüsselung.',
answer_en: 'Maximum data sovereignty: The hardware sits in the customer server room. All data stays on-premise. Only anonymized queries go to the BSI-certified cloud. TLS 1.3 for all connections, Vault for secrets, enterprise-grade encryption.',
goto_slide: 'annex-architecture',
priority: 8,
@@ -67,7 +67,7 @@ export const PRESENTER_FAQ: FAQEntry[] = [
keywords: ['self-hosted', 'selfhosted', 'self hosted', 'on-premise', 'onpremise', 'lokal', 'local', 'warum', 'why', 'mac'],
question_de: 'Warum Self-Hosted auf Apple Hardware?',
question_en: 'Why self-hosted on Apple hardware?',
answer_de: 'Drei Gruende: 1) Datensouveraenitaet — Kundendaten verlassen nie das Unternehmen. 2) Apple Silicon bietet das beste Preis-Leistungs-Verhaeltnis fuer lokale LLM-Inferenz. 3) Hardware-Moat — die Appliance schafft einen natuerlichen Lock-in und differentiert uns vom Wettbewerb.',
answer_de: 'Drei Gründe: 1) Datensouveränität — Kundendaten verlassen nie das Unternehmen. 2) Apple Silicon bietet das beste Preis-Leistungs-Verhältnis für lokale LLM-Inferenz. 3) Hardware-Moat — die Appliance schafft einen natürlichen Lock-in und differentiert uns vom Wettbewerb.',
answer_en: 'Three reasons: 1) Data sovereignty — customer data never leaves the company. 2) Apple Silicon offers the best price-performance ratio for local LLM inference. 3) Hardware moat — the appliance creates a natural lock-in and differentiates us from competition.',
goto_slide: 'solution',
priority: 7,
@@ -77,7 +77,7 @@ export const PRESENTER_FAQ: FAQEntry[] = [
keywords: ['code', 'scan', 'scanning', 'firmware', 'devsecops', 'trivy', 'semgrep', 'schwachstellen', 'vulnerability'],
question_de: 'Wie funktioniert das Code-Scanning?',
question_en: 'How does code scanning work?',
answer_de: 'Integrierte DevSecOps-Tools (Trivy, Semgrep, Gitleaks) scannen automatisch Git-Repos und Firmware bei jedem Commit. Die lokale KI priorisiert Findings, das Cloud-LLM implementiert Fixes und schreibt Risikoanalysen fuer den CRA.',
answer_de: 'Integrierte DevSecOps-Tools (Trivy, Semgrep, Gitleaks) scannen automatisch Git-Repos und Firmware bei jedem Commit. Die lokale KI priorisiert Findings, das Cloud-LLM implementiert Fixes und schreibt Risikoanalysen für den CRA.',
answer_en: 'Integrated DevSecOps tools (Trivy, Semgrep, Gitleaks) automatically scan Git repos and firmware on every commit. The local AI prioritizes findings, the cloud LLM implements fixes and writes risk assessments for the CRA.',
goto_slide: 'how-it-works',
priority: 7,
@@ -86,10 +86,10 @@ export const PRESENTER_FAQ: FAQEntry[] = [
// === MARKET ===
{
id: 'market-tam',
keywords: ['tam', 'sam', 'som', 'markt', 'market', 'marktgroesse', 'market size', 'adressierbar'],
question_de: 'Wie gross ist der Markt?',
keywords: ['tam', 'sam', 'som', 'markt', 'market', 'marktgröße', 'market size', 'adressierbar'],
question_de: 'Wie groß ist der Markt?',
question_en: 'How big is the market?',
answer_de: 'TAM: 8,7 Mrd. EUR (globaler RegTech-Markt, +23% p.a.). SAM: 1,2 Mrd. EUR (DACH-Maschinenbauer mit Softwareentwicklung). SOM: 7,2 Mio. EUR (500 Kunden x 14.400 EUR/Jahr). Der CRA allein betrifft ueber 30.000 Hersteller in der EU.',
answer_de: 'TAM: 8,7 Mrd. EUR (globaler RegTech-Markt, +23% p.a.). SAM: 1,2 Mrd. EUR (DACH-Maschinenbauer mit Softwareentwicklung). SOM: 7,2 Mio. EUR (500 Kunden x 14.400 EUR/Jahr). Der CRA allein betrifft über 30.000 Hersteller in der EU.',
answer_en: 'TAM: EUR 8.7B (global RegTech market, +23% p.a.). SAM: EUR 1.2B (DACH machine manufacturers with software development). SOM: EUR 7.2M (500 customers x EUR 14,400/year). The CRA alone affects over 30,000 manufacturers in the EU.',
goto_slide: 'market',
priority: 9,
@@ -99,7 +99,7 @@ export const PRESENTER_FAQ: FAQEntry[] = [
keywords: ['zielgruppe', 'target', 'kunden', 'customers', 'wer', 'who', 'maschinenbau', 'machine', 'vdma'],
question_de: 'Wer ist die Zielgruppe?',
question_en: 'Who is the target audience?',
answer_de: 'Primaer: Maschinen- und Anlagenbauer (VDMA ~3.600 Mitglieder in DE, ~5.000 DACH) die eigene Software und Firmware entwickeln. Diese Unternehmen muessen CRA, DSGVO, AI Act und NIS2 einhalten — haben aber keine spezialisierten Compliance-Tools fuer ihren Code.',
answer_de: 'Primär: Maschinen- und Anlagenbauer (VDMA ~3.600 Mitglieder in DE, ~5.000 DACH) die eigene Software und Firmware entwickeln. Diese Unternehmen müssen CRA, DSGVO, AI Act und NIS2 einhalten — haben aber keine spezialisierten Compliance-Tools für ihren Code.',
answer_en: 'Primary: Machine and plant manufacturers (VDMA ~3,600 members in DE, ~5,000 DACH) who develop their own software and firmware. These companies must comply with CRA, GDPR, AI Act and NIS2 — but lack specialized compliance tools for their code.',
goto_slide: 'market',
priority: 8,
@@ -111,7 +111,7 @@ export const PRESENTER_FAQ: FAQEntry[] = [
keywords: ['wettbewerb', 'competition', 'konkurrenz', 'unterschied', 'differenzierung', 'differentiation', 'proliance', 'dataguard', 'heydata', 'vanta'],
question_de: 'Was unterscheidet euch vom Wettbewerb?',
question_en: 'What differentiates you from the competition?',
answer_de: 'Drei entscheidende Unterschiede: 1) Code-Security — wir scannen Firmware und Software, das kann kein anderer Compliance-Anbieter. 2) Self-Hosted KI — maximale Datensouveraenitaet. 3) Produkt-Compliance — wir machen nicht nur das Unternehmen, sondern auch die Produkte compliant (CRA).',
answer_de: 'Drei entscheidende Unterschiede: 1) Code-Security — wir scannen Firmware und Software, das kann kein anderer Compliance-Anbieter. 2) Self-Hosted KI — maximale Datensouveränität. 3) Produkt-Compliance — wir machen nicht nur das Unternehmen, sondern auch die Produkte compliant (CRA).',
answer_en: 'Three decisive differences: 1) Code security — we scan firmware and software, no other compliance provider can do that. 2) Self-hosted AI — maximum data sovereignty. 3) Product compliance — we make not only the company, but also the products compliant (CRA).',
goto_slide: 'competition',
priority: 9,
@@ -119,9 +119,9 @@ export const PRESENTER_FAQ: FAQEntry[] = [
{
id: 'competition-proliance',
keywords: ['proliance', 'dataguard', 'heydata', 'vergleich', 'comparison', 'versus'],
question_de: 'Warum koennen Proliance und DataGuard das nicht?',
question_de: 'Warum können Proliance und DataGuard das nicht?',
question_en: 'Why can\'t Proliance and DataGuard do this?',
answer_de: 'Proliance, DataGuard und heyData fokussieren auf organisatorische DSGVO-Compliance — Verarbeitungsverzeichnisse, Datenschutzerklaerungen, Schulungen. Keiner bietet Code-Scanning, Firmware-Analyse oder CRA-Compliance. Sie machen das Unternehmen compliant, aber nicht die Produkte.',
answer_de: 'Proliance, DataGuard und heyData fokussieren auf organisatorische DSGVO-Compliance — Verarbeitungsverzeichnisse, Datenschutzerklärungen, Schulungen. Keiner bietet Code-Scanning, Firmware-Analyse oder CRA-Compliance. Sie machen das Unternehmen compliant, aber nicht die Produkte.',
answer_en: 'Proliance, DataGuard and heyData focus on organizational GDPR compliance — records of processing, privacy policies, training. None offer code scanning, firmware analysis or CRA compliance. They make the company compliant, but not the products.',
goto_slide: 'competition',
priority: 8,
@@ -133,7 +133,7 @@ export const PRESENTER_FAQ: FAQEntry[] = [
keywords: ['preis', 'price', 'pricing', 'kosten', 'cost', 'kostet', 'costs', 'wie viel', 'how much', 'subscription'],
question_de: 'Was kostet BreakPilot?',
question_en: 'What does BreakPilot cost?',
answer_de: 'Drei Tiers: ComplAI Starter (Mac Mini) ab 1.200 EUR/Monat, Professional (Mac Studio) ab 2.400 EUR/Monat, Enterprise mit Cloud-LLM ab 3.600 EUR/Monat. Die Hardware wird einmalig bereitgestellt, die Software laeuft als monatliche Subscription.',
answer_de: 'Drei Tiers: ComplAI Starter (Mac Mini) ab 1.200 EUR/Monat, Professional (Mac Studio) ab 2.400 EUR/Monat, Enterprise mit Cloud-LLM ab 3.600 EUR/Monat. Die Hardware wird einmalig bereitgestellt, die Software läuft als monatliche Subscription.',
answer_en: 'Three tiers: ComplAI Starter (Mac Mini) from EUR 1,200/month, Professional (Mac Studio) from EUR 2,400/month, Enterprise with cloud LLM from EUR 3,600/month. Hardware is provided once, software runs as monthly subscription.',
goto_slide: 'product',
priority: 9,
@@ -153,7 +153,7 @@ export const PRESENTER_FAQ: FAQEntry[] = [
keywords: ['unit economics', 'marge', 'margin', 'ltv', 'cac', 'amortisation', 'amortization'],
question_de: 'Wie sind die Unit Economics?',
question_en: 'What are the unit economics?',
answer_de: 'Bruttomarge ueber 70%. Hardware-Kosten amortisieren sich in wenigen Monaten. LTV/CAC Ratio verbessert sich auf ueber 5x bis 2029. Die AI-First Architektur haelt die operativen Kosten pro Kunde extrem niedrig.',
answer_de: 'Bruttomarge über 70%. Hardware-Kosten amortisieren sich in wenigen Monaten. LTV/CAC Ratio verbessert sich auf über 5x bis 2029. Die AI-First Architektur hält die operativen Kosten pro Kunde extrem niedrig.',
answer_en: 'Gross margin above 70%. Hardware costs amortize in a few months. LTV/CAC ratio improves to over 5x by 2029. The AI-first architecture keeps operational costs per customer extremely low.',
goto_slide: 'business-model',
priority: 7,
@@ -161,9 +161,9 @@ export const PRESENTER_FAQ: FAQEntry[] = [
{
id: 'biz-scalability',
keywords: ['skalierung', 'scalability', 'skalierbar', 'scalable', 'wachstum', 'growth', 'personal', 'headcount'],
question_de: 'Wie skaliert das Geschaeftsmodell?',
question_de: 'Wie skaliert das Geschäftsmodell?',
question_en: 'How does the business model scale?',
answer_de: 'AI-First bedeutet: 10x Kunden erfordert nicht 10x Personal. Die KI automatisiert Compliance-Analyse und Code-Scanning. Das Team waechst von 2 auf 18 Personen bei 380 Kunden. Die Hardware-Appliance ist Plug-and-Play — kein aufwendiges Onboarding noetig.',
answer_de: 'AI-First bedeutet: 10x Kunden erfordert nicht 10x Personal. Die KI automatisiert Compliance-Analyse und Code-Scanning. Das Team wächst von 2 auf 18 Personen bei 380 Kunden. Die Hardware-Appliance ist Plug-and-Play — kein aufwendiges Onboarding nötig.',
answer_en: 'AI-first means: 10x customers does not require 10x headcount. The AI automates compliance analysis and code scanning. The team grows from 2 to 18 people at 380 customers. The hardware appliance is plug-and-play — no extensive onboarding needed.',
goto_slide: 'financials',
priority: 7,
@@ -172,10 +172,10 @@ export const PRESENTER_FAQ: FAQEntry[] = [
// === TEAM ===
{
id: 'team-founders',
keywords: ['team', 'gruender', 'founders', 'wer', 'who', 'erfahrung', 'experience', 'hintergrund', 'background'],
question_de: 'Wer sind die Gruender?',
keywords: ['team', 'gründer', 'founders', 'wer', 'who', 'erfahrung', 'experience', 'hintergrund', 'background'],
question_de: 'Wer sind die Gründer?',
question_en: 'Who are the founders?',
answer_de: 'Unser Gruenderteam vereint tiefe Domain-Expertise: Compliance-Wissen aus der Praxis, Software-Architektur fuer skalierbare Systeme, und KI-Erfahrung mit Large Language Models. Details finden Sie auf der Team-Slide.',
answer_de: 'Unser Gründerteam vereint tiefe Domain-Expertise: Compliance-Wissen aus der Praxis, Software-Architektur für skalierbare Systeme, und KI-Erfahrung mit Large Language Models. Details finden Sie auf der Team-Slide.',
answer_en: 'Our founding team combines deep domain expertise: Compliance knowledge from practice, software architecture for scalable systems, and AI experience with large language models. Details on the team slide.',
goto_slide: 'team',
priority: 7,
@@ -187,17 +187,17 @@ export const PRESENTER_FAQ: FAQEntry[] = [
keywords: ['investment', 'investition', 'funding', 'finanzierung', 'wie viel', 'how much', 'kapital', 'capital', 'runde', 'round'],
question_de: 'Wie viel Kapital sucht ihr?',
question_en: 'How much capital are you seeking?',
answer_de: 'Wir suchen eine Pre-Seed Finanzierung. Das genaue Volumen und die Konditionen besprechen wir gerne im Detail. Das Kapital fliesst in Engineering, Vertrieb, Hardware-Bestand und regulatorische Reserve.',
answer_de: 'Wir suchen eine Pre-Seed Finanzierung. Das genaue Volumen und die Konditionen besprechen wir gerne im Detail. Das Kapital fließt in Engineering, Vertrieb, Hardware-Bestand und regulatorische Reserve.',
answer_en: 'We are seeking pre-seed funding. We are happy to discuss the exact volume and terms in detail. Capital goes into engineering, sales, hardware inventory and regulatory reserve.',
goto_slide: 'the-ask',
priority: 9,
},
{
id: 'invest-use-of-funds',
keywords: ['use of funds', 'wofuer', 'what for', 'verwendung', 'allocation', 'mittelverwendung'],
question_de: 'Wofuer wird das Kapital verwendet?',
keywords: ['use of funds', 'wofür', 'what for', 'verwendung', 'allocation', 'mittelverwendung'],
question_de: 'Wofür wird das Kapital verwendet?',
question_en: 'What will the capital be used for?',
answer_de: 'Vier Bereiche: 1) Engineering — Produktreife und weitere Module. 2) Vertrieb — erste Pilotkunden im VDMA-Netzwerk. 3) Hardware — Mac Minis/Studios fuer schnelle Auslieferung. 4) Reserve — regulatorische Anforderungen und Working Capital.',
answer_de: 'Vier Bereiche: 1) Engineering — Produktreife und weitere Module. 2) Vertrieb — erste Pilotkunden im VDMA-Netzwerk. 3) Hardware — Mac Minis/Studios für schnelle Auslieferung. 4) Reserve — regulatorische Anforderungen und Working Capital.',
answer_en: 'Four areas: 1) Engineering — product maturity and additional modules. 2) Sales — first pilot customers in VDMA network. 3) Hardware — Mac Minis/Studios for fast delivery. 4) Reserve — regulatory requirements and working capital.',
goto_slide: 'the-ask',
priority: 8,
@@ -207,7 +207,7 @@ export const PRESENTER_FAQ: FAQEntry[] = [
keywords: ['runway', 'burn', 'burn rate', 'reicht', 'lasts', 'monate', 'months', 'cashflow'],
question_de: 'Wie lang reicht das Kapital?',
question_en: 'How long does the capital last?',
answer_de: 'Die Pre-Seed Runde finanziert uns bis zur naechsten Finanzierungsrunde. Dank AI-First Architektur und Self-Hosted Ansatz ist unsere Burn Rate signifikant niedriger als bei Cloud-basierten SaaS-Startups.',
answer_de: 'Die Pre-Seed Runde finanziert uns bis zur nächsten Finanzierungsrunde. Dank AI-First Architektur und Self-Hosted Ansatz ist unsere Burn Rate signifikant niedriger als bei Cloud-basierten SaaS-Startups.',
answer_en: 'The pre-seed round funds us until the next financing round. Thanks to AI-first architecture and self-hosted approach, our burn rate is significantly lower than cloud-based SaaS startups.',
goto_slide: 'financials',
priority: 7,
@@ -217,7 +217,7 @@ export const PRESENTER_FAQ: FAQEntry[] = [
keywords: ['bewertung', 'valuation', 'konditionen', 'terms', 'instrument', 'safe', 'convertible'],
question_de: 'Was ist die Bewertung?',
question_en: 'What is the valuation?',
answer_de: 'Die genaue Bewertung und das Instrument besprechen wir gerne im persoenlichen Gespraech. Wir sind offen fuer marktgerechte Strukturen, die fuer beide Seiten attraktiv sind.',
answer_de: 'Die genaue Bewertung und das Instrument besprechen wir gerne im persönlichen Gespräch. Wir sind offen für marktgerechte Strukturen, die für beide Seiten attraktiv sind.',
answer_en: 'We are happy to discuss the exact valuation and instrument in a personal meeting. We are open to market-standard structures that are attractive for both sides.',
goto_slide: 'the-ask',
priority: 7,
@@ -229,7 +229,7 @@ export const PRESENTER_FAQ: FAQEntry[] = [
keywords: ['cra', 'cyber resilience', 'cyber resilience act', 'firmware', 'produktsicherheit', 'product security'],
question_de: 'Was ist der Cyber Resilience Act?',
question_en: 'What is the Cyber Resilience Act?',
answer_de: 'Der CRA verpflichtet Hersteller, Software in ihren Produkten abzusichern — ueber den gesamten Lebenszyklus. Fuer Maschinenbauer mit Firmware und embedded Software bedeutet das: Vulnerability Management, SBOM, Incident Reporting. Genau das automatisiert BreakPilot.',
answer_de: 'Der CRA verpflichtet Hersteller, Software in ihren Produkten abzusichern — über den gesamten Lebenszyklus. Für Maschinenbauer mit Firmware und embedded Software bedeutet das: Vulnerability Management, SBOM, Incident Reporting. Genau das automatisiert BreakPilot.',
answer_en: 'The CRA obligates manufacturers to secure software in their products — throughout the entire lifecycle. For machine manufacturers with firmware and embedded software this means: vulnerability management, SBOM, incident reporting. That is exactly what BreakPilot automates.',
goto_slide: 'annex-regulatory',
priority: 7,
@@ -237,9 +237,9 @@ export const PRESENTER_FAQ: FAQEntry[] = [
{
id: 'reg-nis2',
keywords: ['nis2', 'nis 2', 'cybersecurity', 'kritische infrastruktur', 'critical infrastructure'],
question_de: 'Was bedeutet NIS2 fuer Maschinenbauer?',
question_de: 'Was bedeutet NIS2 für Maschinenbauer?',
question_en: 'What does NIS2 mean for machine manufacturers?',
answer_de: 'NIS2 erweitert die Cybersecurity-Pflichten auf den Maschinenbau. Unternehmen muessen Risikomanagement, Incident Response und Supply-Chain-Security implementieren. BreakPilot bietet Module fuer alle drei Bereiche.',
answer_de: 'NIS2 erweitert die Cybersecurity-Pflichten auf den Maschinenbau. Unternehmen müssen Risikomanagement, Incident Response und Supply-Chain-Security implementieren. BreakPilot bietet Module für alle drei Bereiche.',
answer_en: 'NIS2 extends cybersecurity obligations to machine manufacturing. Companies must implement risk management, incident response and supply chain security. BreakPilot offers modules for all three areas.',
goto_slide: 'annex-regulatory',
priority: 6,
@@ -251,7 +251,7 @@ export const PRESENTER_FAQ: FAQEntry[] = [
keywords: ['gtm', 'go-to-market', 'go to market', 'vertrieb', 'sales', 'strategie', 'strategy', 'akquise', 'acquisition'],
question_de: 'Wie gewinnt ihr Kunden?',
question_en: 'How do you acquire customers?',
answer_de: 'Drei Kanaele: 1) VDMA-Netzwerk — direkter Zugang zu 3.600+ Maschinenbauern. 2) Partnerschaften mit Systemhaeusern und IT-Dienstleistern. 3) Content Marketing ueber Compliance-Webinare und CRA-Awareness. Start mit 5 Pilotkunden, dann skalieren.',
answer_de: 'Drei Kanäle: 1) VDMA-Netzwerk — direkter Zugang zu 3.600+ Maschinenbauern. 2) Partnerschaften mit Systemhäusern und IT-Dienstleistern. 3) Content Marketing über Compliance-Webinare und CRA-Awareness. Start mit 5 Pilotkunden, dann skalieren.',
answer_en: 'Three channels: 1) VDMA network — direct access to 3,600+ machine manufacturers. 2) Partnerships with system integrators and IT service providers. 3) Content marketing through compliance webinars and CRA awareness. Start with 5 pilot customers, then scale.',
goto_slide: 'annex-gtm',
priority: 7,
@@ -273,7 +273,7 @@ export const PRESENTER_FAQ: FAQEntry[] = [
keywords: ['pentesting', 'penetrationstest', 'penetration test', 'security testing', 'pentests'],
question_de: 'Plant ihr auch Pentesting-Services?',
question_en: 'Do you plan pentesting services?',
answer_de: 'Ja, Pentesting ist eine natuerliche Erweiterung. Unsere Code-Security-Tools identifizieren bereits Schwachstellen — der naechste Schritt ist automatisiertes Pentesting. Der Pentesting-Markt konvergiert mit Compliance — wir sind an der Schnittstelle positioniert.',
answer_de: 'Ja, Pentesting ist eine natürliche Erweiterung. Unsere Code-Security-Tools identifizieren bereits Schwachstellen — der nächste Schritt ist automatisiertes Pentesting. Der Pentesting-Markt konvergiert mit Compliance — wir sind an der Schnittstelle positioniert.',
answer_en: 'Yes, pentesting is a natural extension. Our code security tools already identify vulnerabilities — the next step is automated pentesting. The pentesting market converges with compliance — we are positioned at the intersection.',
priority: 6,
},
@@ -284,7 +284,7 @@ export const PRESENTER_FAQ: FAQEntry[] = [
keywords: ['demo', 'test', 'testen', 'try', 'ausprobieren', 'live', 'showcase'],
question_de: 'Kann ich eine Demo sehen?',
question_en: 'Can I see a demo?',
answer_de: 'Sehr gerne! Wir zeigen Ihnen die Plattform live — inklusive Code-Scanning, Compliance-Module und KI-Analyse. Kontaktieren Sie uns fuer einen Termin.',
answer_de: 'Sehr gerne! Wir zeigen Ihnen die Plattform live — inklusive Code-Scanning, Compliance-Module und KI-Analyse. Kontaktieren Sie uns für einen Termin.',
answer_en: 'Absolutely! We will show you the platform live — including code scanning, compliance modules and AI analysis. Contact us for an appointment.',
priority: 6,
},
@@ -293,7 +293,7 @@ export const PRESENTER_FAQ: FAQEntry[] = [
keywords: ['kontakt', 'contact', 'email', 'mail', 'erreichen', 'reach', 'termin', 'meeting', 'appointment'],
question_de: 'Wie kann ich euch kontaktieren?',
question_en: 'How can I contact you?',
answer_de: 'Schreiben Sie uns eine E-Mail oder vereinbaren Sie direkt einen Termin ueber unsere Website. Wir freuen uns auf das Gespraech!',
answer_de: 'Schreiben Sie uns eine E-Mail oder vereinbaren Sie direkt einen Termin über unsere Website. Wir freuen uns auf das Gespräch!',
answer_en: 'Send us an email or schedule a meeting directly through our website. We look forward to the conversation!',
priority: 5,
},

View File

@@ -7,17 +7,17 @@ export const PRESENTER_SCRIPT: SlideScript[] = [
duration: 45,
paragraphs: [
{
text_de: 'Willkommen bei BreakPilot ComplAI — Compliance und Code-Security fuer den Maschinenbau.',
text_de: 'Willkommen bei BreakPilot ComplAI — Compliance und Code-Security für den Maschinenbau.',
text_en: 'Welcome to BreakPilot ComplAI — compliance and code security for machine manufacturing.',
pause_after: 1500,
},
{
text_de: 'Ich bin Ihr KI-Praesentator und fuehre Sie durch unser Pitch Deck. Die Praesentation dauert etwa 15 Minuten.',
text_de: 'Ich bin Ihr KI-Präsentator und führe Sie durch unser Pitch Deck. Die Präsentation dauert etwa 15 Minuten.',
text_en: 'I am your AI presenter and will guide you through our pitch deck. The presentation takes about 15 minutes.',
pause_after: 1500,
},
{
text_de: 'Sie koennen jederzeit Fragen stellen — nutzen Sie einfach den Chat. Ich pausiere automatisch und antworte sofort.',
text_de: 'Sie können jederzeit Fragen stellen — nutzen Sie einfach den Chat. Ich pausiere automatisch und antworte sofort.',
text_en: 'You can ask questions at any time — just use the chat. I will pause automatically and respond immediately.',
pause_after: 1000,
},
@@ -37,7 +37,7 @@ export const PRESENTER_SCRIPT: SlideScript[] = [
pause_after: 1500,
},
],
transition_hint_de: 'Schauen wir uns zunaechst das Problem an.',
transition_hint_de: 'Schauen wir uns zunächst das Problem an.',
transition_hint_en: 'Let us first look at the problem.',
},
@@ -52,22 +52,22 @@ export const PRESENTER_SCRIPT: SlideScript[] = [
pause_after: 2000,
},
{
text_de: 'Erstens: DSGVO. 4,1 Milliarden Euro Bussgelder seit 2018. Maschinenbauer verarbeiten Kundendaten, Telemetrie und Wartungsprotokolle — oft ohne DSGVO-Prozesse.',
text_de: 'Erstens: DSGVO. 4,1 Milliarden Euro Bußgelder seit 2018. Maschinenbauer verarbeiten Kundendaten, Telemetrie und Wartungsprotokolle — oft ohne DSGVO-Prozesse.',
text_en: 'First: GDPR. EUR 4.1 billion in fines since 2018. Machine manufacturers process customer data, telemetry and maintenance logs — often without GDPR processes.',
pause_after: 2000,
},
{
text_de: 'Zweitens: Der AI Act. Ab August 2025 muessen Maschinen mit KI-Komponenten klassifiziert und dokumentiert werden.',
text_de: 'Zweitens: Der AI Act. Ab August 2025 müssen Maschinen mit KI-Komponenten klassifiziert und dokumentiert werden.',
text_en: 'Second: The AI Act. From August 2025, machines with AI components must be classified and documented.',
pause_after: 2000,
},
{
text_de: 'Drittens: CRA und NIS2. Der Cyber Resilience Act verpflichtet ueber 30.000 Hersteller, Software in ihren Produkten abzusichern. Das betrifft den gesamten Maschinenbau.',
text_de: 'Drittens: CRA und NIS2. Der Cyber Resilience Act verpflichtet über 30.000 Hersteller, Software in ihren Produkten abzusichern. Das betrifft den gesamten Maschinenbau.',
text_en: 'Third: CRA and NIS2. The Cyber Resilience Act obligates over 30,000 manufacturers to secure software in their products. This affects all of machine manufacturing.',
pause_after: 1500,
},
],
transition_hint_de: 'Und genau dafuer haben wir eine Loesung.',
transition_hint_de: 'Und genau dafür haben wir eine Lösung.',
transition_hint_en: 'And that is exactly what we have a solution for.',
},
@@ -77,22 +77,22 @@ export const PRESENTER_SCRIPT: SlideScript[] = [
duration: 75,
paragraphs: [
{
text_de: 'Unsere Loesung: ComplAI — Compliance und Code-Security auf Autopilot. Drei Saeulen machen uns einzigartig.',
text_de: 'Unsere Lösung: ComplAI — Compliance und Code-Security auf Autopilot. Drei Säulen machen uns einzigartig.',
text_en: 'Our solution: ComplAI — compliance and code security on autopilot. Three pillars make us unique.',
pause_after: 2000,
},
{
text_de: 'Erste Saeule: Self-Hosted Vorarbeit. Ein Mac Mini oder Mac Studio im Serverraum des Kunden scannt Code, analysiert Repositories und erstellt Compliance-Dokumente. Kein einziges Byte verlaesst das Unternehmen.',
text_de: 'Erste Säule: Self-Hosted Vorarbeit. Ein Mac Mini oder Mac Studio im Serverraum des Kunden scannt Code, analysiert Repositories und erstellt Compliance-Dokumente. Kein einziges Byte verlässt das Unternehmen.',
text_en: 'First pillar: Self-hosted preprocessing. A Mac Mini or Mac Studio in the customer server room scans code, analyzes repositories and creates compliance documents. Not a single byte leaves the company.',
pause_after: 2500,
},
{
text_de: 'Zweite Saeule: Code-Security und DevSecOps. Wir scannen Firmware und Software mit integrierten Tools wie Trivy, Semgrep und Gitleaks. Das 1000-Milliarden-Parameter Cloud-LLM implementiert Fixes und schreibt Risikoanalysen.',
text_de: 'Zweite Säule: Code-Security und DevSecOps. Wir scannen Firmware und Software mit integrierten Tools wie Trivy, Semgrep und Gitleaks. Das 1000-Milliarden-Parameter Cloud-LLM implementiert Fixes und schreibt Risikoanalysen.',
text_en: 'Second pillar: Code security and DevSecOps. We scan firmware and software with integrated tools like Trivy, Semgrep, and Gitleaks. The 1000-billion-parameter cloud LLM implements fixes and writes risk assessments.',
pause_after: 2500,
},
{
text_de: 'Dritte Saeule: Die Compliance-KI mit 57 Modulen. DSGVO, AI Act, CRA, NIS2, Hinweisgeberschutzgesetz — 19 Regularien, 2.274 indexierte Rechtstexte. Macht Ihr Unternehmen UND Ihre Produkte compliant.',
text_de: 'Dritte Säule: Die Compliance-KI mit 57 Modulen. DSGVO, AI Act, CRA, NIS2, Hinweisgeberschutzgesetz — 19 Regularien, 2.274 indexierte Rechtstexte. Macht Ihr Unternehmen UND Ihre Produkte compliant.',
text_en: 'Third pillar: The compliance AI with 57 modules. GDPR, AI Act, CRA, NIS2, Whistleblower Protection Act — 19 regulations, 2,274 indexed legal texts. Makes your company AND your products compliant.',
pause_after: 1500,
},
@@ -107,22 +107,22 @@ export const PRESENTER_SCRIPT: SlideScript[] = [
duration: 60,
paragraphs: [
{
text_de: 'Wir bieten drei Produkt-Tiers fuer jede Unternehmensgroesse an.',
text_de: 'Wir bieten drei Produkt-Tiers für jede Unternehmensgröße an.',
text_en: 'We offer three product tiers for every company size.',
pause_after: 1500,
},
{
text_de: 'ComplAI Starter auf dem Mac Mini fuer 1.200 Euro pro Monat. Ein 32-Milliarden-Parameter Modell — perfekt fuer KMU, die DSGVO-Compliance automatisieren wollen.',
text_de: 'ComplAI Starter auf dem Mac Mini für 1.200 Euro pro Monat. Ein 32-Milliarden-Parameter Modell — perfekt für KMU, die DSGVO-Compliance automatisieren wollen.',
text_en: 'ComplAI Starter on Mac Mini for EUR 1,200 per month. A 32-billion-parameter model — perfect for SMEs looking to automate GDPR compliance.',
pause_after: 2000,
},
{
text_de: 'ComplAI Professional auf dem Mac Studio fuer 2.400 Euro pro Monat mit einem 40-Milliarden-Parameter Modell. Inklusive Code-Security-Scanning und erweiterte Risikoanalyse.',
text_de: 'ComplAI Professional auf dem Mac Studio für 2.400 Euro pro Monat mit einem 40-Milliarden-Parameter Modell. Inklusive Code-Security-Scanning und erweiterte Risikoanalyse.',
text_en: 'ComplAI Professional on Mac Studio for EUR 2,400 per month with a 40-billion-parameter model. Including code security scanning and extended risk assessment.',
pause_after: 2000,
},
{
text_de: 'Und ComplAI Enterprise — unser Flaggschiff. Self-Hosted plus BSI-zertifiziertes 1000-Milliarden-Parameter Cloud-LLM. Fuer Unternehmen, die maximale Compliance und Code-Security benoetigen.',
text_de: 'Und ComplAI Enterprise — unser Flaggschiff. Self-Hosted plus BSI-zertifiziertes 1000-Milliarden-Parameter Cloud-LLM. Für Unternehmen, die maximale Compliance und Code-Security benötigen.',
text_en: 'And ComplAI Enterprise — our flagship. Self-hosted plus BSI-certified 1000-billion-parameter cloud LLM. For companies needing maximum compliance and code security.',
pause_after: 1500,
},
@@ -142,22 +142,22 @@ export const PRESENTER_SCRIPT: SlideScript[] = [
pause_after: 1500,
},
{
text_de: 'Schritt 1: Hardware aufstellen. Mac Mini oder Mac Studio im Serverraum anschliessen — Plug and Play, scannt ab Tag 1.',
text_de: 'Schritt 1: Hardware aufstellen. Mac Mini oder Mac Studio im Serverraum anschließen — Plug and Play, scannt ab Tag 1.',
text_en: 'Step 1: Set up hardware. Connect Mac Mini or Mac Studio in the server room — plug and play, scans from day one.',
pause_after: 1500,
},
{
text_de: 'Schritt 2: Code-Repos verbinden. Git-Repos, CI/CD Pipelines und Firmware-Projekte anbinden.',
text_de: 'Schritt 2: Code-Repos verbinden. Git-Repos, CI/CD-Pipelines und Firmware-Projekte anbinden.',
text_en: 'Step 2: Connect code repos. Link Git repos, CI/CD pipelines and firmware projects.',
pause_after: 1500,
},
{
text_de: 'Schritt 3: Automatisierung. Laufende Code-Analyse und Risikoanalysen bei jeder Aenderung. Bei kritischen Fixes schaltet sich das Cloud-LLM zu.',
text_de: 'Schritt 3: Automatisierung. Laufende Code-Analyse und Risikoanalysen bei jeder Änderung. Bei kritischen Fixes schaltet sich das Cloud-LLM zu.',
text_en: 'Step 3: Automation. Continuous code analysis and risk assessments on every change. For critical fixes, the cloud LLM steps in.',
pause_after: 1500,
},
{
text_de: 'Schritt 4: Audit bestehen. Vollstaendige Dokumentation fuer DSGVO, AI Act, CRA und NIS2 auf Knopfdruck.',
text_de: 'Schritt 4: Audit bestehen. Vollständige Dokumentation für DSGVO, AI Act, CRA und NIS2 auf Knopfdruck.',
text_en: 'Step 4: Pass audits. Complete documentation for GDPR, AI Act, CRA and NIS2 at the push of a button.',
pause_after: 1000,
},
@@ -172,22 +172,22 @@ export const PRESENTER_SCRIPT: SlideScript[] = [
duration: 60,
paragraphs: [
{
text_de: 'Der Markt fuer Compliance und Code-Security im Maschinenbau ist enorm.',
text_de: 'Der Markt für Compliance und Code-Security im Maschinenbau ist enorm.',
text_en: 'The market for compliance and code security in machine manufacturing is enormous.',
pause_after: 1500,
},
{
text_de: 'Unser Total Addressable Market liegt bei 8,7 Milliarden Euro — der globale Markt fuer Regulatory Technology waechst mit 23 Prozent pro Jahr.',
text_de: 'Unser Total Addressable Market liegt bei 8,7 Milliarden Euro — der globale Markt für Regulatory Technology wächst mit 23 Prozent pro Jahr.',
text_en: 'Our Total Addressable Market is EUR 8.7 billion — the global regulatory technology market grows at 23 percent per year.',
pause_after: 2000,
},
{
text_de: 'Der Serviceable Addressable Market in DACH: 1,2 Milliarden Euro. Das sind ueber 5.000 Maschinenbauer mit eigener Softwareentwicklung.',
text_de: 'Der Serviceable Addressable Market in DACH: 1,2 Milliarden Euro. Das sind über 5.000 Maschinenbauer mit eigener Softwareentwicklung.',
text_en: 'The Serviceable Addressable Market in DACH: EUR 1.2 billion. That is over 5,000 machine manufacturers with in-house software development.',
pause_after: 2000,
},
{
text_de: 'Unser Serviceable Obtainable Market: 7,2 Millionen Euro. 500 DACH-Maschinenbauer mal 14.400 Euro pro Jahr. Das ist unser realistisches Ziel fuer die naechsten 5 Jahre.',
text_de: 'Unser Serviceable Obtainable Market: 7,2 Millionen Euro. 500 DACH-Maschinenbauer mal 14.400 Euro pro Jahr. Das ist unser realistisches Ziel für die nächsten 5 Jahre.',
text_en: 'Our Serviceable Obtainable Market: EUR 7.2 million. 500 DACH machine manufacturers times EUR 14,400 per year. That is our realistic target for the next 5 years.',
pause_after: 1500,
},
@@ -202,17 +202,17 @@ export const PRESENTER_SCRIPT: SlideScript[] = [
duration: 45,
paragraphs: [
{
text_de: 'Unser Geschaeftsmodell: Recurring Revenue mit Hardware-Moat.',
text_de: 'Unser Geschäftsmodell: Recurring Revenue mit Hardware-Moat.',
text_en: 'Our business model: Recurring revenue with hardware moat.',
pause_after: 1500,
},
{
text_de: 'Die Hardware-Appliance im Serverraum des Kunden schafft einen natuerlichen Lock-in. Monatliche Subscriptions von 1.200 bis 3.600 Euro garantieren planbare Einnahmen.',
text_de: 'Die Hardware-Appliance im Serverraum des Kunden schafft einen natürlichen Lock-in. Monatliche Subscriptions von 1.200 bis 3.600 Euro garantieren planbare Einnahmen.',
text_en: 'The hardware appliance in the customer server room creates a natural lock-in. Monthly subscriptions from EUR 1,200 to 3,600 ensure predictable revenue.',
pause_after: 2000,
},
{
text_de: 'Die Unit Economics sind ueberzeugend: Hardware-Kosten amortisieren sich in wenigen Monaten, und die Bruttomarge liegt bei ueber 70 Prozent.',
text_de: 'Die Unit Economics sind überzeugend: Hardware-Kosten amortisieren sich in wenigen Monaten, und die Bruttomarge liegt bei über 70 Prozent.',
text_en: 'The unit economics are compelling: hardware costs amortize in a few months, and gross margin exceeds 70 percent.',
pause_after: 1500,
},
@@ -237,7 +237,7 @@ export const PRESENTER_SCRIPT: SlideScript[] = [
pause_after: 2000,
},
{
text_de: 'Die komplette Plattform ist funktionsfaehig — wir sind bereit fuer die ersten zahlenden Kunden.',
text_de: 'Die komplette Plattform ist funktionsfähig — wir sind bereit für die ersten zahlenden Kunden.',
text_en: 'The complete platform is functional — we are ready for our first paying customers.',
pause_after: 1500,
},
@@ -282,12 +282,12 @@ export const PRESENTER_SCRIPT: SlideScript[] = [
duration: 30,
paragraphs: [
{
text_de: 'Unser Gruenderteam vereint tiefe Domain-Expertise in Compliance, Software-Architektur und KI.',
text_de: 'Unser Gründerteam vereint tiefe Domain-Expertise in Compliance, Software-Architektur und KI.',
text_en: 'Our founding team combines deep domain expertise in compliance, software architecture and AI.',
pause_after: 2000,
},
{
text_de: 'Wir kennen die Schmerzen der Branche aus erster Hand und haben die technische Kompetenz, sie zu loesen.',
text_de: 'Wir kennen die Schmerzen der Branche aus erster Hand und haben die technische Kompetenz, sie zu lösen.',
text_en: 'We know the pain points of the industry firsthand and have the technical competence to solve them.',
pause_after: 1500,
},
@@ -302,12 +302,12 @@ export const PRESENTER_SCRIPT: SlideScript[] = [
duration: 45,
paragraphs: [
{
text_de: 'Unsere Finanzprognose basiert auf einer AI-First Kostenstruktur — das heisst: 10x Kunden bedeutet nicht 10x Personal.',
text_de: 'Unsere Finanzprognose basiert auf einer AI-First Kostenstruktur — das heißt: 10x Kunden bedeutet nicht 10x Personal.',
text_en: 'Our financial projection is based on an AI-first cost structure — meaning: 10x customers does not mean 10x headcount.',
pause_after: 2000,
},
{
text_de: 'Von 36.000 Euro Umsatz in 2026 auf 8,4 Millionen Euro in 2030. Das Team waechst dabei nur von 2 auf 18 Personen. 380 Kunden bei 5,5 Millionen Euro ARR.',
text_de: 'Von 36.000 Euro Umsatz in 2026 auf 8,4 Millionen Euro in 2030. Das Team wächst dabei nur von 2 auf 18 Personen. 380 Kunden bei 5,5 Millionen Euro ARR.',
text_en: 'From EUR 36,000 revenue in 2026 to EUR 8.4 million in 2030. The team grows from just 2 to 18 people. 380 customers at EUR 5.5 million ARR.',
pause_after: 2000,
},
@@ -327,12 +327,12 @@ export const PRESENTER_SCRIPT: SlideScript[] = [
duration: 45,
paragraphs: [
{
text_de: 'Wir suchen eine Pre-Seed Finanzierung fuer den Go-to-Market.',
text_de: 'Wir suchen eine Pre-Seed Finanzierung für den Go-to-Market.',
text_en: 'We are seeking pre-seed funding for go-to-market.',
pause_after: 1500,
},
{
text_de: 'Das Investment fliesst in vier Bereiche: Engineering fuer die Produktreife, Vertrieb fuer die ersten Pilotkunden, Hardware-Bestand fuer schnelle Auslieferung, und eine Reserve fuer regulatorische Anforderungen.',
text_de: 'Das Investment fließt in vier Bereiche: Engineering für die Produktreife, Vertrieb für die ersten Pilotkunden, Hardware-Bestand für schnelle Auslieferung, und eine Reserve für regulatorische Anforderungen.',
text_en: 'The investment flows into four areas: Engineering for product maturity, sales for first pilot customers, hardware inventory for fast delivery, and a reserve for regulatory requirements.',
pause_after: 2500,
},
@@ -352,7 +352,7 @@ export const PRESENTER_SCRIPT: SlideScript[] = [
duration: 30,
paragraphs: [
{
text_de: 'Auf dieser Slide koennen Sie direkt mit unserem KI-Agent interagieren. Stellen Sie Ihre Investorenfragen — der Agent antwortet mit Echtdaten aus unserer Datenbank.',
text_de: 'Auf dieser Slide können Sie direkt mit unserem KI-Agent interagieren. Stellen Sie Ihre Investorenfragen — der Agent antwortet mit Echtdaten aus unserer Datenbank.',
text_en: 'On this slide you can interact directly with our AI agent. Ask your investor questions — the agent responds with real data from our database.',
pause_after: 2000,
},
@@ -372,7 +372,7 @@ export const PRESENTER_SCRIPT: SlideScript[] = [
duration: 35,
paragraphs: [
{
text_de: 'Im Anhang: Unsere Annahmen und Sensitivitaetsanalyse. Drei Szenarien — konservativ, base case und optimistisch — fuer robuste Planung.',
text_de: 'Im Anhang: Unsere Annahmen und Sensitivitätsanalyse. Drei Szenarien — konservativ, base case und optimistisch — für robuste Planung.',
text_en: 'In the appendix: Our assumptions and sensitivity analysis. Three scenarios — conservative, base case and optimistic — for robust planning.',
pause_after: 2000,
},
@@ -390,7 +390,7 @@ export const PRESENTER_SCRIPT: SlideScript[] = [
duration: 35,
paragraphs: [
{
text_de: 'Die technische Architektur: Self-Hosted KI-Stack fuer maximale Datensouveraenitaet. Alle Daten bleiben on-premise, nur anonymisierte Anfragen gehen an die BSI-zertifizierte Cloud.',
text_de: 'Die technische Architektur: Self-Hosted KI-Stack für maximale Datensouveränität. Alle Daten bleiben on-premise, nur anonymisierte Anfragen gehen an die BSI-zertifizierte Cloud.',
text_en: 'The technical architecture: Self-hosted AI stack for maximum data sovereignty. All data stays on-premise, only anonymized queries go to the BSI-certified cloud.',
pause_after: 2000,
},
@@ -403,7 +403,7 @@ export const PRESENTER_SCRIPT: SlideScript[] = [
duration: 35,
paragraphs: [
{
text_de: 'Unsere Go-to-Market Strategie: Vom Pilotprojekt zum skalierbaren Vertrieb. Wir starten mit VDMA-Mitgliedern und skalieren ueber Partnerschaften mit Systemhaeusern.',
text_de: 'Unsere Go-to-Market Strategie: Vom Pilotprojekt zum skalierbaren Vertrieb. Wir starten mit VDMA-Mitgliedern und skalieren über Partnerschaften mit Systemhäusern.',
text_en: 'Our go-to-market strategy: From pilot project to scalable sales. We start with VDMA members and scale through partnerships with system integrators.',
pause_after: 2000,
},
@@ -416,7 +416,7 @@ export const PRESENTER_SCRIPT: SlideScript[] = [
duration: 35,
paragraphs: [
{
text_de: 'Die vier Saeulen der EU-Compliance fuer Maschinenbauer: DSGVO, AI Act, Cyber Resilience Act und NIS2. Alle vier Regularien zusammen erzeugen einen massiven Compliance-Druck — und genau hier setzen wir an.',
text_de: 'Die vier Säulen der EU-Compliance für Maschinenbauer: DSGVO, AI Act, Cyber Resilience Act und NIS2. Alle vier Regularien zusammen erzeugen einen massiven Compliance-Druck — und genau hier setzen wir an.',
text_en: 'The four pillars of EU compliance for machine manufacturers: GDPR, AI Act, Cyber Resilience Act and NIS2. All four regulations together create massive compliance pressure — and that is exactly where we come in.',
pause_after: 2000,
},
@@ -442,7 +442,7 @@ export const PRESENTER_SCRIPT: SlideScript[] = [
duration: 35,
paragraphs: [
{
text_de: 'Die KI-Pipeline im Detail: RAG, Multi-Agent-System, Document Intelligence und Quality Assurance. Vielen Dank fuer Ihre Aufmerksamkeit — ich stehe fuer weitere Fragen bereit.',
text_de: 'Die KI-Pipeline im Detail: RAG, Multi-Agent-System, Document Intelligence und Quality Assurance. Vielen Dank für Ihre Aufmerksamkeit — ich stehe für weitere Fragen bereit.',
text_en: 'The AI pipeline in detail: RAG, multi-agent system, document intelligence and quality assurance. Thank you for your attention — I am available for further questions.',
pause_after: 2000,
},