feat(boc): Complete Business Operations Center v1.0

- Go backend API with full CRUD for all modules (CRM, Sales, Finance, HR, Legal, Marketing, Support, Purchase, Inventory, Projects, Automation, Analytics)
- Rust analytics service with parallel report generation
- C runtime with POSIX shared memory IPC
- PostgreSQL schema with 30+ tables, full migrations
- Redis cache, sessions, pub/sub
- Kafka event streaming with Zookeeper
- WebSocket hub for real-time updates
- Automation engine with cron jobs, workflows, event triggers
- JWT authentication, multi-tenant from start
- Docker Compose with all services
- Nginx reverse proxy with rate limiting
- Integration tests passing
- Feature gap analysis against Fortnox/Odoo/Visma

Refs: BOC-001
This commit is contained in:
Bernt
2026-07-12 12:41:35 +00:00
parent 4789a7fb48
commit 58ca4e68db
26666 changed files with 575891 additions and 2074516 deletions
+367
View File
@@ -0,0 +1,367 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>AAMOS — Infrastructure Intelligence APIs</title>
<meta name="description" content="API-first infrastructure intelligence. Visual monitoring, real-world alerts, identity verification, and enterprise modules — all developer-ready.">
<link rel="preconnect" href="https://fonts.googleapis.com">
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=swap" rel="stylesheet">
<style>
*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
:root {
--navy: #0A2540;
--blue: #635BFF;
--blue-light: #7B74FF;
--gray-50: #F8FAFC;
--gray-100: #F1F5F9;
--gray-200: #E2E8F0;
--gray-400: #94A3B8;
--gray-600: #475569;
--gray-800: #1E293B;
--white: #FFFFFF;
--font: 'Inter', system-ui, -apple-system, sans-serif;
}
body { font-family: var(--font); background: var(--white); color: var(--gray-800); line-height: 1.6; }
a { color: inherit; text-decoration: none; }
/* NAV */
nav {
position: sticky; top: 0; z-index: 100;
background: rgba(255,255,255,0.95);
backdrop-filter: blur(8px);
border-bottom: 1px solid var(--gray-200);
padding: 0 24px;
height: 60px;
display: flex; align-items: center; justify-content: space-between;
}
.nav-logo { font-size: 18px; font-weight: 700; color: var(--navy); letter-spacing: -0.5px; }
.nav-logo span { color: var(--blue); }
.nav-links { display: flex; align-items: center; gap: 8px; }
.nav-links a { font-size: 14px; font-weight: 500; color: var(--gray-600); padding: 8px 12px; border-radius: 8px; transition: background 0.15s; }
.nav-links a:hover { background: var(--gray-100); color: var(--gray-800); }
.btn-nav {
background: var(--navy); color: var(--white) !important;
padding: 8px 16px !important; border-radius: 8px; font-weight: 600;
font-size: 14px; transition: background 0.15s;
}
.btn-nav:hover { background: var(--blue) !important; }
@media(max-width:600px) { .nav-links a:not(.btn-nav) { display: none; } }
/* HERO */
.hero {
background: linear-gradient(135deg, var(--navy) 0%, #1a3a60 100%);
color: var(--white);
padding: 80px 24px 72px;
text-align: center;
}
.hero-badge {
display: inline-block;
background: rgba(99,91,255,0.25);
color: #a5b4fc;
border: 1px solid rgba(99,91,255,0.4);
border-radius: 100px;
padding: 4px 14px;
font-size: 12px;
font-weight: 600;
letter-spacing: 0.05em;
text-transform: uppercase;
margin-bottom: 24px;
}
.hero h1 {
font-size: clamp(32px, 6vw, 52px);
font-weight: 700;
letter-spacing: -1.5px;
line-height: 1.1;
margin-bottom: 20px;
max-width: 700px;
margin-left: auto;
margin-right: auto;
}
.hero p {
font-size: clamp(16px, 2.5vw, 18px);
color: rgba(255,255,255,0.75);
max-width: 520px;
margin: 0 auto 36px;
}
.hero-ctas { display: flex; gap: 12px; justify-content: center; flex-wrap: wrap; }
.btn-primary {
background: var(--blue); color: var(--white);
padding: 14px 28px; border-radius: 10px;
font-size: 15px; font-weight: 600;
transition: background 0.15s, transform 0.1s;
display: inline-block;
}
.btn-primary:hover { background: var(--blue-light); transform: translateY(-1px); }
.btn-secondary {
background: rgba(255,255,255,0.1); color: var(--white);
border: 1px solid rgba(255,255,255,0.25);
padding: 14px 28px; border-radius: 10px;
font-size: 15px; font-weight: 600;
transition: background 0.15s;
display: inline-block;
}
.btn-secondary:hover { background: rgba(255,255,255,0.18); }
/* CODE PEEK */
.code-peek {
background: rgba(0,0,0,0.35);
border: 1px solid rgba(255,255,255,0.1);
border-radius: 12px;
padding: 20px 24px;
max-width: 540px;
margin: 48px auto 0;
text-align: left;
font-family: 'SF Mono', 'Fira Code', monospace;
font-size: 13px;
line-height: 1.7;
color: rgba(255,255,255,0.85);
overflow-x: auto;
}
.code-peek .kw { color: #a5b4fc; }
.code-peek .str { color: #86efac; }
.code-peek .cm { color: rgba(255,255,255,0.4); }
/* TRUST */
.trust {
background: var(--gray-50);
border-bottom: 1px solid var(--gray-200);
padding: 16px 24px;
text-align: center;
font-size: 13px;
color: var(--gray-400);
font-weight: 500;
letter-spacing: 0.02em;
}
/* PRODUCTS */
.products { padding: 72px 24px; max-width: 1100px; margin: 0 auto; }
.section-label {
font-size: 12px; font-weight: 700; color: var(--blue);
letter-spacing: 0.1em; text-transform: uppercase;
margin-bottom: 12px;
}
.section-title {
font-size: clamp(24px, 4vw, 36px);
font-weight: 700; letter-spacing: -0.8px;
color: var(--navy); margin-bottom: 8px;
}
.section-sub { font-size: 16px; color: var(--gray-600); margin-bottom: 48px; max-width: 480px; }
.product-grid {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(260px, 1fr));
gap: 20px;
}
.product-card {
background: var(--white);
border: 1px solid var(--gray-200);
border-radius: 16px;
padding: 28px 24px;
transition: box-shadow 0.2s, transform 0.2s, border-color 0.2s;
display: flex; flex-direction: column;
}
.product-card:hover {
box-shadow: 0 8px 32px rgba(10,37,64,0.1);
transform: translateY(-2px);
border-color: var(--blue);
}
.product-icon {
width: 44px; height: 44px;
background: linear-gradient(135deg, var(--blue) 0%, #4f46e5 100%);
border-radius: 12px;
display: flex; align-items: center; justify-content: center;
margin-bottom: 20px;
}
.product-icon svg { width: 22px; height: 22px; fill: none; stroke: white; stroke-width: 1.8; stroke-linecap: round; stroke-linejoin: round; }
.product-tag {
font-size: 11px; font-weight: 700;
color: var(--blue);
background: rgba(99,91,255,0.08);
border-radius: 4px;
padding: 2px 8px;
display: inline-block;
margin-bottom: 8px;
letter-spacing: 0.04em;
text-transform: uppercase;
}
.product-card h3 { font-size: 18px; font-weight: 700; color: var(--navy); margin-bottom: 8px; }
.product-card p { font-size: 14px; color: var(--gray-600); flex: 1; margin-bottom: 20px; }
.card-link {
font-size: 14px; font-weight: 600; color: var(--blue);
display: flex; align-items: center; gap: 4px;
transition: gap 0.15s;
}
.product-card:hover .card-link { gap: 8px; }
/* HOW IT WORKS */
.how { background: var(--gray-50); padding: 72px 24px; }
.how-inner { max-width: 900px; margin: 0 auto; }
.steps { display: grid; grid-template-columns: repeat(auto-fill, minmax(220px, 1fr)); gap: 24px; margin-top: 48px; }
.step { display: flex; flex-direction: column; }
.step-num {
font-size: 13px; font-weight: 700; color: var(--blue);
margin-bottom: 12px;
background: rgba(99,91,255,0.1);
width: 28px; height: 28px; border-radius: 8px;
display: flex; align-items: center; justify-content: center;
}
.step h4 { font-size: 15px; font-weight: 700; color: var(--navy); margin-bottom: 6px; }
.step p { font-size: 14px; color: var(--gray-600); }
/* CTA BOTTOM */
.cta-bottom {
background: var(--navy);
color: var(--white);
padding: 72px 24px;
text-align: center;
}
.cta-bottom h2 { font-size: clamp(24px, 4vw, 36px); font-weight: 700; letter-spacing: -0.8px; margin-bottom: 16px; }
.cta-bottom p { color: rgba(255,255,255,0.7); font-size: 16px; margin-bottom: 32px; max-width: 420px; margin-left: auto; margin-right: auto; }
.cta-bottom .btn-primary { font-size: 16px; padding: 16px 32px; }
/* FOOTER */
footer {
border-top: 1px solid var(--gray-200);
padding: 24px;
display: flex;
justify-content: space-between;
align-items: center;
flex-wrap: wrap;
gap: 12px;
font-size: 13px;
color: var(--gray-400);
}
footer a { color: var(--gray-400); transition: color 0.15s; }
footer a:hover { color: var(--gray-800); }
.footer-links { display: flex; gap: 20px; }
</style>
</head>
<body>
<nav>
<a href="/" class="nav-logo">A<span>AMOS</span></a>
<div class="nav-links">
<a href="#products">Products</a>
<a href="#">Docs</a>
<a href="#" class="btn-nav">Get API key</a>
</div>
</nav>
<section class="hero">
<div class="hero-badge">API Platform — by Landvex</div>
<h1>We built it for ourselves.<br>Now you can use it too.</h1>
<p>300+ microservices powering Landvex's infrastructure operations. The best ones — available as clean REST APIs for your stack.</p>
<div class="hero-ctas">
<a href="#" class="btn-primary">Get API key</a>
<a href="#" class="btn-secondary">View docs</a>
</div>
<div class="code-peek">
<span class="cm"># Analyze an image for infrastructure changes</span><br>
<span class="kw">curl</span> -X POST https://api.aamos.ai/v1/vims/analyze \<br>
&nbsp;&nbsp;-H <span class="str">"Authorization: Bearer &lt;YOUR_KEY&gt;"</span> \<br>
&nbsp;&nbsp;-F <span class="str">"image=@inspection.jpg"</span> \<br>
&nbsp;&nbsp;-F <span class="str">"object_id=bridge-e4-north"</span>
</div>
</section>
<div class="trust">
Battle-tested in production at Landvex &nbsp;·&nbsp; Used by infrastructure operators, municipalities, and insurers across Europe
</div>
<section class="products" id="products">
<div class="section-label">Products</div>
<h2 class="section-title">Four APIs. One platform.</h2>
<p class="section-sub">Pick what you need. Integrate in hours, not months.</p>
<div class="product-grid">
<a href="/vims/" class="product-card">
<div class="product-icon">
<svg viewBox="0 0 24 24"><path d="M1 12s4-8 11-8 11 8 11 8-4 8-11 8-11-8-11-8z"/><circle cx="12" cy="12" r="3"/></svg>
</div>
<span class="product-tag">Vision AI</span>
<h3>VIMS API</h3>
<p>Visual infrastructure monitoring. Submit images, get AI-powered change detection, baselines, and risk scores.</p>
<span class="card-link">Learn more →</span>
</a>
<a href="/reality-alerts/" class="product-card">
<div class="product-icon">
<svg viewBox="0 0 24 24"><path d="M18 8A6 6 0 0 0 6 8c0 7-3 9-3 9h18s-3-2-3-9"/><path d="M13.73 21a2 2 0 0 1-3.46 0"/></svg>
</div>
<span class="product-tag">Real-world data</span>
<h3>Reality Alerts API</h3>
<p>AI-verified field observations from Zoomers on the ground, automatically routed to the right recipient.</p>
<span class="card-link">Learn more →</span>
</a>
<a href="/kyz/" class="product-card">
<div class="product-icon">
<svg viewBox="0 0 24 24"><path d="M20 21v-2a4 4 0 0 0-4-4H8a4 4 0 0 0-4 4v2"/><circle cx="12" cy="7" r="4"/></svg>
</div>
<span class="product-tag">Identity</span>
<h3>KYZ</h3>
<p>Know Your Zoomer. ID document scanning, selfie liveness detection, and verification — built for the gig economy.</p>
<span class="card-link">Learn more →</span>
</a>
<a href="/modules/" class="product-card">
<div class="product-icon">
<svg viewBox="0 0 24 24"><rect x="3" y="3" width="7" height="7"/><rect x="14" y="3" width="7" height="7"/><rect x="14" y="14" width="7" height="7"/><rect x="3" y="14" width="7" height="7"/></svg>
</div>
<span class="product-tag">Enterprise</span>
<h3>AAMOS Modules</h3>
<p>Production-grade incident management and AI image deviation engine — drop into your stack via REST API.</p>
<span class="card-link">Learn more →</span>
</a>
</div>
</section>
<section class="how">
<div class="how-inner">
<div class="section-label">How it works</div>
<h2 class="section-title">Integrate in minutes.</h2>
<div class="steps">
<div class="step">
<div class="step-num">1</div>
<h4>Get your API key</h4>
<p>Sign up, generate a key, and you're ready. No sales call required.</p>
</div>
<div class="step">
<div class="step-num">2</div>
<h4>Call the API</h4>
<p>Standard REST with JSON responses. SDKs for Node, Python, and Go coming soon.</p>
</div>
<div class="step">
<div class="step-num">3</div>
<h4>Get intelligence</h4>
<p>Detections, alerts, verifications, and deviation scores — structured and ready for your system.</p>
</div>
<div class="step">
<div class="step-num">4</div>
<h4>Scale confidently</h4>
<p>Start on Free, upgrade as you grow. Enterprise plans for volume and SLA requirements.</p>
</div>
</div>
</div>
</section>
<section class="cta-bottom">
<h2>Ready to build?</h2>
<p>Get your API key and start integrating today. Free tier included.</p>
<a href="#" class="btn-primary">Get API key — it's free</a>
</section>
<footer>
<span>© 2026 AAMOS / Landvex AB</span>
<div class="footer-links">
<a href="#">Privacy</a>
<a href="#">Terms</a>
<a href="#">Status</a>
<a href="#">Contact</a>
</div>
</footer>
</body>
</html>