Run your own instance on any Kubernetes cluster. One all-in-one Helm chart brings up the whole platform โ app, database, object storage and auth โ with no required operators, so it works on a laptop (kind), a Raspberry Pi 5 cluster, or a homelab.
The chart is self-contained โ it bundles everything Grown needs so a fresh cluster becomes a working workspace:
Everything is plain Kubernetes objects, arm64-friendly, with sensible defaults that come up out of the box on kind.
The simplest path. Requires a Kubernetes cluster and helm.
# clone the repo (the chart lives in deploy/helm/grown)
git clone https://github.com/grown-platform/grown.git
cd grown
# install everything into the "grown" namespace
helm install grown deploy/helm/grown \
-n grown --create-namespace \
--set domain=grown.example.com
That's it โ Postgres, MinIO, Zitadel (with the OIDC app provisioned) and grown all
come up. Watch it with kubectl -n grown get pods -w; grown is ready when
/healthz returns 200. The default admin is printed in the install notes.
| Value | Default | What it does |
|---|---|---|
domain | โ | Public hostname (required). |
ingress.type | ingress | ingress (plain), httproute (Gateway API), or none. |
auth.mode | bundled | bundled Zitadel, or external against your own OIDC issuer. |
adminEmails | โ | Comma-separated super-admin allowlist. |
storageClass | cluster default | PVC storage class (e.g. local-path, longhorn). |
postgres.externalDsn | โ | Use an external/managed Postgres instead of the bundled one. |
minio.external.endpoint | โ | Use an external S3 (rustfs/MinIO/cloud) instead of the bundled one. |
image.tag | pinned | grown image tag. |
bolo.enabled | false | Run the Bolo multiplayer sidecar. |
See values.yaml for the full list, and the chart README for production guidance.
auth.mode=external
at an already-exposed issuer). The app, /healthz and the OIDC client
provisioning all work regardless; this only affects the interactive login redirect.
kubectl apply)No Helm? Apply the pre-rendered all-in-one manifest.
# edit the hostname/values in the file first, then:
kubectl create namespace grown
kubectl apply -n grown -f deploy/manifests/grown.yaml
deploy/manifests/grown.yaml is rendered from the same chart. To customise it,
re-render with your own values:
helm template grown deploy/helm/grown -n grown \
--set domain=grown.example.com > my-grown.yaml
kubectl apply -n grown -f my-grown.yaml
kindTry the whole platform on your laptop in a throwaway cluster. Requires
kind, kubectl and helm
(Docker/Podman under the hood). This is the exact path the chart is smoke-tested on.
kind create cluster --name grown
helm install grown deploy/helm/grown \
-n grown --create-namespace \
--set domain=grown.local --set ingress.type=none
# wait for grown, then reach it via a port-forward
kubectl -n grown rollout status deploy/grown
kubectl -n grown port-forward svc/grown 8080:8080
# open http://localhost:8080/healthz -> 200
kind delete cluster --name grown.Grown runs well on a small arm64 Pi 5 cluster โ the app itself is a lightweight Go binary. Recommended: 3โ4ร Pi 5 (16 GB) with NVMe (the M.2 HAT), not SD cards.
image.tag to an arm64-built grown tag.local-path or Longhorn for Postgres I/O and S3 blobs โ set --set storageClass=longhorn. Avoid SD cards.helm install grown deploy/helm/grown \
-n grown --create-namespace \
--set domain=grown.example.com \
--set storageClass=longhorn \
--set image.tag=<arm64-tag>
A single 16 GB Pi 5 can host core grown for a household; a 3โ4 node cluster comfortably runs grown plus heavier add-ons (mail, photos) for a small team.
Hit a snag installing, or want docs for a specific platform (k3s, Talos, a managed cloud)? Open an issue and we'll get it grown ๐ฑ.
Open an issue