All checks were successful
Deploy KubeViz / deploy (push) Successful in 11s
KubeViz
No-Node Kubernetes manifest visualizer built with Go + server-rendered HTML (HTMX + Alpine.js).
Features
- Upload one or more Kubernetes manifest files, or paste YAML/JSON text
- Import manifests directly from a Git repository path
- Render Helm charts directly from Git repositories (
helm template) and visualize output - Parse multi-document manifests and
List.items - Visual graph with resource relationships and details panel
- Grouping/collapsing by namespace or kind
- Security and validation checks (privileged containers, missing limits/requests, unresolved refs, selector mismatch, duplicates)
- Configurable checks in UI (enable/disable individual rules)
- Manifest diff between base and target states
- Supported first-class resources:
- Deployment, StatefulSet, DaemonSet
- Service, Ingress
- ConfigMap, Secret
- PersistentVolumeClaim
- HorizontalPodAutoscaler
- Generic CRD/custom resource nodes
- Secret redaction (never exposes decoded secret values)
- Session-scoped in-memory dataset storage (no DB)
- SVG and PNG graph export endpoints
Run locally
go run ./cmd/server
Open http://localhost:8080.
Run locally with Docker
Build and run directly:
docker build -t kubeviz:local .
docker run --rm -p 8080:8080 \
-e ADDR=:8080 \
-e SESSION_TTL=30m \
-e MAX_UPLOAD_SIZE=5242880 \
-e COOKIE_SECURE=false \
-e LOG_LEVEL=info \
kubeviz:local
Optional Helm version override during build:
docker build --build-arg HELM_VERSION=v3.16.4 -t kubeviz:local .
Or with Compose:
docker compose up --build
Then open http://localhost:8080.
Environment variables
ADDR(default:8080)SESSION_TTL(default30m)MAX_UPLOAD_SIZE(bytes, default5242880)COOKIE_SECURE(true/false, defaulttrue)APP_CSP_ENABLED(true/false, defaulttrue) - disable when CSP is enforced by reverse proxyGIT_ALLOWED_HOSTS(CSV allowlist, defaultgithub.com,gitlab.com,bitbucket.org)LOG_LEVEL(defaultinfo)
API endpoints
POST /api/manifests/parsePOST /api/git/importPOST /api/helm/renderGET /api/graphPOST /api/diffGET /api/resources/{id}GET /api/export/svgGET /api/export/pngPOST /api/session/clear
Test
GOCACHE=$(pwd)/.gocache go test ./...
Deploy to Kubernetes
Manifests are in deploy/k8s/:
kubectl apply -f deploy/k8s/namespace.yaml
kubectl apply -f deploy/k8s/configmap.yaml
kubectl apply -f deploy/k8s/deployment.yaml
kubectl apply -f deploy/k8s/service.yaml
kubectl apply -f deploy/k8s/ingress.yaml
Notes
- The built-in YAML parser is dependency-free and optimized for common Kubernetes manifest structures.
- v1 scope is visualization only (no apply/edit back to cluster).
- Container images use
dhi.io/golang:1.26(builder and runtime) with a non-root runtime user. - Runtime image includes
gitandhelmfor Git/Helm import endpoints.
Deploy via Gitea (Podman + Quadlet on same VM)
- Workflow:
.gitea/workflows/deploy-kubeviz.yml - Script:
scripts/deploy-with-podman.sh
Pipeline flow:
- Build image locally on server with Podman
- Tag as
localhost/kubeviz:prod - Restart
kubeviz.service
Use this in your Quadlet:
Image=localhost/kubeviz:prod
Pull=never
Description
Languages
Go
51.6%
JavaScript
29.2%
CSS
9.2%
HTML
7.5%
Shell
2.1%
Other
0.4%