fluxcd-reconciler, env creator calling it every 30 sec to sync the cluster
diff --git a/core/installer/app.go b/core/installer/app.go
index 511f1a4..85f1cba 100644
--- a/core/installer/app.go
+++ b/core/installer/app.go
@@ -114,6 +114,7 @@
 		CreateResourceRendererController(valuesTmpls, tmpls),
 		CreateHeadscaleController(valuesTmpls, tmpls),
 		CreateDNSZoneManager(valuesTmpls, tmpls),
+		CreateFluxcdReconciler(valuesTmpls, tmpls),
 	}
 	for _, a := range CreateStoreApps() {
 		ret = append(ret, a.App)
@@ -577,6 +578,22 @@
 	}
 }
 
+func CreateFluxcdReconciler(fs embed.FS, tmpls *template.Template) App {
+	schema, err := fs.ReadFile("values-tmpl/fluxcd-reconciler.jsonschema")
+	if err != nil {
+		panic(err)
+	}
+	return App{
+		"fluxcd-reconciler",
+		[]string{"fluxcd-reconciler"},
+		[]*template.Template{
+			tmpls.Lookup("fluxcd-reconciler.yaml"),
+		},
+		string(schema),
+		tmpls.Lookup("fluxcd-reconciler.md"),
+	}
+}
+
 type httpAppRepository struct {
 	apps []StoreApp
 }
diff --git a/core/installer/bootstrapper.go b/core/installer/bootstrapper.go
index 94c1e2d..e3331c4 100644
--- a/core/installer/bootstrapper.go
+++ b/core/installer/bootstrapper.go
@@ -88,6 +88,10 @@
 	if err := b.installDNSZoneManager(ss, repoIO, nsGen, b.ns, env); err != nil {
 		return err
 	}
+	fmt.Println("Installing Fluxcd Reconciler")
+	if err := b.installFluxcdReconciler(ss, repoIO, nsGen, b.ns, env); err != nil {
+		return err
+	}
 	fmt.Println("Installing env manager")
 	if err := b.installEnvManager(ss, repoIO, nsGen, b.ns, env); err != nil {
 		return err
@@ -555,6 +559,34 @@
 	return nil
 }
 
+func (b Bootstrapper) installFluxcdReconciler(ss *soft.Client, repo RepoIO, nsGen NamespaceGenerator, nsCreator NamespaceCreator, env EnvConfig) error {
+	appRepo := NewInMemoryAppRepository(CreateAllApps())
+	app, err := appRepo.Find("fluxcd-reconciler")
+	if err != nil {
+		return err
+	}
+	ns, err := nsGen.Generate(app.Namespaces[0])
+	if err != nil {
+		return err
+	}
+	if err := nsCreator.Create(ns); err != nil {
+		return err
+	}
+	derived := Derived{
+		Global: Values{
+			PCloudEnvName: env.Name,
+		},
+		Values: map[string]any{},
+		Release: Release{
+			Namespace: ns,
+		},
+	}
+	if err := repo.InstallApp(*app, filepath.Join("/infrastructure", app.Name), derived.Values, derived); err != nil {
+		return err
+	}
+	return nil
+}
+
 type HelmActionConfigFactory interface {
 	New(namespace string) (*action.Configuration, error)
 }
diff --git a/core/installer/tasks/env.go b/core/installer/tasks/env.go
index 2dd8da5..f5cc0c7 100644
--- a/core/installer/tasks/env.go
+++ b/core/installer/tasks/env.go
@@ -1,7 +1,10 @@
 package tasks
 
 import (
+	"fmt"
 	"net"
+	"net/http"
+	"time"
 
 	"github.com/charmbracelet/keygen"
 
@@ -47,7 +50,7 @@
 		nsCreator: nsCreator,
 		repo:      repo,
 	}
-	return newSequentialParentTask(
+	t := newSequentialParentTask(
 		"Create env",
 		append(
 			[]Task{
@@ -57,5 +60,26 @@
 			},
 			SetupInfra(env, &st)...,
 		)...,
-	), DNSZoneRef{"dns-zone", env.Name}
+	)
+	done := make(chan struct{})
+	t.OnDone(func(_ error) {
+		close(done)
+	})
+	go reconcile(fmt.Sprintf("%s-flux", env.PCloudEnvName), done)
+	go reconcile(env.Name, done)
+	return t, DNSZoneRef{"dns-zone", env.Name}
+}
+
+func reconcile(name string, quit chan struct{}) {
+	git := fmt.Sprintf("http://fluxcd-reconciler.dodo-fluxcd-reconciler.svc.cluster.local/source/git/%s/%s/reconcile", name, name)
+	kust := fmt.Sprintf("http://fluxcd-reconciler.dodo-fluxcd-reconciler.svc.cluster.local/kustomization/%s/%s/reconcile", name, name)
+	for {
+		select {
+		case <-time.After(30 * time.Second):
+			http.Get(git)
+			http.Get(kust)
+		case <-quit:
+			return
+		}
+	}
 }
diff --git a/core/installer/values-tmpl/fluxcd-reconciler.jsonschema b/core/installer/values-tmpl/fluxcd-reconciler.jsonschema
new file mode 100644
index 0000000..4a7c07d
--- /dev/null
+++ b/core/installer/values-tmpl/fluxcd-reconciler.jsonschema
@@ -0,0 +1,5 @@
+{
+  "type": "object",
+  "properties": {},
+  "additionalProperties": false
+}
diff --git a/core/installer/values-tmpl/fluxcd-reconciler.md b/core/installer/values-tmpl/fluxcd-reconciler.md
new file mode 100644
index 0000000..f31c256
--- /dev/null
+++ b/core/installer/values-tmpl/fluxcd-reconciler.md
@@ -0,0 +1 @@
+Installs gateway to Fluxcd API
diff --git a/core/installer/values-tmpl/fluxcd-reconciler.yaml b/core/installer/values-tmpl/fluxcd-reconciler.yaml
new file mode 100644
index 0000000..d749a7d
--- /dev/null
+++ b/core/installer/values-tmpl/fluxcd-reconciler.yaml
@@ -0,0 +1,15 @@
+apiVersion: helm.toolkit.fluxcd.io/v2beta1
+kind: HelmRelease
+metadata:
+  name: fluxcd-reconciler
+  namespace: {{ .Release.Namespace }}
+spec:
+  chart:
+    spec:
+      chart: charts/fluxcd-reconciler
+      sourceRef:
+        kind: GitRepository
+        name: pcloud
+        namespace: {{ .Global.Id }}
+  interval: 1m0s
+  values: