A web application for configuring, storing, and managing multi-service Helm-based application stacks for deployment to one or more Kubernetes clusters.
Developers create stack definitions (collections of Helm charts with configuration), launch stack instances (per-developer copies with branch and value overrides), and manage everything through an audit-logged UI with Git provider integration.
View, search, and manage all your stack instances from a single dashboard. Filter by status (draft, deploying, running, stopped, error), star your favorites for quick access, and see recently used stacks at a glance. Bulk operations let you deploy, stop, clean, or delete up to 50 instances at once.
Browse and discover reusable stack templates organized by category (Web, API, Data, Infrastructure). Each template includes a description, version tag, and one-click Quick Deploy to spin up a new instance instantly. Create your own templates and publish them for your team.
Define multi-chart application stacks with Helm chart configurations, default branches, and value templates. Import and export definitions as JSON bundles for sharing across environments. Each definition can be used to create templates or directly instantiate stack instances.
Track platform usage with real-time metrics: template and definition counts, running instances, total deployments, and active users. The template usage table shows deployment success rates and adoption across the team.
Full audit trail of every action in the system β creates, updates, deletes β with filters by user, entity type, action, and date range. Export logs for compliance. Every mutating API call is automatically logged with user identity and entity details.
Manage your account, generate API keys for CI/CD automation, and configure notification preferences per event type (deployment succeeded/failed, stopped, deleted).
- Multi-cluster support β Register and manage multiple Kubernetes clusters with encrypted kubeconfig storage (AES-GCM). Monitor cluster health and resource utilization.
- Git provider integration β Automatic branch listing from Azure DevOps and GitLab repositories, with per-chart branch overrides.
- Helm values deep merge β Chart defaults are deep-merged with instance overrides. Template variables (
{{.Branch}},{{.Namespace}},{{.InstanceName}}, etc.) are substituted automatically. - Cleanup policies β Schedule cron-based cleanup actions (stop, clean, delete) on instances matching custom conditions.
- TTL auto-expiry β Set time-to-live on instances; a background reaper automatically stops expired deployments.
- Real-time updates β WebSocket-based live updates push deployment status changes to all connected clients.
- RBAC β Role-based access control (admin, devops, developer) with JWT authentication and optional OpenID Connect (OIDC) SSO.
- In-app notifications β Get notified on deploy/stop/clean events with configurable per-user preferences.
- Instance comparison β Side-by-side diff of two stack instances including merged Helm values per chart.
- Shared values β Per-cluster shared Helm values applied to all instances, merged by priority before instance-specific overrides.
- Dark mode β Full dark/light theme support.
k8s-stack-manager is deliberately free of organisation-specific logic. Database refreshes, CMDB sync, policy gates, custom snapshots, Slack notifications β all of this can be added without forking, in any language, as a small out-of-process service.
Two mechanisms:
- Event hooks β POST handlers subscribe to lifecycle events (
pre-deploy,post-instance-create, β¦).failure_policy: failsubscribers can abort operations to enforce policy. - Actions β
POST /api/v1/stack-instances/:id/actions/:namedispatches to a subscriber you register. Subscriber responses are forwarded verbatim to callers β so stackctl can expose them as first-class subcommands via plugin discovery.
Both run over plain HTTP with HMAC signing. Build a subscriber in 10 minutes using Python stdlib (see backend/examples/webhook-handler-python/) or in Go (backend/examples/webhook-handler/).
π Full guide: EXTENDING.md β tutorial, event reference, action contract, security, real-world recipes.
Frontend (React + MUI + TypeScript)
β
βΌ
Backend (Go + Gin)
βββ REST API with JWT auth
βββ MySQL (GORM)
βββ Git Provider (Azure DevOps + GitLab)
βββ Helm Values (deep merge + template substitution)
βββ Multi-cluster support (kubeconfig encrypted at rest)
βββ Audit Logging
- Docker and Docker Compose
- Go 1.25+ (for local backend development)
- Node.js 20+ (for local frontend development)
make devThis starts all services:
- Frontend: http://localhost:3000
- Backend API: http://localhost:8081
- Swagger docs: http://localhost:8081/swagger/index.html
Default admin credentials: admin / admin (configured in docker-compose.yml).
# Run backend
make dev-local
# In another terminal β run frontend
cd frontend && npm install && npm run dev| Command | Description |
|---|---|
make dev |
Start full stack via Docker Compose |
make dev-local |
Run backend + frontend locally |
make test |
Run all tests (backend + frontend) |
make test-backend |
Backend unit tests |
make test-frontend |
Frontend unit tests |
make test-backend-all |
Backend unit + integration tests |
make test-e2e |
End-to-end Playwright tests |
make docs |
Regenerate Swagger documentation |
make lint |
Lint backend + frontend |
make clean |
Stop containers and remove volumes |
make install |
Install all dependencies |
make helm-lint |
Lint the Helm chart |
make helm-template |
Render templates locally (dry-run) |
make helm-install |
Install chart into current cluster |
make helm-upgrade |
Upgrade an existing release |
make helm-uninstall |
Uninstall the release |
βββ backend/ # Go API server
β βββ api/main.go # Application entry point
β βββ internal/
β β βββ api/ # Handlers, middleware, routes
β β βββ config/ # Environment-based configuration
β β βββ database/ # Database repositories + migrations
β β βββ gitprovider/ # Azure DevOps + GitLab integration
β β βββ helm/ # Values merge + template substitution
β β βββ cluster/ # Multi-cluster registry + health poller
β β βββ deployer/ # Helm CLI wrapper for deploy/undeploy (multi-cluster)
β β βββ k8s/ # Cluster client + status monitoring
β β βββ models/ # Domain models + interfaces
β β βββ scheduler/ # Cron-based cleanup policy execution
β β βββ ttl/ # TTL reaper for auto-expiring stack instances
β β βββ websocket/ # Real-time event broadcasting
β βββ pkg/crypto/ # AES-GCM encryption for kubeconfig at rest (key derived via SHA-256)
β βββ docs/ # Swagger/OpenAPI
βββ frontend/ # React SPA
β βββ src/
β βββ api/ # API client + types
β βββ components/ # Shared UI components
β βββ context/ # Auth + WebSocket contexts
β βββ pages/ # Page components
β βββ routes.tsx # Route definitions
βββ helm/k8s-stack-manager/ # Helm chart (Argo Rollouts + Traefik)
β βββ templates/backend/ # Backend Rollout, services, config
β βββ templates/frontend/ # Frontend Rollout, services, nginx config
β βββ templates/traefik/ # IngressRoute + middleware
βββ loadtest/ # Load testing suites
β βββ backend/ # k6 API + WebSocket load tests
β βββ frontend/ # Playwright load tests
βββ docker-compose.yml
| Group | Prefix | Description |
|---|---|---|
| Auth | /api/v1/auth |
Login, register, current user |
| Templates | /api/v1/templates |
Stack template CRUD, publish, instantiate |
| Definitions | /api/v1/stack-definitions |
Stack definition CRUD, chart configs |
| Instances | /api/v1/stack-instances |
Stack instance CRUD, clone, deploy, stop, clean, status |
| Overrides | /api/v1/stack-instances/:id/overrides |
Per-chart value overrides |
| Branch Overrides | /api/v1/stack-instances/:id/branches |
Per-chart branch overrides |
| Git | /api/v1/git |
Branch listing, validation |
| Audit Logs | /api/v1/audit-logs |
Filterable audit trail + export |
| Admin | /api/v1/admin |
Orphaned namespace detection and cleanup |
| Clusters | /api/v1/clusters |
Multi-cluster registration, health, test-connection |
| Shared Values | /api/v1/clusters/:id/shared-values |
Per-cluster shared Helm values |
| Cleanup Policies | /api/v1/admin/cleanup-policies |
Cron-based cleanup policy management |
| Analytics | /api/v1/analytics |
Usage overview, template stats, user stats |
| Favorites | /api/v1/favorites |
User bookmark management |
| Quick Deploy | /api/v1/templates/:id/quick-deploy |
One-click template deployment |
| Health | /health/* |
Liveness + readiness |
Key environment variables (see docker-compose.yml for full list):
| Variable | Required | Description |
|---|---|---|
JWT_SECRET |
Yes | JWT signing secret (min 16 chars) |
ADMIN_PASSWORD |
Yes | Initial admin password |
AZURE_DEVOPS_PAT |
No | Azure DevOps personal access token |
GITLAB_TOKEN |
No | GitLab access token |
DEFAULT_BRANCH |
No | Default Git branch (default: master) |
KUBECONFIG_ENCRYPTION_KEY |
No | Passphrase for deriving AES-256 key (SHA-256) to encrypt kubeconfig data at rest |
The Helm chart in helm/k8s-stack-manager/ deploys the full stack to Kubernetes using Argo Rollouts (canary strategy) and Traefik IngressRoute.
- Kubernetes cluster with
kubectlcontext configured - Helm 3+
- Argo Rollouts controller installed
- Traefik ingress controller with CRDs
Note: The Helm chart requires
backend.secrets.JWT_SECRETat render time. You must provide this value via--setor theJWT_SECRETenv var before running lint/install.
# Lint the chart
make helm-lint
# Install (JWT_SECRET env var required)
JWT_SECRET=my-secret-at-least-16-chars make helm-install
# Or install with custom values directly
helm install k8s-stack-manager helm/k8s-stack-manager \
--namespace k8s-stack-manager --create-namespace \
--set backend.secrets.JWT_SECRET=my-secret-at-least-16-chars \
--set ingress.host=stacks.example.com
# Upgrade after changes
JWT_SECRET=my-secret-at-least-16-chars make helm-upgrade
# Uninstall
make helm-uninstall- Backend β Argo Rollout (canary 20%β50%β80%) with stable + canary services
- Frontend β Argo Rollout with nginx serving the React SPA
- Traefik IngressRoute β Routes
/api/*βbackend,/wsβbackend,/βfrontend - Traefik Middleware β StripPrefix for
/api, secure response headers
See helm/k8s-stack-manager/values.yaml for all configurable values.
make test # All unit tests
make test-backend-all # Backend unit + integration
make test-e2e # Playwright end-to-end
cd backend && make test-coverage # Coverage report (80% threshold)See LICENSE.





