feat: Add staged funding model, financial compute engine, annex slides and UI enhancements
Some checks failed
ci/woodpecker/push/integration Pipeline failed
ci/woodpecker/push/main Pipeline failed
CI/CD Pipeline / Go Tests (push) Has been cancelled
CI/CD Pipeline / Python Tests (push) Has been cancelled
CI/CD Pipeline / Website Tests (push) Has been cancelled
CI/CD Pipeline / Linting (push) Has been cancelled
CI/CD Pipeline / Security Scan (push) Has been cancelled
CI/CD Pipeline / Docker Build & Push (push) Has been cancelled
CI/CD Pipeline / Integration Tests (push) Has been cancelled
Security Scanning / Dependency Vulnerability Scan (push) Has been cancelled
Security Scanning / Go Security Scan (push) Has been cancelled
Security Scanning / Python Security Scan (push) Has been cancelled
Security Scanning / Node.js Security Scan (push) Has been cancelled
Security Scanning / Docker Image Security (push) Has been cancelled
Security Scanning / Security Summary (push) Has been cancelled
Tests / All Checks Passed (push) Has been cancelled
Tests / Go Tests (push) Has been cancelled
Tests / Python Tests (push) Has been cancelled
CI/CD Pipeline / Deploy to Staging (push) Has been cancelled
CI/CD Pipeline / Deploy to Production (push) Has been cancelled
CI/CD Pipeline / CI Summary (push) Has been cancelled
Security Scanning / Secret Scanning (push) Has been cancelled
Tests / Integration Tests (push) Has been cancelled
Tests / Go Lint (push) Has been cancelled
Tests / Python Lint (push) Has been cancelled
Tests / Security Scan (push) Has been cancelled
Some checks failed
ci/woodpecker/push/integration Pipeline failed
ci/woodpecker/push/main Pipeline failed
CI/CD Pipeline / Go Tests (push) Has been cancelled
CI/CD Pipeline / Python Tests (push) Has been cancelled
CI/CD Pipeline / Website Tests (push) Has been cancelled
CI/CD Pipeline / Linting (push) Has been cancelled
CI/CD Pipeline / Security Scan (push) Has been cancelled
CI/CD Pipeline / Docker Build & Push (push) Has been cancelled
CI/CD Pipeline / Integration Tests (push) Has been cancelled
Security Scanning / Dependency Vulnerability Scan (push) Has been cancelled
Security Scanning / Go Security Scan (push) Has been cancelled
Security Scanning / Python Security Scan (push) Has been cancelled
Security Scanning / Node.js Security Scan (push) Has been cancelled
Security Scanning / Docker Image Security (push) Has been cancelled
Security Scanning / Security Summary (push) Has been cancelled
Tests / All Checks Passed (push) Has been cancelled
Tests / Go Tests (push) Has been cancelled
Tests / Python Tests (push) Has been cancelled
CI/CD Pipeline / Deploy to Staging (push) Has been cancelled
CI/CD Pipeline / Deploy to Production (push) Has been cancelled
CI/CD Pipeline / CI Summary (push) Has been cancelled
Security Scanning / Secret Scanning (push) Has been cancelled
Tests / Integration Tests (push) Has been cancelled
Tests / Go Lint (push) Has been cancelled
Tests / Python Lint (push) Has been cancelled
Tests / Security Scan (push) Has been cancelled
Restructure financial plan from single 200k SAFE to realistic staged funding (25k Stammkapital, 25k Angel, 200k Wandeldarlehen, 1M Series A = 1.25M total). Add 60-month compute engine with CAPEX/OPEX accounting, cash constraints, hardware financing (30% upfront / 70% leasing), and revenue-based hiring caps. Rebuild TheAskSlide with 4-event funding timeline, update i18n (DE/EN), chat agent core messages, and add 15 new annex/technology slides with supporting UI components (KPICard, RunwayGauge, WaterfallChart, etc.). Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
109
pitch-deck/lib/hooks/useFinancialModel.ts
Normal file
109
pitch-deck/lib/hooks/useFinancialModel.ts
Normal file
@@ -0,0 +1,109 @@
|
||||
'use client'
|
||||
|
||||
import { useState, useEffect, useCallback, useRef } from 'react'
|
||||
import { FMScenario, FMResult, FMComputeResponse } from '../types'
|
||||
|
||||
export function useFinancialModel() {
|
||||
const [scenarios, setScenarios] = useState<FMScenario[]>([])
|
||||
const [activeScenarioId, setActiveScenarioId] = useState<string | null>(null)
|
||||
const [compareMode, setCompareMode] = useState(false)
|
||||
const [results, setResults] = useState<Map<string, FMComputeResponse>>(new Map())
|
||||
const [loading, setLoading] = useState(true)
|
||||
const [computing, setComputing] = useState(false)
|
||||
const computeTimer = useRef<NodeJS.Timeout | null>(null)
|
||||
|
||||
// Load scenarios on mount
|
||||
useEffect(() => {
|
||||
async function load() {
|
||||
try {
|
||||
const res = await fetch('/api/financial-model')
|
||||
if (res.ok) {
|
||||
const data: FMScenario[] = await res.json()
|
||||
setScenarios(data)
|
||||
const defaultScenario = data.find(s => s.is_default) || data[0]
|
||||
if (defaultScenario) {
|
||||
setActiveScenarioId(defaultScenario.id)
|
||||
}
|
||||
}
|
||||
} catch (err) {
|
||||
console.error('Failed to load financial model:', err)
|
||||
} finally {
|
||||
setLoading(false)
|
||||
}
|
||||
}
|
||||
load()
|
||||
}, [])
|
||||
|
||||
// Compute when active scenario changes
|
||||
useEffect(() => {
|
||||
if (activeScenarioId && !results.has(activeScenarioId)) {
|
||||
compute(activeScenarioId)
|
||||
}
|
||||
}, [activeScenarioId]) // eslint-disable-line react-hooks/exhaustive-deps
|
||||
|
||||
const compute = useCallback(async (scenarioId: string) => {
|
||||
setComputing(true)
|
||||
try {
|
||||
const res = await fetch('/api/financial-model/compute', {
|
||||
method: 'POST',
|
||||
headers: { 'Content-Type': 'application/json' },
|
||||
body: JSON.stringify({ scenarioId }),
|
||||
})
|
||||
if (res.ok) {
|
||||
const data: FMComputeResponse = await res.json()
|
||||
setResults(prev => new Map(prev).set(scenarioId, data))
|
||||
}
|
||||
} catch (err) {
|
||||
console.error('Compute failed:', err)
|
||||
} finally {
|
||||
setComputing(false)
|
||||
}
|
||||
}, [])
|
||||
|
||||
const updateAssumption = useCallback(async (scenarioId: string, key: string, value: number | number[]) => {
|
||||
// Optimistic update in local state
|
||||
setScenarios(prev => prev.map(s => {
|
||||
if (s.id !== scenarioId) return s
|
||||
return {
|
||||
...s,
|
||||
assumptions: s.assumptions.map(a => a.key === key ? { ...a, value } : a),
|
||||
}
|
||||
}))
|
||||
|
||||
// Save to DB
|
||||
await fetch('/api/financial-model/assumptions', {
|
||||
method: 'PUT',
|
||||
headers: { 'Content-Type': 'application/json' },
|
||||
body: JSON.stringify({ scenarioId, key, value }),
|
||||
})
|
||||
|
||||
// Debounced recompute
|
||||
if (computeTimer.current) clearTimeout(computeTimer.current)
|
||||
computeTimer.current = setTimeout(() => compute(scenarioId), 300)
|
||||
}, [compute])
|
||||
|
||||
const computeAll = useCallback(async () => {
|
||||
for (const s of scenarios) {
|
||||
await compute(s.id)
|
||||
}
|
||||
}, [scenarios, compute])
|
||||
|
||||
const activeScenario = scenarios.find(s => s.id === activeScenarioId) || null
|
||||
const activeResults = activeScenarioId ? results.get(activeScenarioId) || null : null
|
||||
|
||||
return {
|
||||
scenarios,
|
||||
activeScenario,
|
||||
activeScenarioId,
|
||||
setActiveScenarioId,
|
||||
activeResults,
|
||||
results,
|
||||
loading,
|
||||
computing,
|
||||
compareMode,
|
||||
setCompareMode,
|
||||
compute,
|
||||
computeAll,
|
||||
updateAssumption,
|
||||
}
|
||||
}
|
||||
@@ -14,9 +14,24 @@ const SLIDE_ORDER: SlideId[] = [
|
||||
'traction',
|
||||
'competition',
|
||||
'team',
|
||||
'technology',
|
||||
'financials',
|
||||
'the-ask',
|
||||
'ai-qa',
|
||||
'appendix',
|
||||
'annex-infra',
|
||||
'annex-ai-stack',
|
||||
'annex-rag',
|
||||
'annex-security',
|
||||
'annex-devops',
|
||||
'annex-agent-arch',
|
||||
'annex-agent-rag',
|
||||
'annex-agent-workflow',
|
||||
'annex-usp-overview',
|
||||
'annex-usp-comparison',
|
||||
'annex-usp-moat',
|
||||
'annex-roadmap-2027',
|
||||
'annex-roadmap-2028',
|
||||
]
|
||||
|
||||
export const TOTAL_SLIDES = SLIDE_ORDER.length
|
||||
|
||||
@@ -18,13 +18,28 @@ const translations = {
|
||||
'Traction',
|
||||
'Wettbewerb',
|
||||
'Team',
|
||||
'Technologie',
|
||||
'Finanzen',
|
||||
'The Ask',
|
||||
'KI Q&A',
|
||||
'Appendix',
|
||||
'Infrastruktur',
|
||||
'KI-Stack',
|
||||
'RAG Pipeline',
|
||||
'Sicherheit',
|
||||
'DevOps & CI/CD',
|
||||
'Agent Architektur',
|
||||
'Rechtsdokumente',
|
||||
'Compliance Workflow',
|
||||
'5 USPs',
|
||||
'Wettbewerbsvergleich',
|
||||
'Marktposition',
|
||||
'Roadmap 2027',
|
||||
'Roadmap 2028',
|
||||
],
|
||||
cover: {
|
||||
tagline: 'Datensouveraenitaet meets KI-Compliance',
|
||||
subtitle: 'Pre-Seed · Q4 2026',
|
||||
subtitle: 'Seed · 2026-2027',
|
||||
cta: 'Pitch starten',
|
||||
},
|
||||
problem: {
|
||||
@@ -148,6 +163,46 @@ const translations = {
|
||||
equity: 'Equity',
|
||||
expertise: 'Expertise',
|
||||
},
|
||||
technology: {
|
||||
title: 'Technologie-Roadmap',
|
||||
subtitle: 'Von MVP zu Full Autonomy — 5-Jahres-Technologieplan',
|
||||
timelineTitle: 'Meilensteine 2026-2030',
|
||||
stackTitle: 'Tech-Stack',
|
||||
phases: [
|
||||
{
|
||||
year: '2026',
|
||||
phase: 'Foundation & MVP',
|
||||
techs: ['Self-Hosted LLM (32B)', 'Apple M2 Mini', 'Basic Compliance SDK', 'OCR Pipeline'],
|
||||
},
|
||||
{
|
||||
year: '2027',
|
||||
phase: 'Product-Market Fit',
|
||||
techs: ['Multi-Model Router', 'RAG 2.0 mit Qdrant', 'Auto Compliance-Scan', 'Echtzeit-Monitoring'],
|
||||
},
|
||||
{
|
||||
year: '2028',
|
||||
phase: 'Enterprise Scale',
|
||||
techs: ['Federated Learning', 'Cluster-Management', 'API Marketplace', 'Multi-Tenant'],
|
||||
},
|
||||
{
|
||||
year: '2029',
|
||||
phase: 'AI Platform',
|
||||
techs: ['Custom Fine-Tuned (40B+)', 'Predictive Compliance', 'Auto-Audits', 'Partner-Integrationen'],
|
||||
},
|
||||
{
|
||||
year: '2030',
|
||||
phase: 'Full Autonomy',
|
||||
techs: ['Agent-Netzwerk', 'Self-Healing', 'Zero-Day Compliance', '1000B Parameter'],
|
||||
},
|
||||
],
|
||||
layers: [
|
||||
{ name: 'Application', techs: 'Next.js, React, TailwindCSS, REST/GraphQL API' },
|
||||
{ name: 'AI/ML', techs: 'Qwen 32B → 1000B, RAG Pipeline, NLP, OCR (PaddleOCR)' },
|
||||
{ name: 'Infrastructure', techs: 'Apple Silicon (M2/M4 Pro), Docker, Self-Hosted' },
|
||||
{ name: 'Security', techs: 'BSI-TR-03161, E2E Verschluesselung, Vault' },
|
||||
{ name: 'Data', techs: 'PostgreSQL + PostGIS, Qdrant (Vektoren), MinIO (S3)' },
|
||||
],
|
||||
},
|
||||
financials: {
|
||||
title: 'Finanzprognose',
|
||||
subtitle: 'AI-First Kostenstruktur — skaliert ohne lineares Personalwachstum',
|
||||
@@ -166,16 +221,17 @@ const translations = {
|
||||
},
|
||||
theAsk: {
|
||||
title: 'The Ask',
|
||||
subtitle: 'Pre-Seed Finanzierung',
|
||||
subtitle: 'Gestaffelte Finanzierung 2026-2027',
|
||||
amount: 'Funding',
|
||||
instrument: 'Instrument',
|
||||
useOfFunds: 'Use of Funds',
|
||||
engineering: 'Engineering',
|
||||
sales: 'Vertrieb',
|
||||
hardware: 'Hardware',
|
||||
personnel: 'Personal',
|
||||
legal: 'Legal',
|
||||
reserve: 'Reserve',
|
||||
targetDate: 'Zieldatum',
|
||||
targetDate: 'Zeitraum',
|
||||
},
|
||||
aiqa: {
|
||||
title: 'Fragen? Die KI antwortet.',
|
||||
@@ -208,13 +264,28 @@ const translations = {
|
||||
'Traction',
|
||||
'Competition',
|
||||
'Team',
|
||||
'Technology',
|
||||
'Financials',
|
||||
'The Ask',
|
||||
'AI Q&A',
|
||||
'Appendix',
|
||||
'Infrastructure',
|
||||
'AI Stack',
|
||||
'RAG Pipeline',
|
||||
'Security',
|
||||
'DevOps & CI/CD',
|
||||
'Agent Architecture',
|
||||
'Legal Documents',
|
||||
'Compliance Workflow',
|
||||
'5 USPs',
|
||||
'Competitor Comparison',
|
||||
'Market Position',
|
||||
'Roadmap 2027',
|
||||
'Roadmap 2028',
|
||||
],
|
||||
cover: {
|
||||
tagline: 'Data Sovereignty meets AI Compliance',
|
||||
subtitle: 'Pre-Seed · Q4 2026',
|
||||
subtitle: 'Seed · 2026-2027',
|
||||
cta: 'Start Pitch',
|
||||
},
|
||||
problem: {
|
||||
@@ -338,6 +409,46 @@ const translations = {
|
||||
equity: 'Equity',
|
||||
expertise: 'Expertise',
|
||||
},
|
||||
technology: {
|
||||
title: 'Technology Roadmap',
|
||||
subtitle: 'From MVP to Full Autonomy — 5-Year Technology Plan',
|
||||
timelineTitle: 'Milestones 2026-2030',
|
||||
stackTitle: 'Tech Stack',
|
||||
phases: [
|
||||
{
|
||||
year: '2026',
|
||||
phase: 'Foundation & MVP',
|
||||
techs: ['Self-Hosted LLM (32B)', 'Apple M2 Mini', 'Basic Compliance SDK', 'OCR Pipeline'],
|
||||
},
|
||||
{
|
||||
year: '2027',
|
||||
phase: 'Product-Market Fit',
|
||||
techs: ['Multi-Model Router', 'RAG 2.0 with Qdrant', 'Auto Compliance Scan', 'Real-time Monitoring'],
|
||||
},
|
||||
{
|
||||
year: '2028',
|
||||
phase: 'Enterprise Scale',
|
||||
techs: ['Federated Learning', 'Cluster Management', 'API Marketplace', 'Multi-Tenant'],
|
||||
},
|
||||
{
|
||||
year: '2029',
|
||||
phase: 'AI Platform',
|
||||
techs: ['Custom Fine-Tuned (40B+)', 'Predictive Compliance', 'Auto-Audits', 'Partner Integrations'],
|
||||
},
|
||||
{
|
||||
year: '2030',
|
||||
phase: 'Full Autonomy',
|
||||
techs: ['Agent Network', 'Self-Healing', 'Zero-Day Compliance', '1000B Parameters'],
|
||||
},
|
||||
],
|
||||
layers: [
|
||||
{ name: 'Application', techs: 'Next.js, React, TailwindCSS, REST/GraphQL API' },
|
||||
{ name: 'AI/ML', techs: 'Qwen 32B → 1000B, RAG Pipeline, NLP, OCR (PaddleOCR)' },
|
||||
{ name: 'Infrastructure', techs: 'Apple Silicon (M2/M4 Pro), Docker, Self-Hosted' },
|
||||
{ name: 'Security', techs: 'BSI-TR-03161, E2E Encryption, Vault' },
|
||||
{ name: 'Data', techs: 'PostgreSQL + PostGIS, Qdrant (Vectors), MinIO (S3)' },
|
||||
],
|
||||
},
|
||||
financials: {
|
||||
title: 'Financial Projections',
|
||||
subtitle: 'AI-First cost structure — scales without linear headcount growth',
|
||||
@@ -356,16 +467,17 @@ const translations = {
|
||||
},
|
||||
theAsk: {
|
||||
title: 'The Ask',
|
||||
subtitle: 'Pre-Seed Funding',
|
||||
subtitle: 'Staged Funding 2026-2027',
|
||||
amount: 'Funding',
|
||||
instrument: 'Instrument',
|
||||
useOfFunds: 'Use of Funds',
|
||||
engineering: 'Engineering',
|
||||
sales: 'Sales',
|
||||
hardware: 'Hardware',
|
||||
personnel: 'Personnel',
|
||||
legal: 'Legal',
|
||||
reserve: 'Reserve',
|
||||
targetDate: 'Target Date',
|
||||
targetDate: 'Timeline',
|
||||
},
|
||||
aiqa: {
|
||||
title: 'Questions? The AI answers.',
|
||||
|
||||
@@ -127,6 +127,85 @@ export interface PitchData {
|
||||
products: PitchProduct[]
|
||||
}
|
||||
|
||||
// Financial Model Types
|
||||
export interface FMScenario {
|
||||
id: string
|
||||
name: string
|
||||
description: string
|
||||
is_default: boolean
|
||||
color: string
|
||||
assumptions: FMAssumption[]
|
||||
}
|
||||
|
||||
export interface FMAssumption {
|
||||
id: string
|
||||
scenario_id: string
|
||||
key: string
|
||||
label_de: string
|
||||
label_en: string
|
||||
value: number | number[]
|
||||
value_type: 'scalar' | 'step' | 'timeseries'
|
||||
unit: string
|
||||
min_value: number | null
|
||||
max_value: number | null
|
||||
step_size: number | null
|
||||
category: string
|
||||
sort_order: number
|
||||
}
|
||||
|
||||
export interface FMResult {
|
||||
month: number
|
||||
year: number
|
||||
month_in_year: number
|
||||
new_customers: number
|
||||
churned_customers: number
|
||||
total_customers: number
|
||||
mrr_eur: number
|
||||
arr_eur: number
|
||||
revenue_eur: number
|
||||
cogs_eur: number
|
||||
personnel_eur: number
|
||||
infra_eur: number
|
||||
marketing_eur: number
|
||||
total_costs_eur: number
|
||||
employees_count: number
|
||||
gross_margin_pct: number
|
||||
burn_rate_eur: number
|
||||
runway_months: number
|
||||
cac_eur: number
|
||||
ltv_eur: number
|
||||
ltv_cac_ratio: number
|
||||
cash_balance_eur: number
|
||||
cumulative_revenue_eur: number
|
||||
// Detail costs
|
||||
admin_costs_eur: number
|
||||
office_costs_eur: number
|
||||
founding_costs_eur: number
|
||||
ihk_eur: number
|
||||
depreciation_eur: number
|
||||
interest_expense_eur: number
|
||||
taxes_eur: number
|
||||
net_income_eur: number
|
||||
ebit_eur: number
|
||||
software_licenses_eur: number
|
||||
travel_costs_eur: number
|
||||
funding_eur: number
|
||||
}
|
||||
|
||||
export interface FMComputeResponse {
|
||||
scenario_id: string
|
||||
results: FMResult[]
|
||||
summary: {
|
||||
final_arr: number
|
||||
final_customers: number
|
||||
break_even_month: number | null
|
||||
final_runway: number
|
||||
final_ltv_cac: number
|
||||
peak_burn: number
|
||||
total_funding_needed: number
|
||||
}
|
||||
}
|
||||
|
||||
export type Language = 'de' | 'en'
|
||||
|
||||
export interface ChatMessage {
|
||||
@@ -145,6 +224,21 @@ export type SlideId =
|
||||
| 'traction'
|
||||
| 'competition'
|
||||
| 'team'
|
||||
| 'technology'
|
||||
| 'financials'
|
||||
| 'the-ask'
|
||||
| 'ai-qa'
|
||||
| 'appendix'
|
||||
| 'annex-infra'
|
||||
| 'annex-ai-stack'
|
||||
| 'annex-rag'
|
||||
| 'annex-security'
|
||||
| 'annex-devops'
|
||||
| 'annex-agent-arch'
|
||||
| 'annex-agent-rag'
|
||||
| 'annex-agent-workflow'
|
||||
| 'annex-usp-overview'
|
||||
| 'annex-usp-comparison'
|
||||
| 'annex-usp-moat'
|
||||
| 'annex-roadmap-2027'
|
||||
| 'annex-roadmap-2028'
|
||||
|
||||
Reference in New Issue
Block a user