A developmentKubernetes networkfor proving change before production.
KuberTech.dev is the development view of the same KuberTech network: the place Kubernetes, automation and GitOps changes are worked through before production is updated.
It keeps experimentation useful rather than reckless: realistic services, familiar boundaries, controlled blast radius and a record of what was promoted, tightened or rejected.
KuberTech is the public face of a real Kubernetes platform, not a throwaway demo.
Simon Oakes has been building and running networks since 1997, starting with small private LANs at a time when UK internet access was still mostly dial-up, expensive and bandwidth-limited. Today the wider environment spans virtualised and co-located systems across datacentres, runs useful services and gives new tools a realistic place to prove themselves. This site turns that operating model into something public, reviewable and safe to share.
soakes@uk
From hands-on network building in 1997 to Kubernetes platform engineering.
KuberTech is the public slice of the development network Simon Oakes uses today to operate useful services, research new technology and keep Linux, Kubernetes, networking, automation and recovery skills grounded in practical infrastructure.
It is a controlled slice of a larger environment used for real services, research and long-running practice across Kubernetes, Linux, networking, automation and recovery.
1997 to now
Long-running practice
That path started with small private LANs in the dial-up era, when reliable local networking was the practical way to connect systems and move data. It grew into a datacentre-hosted development platform, keeping learning tied to real systems instead of throwaway examples.
real services
Production discipline
Services are operated with the same habits expected at work: clear ownership, controlled exposure, repeatable change, maintenance windows and recovery paths.
reviewed desired state
GitOps control
Argo CD reconciles reviewed application state from Git, with automated prune and self-heal policies used to keep drift visible and correctable.
ISP roots
Network and edge depth
DNS, routing, VPNs, mail, ingress, certificates and edge connectivity are treated as part of the platform, not as detached service plumbing.
less manual drift
Automation muscle
Ingress, certificates, secret sync, storage, runners, maintenance and upgrades are handled as repeatable platform capabilities rather than manual cluster chores.
designed to fix
Recovery judgement
Vault snapshots, unseal automation, controlled reboots and k3s upgrade plans keep failure handling and maintenance visible before pressure arrives.
03development network
The .dev site is where change is developed before it reaches production.
KuberTech.dev shows the development side of the environment: what is being tested, how promotion works, which guardrails stay in place and what has recently changed.
current development work
Production and development split
promoted
The same codebase now supports two clear roles: kubertech.io is production, while kubertech.dev is the development environment used to work through change.
Build matrix coverage
promoted
Both site variants are built and validated together so the production and development narratives cannot drift silently.
Image updater policies
watching
Selected workloads use Image Updater boundaries that can be observed in development before production automation is allowed to change behaviour.
Platform upgrade path
validating
k3s upgrade and maintenance automation is kept visible so sequencing, recovery and operator impact can be checked before production is touched.
Ingress and certificate flow
ready for production
Routing, TLS material and Cloudflare edge connectivity are validated together because they operate, and fail, as a system rather than isolated manifests.
promotion flow
01
Declare
Describe the change in a base application, development overlay, AppProject boundary or automation policy before it becomes cluster state.
02
Reconcile
Let Argo CD apply the development state and check the result against real platform services, not a throwaway example environment.
03
Observe
Review routing, secrets, storage, runner behaviour and maintenance impact before calling the change safe enough to promote.
04
Promote
Move the equivalent change into production only after the development environment has proved the path and exposed the operational consequences.
05
Record
Keep a short note of what changed, what was learned and whether the pattern should be reused, tightened or avoided.
guardrails that stay on
Same production-style boundaries
Development uses the same AppProjects, namespace boundaries and explicit repository sources as production, so testing happens inside realistic constraints.
No secret exposure
Secrets remain externalised and are never exposed through the public site, generated output or repository content.
Controlled failure
Development can expose failed approaches, but drift, hidden changes and unclear rollback paths are not allowed to become normal operating behaviour.
recent change notes
2026-06-08
promoted
Separate production and development narratives
KuberTech.io now presents the production network view while KuberTech.dev explains the development environment, guardrails and promotion flow.
2026-06-08
promoted
Validate both site variants
The build and validation path checks both production and development variants so the paired-domain model stays intentional.
2026-06-08
watching
Review public workload wording
Internal-facing workloads are described by purpose and access expectation so the site reads as controlled operation, not accidental exposure.
04managed applications
The inventory is organised by operational responsibility.
kubertech.dev groups Kubernetes applications by the role they play in the platform: workloads, ingress, certificates, secrets, storage, CI/CD runners and maintenance automation. The useful signal is not the manifest count; it is whether the operating model is easy to reason about and safe to change.
app
User workloads
Click to inspect grouped applicationsShowing grouped applications
8 appsToggle category
squid
namespace/squid
workload
policy
GitOps
scope
Bounded
wave
0
Caching forward proxy used for controlled network egress and development traffic patterns.
project
squid
source
squid-appify-k8s
path
overlays/<env>
exposure
internal service
proddevautomated pruneself-heal
vaultwarden
namespace/vaultwarden
workload
policy
GitOps
scope
Bounded
wave
0
Self-hosted password vault workload operated with private access, clear routing expectations and backup consideration.
project
vaultwarden
source
vaultwarden-appify-k8s
path
overlays/<env>
exposure
controlled routed workload
proddevautomated pruneself-heal
vlmcsd
namespace/vlmcsd
workload
policy
GitOps
scope
Bounded
wave
0
Internal licence activation workload for authorised development systems inside the wider network.
project
vlmcsd
source
vlmcsd-appify-k8s
path
overlays/<env>
exposure
internal-only service
proddevautomated pruneself-heal
phpipam
namespace/phpipam
workload
policy
GitOps
scope
Bounded
wave
0
IP address management workload for network records and address planning across the development network.
project
phpipam
source
phpipam-appify-k8s
path
overlays/<env>
exposure
routed workload
proddevautomated pruneself-heal
speedtest-tracker
namespace/speedtest-tracker
workload
policy
GitOps
scope
Bounded
wave
0
Internet performance monitoring workload used to track network behaviour over time.
project
speedtest-tracker
source
speedtest-tracker-appify-k8s
path
overlays/<env>
exposure
routed workload
proddevautomated pruneself-heal
termbin
namespace/termbin
workload
policy
GitOps
scope
Bounded
wave
0
Terminal-friendly paste service for controlled operator handoff and short-lived diagnostic notes.
project
termbin
source
termbin-appify-k8s
path
overlays/<env>
exposure
controlled routed workload
proddevautomated pruneself-heal
transfer
namespace/transfer
workload
policy
GitOps
scope
Bounded
wave
0
Command-line file handoff service used inside the wider network with controlled access expectations.
project
transfer
source
transfer-appify-k8s
path
overlays/<env>
exposure
controlled routed workload
proddevautomated pruneself-heal
ninerouter
namespace/ninerouter
workload
policy
GitOps
scope
Bounded
wave
0
Routed AI access service with image guard automation and controlled promotion expectations.
project
ninerouter
source
ninerouter-appify-k8s
path
overlays/<env>
exposure
routed workload
proddevautomated pruneself-heal
net
Networking and edge
Click to inspect grouped applicationsShowing grouped applications
4 appsToggle category
cloudflare
namespace/cloudflare
networking
policy
GitOps
scope
Bounded
wave
0
Cloudflare edge connectivity for controlled ingress into the KuberTech network.
project
cloudflare
source
cloudflare-appify-k8s
path
base app patched by overlays/<env>
exposure
edge connectivity
proddevautomated pruneself-heal
metallb-crds
namespace/metallb-system
networking
policy
GitOps
scope
Bounded
wave
0
Installs MetalLB custom resources ahead of the controller so load-balancer state has a reliable API surface.
project
metallb
source
metallb-crds-appify-k8s
path
base/apps/metallb-crds.yaml
exposure
cluster internal
proddevautomated pruneself-heal
metallb
namespace/metallb-system
networking
policy
GitOps
scope
Bounded
wave
0
Provides load-balancer IP allocation for services inside the Kubernetes network.
project
metallb
source
MetalLB Helm chart
path
base app patched by overlays/<env>
exposure
cluster networking
proddevautomated pruneself-heal
traefik
namespace/kube-system
networking
policy
GitOps
scope
Bounded
wave
0
Ingress routing layer for HTTP and TCP services, separated from TLS material and edge policy.
project
traefik
source
traefik chart + traefik-appify-k8s
path
charts/traefik/<env>/values.yaml
exposure
ingress edge
proddevautomated pruneself-heal
sec
Secrets and certificates
Click to inspect grouped applicationsShowing grouped applications
4 appsToggle category
external-secrets
namespace/external-secrets
secrets
policy
GitOps
scope
Bounded
wave
1
Synchronises external secret material into Kubernetes namespaces without publishing sensitive values in Git.
project
external-secrets
source
external-secrets Helm chart
path
base/apps/external-secrets.yaml
exposure
cluster internal
proddevautomated pruneself-heal
reflector
namespace/reflector
secrets
policy
GitOps
scope
Bounded
wave
2
Reflects selected secrets and config maps into target namespaces where shared platform material is required.
project
reflector
source
reflector Helm chart
path
base app patched by overlays/<env>
exposure
cluster internal
proddevautomated pruneself-heal
cert-manager
namespace/cert-manager
secrets
policy
GitOps
scope
Bounded
wave
0
Automates certificate resources and lifecycle management for services inside the cluster.
project
cert-manager
source
cert-manager chart + cert-manager-appify-k8s
path
overlays/<env>
exposure
cluster internal
proddevautomated pruneself-heal
traefik-tls
namespace/external-secrets
secrets
policy
GitOps
scope
Bounded
wave
4
Creates the TLS secret material consumed by Traefik routes without coupling certificates directly to ingress configuration.
project
external-secrets
source
traefik-tls-appify-k8s
path
overlays/<env>
exposure
TLS support
proddevautomated pruneself-heal
ci
CI/CD runners
Click to inspect grouped applicationsShowing grouped applications
2 appsToggle category
ci
github-actions-runners
cicd
Self-hosted GitHub Actions runners for trusted automation jobs close to the platform.
policyGitOpsscopeBoundedwave0
namespace
github-actions-runners
project
github-actions-runners
exposure
cluster internal
source
github-actions-runner-appify-k8s
ci
gitlab-runner
cicd
GitLab runner fleet for pipeline work that benefits from being close to the Kubernetes platform.
policyGitOpsscopeBoundedwave0
namespace
gitlab
project
gitlab-runner
exposure
cluster internal
source
gitlab-runner chart + gitlab-runner-appify-k8s
pvc
Storage
Click to inspect grouped applicationsShowing grouped applications
1 appsToggle category
pvc
nfs-subdir-external-provisioner
storage
Dynamic NFS-backed persistent volume provisioning for workloads that need shared storage.
Click to inspect grouped applicationsShowing grouped applications
4 appsToggle category
kured
namespace/kube-system
maintenance
policy
GitOps
scope
Bounded
wave
5
Coordinates node reboots inside a defined maintenance window so patching remains predictable.
project
kured
source
kured Helm chart
path
base/apps/kured.yaml
exposure
cluster internal
proddevautomated pruneself-heal
vault-unseal
namespace/vault-unseal
maintenance
policy
GitOps
scope
Bounded
wave
0
Automates Vault unseal operations so the platform secret backend has a recoverable operating path.
project
vault-unseal
source
vault-unseal chart + vault-unseal-appify-k8s
path
charts/vault-unseal/<env>/values.yaml
exposure
cluster internal
proddevautomated pruneself-heal
vault-raft-snapshot-agent
namespace/vault-raft-snapshot-agent
maintenance
policy
GitOps
scope
Bounded
wave
0
Captures Vault raft snapshots so backup and recovery posture is part of normal operations.
project
vault-raft-snapshot-agent
source
vault-raft-snapshot-agent-appify-k8s
path
overlays/<env>
exposure
cluster internal
proddevautomated pruneself-heal
system-upgrade
namespace/system-upgrade
maintenance
policy
GitOps
scope
Bounded
wave
0
System Upgrade Controller for automated k3s upgrade plans and repeatable node maintenance.
project
system-upgrade
source
system-upgrade-appify-k8s
path
overlays/<env>
exposure
cluster internal
proddevautomated pruneself-heal
api
Platform APIs
Click to inspect grouped applicationsShowing grouped applications
1 appsToggle category
api
metrics
platform
Provides Kubernetes resource metrics used for scheduling, checks and day-to-day platform visibility.
policyGitOpsscopeBoundedwave3
namespace
kube-system
project
metrics-server
exposure
cluster internal
source
metrics-server Helm chart
05reconciliation model
Argo CD boundaries make the operating contract visible.
The development plane is represented through Argo CD Applications, AppProjects, Image Updater policies and storage resources so repository access, namespaces and automation scope are clear before anything reaches the cluster.
Core services are treated as platform capabilities.
Ingress, certificates, secrets, load balancing, storage, maintenance and build runners are separated into service groups so each capability has a clear purpose, boundary and recovery expectation.
networking
Ingress edge
3 apps
Traefik handles cluster routing, TLS material is reconciled separately, and Cloudflare provides the controlled external edge path.
traefiktraefik-tlscloudflare
secrets
Certificate and secret flow
3 apps
Certificate resources, external secret sync and namespace reflection are managed as first-class platform services rather than ad-hoc workload details.
cert-managerexternal-secretsreflector
networking
Load balancing
2 apps
MetalLB CRDs and controller state are split so the controller reconciles only after its API surface is present.
metallb-crdsmetallb
storage
Storage provisioning
1 apps
NFS-backed dynamic provisioning supplies persistent volumes for workloads that need shared storage without hand-built volume steps.
nfs-subdir-external-provisioner
maintenance
Operational maintenance
4 apps
Reboots, k3s upgrade plans, Vault unseal and Vault raft snapshots are managed through GitOps-controlled applications so recovery work is visible.
Self-hosted GitHub and GitLab runners keep automation close to the platform while remaining declared, bounded and GitOps-managed.
github-actions-runnersgitlab-runner
07gitops workflow
The repository layout is part of how the platform is operated.
Base applications, environment overlays, AppProjects and automation policies are split deliberately so changes can be reviewed, constrained, reconciled and promoted without relying on memory or manual cluster work.
Promotion model
dev overlay before prod overlay
Development and production sides use the same application model, giving platform and workload changes a repeatable path from testing to release.
Sync policy
automated prune + self-heal
Automated reconciliation keeps the cluster aligned to reviewed Git state, including pruning obsolete resources and self-healing configuration drift.
step 01
Declare
Applications and AppProjects are versioned in apps-appify-k8s under shared base and environment overlay paths.
step 02
Constrain
AppProjects limit each app to explicit source repositories, namespaces and cluster permissions before reconciliation starts.
step 03
Reconcile
Argo CD applies desired state with automated prune and self-heal enabled across the app set.
step 04
Promote
The development overlay proves platform and workload changes before the same operating model moves to production.
base/apps
Shared Argo CD Applications used by both production and development environments so common platform behaviour is defined once.
overlays/prod/apps
Production application resources and patches for the public network view.
overlays/dev/apps
Development application resources and patches for testing before production promotion.
overlays/*/projects
AppProject boundaries for allowed repositories, namespaces and cluster resources.
overlays/*/argocd
Argo CD Image Updater write-back policies for selected workloads where image automation is intentionally bounded.
overlays/*/storage
Storage provider Applications kept separate from normal workload apps so persistence concerns are easy to review.