Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
24 changes: 22 additions & 2 deletions src/components/AppArchitectureDiagram.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,7 @@ function Box({
h,
label,
sublabel,
lines,
fill,
}: {
x: number;
Expand All @@ -60,8 +61,15 @@ function Box({
h: number;
label: string;
sublabel?: string;
lines?: string[];
fill: string;
}) {
const detailLines = lines ?? [];
const hasSublabel = Boolean(sublabel);
const titleY = y + (hasSublabel || detailLines.length > 0 ? 18 : h / 2 + 5);
const sublabelY = y + 34;
const detailsStartY = y + (hasSublabel ? 50 : 36);

return (
<g>
<rect
Expand All @@ -76,7 +84,7 @@ function Box({
/>
<text
x={x + w / 2}
y={y + (sublabel ? h / 2 - 4 : h / 2 + 5)}
y={titleY}
textAnchor="middle"
fill="#ffffff"
fontSize={13}
Expand All @@ -87,14 +95,26 @@ function Box({
{sublabel && (
<text
x={x + w / 2}
y={y + h / 2 + 14}
y={sublabelY}
textAnchor="middle"
fill="rgba(255,255,255,0.75)"
fontSize={11}
>
{sublabel}
</text>
)}
{detailLines.map((line, index) => (
<text
key={`${line}-${index}`}
x={x + w / 2}
y={detailsStartY + index * 14}
textAnchor="middle"
fill="rgba(255,255,255,0.75)"
fontSize={10}
>
{line}
</text>
))}
</g>
);
}
Expand Down
6 changes: 6 additions & 0 deletions src/components/AppStatusBadge.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,12 @@ const statusStyles: Record<
color: '#0a1628',
borderColor: 'rgba(126, 200, 255, 1)',
},
'In Progress': {
label: 'In Progress',
backgroundColor: 'rgba(255, 180, 50, 0.92)',
color: '#1a1400',
borderColor: 'rgba(255, 200, 80, 1)',
},
Beta: {
label: 'Beta',
backgroundColor: 'rgba(123, 97, 255, 0.92)',
Expand Down
65 changes: 32 additions & 33 deletions src/content/appShowcases.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import { AppShowcaseContent } from '../types/appShowcase';
import { kubesentryDiagram } from './kubesentryDiagram';

const GITHUB_URL = 'https://github.com/TheTraille18/';

Expand Down Expand Up @@ -220,56 +221,54 @@ export const appShowcases: Record<string, AppShowcaseContent> = {
'kubesentry-ai': {
title: 'KubeSentry AI',
tagline:
'AI-powered Kubernetes monitoring, anomaly detection, and intelligent alerting for clusters.',
'AI-driven Kubernetes incident response — observability, agents, and chaos engineering in one platform.',
githubUrl: GITHUB_URL,
workInProgress: true,
summary: [
'KubeSentry AI aims to watch Kubernetes clusters for unusual behavior — failed pods, resource spikes, and deployment regressions — and explain what went wrong using AI-assisted analysis.',
'Metrics and events from the cluster feed into an anomaly detection layer that correlates signals and surfaces actionable alerts instead of raw log noise.',
'KubeSentry is an AI-driven Kubernetes incident response platform that combines observability, AI agents, and chaos engineering to detect, investigate, and validate issues in Kubernetes environments.',
'The goal is to reduce the time engineers spend diagnosing production incidents by automating root cause analysis and providing actionable recommendations.',
],
architectureCaption:
'Cluster metrics and events flow from Prometheus and the Kubernetes API into an analysis pipeline. An AI layer interprets anomalies, correlates root causes, and sends alerts to operators through a dashboard or notification channel.',
diagram: {
viewBox: '0 0 760 400',
boxes: [
{ x: 40, y: 60, w: 170, h: 52, label: 'Kubernetes', sublabel: 'Cluster', fill: 'rgba(0,166,153,0.35)' },
{ x: 280, y: 60, w: 200, h: 52, label: 'Prometheus', sublabel: 'Metrics', fill: 'rgba(0,0,0,0.45)' },
{ x: 520, y: 60, w: 200, h: 52, label: 'Event stream', sublabel: 'K8s API', fill: 'rgba(0,0,0,0.35)' },
{ x: 160, y: 180, w: 200, h: 52, label: 'Anomaly engine', sublabel: 'Detection', fill: 'rgba(255,90,95,0.35)' },
{ x: 400, y: 180, w: 200, h: 52, label: 'AI analysis', sublabel: 'Root cause', fill: 'rgba(255,90,95,0.25)' },
{ x: 280, y: 300, w: 200, h: 52, label: 'Alerts', sublabel: 'Dashboard', fill: 'rgba(0,166,153,0.25)' },
],
arrows: [
{ x1: 210, y1: 86, x2: 278, y2: 86 },
{ x1: 480, y1: 86, x2: 518, y2: 86 },
{ x1: 380, y1: 112, x2: 260, y2: 178 },
{ x1: 620, y1: 112, x2: 500, y2: 178 },
{ x1: 360, y1: 206, x2: 398, y2: 206 },
{ x1: 500, y1: 232, x2: 380, y2: 298 },
],
footer: 'Work in progress — planned K8s observability with AI-assisted incident analysis',
workInProgress: true,
},
'Kubernetes API data and Prometheus, CloudWatch, and log streams feed a data collector that normalizes pods, events, metrics, and deployments. A LangGraph AI agent orchestrates multi-step investigation using Kubernetes tools and optional web search, with Claude on Amazon Bedrock driving root cause analysis, confidence scoring, and remediation recommendations delivered to Slack, Jira, ServiceNow, dashboards, or email. A separate chaos engineering pipeline uses LitmusChaos, Chaos Mesh, or AWS FIS to inject failures and validate that KubeSentry detects and diagnoses incidents correctly.',
diagram: kubesentryDiagram,
toolsUsed: [
{ category: 'Platform', tools: ['Kubernetes', 'Prometheus', 'Helm'] },
{ category: 'AI', tools: ['LLM', 'Anomaly detection', 'Event correlation'] },
{ category: 'Backend', tools: ['Go', 'Python', 'gRPC', 'Webhooks'] },
{ category: 'Platform', tools: ['Kubernetes', 'EKS', 'Prometheus', 'CloudWatch', 'Helm'] },
{ category: 'AI', tools: ['LangGraph', 'Claude', 'Amazon Bedrock', 'Titan Embeddings'] },
{ category: 'Integrations', tools: ['Slack', 'Jira', 'ServiceNow', 'kubectl'] },
{ category: 'Chaos', tools: ['LitmusChaos', 'Chaos Mesh', 'AWS FIS'] },
{ category: 'Backend', tools: ['Go', 'Web search', 'Event correlation'] },
],
progressUpdates: [
{
date: 'Jun 29, 2026',
title: 'Go backend + Kubernetes data collection',
detail:
'Scaffolded the production Go layout with server and worker entrypoints, detector, and in-memory alert store. Integrated client-go to list pods and events, built a pod-failure detector, and wired a worker that polls the online-boutique namespace every 30s. Added an HTTP API for health checks and listing alerts, moved the Online Boutique Helm chart to deployments/helm/online-boutique, stood up a local kind cluster for testing, and added Makefile targets for build, run-server, run-worker, helm-install, and port-forward.',
},
{
date: 'Jun 2026',
title: 'Architecture design',
detail:
'Documented the full incident response pipeline — data collector, LangGraph agent, Bedrock analysis, notification channels, and chaos validation flow.',
},
{
date: 'Jun 2026',
title: 'Project page',
detail: 'Added showcase documentation with architecture overview and planned tooling.',
},
{
date: 'Planned',
title: 'Metrics collector',
detail: 'Integrate Prometheus and Kubernetes event watchers for cluster telemetry.',
title: 'Data collector',
detail: 'Integrate Kubernetes API, Prometheus, CloudWatch, and log streams into a unified collector.',
},
{
date: 'Planned',
title: 'LangGraph investigation agent',
detail: 'Build multi-step incident workflows with Kubernetes tools and optional web search fallback.',
},
{
date: 'Planned',
title: 'AI alert summaries',
detail: 'Generate human-readable incident summaries from correlated cluster signals.',
title: 'Chaos validation',
detail: 'Run LitmusChaos, Chaos Mesh, or AWS FIS experiments to verify detection and diagnosis.',
},
],
},
Expand Down
147 changes: 147 additions & 0 deletions src/content/kubesentryDiagram.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,147 @@
import { ArchitectureDiagramConfig } from '../types/appShowcase';

export const kubesentryDiagram: ArchitectureDiagramConfig = {
viewBox: '0 0 880 1400',
boxes: [
{
x: 290,
y: 16,
w: 300,
h: 52,
label: 'Kubernetes Cluster',
sublabel: 'EKS or any K8s',
fill: 'rgba(0,166,153,0.35)',
},
{
x: 50,
y: 108,
w: 220,
h: 108,
label: 'Kubernetes API',
lines: ['Pod Status', 'Events', 'Deployments'],
fill: 'rgba(0,0,0,0.45)',
},
{
x: 610,
y: 108,
w: 220,
h: 108,
label: 'Prometheus / Metrics',
lines: ['CloudWatch', 'Logs', 'Alerts'],
fill: 'rgba(0,0,0,0.45)',
},
{
x: 240,
y: 268,
w: 400,
h: 118,
label: 'Data Collector',
lines: ['Pods', 'Logs', 'Events', 'Metrics', 'Deployments'],
fill: 'rgba(255,90,95,0.35)',
},
{
x: 200,
y: 426,
w: 480,
h: 118,
label: 'AI Agent (LangGraph)',
lines: ['Incident State', 'Tool Selection', 'Investigation Workflow', 'Multi-step Reasoning'],
fill: 'rgba(255,90,95,0.25)',
},
{
x: 50,
y: 582,
w: 240,
h: 100,
label: 'Kubernetes Tools',
lines: ['kubectl', 'Metrics', 'Events'],
fill: 'rgba(0,0,0,0.45)',
},
{
x: 590,
y: 582,
w: 240,
h: 100,
label: 'Web Search (optional)',
lines: ['AWS Docs', 'CVEs', 'Kubernetes Docs'],
fill: 'rgba(0,0,0,0.45)',
},
{
x: 240,
y: 722,
w: 400,
h: 88,
label: 'Amazon Bedrock',
lines: ['Claude', 'Titan Embeddings (optional)'],
fill: 'rgba(0,166,153,0.35)',
},
{
x: 200,
y: 842,
w: 480,
h: 100,
label: 'Root Cause Analysis',
lines: ['Confidence Score', 'Suggested Remediation', 'YAML / kubectl Recommendations'],
fill: 'rgba(255,90,95,0.35)',
},
{
x: 120,
y: 978,
w: 640,
h: 56,
label: 'Slack  Jira / ServiceNow  Dashboard  Email',
fill: 'rgba(0,166,153,0.25)',
},
{
x: 160,
y: 1068,
w: 560,
h: 40,
label: 'Chaos Engineering / Validation Pipeline',
fill: 'rgba(255,180,50,0.3)',
},
{
x: 200,
y: 1132,
w: 480,
h: 52,
label: 'LitmusChaos / Chaos Mesh / AWS FIS',
fill: 'rgba(255,180,50,0.25)',
},
{
x: 200,
y: 1210,
w: 480,
h: 100,
label: 'Inject Failures',
lines: ['Pod Failures', 'Kill Nodes', 'Network Latency', 'CPU / Memory Pressure'],
fill: 'rgba(255,180,50,0.2)',
},
{
x: 240,
y: 1338,
w: 400,
h: 52,
label: 'Verify KubeSentry',
sublabel: 'Detects & diagnoses correctly',
fill: 'rgba(255,180,50,0.35)',
},
],
arrows: [
{ x1: 440, y1: 68, x2: 160, y2: 106 },
{ x1: 440, y1: 68, x2: 720, y2: 106 },
{ x1: 160, y1: 216, x2: 340, y2: 266 },
{ x1: 720, y1: 216, x2: 540, y2: 266 },
{ x1: 440, y1: 386, x2: 440, y2: 424 },
{ x1: 170, y1: 582, x2: 300, y2: 544 },
{ x1: 710, y1: 582, x2: 580, y2: 544 },
{ x1: 440, y1: 544, x2: 440, y2: 720 },
{ x1: 440, y1: 810, x2: 440, y2: 840 },
{ x1: 440, y1: 942, x2: 440, y2: 976 },
{ x1: 440, y1: 1034, x2: 440, y2: 1066 },
{ x1: 440, y1: 1108, x2: 440, y2: 1130 },
{ x1: 440, y1: 1184, x2: 440, y2: 1208 },
{ x1: 440, y1: 1310, x2: 440, y2: 1336 },
],
footer: 'Incident response pipeline + chaos validation to prove detection and diagnosis',
};
6 changes: 3 additions & 3 deletions src/data/apps.ts
Original file line number Diff line number Diff line change
Expand Up @@ -56,9 +56,9 @@ export const catalogApps: AppImage[] = [
path: '/apps/kubesentry-ai',
badge: 'AI',
group: 'AI',
status: 'POC',
infoLine1: 'AI-powered Kubernetes monitoring',
infoLine2: 'and anomaly detection for your clusters',
status: 'In Progress',
infoLine1: 'AI-driven Kubernetes incident response',
infoLine2: 'with observability, agents, and chaos engineering',
infoLine3: '',
infoLine4: '',
},
Expand Down
1 change: 1 addition & 0 deletions src/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ export interface TaskFormValues {
export type AppStatus =
| 'Live'
| 'In Development'
| 'In Progress'
| 'Beta'
| 'Planned'
| 'POC'
Expand Down
2 changes: 2 additions & 0 deletions src/types/appShowcase.ts
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,8 @@ export interface DiagramBox {
h: number;
label: string;
sublabel?: string;
/** Additional detail lines rendered inside the box (smaller text). */
lines?: string[];
fill: string;
}

Expand Down
Loading