feat: product page with architecture and platform framing
This commit is contained in:
parent
f7bd9085de
commit
2d3391f531
1 changed files with 424 additions and 0 deletions
424
src/pages/product.astro
Normal file
424
src/pages/product.astro
Normal file
|
|
@ -0,0 +1,424 @@
|
||||||
|
---
|
||||||
|
import AppLayout from '../layouts/AppLayout.astro';
|
||||||
|
|
||||||
|
const user = Astro.locals.user;
|
||||||
|
|
||||||
|
const tiers = [
|
||||||
|
{
|
||||||
|
name: 'Fenja Basic',
|
||||||
|
desc: 'General knowledge work — document retrieval, Q&A, summarisation, and search across the organisation\'s corpus. The foundation every other tier is built on.',
|
||||||
|
current: true,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'Fenja Code',
|
||||||
|
desc: 'Developer-assisted coding within the customer\'s own codebase. The agent understands project structure, conventions, and prior decisions.',
|
||||||
|
current: false,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'Fenja Analyze',
|
||||||
|
desc: 'Strategic data analysis — structured extraction across large document corpora, with full provenance on every finding.',
|
||||||
|
current: false,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'Fenja Agentic',
|
||||||
|
desc: 'Governed agent-based automation. Non-technical users define repeatable workflows; the platform handles execution, scheduling, and audit.',
|
||||||
|
current: false,
|
||||||
|
},
|
||||||
|
];
|
||||||
|
---
|
||||||
|
<AppLayout title="Product" user={user}>
|
||||||
|
<div class="page">
|
||||||
|
|
||||||
|
<!-- ── Hero ───────────────────────────────────────────────────── -->
|
||||||
|
<header class="hero">
|
||||||
|
<p class="label-sm eyebrow">Product</p>
|
||||||
|
<h1 class="hero-headline">
|
||||||
|
The platform for <em>sovereign AI.</em>
|
||||||
|
</h1>
|
||||||
|
</header>
|
||||||
|
|
||||||
|
<!-- ── What Fenja is ──────────────────────────────────────────── -->
|
||||||
|
<section class="section">
|
||||||
|
<div class="intro-prose">
|
||||||
|
<p class="body-lg">
|
||||||
|
Fenja is not a single product. It is a platform for running advanced AI
|
||||||
|
inside the customer's own infrastructure. It solves many use cases because
|
||||||
|
it provides the building blocks every regulated AI deployment needs: a local
|
||||||
|
model, agents that do work, a layer that teaches the AI the organisation's
|
||||||
|
language, and the tools those agents use to act.
|
||||||
|
</p>
|
||||||
|
<p class="body-lg">
|
||||||
|
One deployment, fully under your control, with no data ever touching
|
||||||
|
external infrastructure.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<!-- ── Architecture diagram ───────────────────────────────────── -->
|
||||||
|
<section class="section arch-section">
|
||||||
|
<h2 class="section-heading label-sm">How it is structured</h2>
|
||||||
|
|
||||||
|
<div class="arch-diagram" role="list" aria-label="Platform architecture layers">
|
||||||
|
|
||||||
|
<div class="arch-row" role="listitem" style="background: var(--surface-container-lowest);">
|
||||||
|
<div class="arch-row-label">
|
||||||
|
<span class="arch-layer-name label-sm">AI Model</span>
|
||||||
|
</div>
|
||||||
|
<div class="arch-row-content">
|
||||||
|
<p class="arch-row-desc body-md">
|
||||||
|
Locally hosted, open-source foundation model (Llama 3, Mistral).
|
||||||
|
No data ever leaves the customer's infrastructure.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
<div class="arch-row-tag">
|
||||||
|
<span class="arch-tag label-sm">Foundation</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="arch-row" role="listitem" style="background: var(--surface-container-low);">
|
||||||
|
<div class="arch-row-label">
|
||||||
|
<span class="arch-layer-name label-sm">Agents</span>
|
||||||
|
</div>
|
||||||
|
<div class="arch-row-content">
|
||||||
|
<p class="arch-row-desc body-md">
|
||||||
|
Specialised AI agents that handle distinct tasks — retrieval, summarisation,
|
||||||
|
analysis, drafting — and collaborate to solve complex queries.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
<div class="arch-row-tag">
|
||||||
|
<span class="arch-tag label-sm">Execution</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="arch-row arch-row--highlight" role="listitem" style="background: var(--surface-container);">
|
||||||
|
<div class="arch-row-label">
|
||||||
|
<span class="arch-layer-name label-sm">Semantic Layer</span>
|
||||||
|
<span class="arch-sublabel label-sm">Fenja Knowledge</span>
|
||||||
|
</div>
|
||||||
|
<div class="arch-row-content">
|
||||||
|
<p class="arch-row-desc body-md">
|
||||||
|
The business vocabulary through which the AI understands the organisation —
|
||||||
|
its structure, terminology, decisions, and the people behind them.
|
||||||
|
Grows automatically as the organisation uses the platform.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
<div class="arch-row-tag">
|
||||||
|
<span class="arch-tag label-sm">Context</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="arch-row" role="listitem" style="background: var(--surface-container-high);">
|
||||||
|
<div class="arch-row-label">
|
||||||
|
<span class="arch-layer-name label-sm">Tools</span>
|
||||||
|
</div>
|
||||||
|
<div class="arch-row-content">
|
||||||
|
<p class="arch-row-desc body-md">
|
||||||
|
The capabilities agents use to act: read files, query systems, search the corpus,
|
||||||
|
produce structured output, trigger processes.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
<div class="arch-row-tag">
|
||||||
|
<span class="arch-tag label-sm">Capabilities</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<!-- ── Platform framing ───────────────────────────────────────── -->
|
||||||
|
<section class="section platform-section">
|
||||||
|
<h2 class="section-heading label-sm">Why this is a platform, not a product</h2>
|
||||||
|
<div class="prose-col">
|
||||||
|
<p class="body-lg">
|
||||||
|
The same sovereign infrastructure supports fundamentally different shapes of work.
|
||||||
|
One deployment, one security model, one audit trail — but the use cases it enables
|
||||||
|
expand as you add tiers.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
<div class="tiers-list">
|
||||||
|
{tiers.map((tier) => (
|
||||||
|
<div class:list={['tier-row', { 'tier-row--current': tier.current }]}>
|
||||||
|
<div class="tier-name-col">
|
||||||
|
<span class="tier-name body-md">{tier.name}</span>
|
||||||
|
{tier.current && (
|
||||||
|
<span class="tier-badge label-sm">Bifrost MVP</span>
|
||||||
|
)}
|
||||||
|
</div>
|
||||||
|
<p class="tier-desc body-md">{tier.desc}</p>
|
||||||
|
</div>
|
||||||
|
))}
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<!-- ── What Bifrost delivers ──────────────────────────────────── -->
|
||||||
|
<section class="section bifrost-section">
|
||||||
|
<h2 class="section-heading label-sm">What Project Bifrost delivers first</h2>
|
||||||
|
<div class="prose-col">
|
||||||
|
<p class="body-lg">
|
||||||
|
The MVP in Project Bifrost is Fenja Basic: a locally hosted LLM with agent
|
||||||
|
flows, plus Fenja Knowledge — the semantic layer that lets the AI understand
|
||||||
|
not just your documents, but the context behind them.
|
||||||
|
</p>
|
||||||
|
<p class="body-lg">
|
||||||
|
This is the foundation. It solves real work today. And every tier that follows —
|
||||||
|
Code, Analyze, Agentic — is built on it without requiring a new deployment,
|
||||||
|
new infrastructure, or new compliance review.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<!-- ── What comes after ───────────────────────────────────────── -->
|
||||||
|
<section class="section extends-section">
|
||||||
|
<h2 class="section-heading label-sm">The platform extends to</h2>
|
||||||
|
<ul class="extends-list">
|
||||||
|
<li class="extends-item">
|
||||||
|
<span class="extends-name body-md">Fenja Code</span>
|
||||||
|
<span class="extends-desc body-md">
|
||||||
|
Developer-assisted coding inside your own infrastructure — source code never leaves.
|
||||||
|
</span>
|
||||||
|
</li>
|
||||||
|
<li class="extends-item">
|
||||||
|
<span class="extends-name body-md">Fenja Analyze</span>
|
||||||
|
<span class="extends-desc body-md">
|
||||||
|
Structured data extraction and analysis across large corpora, with provenance intact.
|
||||||
|
</span>
|
||||||
|
</li>
|
||||||
|
<li class="extends-item">
|
||||||
|
<span class="extends-name body-md">Fenja Agentic</span>
|
||||||
|
<span class="extends-desc body-md">
|
||||||
|
Governed automation for repeatable workflows — defined in natural language, audited end to end.
|
||||||
|
</span>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</AppLayout>
|
||||||
|
|
||||||
|
<style>
|
||||||
|
.page {
|
||||||
|
max-width: var(--content-max);
|
||||||
|
margin: 0 auto;
|
||||||
|
padding: 0 var(--space-20) var(--space-16);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ── Hero ────────────────────────────────────────────────────────── */
|
||||||
|
.hero {
|
||||||
|
padding-top: var(--space-16);
|
||||||
|
padding-bottom: var(--space-12);
|
||||||
|
max-width: 52rem;
|
||||||
|
border-bottom: var(--ghost-border);
|
||||||
|
}
|
||||||
|
|
||||||
|
.eyebrow {
|
||||||
|
letter-spacing: var(--tracking-wider);
|
||||||
|
text-transform: uppercase;
|
||||||
|
color: var(--on-surface-muted);
|
||||||
|
margin-bottom: var(--space-4);
|
||||||
|
}
|
||||||
|
|
||||||
|
.hero-headline {
|
||||||
|
font-family: var(--font-serif);
|
||||||
|
font-size: var(--text-display-md);
|
||||||
|
font-weight: 400;
|
||||||
|
letter-spacing: var(--tracking-tight);
|
||||||
|
line-height: var(--leading-snug);
|
||||||
|
color: var(--on-surface);
|
||||||
|
margin: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.hero-headline em {
|
||||||
|
font-weight: 700;
|
||||||
|
font-style: italic;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ── Sections ────────────────────────────────────────────────────── */
|
||||||
|
.section {
|
||||||
|
padding: var(--space-12) 0;
|
||||||
|
border-bottom: var(--ghost-border);
|
||||||
|
}
|
||||||
|
|
||||||
|
.section-heading {
|
||||||
|
letter-spacing: var(--tracking-wider);
|
||||||
|
text-transform: uppercase;
|
||||||
|
color: var(--on-surface-muted);
|
||||||
|
margin-bottom: var(--space-6);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ── Intro ───────────────────────────────────────────────────────── */
|
||||||
|
.intro-prose {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
gap: var(--space-5);
|
||||||
|
max-width: 44rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.intro-prose .body-lg {
|
||||||
|
margin: 0;
|
||||||
|
color: var(--on-surface-variant);
|
||||||
|
line-height: var(--leading-relaxed);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ── Architecture diagram ────────────────────────────────────────── */
|
||||||
|
.arch-diagram {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
border-radius: var(--radius-md);
|
||||||
|
overflow: hidden;
|
||||||
|
max-width: 52rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.arch-row {
|
||||||
|
display: grid;
|
||||||
|
grid-template-columns: 11rem 1fr 6rem;
|
||||||
|
gap: var(--space-6);
|
||||||
|
align-items: center;
|
||||||
|
padding: var(--space-6) var(--space-8);
|
||||||
|
transition: background var(--duration-fast) var(--ease-standard);
|
||||||
|
}
|
||||||
|
|
||||||
|
.arch-row-label {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
gap: var(--space-1);
|
||||||
|
}
|
||||||
|
|
||||||
|
.arch-layer-name {
|
||||||
|
letter-spacing: var(--tracking-wider);
|
||||||
|
text-transform: uppercase;
|
||||||
|
color: var(--on-surface);
|
||||||
|
font-weight: 700;
|
||||||
|
}
|
||||||
|
|
||||||
|
.arch-sublabel {
|
||||||
|
letter-spacing: var(--tracking-wide);
|
||||||
|
text-transform: uppercase;
|
||||||
|
color: var(--secondary);
|
||||||
|
font-weight: 500;
|
||||||
|
}
|
||||||
|
|
||||||
|
.arch-row-desc {
|
||||||
|
font-family: var(--font-serif);
|
||||||
|
font-style: italic;
|
||||||
|
color: var(--on-surface-variant);
|
||||||
|
margin: 0;
|
||||||
|
line-height: var(--leading-relaxed);
|
||||||
|
}
|
||||||
|
|
||||||
|
.arch-row-tag {
|
||||||
|
display: flex;
|
||||||
|
justify-content: flex-end;
|
||||||
|
}
|
||||||
|
|
||||||
|
.arch-tag {
|
||||||
|
letter-spacing: var(--tracking-wider);
|
||||||
|
text-transform: uppercase;
|
||||||
|
color: var(--on-surface-muted);
|
||||||
|
font-weight: 500;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ── Platform / tiers ────────────────────────────────────────────── */
|
||||||
|
.prose-col {
|
||||||
|
max-width: 44rem;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
gap: var(--space-5);
|
||||||
|
margin-bottom: var(--space-8);
|
||||||
|
}
|
||||||
|
|
||||||
|
.prose-col .body-lg {
|
||||||
|
margin: 0;
|
||||||
|
color: var(--on-surface-variant);
|
||||||
|
line-height: var(--leading-relaxed);
|
||||||
|
}
|
||||||
|
|
||||||
|
.tiers-list {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
max-width: 52rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.tier-row {
|
||||||
|
display: grid;
|
||||||
|
grid-template-columns: 14rem 1fr;
|
||||||
|
gap: var(--space-6);
|
||||||
|
align-items: start;
|
||||||
|
padding: var(--space-5) 0;
|
||||||
|
border-top: var(--ghost-border);
|
||||||
|
}
|
||||||
|
.tier-row:last-child {
|
||||||
|
border-bottom: var(--ghost-border);
|
||||||
|
}
|
||||||
|
|
||||||
|
.tier-name-col {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
gap: var(--space-2);
|
||||||
|
}
|
||||||
|
|
||||||
|
.tier-name {
|
||||||
|
font-family: var(--font-serif);
|
||||||
|
font-weight: 700;
|
||||||
|
font-style: italic;
|
||||||
|
letter-spacing: var(--tracking-snug);
|
||||||
|
color: var(--on-surface);
|
||||||
|
margin: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.tier-row--current .tier-name {
|
||||||
|
color: var(--secondary);
|
||||||
|
}
|
||||||
|
|
||||||
|
.tier-badge {
|
||||||
|
display: inline-block;
|
||||||
|
padding: 0.2em var(--space-2);
|
||||||
|
background: var(--surface-container);
|
||||||
|
border-radius: var(--radius-full);
|
||||||
|
letter-spacing: var(--tracking-wide);
|
||||||
|
text-transform: uppercase;
|
||||||
|
color: var(--secondary);
|
||||||
|
font-weight: 600;
|
||||||
|
}
|
||||||
|
|
||||||
|
.tier-desc {
|
||||||
|
color: var(--on-surface-variant);
|
||||||
|
margin: 0;
|
||||||
|
line-height: var(--leading-relaxed);
|
||||||
|
padding-top: 0.2rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ── Extends list ────────────────────────────────────────────────── */
|
||||||
|
.extends-list {
|
||||||
|
list-style: none;
|
||||||
|
padding: 0;
|
||||||
|
margin: 0;
|
||||||
|
max-width: 52rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.extends-item {
|
||||||
|
display: grid;
|
||||||
|
grid-template-columns: 10rem 1fr;
|
||||||
|
gap: var(--space-6);
|
||||||
|
align-items: baseline;
|
||||||
|
padding: var(--space-4) 0;
|
||||||
|
border-top: var(--ghost-border);
|
||||||
|
}
|
||||||
|
.extends-item:last-child {
|
||||||
|
border-bottom: var(--ghost-border);
|
||||||
|
}
|
||||||
|
|
||||||
|
.extends-name {
|
||||||
|
font-family: var(--font-serif);
|
||||||
|
font-weight: 700;
|
||||||
|
font-style: italic;
|
||||||
|
letter-spacing: var(--tracking-snug);
|
||||||
|
color: var(--on-surface-variant);
|
||||||
|
margin: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.extends-desc {
|
||||||
|
color: var(--on-surface-variant);
|
||||||
|
margin: 0;
|
||||||
|
line-height: var(--leading-relaxed);
|
||||||
|
}
|
||||||
|
</style>
|
||||||
Loading…
Add table
Reference in a new issue