diff --git a/.sops.yaml b/.sops.yaml
index 912dddbd06d9c2c2c305a09ffba17fd8b1671c8d..0957a2f8d6639afa4599837369d0b6272e514433 100644
--- a/.sops.yaml
+++ b/.sops.yaml
@@ -1,4 +1,9 @@
 creation_rules:
+  - path_regex: shared/components/.*secret.yaml
+    encrypted_regex: ^(stringData)$
+    pgp: >-
+      286791FB6648539775DB31B8FCB98C2A3EC6F601,
+      B137EE1549DFAF960DD1E2B15147025FB9F09E07
   - path_regex: shared/applications/.*.yaml
     encrypted_regex: ^(stringData)$
     pgp: >-
diff --git a/apps/base/forecastle/kustomization.yaml b/apps/base/forecastle/kustomization.yaml
index 0c988e077090d1cad353e1e19d07a0951bd9a31a..7e377b974e5f724c10b177d78184cd4283e85354 100644
--- a/apps/base/forecastle/kustomization.yaml
+++ b/apps/base/forecastle/kustomization.yaml
@@ -10,7 +10,3 @@ resources:
 
 commonLabels:
   app: forecastle
-
-components:
-  - ../../../shared/components/flux-namespace-admin
-  - ../../../shared/components/namespace-baseline
\ No newline at end of file
diff --git a/apps/k8s01/forecastle/kustomization.yaml b/apps/k8s01/forecastle/kustomization.yaml
index e22854b47738d084408649eef0c9ded1962d03a2..2594b1594a712f3084292d4059f07f291ac6b132 100644
--- a/apps/k8s01/forecastle/kustomization.yaml
+++ b/apps/k8s01/forecastle/kustomization.yaml
@@ -1,12 +1,21 @@
 apiVersion: kustomize.config.k8s.io/v1beta1
 kind: Kustomization
 namespace: forecastle
+
+commonLabels:
+  app.kubernetes.io/name: forecastle
+  app.kubernetes.io/instance: fmd
+
 resources:
   - ../../base/forecastle
   - certificate.yaml
   - forecastle-values.yaml
-  - ../../../shared/applications/oauth2-proxy.yaml
   - oauth2.yaml
   - pdb.yaml
   - slo.yaml
   - ../../../shared/resourcequotas/default.yaml
+
+components:
+  - ../../../shared/components/namespace-baseline
+  - ../../../shared/components/oauth2-proxy
+  - ../../../shared/components/flux-namespace-admin
\ No newline at end of file
diff --git a/shared/components/oauth2-proxy/configmap.yaml b/shared/components/oauth2-proxy/configmap.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..94e1ec95d4a794316968b1a04d4061f540c8c989
--- /dev/null
+++ b/shared/components/oauth2-proxy/configmap.yaml
@@ -0,0 +1,33 @@
+---
+apiVersion: v1
+kind: ConfigMap
+metadata:
+    name: oauth2-proxy-base-values
+    labels:
+      app.kubernetes.io/component: oauth2-proxy
+data:
+    values.yaml: |
+        extraArgs:
+          silence-ping-logging: "true"
+          scope: openid email profile
+          oidc-groups-claim: memberof
+          code-challenge-method: 'S256'
+        replicaCount: 2
+        securityContext:
+          enabled: true
+        resources:
+            limits:
+                cpu: 200m
+                memory: 100Mi
+            requests:
+                cpu: 100m
+                memory: 25Mi
+        topologySpreadConstraints:
+          - maxSkew: 1
+            topologyKey: kubernetes.io/hostname
+            whenUnsatisfiable: DoNotSchedule
+            labelSelector:
+              matchLabels:
+                app: oauth2-proxy
+            matchLabelKeys:
+              - pod-template-hash
\ No newline at end of file
diff --git a/shared/components/oauth2-proxy/kustomization.yaml b/shared/components/oauth2-proxy/kustomization.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..a92d7e6dd88ef6b3ee8ac2b6aa6679556c86d065
--- /dev/null
+++ b/shared/components/oauth2-proxy/kustomization.yaml
@@ -0,0 +1,9 @@
+apiVersion: kustomize.config.k8s.io/v1alpha1
+kind: Component
+
+resources:
+  - configmap.yaml
+  - secret.yaml
+  - repository.yaml
+  - release.yaml
+  - networkpolicy.yaml
\ No newline at end of file
diff --git a/shared/components/oauth2-proxy/networkpolicy.yaml b/shared/components/oauth2-proxy/networkpolicy.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..c47fe9849ac40eb8ea0d9ce7cceaba370745f122
--- /dev/null
+++ b/shared/components/oauth2-proxy/networkpolicy.yaml
@@ -0,0 +1,21 @@
+---
+apiVersion: networking.k8s.io/v1
+kind: NetworkPolicy
+metadata:
+  name: allow-ingress-to-oauth2
+  labels:
+    app.kubernetes.io/component: oauth2-proxy
+spec:
+  podSelector:
+    matchExpressions:
+      - key: app
+        operator: In
+        values:
+          - oauth2-proxy
+    matchLabels: {}
+  ingress:
+    - from:
+      - namespaceSelector:
+          matchLabels:
+            ingress.shivering-isles.com/network-access-required: "true"
+
diff --git a/shared/components/oauth2-proxy/release.yaml b/shared/components/oauth2-proxy/release.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..68b94cdf6889688d4b1ea2b55f993fd8c57906dd
--- /dev/null
+++ b/shared/components/oauth2-proxy/release.yaml
@@ -0,0 +1,34 @@
+---
+apiVersion: helm.toolkit.fluxcd.io/v2beta1
+kind: HelmRelease
+metadata:
+    name: oauth2-proxy
+    labels:
+      app.kubernetes.io/component: oauth2-proxy
+spec:
+  releaseName: oauth2-proxy
+  chart:
+    spec:
+      chart: oauth2-proxy
+      sourceRef:
+          kind: HelmRepository
+          name: oauth2-proxy
+      # renovate: datasource=helm depName=oauth2-proxy registryUrl=https://oauth2-proxy.github.io/manifests
+      version: 6.23.1
+  interval: 5m
+  install:
+    remediation:
+      retries: 5
+  upgrade:
+    remediation:
+      retries: 5
+  valuesFrom:
+    - kind: ConfigMap
+      name: oauth2-proxy-base-values
+      valuesKey: values.yaml
+    - kind: Secret
+      name: oauth2-proxy-common-values
+      valuesKey: values.yaml
+    - kind: Secret
+      name: oauth2-proxy-override-values
+      valuesKey: values-overrides.yaml
\ No newline at end of file
diff --git a/shared/components/oauth2-proxy/repository.yaml b/shared/components/oauth2-proxy/repository.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..fb3f3e027a4efa18e00baf95d221bc6e7e14da91
--- /dev/null
+++ b/shared/components/oauth2-proxy/repository.yaml
@@ -0,0 +1,9 @@
+apiVersion: source.toolkit.fluxcd.io/v1beta1
+kind: HelmRepository
+metadata:
+    name: oauth2-proxy
+    labels:
+      app.kubernetes.io/component: oauth2-proxy
+spec:
+    interval: 30m
+    url: https://oauth2-proxy.github.io/manifests
\ No newline at end of file
diff --git a/shared/components/oauth2-proxy/secret.yaml b/shared/components/oauth2-proxy/secret.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..1b5dc6a4e2382d49c901c1450d03bf60ae4ed1a5
--- /dev/null
+++ b/shared/components/oauth2-proxy/secret.yaml
@@ -0,0 +1,60 @@
+apiVersion: v1
+kind: Secret
+metadata:
+    name: oauth2-proxy-common-values
+    labels:
+      app.kubernetes.io/component: oauth2-proxy
+stringData:
+    values.yaml: ENC[AES256_GCM,data:e/0KprhgVZA3xvmkPleKFKsdjrhaFtKxZV6WcR5D+usFY4EjAMqQU8l7F1WwI9TToR5FJvE8WpdwOHQNxkrleEELXOC73PPK9h7EIJ9X9AQnAfQfeAlN7uW5Y1ClO6QQPXbG+A9dWw8axtlgBAhbsjgnkRRzkInYRZ+3/Bw11GCoDJuEsmUE9F+/yp+WMDAK,iv:2ODN4Hr59QOa8LHGbz5rjwtpjazj5+lJVmbVNMb19fg=,tag:PGJxywVMCdqTGmw7kRiiPQ==,type:str]
+sops:
+    kms: []
+    gcp_kms: []
+    azure_kv: []
+    hc_vault: []
+    age: []
+    lastmodified: "2024-01-29T01:19:56Z"
+    mac: ENC[AES256_GCM,data:DdWfX3V/M+cpR74W2IJF9NL82mI7L4Qdz7Akl0AN/pSZtdSS8r73FrJNe/I53HKD0kdsaA+H8ERRqEvs8tA10PqgjTMa4ejF+Bm56SOQTiZU8oSEPlSMirIMyxVbjMo3ijG18tNgxRLi5iW6RKgfPKXeRBPOdVfVpWG6NJhVktM=,iv:zyNJI9ZmuJXZ2U/4BP4IEkETOuiM5PZdI7UUiPrai/M=,tag:LIrbpGp7g7A3lOny370jOQ==,type:str]
+    pgp:
+        - created_at: "2024-01-29T01:19:56Z"
+          enc: |-
+            -----BEGIN PGP MESSAGE-----
+
+            wcFMA7kpg2bgzVHcAQ//dWZu1FM8PdaLI/pECsn34T+V+iWLQ8kQ3dbfz0Svhfri
+            rDwqcZLP7L8SKsnP5SaDRmBr7OfgvR6mwSlgJ5KrISevSeXm+Gqo/TG8jf8ry6mG
+            StWISlGahRFU1GeuciBAJ6hppSJCg2vk+VvI9CEHvPjqCBGjunxnGrUlrSRz4F0G
+            NifNuLejDJ+PBz7lZcVe17MoIi9FsdsaloONBh5Qa9V7RBNt5q5ZMIx9HG7gyd9Z
+            ZV7PToFEbbncAQwtoDGjPZTxV+jTZnejrnLySU+oYYxzpj73mBA7iNAaI816cNY6
+            +jfbj+JeguAY6WEZX+y/BXn+oaYHlL5ZwJbIwKQaoQRbxx+QKTtuKHcd3oJsmGr5
+            qfGoH6FmLTnLUfIIWJIYR45t5dnbvJTzRgKgTz3Oe2H6/H2uIvSeyv7JMXVsaNyF
+            0Bym3zLAVieKA+IC2YQsywu5wThl5oBNnaiClizqf5BGXvI7sz48H1A3TUXBjYaF
+            l9CosIXsBZtDMi/wxEGEjXQnfnvfc3y4SbtvOGE+E5m5WPYorR0FD3zAvh/BK26F
+            nAMlLD6h+uL/mzhH3QiYzKN/Ylx6jeSbvAGpBYVQ9DISRPDBGrvoPK8jrLVtj+fZ
+            4Hbn/PNJgfRKOvFIf85CvTBnTS0HsxNbJKucYL9XsYuWcGerWJeEy+OfsTMkuJ/S
+            UQHvweldOK7VHkI1tSSdNp3B8P8Yin1VGmr/qJgQlaEXtums/BDXKda2aYTYjQHk
+            WngEGNgVBaDZYyt3g2PkLWhInKmleZWIMKMKj+hSbAS9EQ==
+            =ztPR
+            -----END PGP MESSAGE-----
+          fp: 286791FB6648539775DB31B8FCB98C2A3EC6F601
+        - created_at: "2024-01-29T01:19:56Z"
+          enc: |
+            -----BEGIN PGP MESSAGE-----
+
+            hQIMA4oYbIHZIrAPARAAw+Cytg1mG36/wr9AHVF30V6zYKMzS7HKajj1Ia9Xt8ej
+            TGpHRSpscU2HwfX1SliEAtfe2Xnqupm65AVXQEeorRhj2axgTfaRYFBIEJDnTJzm
+            UZcndCf416GZIDDu5SF2u2c64WofnpMPV7okdaFvoPNRCZvavGytcYXcczMdV43E
+            Xdb8p66LbFRJuHbGsu3b0M5ylMuaIH2MQGr/KX3fPHij4ZhYaZ/hMRf0YCSf41sM
+            8aoA+Nkgkj/rn6AasSPoFezUNRI0BE7zg20TGcR3sMLIYE7y0Ds2cqa7BIujGcRB
+            pJJQj2VVJZDYpBo4KGiPnvtWNLQONvD5fj+4FKqOiY1moxvr+SYHjY1aMtuCdfmS
+            soPOmj646OBz9Al43TzD16+QBf/r8LzHp2r/ZXXZSAKUqC1e+2whqi2+VOXVk2Vn
+            SUXyDJY52oNX7kC+HnuoxUnsZuwfDRQT5mJG0oF0n0byFz4H3l58T6r3gaS2gzaY
+            AdI0Txv+ktnrJxqLYo4j5Yhq3nBFflMK76U08v6K2N3u0XuRABwbH/TFrdpnKJUA
+            OuJ8+nwgnh81i/yEuIKlKHWu/j9MYjCJSBsq+9TDmL6623uu1GLRj8LKEenClOwo
+            7Q9GNZmQ3qNGTMSs9j1kYCtE67RJJq4GreufffEz4InWFYdPkg5lCPFMPcY5xRvU
+            aAEJAhCQosWWWhg0VQuN+gAhwEFZnMZZsxyo3qpLvsirYuIrxtzVdJZvrRlshexh
+            1eCp0BLflopyp20Avl85QeP//NO/6BeZE6whf5KGsfBdzCh8uoV9/+yqCxYTWX0L
+            E0xLjP9XfzKh
+            =XKjJ
+            -----END PGP MESSAGE-----
+          fp: B137EE1549DFAF960DD1E2B15147025FB9F09E07
+    encrypted_regex: ^(stringData)$
+    version: 3.7.3