A clean, modern dashboard for browsing currently firing Alertmanager alerts with stable deep links to individual alerts.
- Real-time alert browsing - View all currently firing alerts from Alertmanager
- Auto-refresh - Configurable refresh intervals (10s, 30s, 1m, 5m, or off)
- Smart filtering - Filter by severity, state (firing/silenced/inhibited), and search across alert labels
- Alert grouping - Alerts are automatically grouped by alert name for easier navigation
- Watchdog monitoring - Visual status indicator for Alertmanager watchdog alerts
- Deep links - Stable URLs for each alert instance (
/a/<fingerprint>) perfect for PagerDuty or notification templates - Dark mode - Built-in theme toggle for light and dark modes
- Responsive design - Works seamlessly on desktop and mobile devices
Set the following environment variables:
ALERTMANAGER_BASE_URL(required) - The Alertmanager base URL, reachable from the server running Siren- Example:
http://alertmanager.monitoring.svc:9093 - Must be an absolute URL
- Example:
PORT(optional) - The port Siren listens on (default:3000)
For local development, create a .env file in the repository root:
ALERTMANAGER_BASE_URL=http://alertmanager.monitoring.svc:9093
PORT=3000- Bun (latest version)
# Install dependencies
bun install
# Start the development server
bun devThe app will be available at http://localhost:3000.
bun dev- Start development serverbun build- Build for productionbun preview- Preview production build locallybun test- Run testsbun test:watch- Run tests in watch modebun test:coverage- Run tests with coverage reportbun format:check- Check code formattingbun format:write- Format codebun lint- Run linterbun lint:fix- Fix linting issuesbun typecheck- Type check without emitting files
docker build -t siren:latest .docker run -p 3000:3000 \
-e ALERTMANAGER_BASE_URL=http://alertmanager.monitoring.svc:9093 \
siren:latestSiren exposes dedicated endpoints for Kubernetes liveness and readiness probes:
/livez- Liveness probe endpoint (always returns200 OK)/readyz- Readiness probe endpoint (returns200 OKwhen ready,503 Service Unavailablewhen not)/healthz- Human-readable health status page (not intended for probes)
apiVersion: apps/v1
kind: Deployment
metadata:
name: siren
spec:
template:
spec:
containers:
- name: siren
image: ghcr.io/shamubernetes/siren:latest
env:
- name: ALERTMANAGER_BASE_URL
value: "http://alertmanager.monitoring.svc:9093"
ports:
- containerPort: 3000
livenessProbe:
httpGet:
path: /livez
port: 3000
initialDelaySeconds: 10
periodSeconds: 10
readinessProbe:
httpGet:
path: /readyz
port: 3000
initialDelaySeconds: 5
periodSeconds: 5
failureThreshold: 3The readiness probe checks:
ALERTMANAGER_BASE_URLis configured and valid- Alertmanager is reachable (with a 2-second timeout)
If either check fails, the probe returns 503 and Kubernetes will remove the pod from service endpoints until it becomes ready again.
Images are automatically built and published to GHCR on pushes to main and on version tags (v*).
docker pull ghcr.io/shamubernetes/siren:latest
docker run -p 3000:3000 \
-e ALERTMANAGER_BASE_URL=http://alertmanager.monitoring.svc:9093 \
ghcr.io/shamubernetes/siren:latestAvailable tags:
latest- Latest build frommainbranchv*- Version tags (e.g.,v1.0.0)
Each alert instance has a stable URL that can be shared or embedded in notifications:
- Format:
/a/<fingerprint> - Example:
https://siren.example.com/a/abc123def456
You can copy the link from the UI using the "Copy Link" button on any alert detail page.
When templating Alertmanager notifications, the alert fingerprint is available per alert. For grouped notifications, you may want to include multiple links or link to /alerts instead.
Example Alertmanager notification template:
# In your Alertmanager config
receivers:
- name: 'pagerduty'
pagerduty_configs:
- service_key: 'your-service-key'
description: '{{ .GroupLabels.alertname }}'
details:
alert_link: 'https://siren.example.com/a/{{ .Fingerprint }}'
dashboard: 'https://siren.example.com/alerts'Pull requests must pass the following checks before merging (enforced via GitHub Actions):
- Formatting check (
bun run format:check) - Linting (
bun run lint) - Type checking (
bun run typecheck) - Tests (
bun test) - Docker build test (multi-platform)
See .github/workflows/ci.yml for the full CI configuration.
- Go to repository Settings → Branches
- Add a branch protection rule for your default branch
- Enable "Require status checks to pass before merging"
- Select the
lint-and-checkjob from the CI workflow
Releases are automated using semantic-release. When commits are pushed to main, semantic-release:
- Analyzes commits to determine the next version
- Generates release notes from commit messages
- Creates a git tag (e.g.,
v1.0.0) - Publishes a GitHub release
- Triggers Docker image build and push to GHCR
See .github/workflows/release.yml for the release workflow configuration.
- TanStack Start - Full-stack React framework
- TanStack Router - Type-safe routing
- React - UI library
- TypeScript - Type safety
- Tailwind CSS - Styling
- shadcn/ui - UI components
- Bun - Runtime and package manager
- Vitest - Testing framework

