Cron Jobs, Scheduled Tasks, Data Pipelines. Sie laufen im Hintergrund und niemand merkt es, wenn einer ausfällt. Bis ein Kunde anruft und fragt, warum seine Daten nicht aktualisiert wurden.
Kast ist eine Event-Driven Monitoring Plattform, die Jobs in Echtzeit überwacht und Teams über Slack, Discord, Email, Webhooks, PagerDuty oder Telegram alarmiert, wenn ein Job fehlschlägt, zu spät läuft oder sein erwartetes Zeitfenster verpasst.
Wie es funktioniert
Das Ping-Protokoll ist bewusst simpel. Dein Job sendet HTTP Pings an Kast:
# Am Anfang des Jobs
curl https://kast.example.com/api/v1/ping/$MONITOR_ID/start
# Am Ende
curl https://kast.example.com/api/v1/ping/$MONITOR_ID/success
# Bei Fehler
curl https://kast.example.com/api/v1/ping/$MONITOR_ID/fail
Oder du wrappst den Job direkt mit der CLI:
kast wrap -m $MONITOR_ID -- ./backup.sh
Kast erkennt fehlende Pings (Job hat nicht gestartet), verspätete Pings (Job läuft zu lange), und Failed Pings. Jeder Fall triggert die konfigurierte Alert Chain.
Event-Driven Architektur

Jeder Ping ist ein Event, das durch eine Kafka-basierte Pipeline fließt (Redpanda, Kafka 3.7 kompatibel). 14 Topics mit durchdachtem Partitioning:

ping-events (6 Partitionen, 7 Tage Retention). Eingang für alle Pings. Partitioniert nach Monitor UUID für garantierte Reihenfolge pro Monitor.
monitor-state (6 Partitionen, Compacted). Materialized State des aktuellen Monitor-Status. Compaction behält nur den letzten Wert pro Key. Source of Truth.
job-triggers (6 Partitionen, 3 Tage). Triggert Job-Ausführungen in der Workflow Engine.
workflow-signals (6 Partitionen). Inter-Workflow Kommunikation. Dual-Write Pattern: Kafka Topic + DB Tabelle, um Race Conditions bei Signal-Arrival-Timing zu verhindern.
dead-letter (1 Partition, 30 Tage). Fehlgeschlagene Alert-Deliveries landen hier zur Analyse und Retry.
19 Consumer Groups für unabhängige Skalierung: SINK, SCHEDULER, INCIDENTS, NOTIFY, JOB_EXECUTOR, WORKFLOW_ENGINE, WORKFLOW_SLEEPER und mehr.
Workflow Engine
Kast hat eine Durable Workflow Engine inspiriert von Temporal und Inngest. Workflows sind DAGs mit visueller Canvas-Darstellung (React Flow).
Step Types: run (Code ausführen), sleep (Durable Timer), condition (Expression-basiertes Branching mit True/False Paths), run_job (Job triggern), fan_out (parallele Ausführung), webhook_wait (auf externen Callback warten).
Replay-basierte Memoization. Abgeschlossene Steps werden aus workflow_step_results geladen. Die Engine replayed bereits fertige Steps und führt den nächsten Pending Step aus. Crash-safe.
Expression Evaluator für Conditional Branching. Kein eval(), sondern ein sicherer Parser für Bedingungen. Automatische Retries mit Exponential Backoff. Concurrency Policies: Queue, Skip, Cancel.
Graph Utilities. Eigene Library für Adjacency Maps, Frontier Computation (welche Steps sind als nächstes ausführbar) und Loop Detection in DAGs.
Echtzeit-Dashboard
Next.js 16 mit shadcn/ui. WebSocket Gateway (Socket.IO) subscribet auf Kafka Topics und pusht Updates direkt an den Browser. Kein Polling. Recharts für Zeitreihen-Visualisierung. React Flow für die visuelle Workflow Canvas mit Auto-Layout.
Alerting
Alert Channels: Discord, Email (SMTP), Webhooks (HMAC-signiert), Telegram. Konfigurierbar pro Monitor mit Escalation Policies. Fehlgeschlagene Deliveries landen in der Dead-Letter Queue mit automatischem Retry und Exponential Backoff.
Authentication
Unified Auth Guard: akzeptiert API Key Header oder Session Cookie. Better Auth mit Cross-Origin Cookie Handling via Next.js Proxy Route. @Public() Decorator für öffentliche Endpoints. Teams und Workspaces für Multi-Tenant Support.
Deklarative Konfiguration
# kast.yaml
monitors:
- name: nightly-backup
schedule: "0 2 * * *"
grace_period: 15m
alerts:
- channel: slack
webhook: $SLACK_WEBHOOK
- channel: pagerduty
routing_key: $PD_KEY
severity: critical
kast apply -f kast.yaml reconciled den gewünschten Zustand. Versionierbar in Git.
AWS-Infrastruktur

Terraform mit 15 Modulen:
ECS Fargate für API (2-6 Tasks, Auto-Scaling) und Web (2-4 Tasks). Health/Readiness Endpoints für Container Probes. Container Insights für CloudWatch.
Aurora PostgreSQL 17 Serverless v2 (0.5-4 ACU). Skaliert automatisch mit Last. 18 Tabellen: Monitors, Pings, Jobs, Job Runs, Workflows, Workflow Runs, Workflow Step Results, Workflow Signals, Incidents, Alert Configs, Alert Log, API Keys, Teams, Auth.
Amazon MSK (Kafka 3.7) mit IAM Authentication. Fine-grained Permissions: kafka-cluster:Connect, WriteData, ReadData, AlterGroup. Keine Wildcard Policies.
ALB mit HTTPS/TLS. AWS Secrets Manager für DB Passwort und Auth Secret, injected via Task Definition. CloudWatch Logging.
IAM. Task Execution Role (Secrets Manager Access) und Task Role (MSK Permissions) getrennt. Least Privilege.
Database Schema
Drizzle ORM mit Schema-First Migrations. 18 Tabellen decken den kompletten Domain ab: Monitoring (Monitors, Pings, Incidents), Job Execution (Jobs, Job Runs, Job Run Logs), Workflows (Workflows, Workflow Runs, Step Results, Signals), Alerting (Alert Configs, Alert Log mit Dead-Letter Pattern), und Platform (API Keys, Teams, Auth).
Testing
Vitest für Unit Tests (12 Specs). Playwright für E2E Tests (16+ Specs) mit sequentieller Ausführung (workers: 1) für Shared State Management. Global Setup orchestriert Docker Container und Migrations. Swagger/OpenAPI Docs. Prometheus Metrics via prom-client.
Monorepo
Turborepo + pnpm Workspace. Apps: API (NestJS), Dashboard (Next.js 16), Docs (Fumadocs), CLI (Commander.js), Landing Page. 38 NestJS Module in einem Prozess, entkoppelt über Kafka Topic Boundaries statt separater Microservices.