From 10ee1b51889b956fa5aa2f477c0625543e3e84ac Mon Sep 17 00:00:00 2001
From: Sergi Philipsen <philipsen.sergi@gmail.com>
Date: Thu, 23 Nov 2023 19:41:46 +0100
Subject: [PATCH] feat: add keywords and show them in frontend

also add github button
---
 charts/ff-common/Chart.yaml                   |   3 +
 charts/ff-common/values.yaml                  |   2 +-
 charts/ff-test/Chart.yaml                     |   3 +
 charts/ff-test/values.yaml                    |   2 +-
 charts/frank-framework/.helmignore            |  23 +
 charts/frank-framework/Chart.lock             |   6 +
 charts/frank-framework/Chart.yaml             |  13 +
 charts/frank-framework/README.md              | 172 ++++++++
 charts/frank-framework/icon.svg               |   5 +
 charts/frank-framework/templates/NOTES.txt    |  22 +
 .../frank-framework/templates/manifest.yaml   |  17 +
 charts/frank-framework/values.schema.json     | 413 ++++++++++++++++++
 charts/frank-framework/values.yaml            | 332 ++++++++++++++
 charts/frank2example/Chart.yaml               |   5 +-
 charts/frank2example/values.yaml              |   2 +-
 charts/frankframework/Chart.yaml              |   2 +-
 charts/frankframework/values.yaml             |   2 +-
 ff-template/Chart.lock                        |   4 +-
 ff-template/Chart.yaml                        |   4 +-
 ff-template/values.yaml                       |   2 +-
 frontend/pages/[name].vue                     | 111 +++--
 frontend/pages/index.vue                      |  72 +--
 22 files changed, 1130 insertions(+), 87 deletions(-)
 create mode 100644 charts/frank-framework/.helmignore
 create mode 100644 charts/frank-framework/Chart.lock
 create mode 100644 charts/frank-framework/Chart.yaml
 create mode 100644 charts/frank-framework/README.md
 create mode 100644 charts/frank-framework/icon.svg
 create mode 100644 charts/frank-framework/templates/NOTES.txt
 create mode 100644 charts/frank-framework/templates/manifest.yaml
 create mode 100644 charts/frank-framework/values.schema.json
 create mode 100644 charts/frank-framework/values.yaml

diff --git a/charts/ff-common/Chart.yaml b/charts/ff-common/Chart.yaml
index 43e42cb..cb50c75 100644
--- a/charts/ff-common/Chart.yaml
+++ b/charts/ff-common/Chart.yaml
@@ -5,3 +5,6 @@ version: 0.1.17
 appVersion: "7.8"
 home: https://frankframework.org
 icon: https://raw.githubusercontent.com/frankframework/charts/master/charts/ff-common/icon.svg
+
+keywords:
+  - library
\ No newline at end of file
diff --git a/charts/ff-common/values.yaml b/charts/ff-common/values.yaml
index 0281000..8f93d5d 100644
--- a/charts/ff-common/values.yaml
+++ b/charts/ff-common/values.yaml
@@ -12,7 +12,7 @@ fullnameOverride: ""
 ##
 
 ## Frank!Framework image
-## ref: https://https://nexus.frankframework.org/#browse/browse:frankframework-docker:v2%2Ffrankframework%2Ftags/
+## ref: https://nexus.frankframework.org/#browse/browse:frankframework-docker:v2%2Ffrankframework%2Ftags/
 ## @param image.registry Frank!Framework image registry
 ## @param image.repository Frank!Framework image repository
 ## @param image.tag Frank!Framework image tag (immutable tags are recommended)
diff --git a/charts/ff-test/Chart.yaml b/charts/ff-test/Chart.yaml
index 464ab03..d06baab 100644
--- a/charts/ff-test/Chart.yaml
+++ b/charts/ff-test/Chart.yaml
@@ -6,6 +6,9 @@ icon: https://raw.githubusercontent.com/frankframework/charts/master/charts/ff-t
 type: application
 version: 0.2.28
 
+keywords:
+  - e2e
+
 dependencies:
   - name: ff-common
     version: ~0.1.17
diff --git a/charts/ff-test/values.yaml b/charts/ff-test/values.yaml
index ca54f3d..e4b382d 100644
--- a/charts/ff-test/values.yaml
+++ b/charts/ff-test/values.yaml
@@ -12,7 +12,7 @@ fullnameOverride: ""
 ##
 
 ## Frank!Framework image
-## ref: https://https://nexus.frankframework.org/#browse/browse:frankframework-docker:v2%2Ffrankframework%2Ftags/
+## ref: https://nexus.frankframework.org/#browse/browse:frankframework-docker:v2%2Ffrankframework%2Ftags/
 ## @param image.registry Frank!Framework image registry
 ## @param image.repository Frank!Framework image repository
 ## @param image.tag Frank!Framework image tag (immutable tags are recommended)
diff --git a/charts/frank-framework/.helmignore b/charts/frank-framework/.helmignore
new file mode 100644
index 0000000..0e8a0eb
--- /dev/null
+++ b/charts/frank-framework/.helmignore
@@ -0,0 +1,23 @@
+# Patterns to ignore when building packages.
+# This supports shell glob matching, relative path matching, and
+# negation (prefixed with !). Only one pattern per line.
+.DS_Store
+# Common VCS dirs
+.git/
+.gitignore
+.bzr/
+.bzrignore
+.hg/
+.hgignore
+.svn/
+# Common backup files
+*.swp
+*.bak
+*.tmp
+*.orig
+*~
+# Various IDEs
+.project
+.idea/
+*.tmproj
+.vscode/
diff --git a/charts/frank-framework/Chart.lock b/charts/frank-framework/Chart.lock
new file mode 100644
index 0000000..5412b95
--- /dev/null
+++ b/charts/frank-framework/Chart.lock
@@ -0,0 +1,6 @@
+dependencies:
+- name: ff-common
+  repository: file://../ff-common
+  version: 0.1.17
+digest: sha256:353f8759953bd5fd67bd59a10d53622a7837c9cf1ac369c4d06bc221e41aadcb
+generated: "2023-11-21T10:37:52.443945524+01:00"
diff --git a/charts/frank-framework/Chart.yaml b/charts/frank-framework/Chart.yaml
new file mode 100644
index 0000000..7f3fcd5
--- /dev/null
+++ b/charts/frank-framework/Chart.yaml
@@ -0,0 +1,13 @@
+apiVersion: v2
+appVersion: "7.8"
+description: A Helm chart for running the Frank!Framework on Kubernetes
+name: frank-framework
+icon: https://raw.githubusercontent.com/frankframework/charts/master/charts/frank-framework/icon.svg
+type: application
+version: 0.2.9
+deprecated: true
+
+dependencies:
+  - name: ff-common
+    version: ~0.1.17
+    repository: file://../ff-common
diff --git a/charts/frank-framework/README.md b/charts/frank-framework/README.md
new file mode 100644
index 0000000..dee5dd6
--- /dev/null
+++ b/charts/frank-framework/README.md
@@ -0,0 +1,172 @@
+# 🔌Frank!Framework Chart
+
+This Helm Chart can be used for running the Frank!Framework on Kubernetes.
+
+The image should be replaced to include a configuration.
+
+## Usage
+
+[Helm](https://helm.sh) must be installed to use the charts.  Please refer to
+Helm's [documentation](https://helm.sh/docs) to get started.
+
+Once Helm has been set up correctly, add the repo as follows:
+
+```shell
+helm repo add frankframework https://frankframework.github.io/charts
+```
+
+If you had already added this repo earlier, run `helm repo update` to retrieve
+the latest versions of the packages.  You can then run `helm search repo
+frankframework` to see the charts.
+
+To install the frankframework chart:
+
+```shell
+helm install my-frank-framework frankframework/frank-framework
+```
+
+To uninstall the chart:
+
+```shell
+helm delete my-frank-framework
+```
+
+## Parameters
+
+### Common parameters
+
+| Name               | Description                                                                                  | Value |
+| ------------------ | -------------------------------------------------------------------------------------------- | ----- |
+| `nameOverride`     | String to partially override common.names.fullname template (will maintain the release name) | `""`  |
+| `fullnameOverride` | String to fully override common.names.fullname template                                      | `""`  |
+
+### Frank!Framework image parameters
+
+| Name                | Description                                                | Value                      |
+| ------------------- | ---------------------------------------------------------- | -------------------------- |
+| `image.registry`    | Frank!Framework image registry                             | `nexus.frankframework.org` |
+| `image.repository`  | Frank!Framework image repository                           | `frankframework`           |
+| `image.tag`         | Frank!Framework image tag (immutable tags are recommended) | `""`                       |
+| `image.pullPolicy`  | Frank!Framework image pull policy                          | `IfNotPresent`             |
+| `image.pullSecrets` | Frank!Framework image pull secrets                         | `[]`                       |
+
+### Frank! Configuration parameters
+
+| Name                                                         | Description                                                                                                      | Value   |
+| ------------------------------------------------------------ | ---------------------------------------------------------------------------------------------------------------- | ------- |
+| `frank.memory.percentage`                                    | Set if the values for the memory are in percentages                                                              | `false` |
+| `frank.memory.minimum`                                       | Sets the initial size of the heap that will be used by the Frank!Framework                                       | `4G`    |
+| `frank.memory.maximum`                                       | Sets the maximum size of the heap that will be used by the Frank!Framework                                       | `4G`    |
+| `frank.dtap.stage`                                           | (Required) Set the `DTAP` stage. Options: `LOC`, `DEV`, `TST`, `ACC`, `PRD`                                      | `""`    |
+| `frank.dtap.side`                                            | Set the `DTAP` side of where the instance is running                                                             | `""`    |
+| `frank.credentials.secret`                                   | Set the secret name of the existing secret                                                                       | `""`    |
+| `frank.credentials.key`                                      | Set the key inside the secret that contains the data (e.g. `credentials.properties`)                             | `""`    |
+| `frank.instance.name`                                        | Set the name of the Frank! instance (default is the `fullname`)                                                  | `""`    |
+| `frank.configurations.names`                                 | Set the configurations to load. Leave empty to use the default                                                   | `[]`    |
+| `frank.security.http.authentication`                         | Set http authentication for the Frank!                                                                           | `false` |
+| `frank.security.http.localUsers`                             | Set localUsers who can log in on the Frank!                                                                      | `[]`    |
+| `frank.security.http.localUsers.username`                    | Set the username of the user                                                                                     | `""`    |
+| `frank.security.http.localUsers.password`                    | Set the password of the user                                                                                     | `""`    |
+| `frank.security.http.localUsers.roles`                       | Set the roles of the user. Options: `IbisTester`, `IbisDataAdmin`, `IbisAdmin`, `IbisWebService`, `IbisObserver` | `[]`    |
+| `frank.security.http.activeDirectory.enabled`                | Enable Active Directory for authentication                                                                       | `false` |
+| `frank.security.http.activeDirectory.url`                    | Set url for Active Directory                                                                                     | `""`    |
+| `frank.security.http.activeDirectory.baseDn`                 | Set baseDn for Active Directory users                                                                            | `""`    |
+| `frank.security.http.activeDirectory.roleMapping.tester`     | Map the rol for Tester                                                                                           | `""`    |
+| `frank.security.http.activeDirectory.roleMapping.dataAdmin`  | Map the rol for DataAdmin                                                                                        | `""`    |
+| `frank.security.http.activeDirectory.roleMapping.admin`      | Map the rol for Admin                                                                                            | `""`    |
+| `frank.security.http.activeDirectory.roleMapping.webService` | Map the rol for WebService                                                                                       | `""`    |
+| `frank.security.http.activeDirectory.roleMapping.observer`   | Map the rol for Observer                                                                                         | `""`    |
+| `frank.server.transactionManager`                            | Set the transaction manager for Tomcat. Options: `NARAYANA`, `BTM`, ``                                           | `""`    |
+| `frank.environmentVariables`                                 | Set extra environment variables for the Frank!                                                                   | `{}`    |
+
+### Frank!Framework Connection parameters
+
+| Name                        | Description                                                                                                                                          | Value  |
+| --------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------- | ------ |
+| `connections.create`        | Create a `context.xml` and possibly overwrite the existing one, to configure the connections/resources.                                              | `true` |
+| `connections.jdbc`          | Set multiple database connections. One connection should have an empty name, so it'll get picked up by default (unless `jdbc.required=false` is set) | `[]`   |
+| `connections.jdbc.name`     | Name of the connection (leave empty to use default: `jdbc/${.Values.instance.name}` in lowercase)                                                    | `""`   |
+| `connections.jdbc.type`     | DBMS type. Options: `oracle`, `mssql`, `mysql`, `mariadb`, `postgresql`, `db2`, `mongodb`                                                            | `""`   |
+| `connections.jdbc.host`     | Host of where the database can be reached (like in the same cluster e.g. `<service>.<namespace>.svc.cluster.local`)                                  | `""`   |
+| `connections.jdbc.post`     | Port for the database (leave empty for default)                                                                                                      | `""`   |
+| `connections.jdbc.database` | Name of the database to use (default is `.Values.instance.name`)                                                                                     | `""`   |
+| `connections.jdbc.username` | Username to connect to the database (or use string template for use with credentials e.g. `${database/username}`)                                    | `""`   |
+| `connections.jdbc.password` | Password to connect to the database (or use string template for use with credentials e.g. `${database/password}`)                                    | `""`   |
+| `connections.jdbc.ssl`      | Set to `true` is the connection uses SSL, default is `false`                                                                                         | `""`   |
+| `connections.jms`           | Set multiple massage services                                                                                                                        | `[]`   |
+| `connections.jms.name`      | Name of the connection (leave empty to use default: `jms/${.Values.instance.name}` in lowercase)                                                     | `""`   |
+| `connections.jms.type`      | MQ type. Options: `artemis`, `activemq`                                                                                                              | `""`   |
+| `connections.jms.host`      | Host of where the MQ can be reached (like in the same cluster e.g. `<service>.<namespace>.svc.cluster.local`)                                        | `""`   |
+| `connections.jms.post`      | Port for the MQ (leave empty for default)                                                                                                            | `""`   |
+
+### Frank!Framework deployment parameters
+
+| Name                                | Description                                             | Value     |
+| ----------------------------------- | ------------------------------------------------------- | --------- |
+| `replicaCount`                      | Number of Frank!Framework replicas to deploy            | `1`       |
+| `livenessProbe.initialDelaySeconds` | Initial delay seconds for livenessProbe                 | `40`      |
+| `livenessProbe.periodSeconds`       | Period seconds for livenessProbe                        | `10`      |
+| `livenessProbe.timeoutSeconds`      | Timeout seconds for livenessProbe                       | `1`       |
+| `livenessProbe.failureThreshold`    | Failure threshold for livenessProbe                     | `6`       |
+| `livenessProbe.successThreshold`    | Success threshold for livenessProbe                     | `1`       |
+| `resources`                         | Set the resources for the Frank!Framework containers    | `{}`      |
+| `resources.limits`                  | The resources limits for the Frank!Framework containers | `""`      |
+| `resources.requests.memory`         | The requested memory for the Frank!Framework containers | `""`      |
+| `resources.requests.cpu`            | The requested cpu for the Frank!Framework containers    | `""`      |
+| `nodeSelector`                      | Node labels for pod assignment                          | `{}`      |
+| `tolerations`                       | Set tolerations for pod assignment                      | `[]`      |
+| `affinity`                          | Set affinity for pod assignment                         | `{}`      |
+| `timeZone`                          | used for database connection and log timestamps         | `Etc/UTC` |
+
+### Traffic Exposure Parameters
+
+| Name                           | Description                                                                                                                      | Value       |
+| ------------------------------ | -------------------------------------------------------------------------------------------------------------------------------- | ----------- |
+| `service.type`                 | Frank!Framework service type                                                                                                     | `ClusterIP` |
+| `service.port`                 | Frank!Framework service port                                                                                                     | `80`        |
+| `ingress.enabled`              | Enable ingress record generation for Frank!                                                                                      | `false`     |
+| `ingress.className`            | IngressClass that will be used to implement the Ingress (Kubernetes 1.18+)                                                       | `""`        |
+| `ingress.annotations`          | Additional annotations for the Ingress resource. To enable certificate autogeneration, place here your cert-manager annotations. | `{}`        |
+| `ingress.hosts`                | Set hosts for ingress                                                                                                            | `[]`        |
+| `ingress.hosts.host`           | Set hostname                                                                                                                     | `""`        |
+| `ingress.hosts.paths`          | Set multiple paths                                                                                                               | `[]`        |
+| `ingress.hosts.paths.path`     | Set path (context url)                                                                                                           | `""`        |
+| `ingress.hosts.paths.pathType` | Set type of path                                                                                                                 | `""`        |
+| `ingress.tls`                  | Define tls secrets for hosts (implementation not done yet)                                                                       | `[]`        |
+
+### Other Parameters
+
+| Name                         | Description                                               | Value  |
+| ---------------------------- | --------------------------------------------------------- | ------ |
+| `serviceAccount.create`      | Enable creation of ServiceAccount for Frank!Framework pod | `true` |
+| `serviceAccount.annotations` | Additional custom annotations for the ServiceAccount      | `{}`   |
+| `serviceAccount.name`        | The name of the ServiceAccount to use.                    | `""`   |
+| `podAnnotations`             | Annotations for Frank!Framework pods                      | `{}`   |
+| `podLabels`                  | Extra labels for Frank!Framework pods                     | `{}`   |
+| `podSecurityContext`         | Set Frank!Framework pod's Security Context                | `{}`   |
+| `securityContext`            | Set Frank!Framework container's Security Context          | `{}`   |
+
+## Configuration and installation details
+
+### DTAP Stage
+
+The Frank!Framework will start with different settings enabled, depending on what DTAP stage is configured. 
+
+For more information about DTAP stages read: https://frank-manual.readthedocs.io/en/latest/deploying/dtapAndProperties.html
+
+## Notable changes
+
+### 0.2.10
+
+The name of the chart has been renamed (frankframework) to match the project, organisation and Docker image. 
+
+### 0.2.8
+
+The `.Values.frank.memory` notation has been changed. It is now possible to define a minimum and a maximum, and to set percentages.
+
+### 0.2.7
+
+The `.Values.frank.dtap.stage` and `.Values.frank.dtap.side` are now empty by default.
+
+* `.Values.frank.dtap.stage` is now required and should be set to the right stage. Read more in the [Installation details](#dtap-stage)
+* `.Values.frank.dtap.side` will default to the release namespace deployed in.
diff --git a/charts/frank-framework/icon.svg b/charts/frank-framework/icon.svg
new file mode 100644
index 0000000..8888c37
--- /dev/null
+++ b/charts/frank-framework/icon.svg
@@ -0,0 +1,5 @@
+<svg width="300" height="300" viewBox="0 0 300 300" fill="none" xmlns="http://www.w3.org/2000/svg">
+<rect width="300" height="300" rx="55" fill="#FDC300"/>
+<path d="M118.36 109.56V81.912C86.488 79.992 71.704 96.12 71.704 123H58.84V150.648H71.704V219H100.504V150.648H118.36V123H100.504C100.504 111.864 107.608 108.6 118.36 109.56ZM182.673 109.56V81.912C150.801 79.992 136.017 96.12 136.017 123H123.153V150.648H136.017V219H164.817V150.648H182.673V123H164.817C164.817 111.864 171.921 108.6 182.673 109.56Z" fill="white"/>
+<path d="M198.048 171H221.088L226.848 123V84.6H192.288V123L198.048 171ZM209.568 221.688C219.552 221.688 227.808 213.432 227.808 203.448C227.808 193.464 219.552 185.208 209.568 185.208C199.584 185.208 191.328 193.464 191.328 203.448C191.328 213.432 199.584 221.688 209.568 221.688Z" fill="#1E1E1E"/>
+</svg>
diff --git a/charts/frank-framework/templates/NOTES.txt b/charts/frank-framework/templates/NOTES.txt
new file mode 100644
index 0000000..c08f4b4
--- /dev/null
+++ b/charts/frank-framework/templates/NOTES.txt
@@ -0,0 +1,22 @@
+1. Get the application URL by running these commands:
+{{- if .Values.ingress.enabled }}
+{{- range $host := .Values.ingress.hosts }}
+  {{- range .paths }}
+  http{{ if $.Values.ingress.tls }}s{{ end }}://{{ $host.host }}{{ .path }}
+  {{- end }}
+{{- end }}
+{{- else if contains "NodePort" .Values.service.type }}
+  export NODE_PORT=$(kubectl get --namespace {{ .Release.Namespace }} -o jsonpath="{.spec.ports[0].nodePort}" services {{ include "ff-common.fullname" . }})
+  export NODE_IP=$(kubectl get nodes --namespace {{ .Release.Namespace }} -o jsonpath="{.items[0].status.addresses[0].address}")
+  echo http://$NODE_IP:$NODE_PORT
+{{- else if contains "LoadBalancer" .Values.service.type }}
+     NOTE: It may take a few minutes for the LoadBalancer IP to be available.
+           You can watch the status of by running 'kubectl get --namespace {{ .Release.Namespace }} svc -w {{ include "ff-common.fullname" . }}'
+  export SERVICE_IP=$(kubectl get svc --namespace {{ .Release.Namespace }} {{ include "ff-common.fullname" . }} --template "{{"{{ range (index .status.loadBalancer.ingress 0) }}{{.}}{{ end }}"}}")
+  echo http://$SERVICE_IP:{{ .Values.service.port }}
+{{- else if contains "ClusterIP" .Values.service.type }}
+  export POD_NAME=$(kubectl get pods --namespace {{ .Release.Namespace }} -l "app.kubernetes.io/name={{ include "ff-common.name" . }},app.kubernetes.io/instance={{ .Release.Name }}" -o jsonpath="{.items[0].metadata.name}")
+  export CONTAINER_PORT=$(kubectl get pod --namespace {{ .Release.Namespace }} $POD_NAME -o jsonpath="{.spec.containers[0].ports[0].containerPort}")
+  echo "Visit http://127.0.0.1:8080 to use your application"
+  kubectl --namespace {{ .Release.Namespace }} port-forward $POD_NAME 8080:$CONTAINER_PORT
+{{- end }}
diff --git a/charts/frank-framework/templates/manifest.yaml b/charts/frank-framework/templates/manifest.yaml
new file mode 100644
index 0000000..9bc749b
--- /dev/null
+++ b/charts/frank-framework/templates/manifest.yaml
@@ -0,0 +1,17 @@
+{{ template "ff-common.configmap.context.tpl" . }}
+---
+{{ template "ff-common.configmap.env.tpl" . }}
+---
+{{ template "ff-common.configmap.tomcat-users.tpl" . }}
+---
+{{ template "ff-common.configmap.ldap-role-mapping.tpl" . }}
+---
+{{ template "ff-common.deployment.tpl" . }}
+---
+{{ template "ff-common.hpa.tpl" . }}
+---
+{{ template "ff-common.serviceAccount.tpl" . }}
+---
+{{ template "ff-common.service.tpl" . }}
+---
+{{ template "ff-common.ingress.tpl" . }}
diff --git a/charts/frank-framework/values.schema.json b/charts/frank-framework/values.schema.json
new file mode 100644
index 0000000..7020af3
--- /dev/null
+++ b/charts/frank-framework/values.schema.json
@@ -0,0 +1,413 @@
+{
+    "title": "Chart Values",
+    "type": "object",
+    "properties": {
+        "nameOverride": {
+            "type": "string",
+            "description": "String to partially override common.names.fullname template (will maintain the release name)",
+            "default": ""
+        },
+        "fullnameOverride": {
+            "type": "string",
+            "description": "String to fully override common.names.fullname template",
+            "default": ""
+        },
+        "image": {
+            "type": "object",
+            "properties": {
+                "registry": {
+                    "type": "string",
+                    "description": "Frank!Framework image registry",
+                    "default": "nexus.frankframework.org"
+                },
+                "repository": {
+                    "type": "string",
+                    "description": "Frank!Framework image repository",
+                    "default": "frankframework"
+                },
+                "tag": {
+                    "type": "string",
+                    "description": "Frank!Framework image tag (immutable tags are recommended)",
+                    "default": ""
+                },
+                "pullPolicy": {
+                    "type": "string",
+                    "description": "Frank!Framework image pull policy",
+                    "default": "IfNotPresent"
+                },
+                "pullSecrets": {
+                    "type": "array",
+                    "description": "Frank!Framework image pull secrets",
+                    "default": [],
+                    "items": {}
+                }
+            }
+        },
+        "frank": {
+            "type": "object",
+            "properties": {
+                "memory": {
+                    "type": "object",
+                    "properties": {
+                        "percentage": {
+                            "type": "boolean",
+                            "description": "Set if the values for the memory are in percentages",
+                            "default": false
+                        },
+                        "minimum": {
+                            "type": "string",
+                            "description": "Sets the initial size of the heap that will be used by the Frank!Framework",
+                            "default": "4G"
+                        },
+                        "maximum": {
+                            "type": "string",
+                            "description": "Sets the maximum size of the heap that will be used by the Frank!Framework",
+                            "default": "4G"
+                        }
+                    }
+                },
+                "dtap": {
+                    "type": "object",
+                    "properties": {
+                        "stage": {
+                            "type": "string",
+                            "description": "(Required) Set the `DTAP` stage. Options: `LOC`, `DEV`, `TST`, `ACC`, `PRD`",
+                            "default": ""
+                        },
+                        "side": {
+                            "type": "string",
+                            "description": "Set the `DTAP` side of where the instance is running",
+                            "default": ""
+                        }
+                    }
+                },
+                "credentials": {
+                    "type": "object",
+                    "properties": {
+                        "secret": {
+                            "type": "string",
+                            "description": "Set the secret name of the existing secret",
+                            "default": ""
+                        },
+                        "key": {
+                            "type": "string",
+                            "description": "Set the key inside the secret that contains the data (e.g. `credentials.properties`)",
+                            "default": ""
+                        }
+                    }
+                },
+                "instance": {
+                    "type": "object",
+                    "properties": {
+                        "name": {
+                            "type": "string",
+                            "description": "Set the name of the Frank! instance (default is the `fullname`)",
+                            "default": ""
+                        }
+                    }
+                },
+                "configurations": {
+                    "type": "object",
+                    "properties": {
+                        "names": {
+                            "type": "array",
+                            "description": "Set the configurations to load. Leave empty to use the default",
+                            "default": [],
+                            "items": {}
+                        }
+                    }
+                },
+                "security": {
+                    "type": "object",
+                    "properties": {
+                        "http": {
+                            "type": "object",
+                            "properties": {
+                                "authentication": {
+                                    "type": "boolean",
+                                    "description": "Set http authentication for the Frank!",
+                                    "default": false
+                                },
+                                "localUsers": {
+                                    "type": "array",
+                                    "description": "Set localUsers who can log in on the Frank!",
+                                    "default": [],
+                                    "items": {}
+                                },
+                                "activeDirectory": {
+                                    "type": "object",
+                                    "properties": {
+                                        "enabled": {
+                                            "type": "boolean",
+                                            "description": "Enable Active Directory for authentication",
+                                            "default": false
+                                        },
+                                        "url": {
+                                            "type": "string",
+                                            "description": "Set url for Active Directory",
+                                            "default": ""
+                                        },
+                                        "baseDn": {
+                                            "type": "string",
+                                            "description": "Set baseDn for Active Directory users",
+                                            "default": ""
+                                        },
+                                        "roleMapping": {
+                                            "type": "object",
+                                            "properties": {
+                                                "tester": {
+                                                    "type": "string",
+                                                    "description": "Map the rol for Tester",
+                                                    "default": ""
+                                                },
+                                                "dataAdmin": {
+                                                    "type": "string",
+                                                    "description": "Map the rol for DataAdmin",
+                                                    "default": ""
+                                                },
+                                                "admin": {
+                                                    "type": "string",
+                                                    "description": "Map the rol for Admin",
+                                                    "default": ""
+                                                },
+                                                "webService": {
+                                                    "type": "string",
+                                                    "description": "Map the rol for WebService",
+                                                    "default": ""
+                                                },
+                                                "observer": {
+                                                    "type": "string",
+                                                    "description": "Map the rol for Observer",
+                                                    "default": ""
+                                                }
+                                            }
+                                        }
+                                    }
+                                }
+                            }
+                        }
+                    }
+                },
+                "server": {
+                    "type": "object",
+                    "properties": {
+                        "transactionManager": {
+                            "type": "string",
+                            "description": "Set the transaction manager for Tomcat. Options: `NARAYANA`, `BTM`, ``",
+                            "default": "NARAYANA"
+                        }
+                    }
+                }
+            }
+        },
+        "autoscaling": {
+            "type": "object",
+            "properties": {
+                "enabled": {
+                    "type": "boolean",
+                    "description": "",
+                    "default": false
+                },
+                "minReplicas": {
+                    "type": "number",
+                    "description": "",
+                    "default": 1
+                },
+                "maxReplicas": {
+                    "type": "number",
+                    "description": "",
+                    "default": 100
+                },
+                "targetCPUUtilizationPercentage": {
+                    "type": "number",
+                    "description": "",
+                    "default": 80
+                },
+                "targetMemoryUtilizationPercentage": {
+                    "type": "number",
+                    "description": "",
+                    "default": 80
+                }
+            }
+        },
+        "connections": {
+            "type": "object",
+            "properties": {
+                "create": {
+                    "type": "boolean",
+                    "description": "Create a `context.xml` and possibly overwrite the existing one, to configure the connections/resources.",
+                    "default": true
+                },
+                "jdbc": {
+                    "type": "array",
+                    "description": "Set multiple database connections. One connection should have an empty name, so it'll get picked up by default (unless `jdbc.required=false` is set)",
+                    "default": [],
+                    "items": {}
+                },
+                "jms": {
+                    "type": "array",
+                    "description": "Set multiple massage services",
+                    "default": [],
+                    "items": {}
+                }
+            }
+        },
+        "ingress": {
+            "type": "object",
+            "properties": {
+                "hosts": {
+                    "type": "array",
+                    "description": "",
+                    "items": {
+                        "type": "object",
+                        "properties": {
+                            "host": {
+                                "type": "string",
+                                "description": ""
+                            },
+                            "paths": {
+                                "type": "array",
+                                "description": "",
+                                "items": {
+                                    "type": "object",
+                                    "properties": {
+                                        "path": {
+                                            "type": "string",
+                                            "description": ""
+                                        },
+                                        "pathType": {
+                                            "type": "string",
+                                            "description": ""
+                                        }
+                                    }
+                                }
+                            }
+                        }
+                    }
+                },
+                "enabled": {
+                    "type": "boolean",
+                    "description": "Enable ingress record generation for Frank!",
+                    "default": false
+                },
+                "className": {
+                    "type": "string",
+                    "description": "IngressClass that will be used to implement the Ingress (Kubernetes 1.18+)",
+                    "default": ""
+                },
+                "annotations": {
+                    "type": "object",
+                    "description": "Additional annotations for the Ingress resource. To enable certificate autogeneration, place here your cert-manager annotations.",
+                    "default": {}
+                },
+                "tls": {
+                    "type": "array",
+                    "description": "Define tls secrets for hosts (implementation not done yet)",
+                    "default": [],
+                    "items": {}
+                }
+            }
+        },
+        "replicaCount": {
+            "type": "number",
+            "description": "Number of Frank!Framework replicas to deploy",
+            "default": 1
+        },
+        "livenessProbe": {
+            "type": "object",
+            "properties": {
+                "initialDelaySeconds": {
+                    "type": "number",
+                    "description": "Initial delay seconds for livenessProbe",
+                    "default": 40
+                },
+                "periodSeconds": {
+                    "type": "number",
+                    "description": "Period seconds for livenessProbe",
+                    "default": 10
+                },
+                "timeoutSeconds": {
+                    "type": "number",
+                    "description": "Timeout seconds for livenessProbe",
+                    "default": 1
+                },
+                "failureThreshold": {
+                    "type": "number",
+                    "description": "Failure threshold for livenessProbe",
+                    "default": 6
+                },
+                "successThreshold": {
+                    "type": "number",
+                    "description": "Success threshold for livenessProbe",
+                    "default": 1
+                }
+            }
+        },
+        "nodeSelector": {
+            "type": "object",
+            "description": "Node labels for pod assignment",
+            "default": {}
+        },
+        "tolerations": {
+            "type": "array",
+            "description": "Set tolerations for pod assignment",
+            "default": [],
+            "items": {}
+        },
+        "affinity": {
+            "type": "object",
+            "description": "Set affinity for pod assignment",
+            "default": {}
+        },
+        "timeZone": {
+            "type": "string",
+            "description": "used for database connection and log timestamps",
+            "default": "Etc/UTC"
+        },
+        "service": {
+            "type": "object",
+            "properties": {
+                "type": {
+                    "type": "string",
+                    "description": "Frank!Framework service type",
+                    "default": "ClusterIP"
+                },
+                "port": {
+                    "type": "number",
+                    "description": "Frank!Framework service port",
+                    "default": 80
+                }
+            }
+        },
+        "serviceAccount": {
+            "type": "object",
+            "properties": {
+                "create": {
+                    "type": "boolean",
+                    "description": "Enable creation of ServiceAccount for Frank!Framework pod",
+                    "default": true
+                },
+                "annotations": {
+                    "type": "object",
+                    "description": "Additional custom annotations for the ServiceAccount",
+                    "default": {}
+                },
+                "name": {
+                    "type": "string",
+                    "description": "The name of the ServiceAccount to use.",
+                    "default": ""
+                }
+            }
+        },
+        "podAnnotations": {
+            "type": "object",
+            "description": "Annotations for Frank!Framework pods",
+            "default": {}
+        },
+        "podLabels": {
+            "type": "object",
+            "description": "Extra labels for Frank!Framework pods",
+            "default": {}
+        }
+    }
+}
\ No newline at end of file
diff --git a/charts/frank-framework/values.yaml b/charts/frank-framework/values.yaml
new file mode 100644
index 0000000..8f93d5d
--- /dev/null
+++ b/charts/frank-framework/values.yaml
@@ -0,0 +1,332 @@
+## @section Common parameters
+##
+
+## @param nameOverride String to partially override common.names.fullname template (will maintain the release name)
+##
+nameOverride: ""
+## @param fullnameOverride String to fully override common.names.fullname template
+##
+fullnameOverride: ""
+
+## @section Frank!Framework image parameters
+##
+
+## Frank!Framework image
+## ref: https://nexus.frankframework.org/#browse/browse:frankframework-docker:v2%2Ffrankframework%2Ftags/
+## @param image.registry Frank!Framework image registry
+## @param image.repository Frank!Framework image repository
+## @param image.tag Frank!Framework image tag (immutable tags are recommended)
+##
+image:
+  registry: nexus.frankframework.org
+  repository: frankframework
+  tag: ""
+  ## @param image.pullPolicy Frank!Framework image pull policy
+  ## Specify a imagePullPolicy
+  ## Defaults to 'Always' if image tag is 'latest', else set to 'IfNotPresent'
+  ## ref: https://kubernetes.io/docs/user-guide/images/#pre-pulling-images
+  ##
+  pullPolicy: IfNotPresent
+  ## @param image.pullSecrets Frank!Framework image pull secrets
+  ## Optionally specify an array of imagePullSecrets.
+  ## Secrets must be manually created in the namespace.
+  ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/
+  ## e.g:
+  ## pullSecrets:
+  ##   - myRegistryKeySecretName
+  ##
+  pullSecrets: []
+
+## @section Frank! Configuration parameters
+##
+
+## @skip frank [object]
+##
+frank:
+  ## @param frank.memory.percentage Set if the values for the memory are in percentages
+  ## @param frank.memory.minimum Sets the initial size of the heap that will be used by the Frank!Framework
+  ## @param frank.memory.maximum Sets the maximum size of the heap that will be used by the Frank!Framework
+  ## For Java 8 it is best suited to use the same amount of memory for both the minimum and maximum.
+  ## For Java 11 and above, it is possible to use percentages. E.g. minimum: 20.0, maximum: 80.0.
+  ## ref: https://docs.oracle.com/javase/8/docs/technotes/tools/unix/java.html#BABDJJFI
+  ##
+  memory:
+    percentage: false
+    minimum: 4G
+    maximum: 4G
+  ## @skip frank.dtap [object]
+  ## @param frank.dtap.stage (Required) Set the `DTAP` stage. Options: `LOC`, `DEV`, `TST`, `ACC`, `PRD`
+  ## @param frank.dtap.side Set the `DTAP` side of where the instance is running
+  ##
+  dtap:
+    stage: ""
+    side: ""
+  ## @skip frank.credentials [object]
+  ## @param frank.credentials.secret Set the secret name of the existing secret
+  ## @param frank.credentials.key Set the key inside the secret that contains the data (e.g. `credentials.properties`)
+  ##
+  credentials:
+    secret: ""
+    key: ""
+  ## @skip frank.instance [string]
+  ## @param frank.instance.name Set the name of the Frank! instance (default is the `fullname`)
+  ##
+  instance:
+    name: ""
+  ## @skip frank.configurations [object]
+  ## @param frank.configurations.names [array] Set the configurations to load. Leave empty to use the default
+  ## e.g.
+  ## configurations.names:
+  ##   - main
+  ##
+  configurations:
+    names: []
+  ## @skip frank.security [object]
+  ## @skip frank.security.http [object]
+  ##
+  security:
+    http:
+      ## @param frank.security.http.authentication Set http authentication for the Frank!
+      ##
+      authentication: false
+      ## @param frank.security.http.localUsers [array] Set localUsers who can log in on the Frank!
+      ## @param frank.security.http.localUsers.username [string] Set the username of the user
+      ## @param frank.security.http.localUsers.password [string] Set the password of the user
+      ## @param frank.security.http.localUsers.roles [array] Set the roles of the user. Options: `IbisTester`, `IbisDataAdmin`, `IbisAdmin`, `IbisWebService`, `IbisObserver`
+      ## e.g.
+      ## localUsers:
+      ##   - username: Tester
+      ##     password: ChangeMe!
+      ##     roles:
+      ##        - IbisTester
+      ##
+      localUsers: []
+      ## @skip frank.security.http.activeDirectory [object]
+      ## @param frank.security.http.activeDirectory.enabled Enable Active Directory for authentication
+      ## @param frank.security.http.activeDirectory.url Set url for Active Directory
+      ## @param frank.security.http.activeDirectory.baseDn Set baseDn for Active Directory users
+      ## @skip frank.security.http.activeDirectory.roleMapping [object]
+      ## @param frank.security.http.activeDirectory.roleMapping.tester Map the rol for Tester
+      ## @param frank.security.http.activeDirectory.roleMapping.dataAdmin Map the rol for DataAdmin
+      ## @param frank.security.http.activeDirectory.roleMapping.admin Map the rol for Admin
+      ## @param frank.security.http.activeDirectory.roleMapping.webService Map the rol for WebService
+      ## @param frank.security.http.activeDirectory.roleMapping.observer Map the rol for Observer
+      ##
+      activeDirectory:
+        enabled: false
+        url: ""
+        baseDn: ""
+        roleMapping:
+          tester: ""
+          dataAdmin: ""
+          admin: ""
+          webService: ""
+          observer: ""
+  ## @skip frank.server [object]
+  ##
+  server:
+    ## @param frank.server.transactionManager [string] Set the transaction manager for Tomcat. Options: `NARAYANA`, `BTM`, ``
+    ##
+    transactionManager: NARAYANA
+  ## @param frank.environmentVariables [object] Set extra environment variables for the Frank!
+  ##
+  environmentVariables: {}
+
+## @section Frank!Framework Connection parameters
+##
+
+## @skip connections [object]
+##
+connections:
+  ## @param connections.create Create a `context.xml` and possibly overwrite the existing one, to configure the connections/resources.
+  ##
+  create: true
+  ## @param connections.jdbc [array] Set multiple database connections. One connection should have an empty name, so it'll get picked up by default (unless `jdbc.required=false` is set)
+  ## @param connections.jdbc.name [nullable,string] Name of the connection (leave empty to use default: `jdbc/${.Values.instance.name}` in lowercase)
+  ## @param connections.jdbc.type [string] DBMS type. Options: `oracle`, `mssql`, `mysql`, `mariadb`, `postgresql`, `db2`, `mongodb`
+  ## @param connections.jdbc.host [string] Host of where the database can be reached (like in the same cluster e.g. `<service>.<namespace>.svc.cluster.local`)
+  ## @param connections.jdbc.post [nullable,string] Port for the database (leave empty for default)
+  ## @param connections.jdbc.database [nullable,string] Name of the database to use (default is `.Values.instance.name`)
+  ## @param connections.jdbc.username [string] Username to connect to the database (or use string template for use with credentials e.g. `${database/username}`)
+  ## @param connections.jdbc.password [string] Password to connect to the database (or use string template for use with credentials e.g. `${database/password}`)
+  ## @param connections.jdbc.ssl [nullable,string] Set to `true` is the connection uses SSL, default is `false`
+  ##
+  jdbc: []
+  ## @param connections.jms [array] Set multiple massage services
+  ## @param connections.jms.name [nullable,string] Name of the connection (leave empty to use default: `jms/${.Values.instance.name}` in lowercase)
+  ## @param connections.jms.type [string] MQ type. Options: `artemis`, `activemq`
+  ## @param connections.jms.host [string] Host of where the MQ can be reached (like in the same cluster e.g. `<service>.<namespace>.svc.cluster.local`)
+  ## @param connections.jms.post [nullable,string] Port for the MQ (leave empty for default)
+  ##
+  jms: []
+
+## @section Frank!Framework deployment parameters
+##
+
+## @param replicaCount Number of Frank!Framework replicas to deploy
+## NOTE: ReadWriteMany PVC(s) are required if replicaCount > 1
+##
+replicaCount: 1
+
+## Configure extra options for Frank!Framework containers' liveness, readiness and startup probes
+## ref: https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes/#configure-probes
+## @param livenessProbe.initialDelaySeconds Initial delay seconds for livenessProbe
+## @param livenessProbe.periodSeconds Period seconds for livenessProbe
+## @param livenessProbe.timeoutSeconds Timeout seconds for livenessProbe
+## @param livenessProbe.failureThreshold Failure threshold for livenessProbe
+## @param livenessProbe.successThreshold Success threshold for livenessProbe
+##
+livenessProbe:
+  initialDelaySeconds: 40
+  periodSeconds: 10
+  timeoutSeconds: 1
+  failureThreshold: 6
+  successThreshold: 1
+## Frank!Framework container's resource requests and limits
+## ref: https://kubernetes.io/docs/user-guide/compute-resources/
+## @param resources [object] Set the resources for the Frank!Framework containers
+## @param resources.limits [string] The resources limits for the Frank!Framework containers
+## @param resources.requests.memory [string] The requested memory for the Frank!Framework containers
+## @param resources.requests.cpu [string] The requested cpu for the Frank!Framework containers
+## e.g.:
+## resources
+##   limits:
+##     cpu: 2000m
+##     memory: 4200M
+##   requests:
+##     cpu: 2000m
+##     memory: 4200M
+##
+resources: {}
+
+## @skip autoscaling
+##
+autoscaling:
+  enabled: false
+  minReplicas: 1
+  maxReplicas: 100
+  targetCPUUtilizationPercentage: 80
+  targetMemoryUtilizationPercentage: 80
+
+## @param nodeSelector Node labels for pod assignment
+## ref: https://kubernetes.io/docs/user-guide/node-selection/
+##
+nodeSelector: {}
+
+## @param tolerations Set tolerations for pod assignment
+## ref: https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/
+##
+tolerations: []
+
+## @param affinity Set affinity for pod assignment
+## Ref: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#affinity-and-anti-affinity
+## NOTE: podAffinityPreset, podAntiAffinityPreset, and nodeAffinityPreset will be ignored when it's set
+##
+affinity: {}
+
+## @param timeZone used for database connection and log timestamps
+##
+timeZone: Etc/UTC
+
+## @section Traffic Exposure Parameters
+##
+
+## Frank!Framework service parameters
+##
+service:
+  ## @param service.type Frank!Framework service type
+  ##
+  type: ClusterIP
+  ## @param service.port Frank!Framework service port
+  port: 80
+
+## Configure the ingress resource that allows you to access the Frank!Framework installation
+## ref: https://kubernetes.io/docs/concepts/services-networking/ingress/
+##
+ingress:
+  ## @param ingress.enabled Enable ingress record generation for Frank!
+  ##
+  enabled: false
+  ## @param ingress.className IngressClass that will be used to implement the Ingress (Kubernetes 1.18+)
+  ## This is supported in Kubernetes 1.18+ and required if you have more than one IngressClass marked as the default for your cluster .
+  ## ref: https://kubernetes.io/blog/2020/04/02/improvements-to-the-ingress-api-in-kubernetes-1.18/
+  ##
+  className: ""
+  ## @param ingress.annotations Additional annotations for the Ingress resource. To enable certificate autogeneration, place here your cert-manager annotations.
+  ## For a full list of possible ingress annotations, please see
+  ## ref: https://github.com/kubernetes/ingress-nginx/blob/master/docs/user-guide/nginx-configuration/annotations.md
+  ## Use this parameter to set the required annotations for cert-manager, see
+  ## ref: https://cert-manager.io/docs/usage/ingress/#supported-annotations
+  ## e.g:
+  ## annotations:
+  ##   kubernetes.io/ingress.class: nginx
+  ##   kubernetes.io/tls-acme: 'true'
+  ##
+  annotations: {}
+  ## @param ingress.hosts [array] Set hosts for ingress
+  ## @param ingress.hosts.host [string] Set hostname
+  ## @param ingress.hosts.paths [array] Set multiple paths
+  ## @param ingress.hosts.paths.path [string] Set path (context url)
+  ## @param ingress.hosts.paths.pathType [string] Set type of path
+  ##
+  hosts:
+    - host: chart-example.local
+      paths:
+        - path: /
+          pathType: ImplementationSpecific
+  ## @param ingress.tls [array] Define tls secrets for hosts (implementation not done yet)
+  ## e.g.
+  ## tls:
+  ##   - secretName: chart-example-tls
+  ##     hosts:
+  ##       - chart-example.local
+  ##
+  tls: []
+
+## @section Other Parameters
+##
+
+## Frank!Framework Service Account
+## ref: https://kubernetes.io/docs/tasks/configure-pod-container/configure-service-account/
+##
+serviceAccount:
+  ## @param serviceAccount.create Enable creation of ServiceAccount for Frank!Framework pod
+  ##
+  create: true
+  ## @param serviceAccount.annotations Additional custom annotations for the ServiceAccount
+  ##
+  annotations: {}
+  ## @param serviceAccount.name The name of the ServiceAccount to use.
+  ## If not set and create is true, a name is generated using the ff-common.fullname template
+  ##
+  name: ""
+
+## @param podAnnotations Annotations for Frank!Framework pods
+## ref: https://kubernetes.io/docs/concepts/overview/working-with-objects/annotations/
+##
+podAnnotations: {}
+
+## @param podLabels Extra labels for Frank!Framework pods
+## ref: https://kubernetes.io/docs/concepts/overview/working-with-objects/labels/
+##
+podLabels: {}
+
+## Configure Pods Security Context
+## ref: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/#set-the-security-context-for-a-pod
+## @param podSecurityContext [object] Set Frank!Framework pod's Security Context
+##
+podSecurityContext: {}
+
+## Configure Container Security Context (only main container)
+## ref: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/#set-the-security-context-for-a-container
+## @param securityContext [object] Set Frank!Framework container's Security Context
+## e.g.
+## securityContext: {}
+##  capabilities:
+##    drop:
+##      - ALL
+##  readOnlyRootFilesystem: true
+##  runAsNonRoot: true
+##  runAsUser: 1000
+##
+securityContext: {}
diff --git a/charts/frank2example/Chart.yaml b/charts/frank2example/Chart.yaml
index a0e6f3e..e75d6af 100644
--- a/charts/frank2example/Chart.yaml
+++ b/charts/frank2example/Chart.yaml
@@ -4,7 +4,10 @@ description: A Helm chart for running Frank2Example on Kubernetes
 name: frank2example
 icon: https://raw.githubusercontent.com/frankframework/charts/master/charts/frank2example/icon.svg
 type: application
-version: 0.2.10
+version: 0.2.11
+
+keywords:
+  - demo
 
 dependencies:
   - name: ff-common
diff --git a/charts/frank2example/values.yaml b/charts/frank2example/values.yaml
index 634f137..35810bf 100644
--- a/charts/frank2example/values.yaml
+++ b/charts/frank2example/values.yaml
@@ -12,7 +12,7 @@ fullnameOverride: ""
 ##
 
 ## Frank!Framework image
-## ref: https://https://nexus.frankframework.org/#browse/browse:frankframework-docker:v2%2Ffrankframework%2Ftags/
+## ref: https://nexus.frankframework.org/#browse/browse:frankframework-docker:v2%2Ffrankframework%2Ftags/
 ## @param image.registry Frank!Framework image registry
 ## @param image.repository Frank!Framework image repository
 ## @param image.tag Frank!Framework image tag (immutable tags are recommended)
diff --git a/charts/frankframework/Chart.yaml b/charts/frankframework/Chart.yaml
index c9bdee2..8340890 100644
--- a/charts/frankframework/Chart.yaml
+++ b/charts/frankframework/Chart.yaml
@@ -4,7 +4,7 @@ description: A Helm chart for running the Frank!Framework on Kubernetes
 name: frankframework
 icon: https://raw.githubusercontent.com/frankframework/charts/master/charts/frankframework/icon.svg
 type: application
-version: 0.2.10
+version: 0.2.11
 
 dependencies:
   - name: ff-common
diff --git a/charts/frankframework/values.yaml b/charts/frankframework/values.yaml
index 0281000..8f93d5d 100644
--- a/charts/frankframework/values.yaml
+++ b/charts/frankframework/values.yaml
@@ -12,7 +12,7 @@ fullnameOverride: ""
 ##
 
 ## Frank!Framework image
-## ref: https://https://nexus.frankframework.org/#browse/browse:frankframework-docker:v2%2Ffrankframework%2Ftags/
+## ref: https://nexus.frankframework.org/#browse/browse:frankframework-docker:v2%2Ffrankframework%2Ftags/
 ## @param image.registry Frank!Framework image registry
 ## @param image.repository Frank!Framework image repository
 ## @param image.tag Frank!Framework image tag (immutable tags are recommended)
diff --git a/ff-template/Chart.lock b/ff-template/Chart.lock
index f33c7d9..3250dfe 100644
--- a/ff-template/Chart.lock
+++ b/ff-template/Chart.lock
@@ -2,5 +2,5 @@ dependencies:
 - name: ff-common
   repository: file://../charts/ff-common
   version: 0.1.17
-digest: sha256:4225859041b2b69925615ac9392a6ac202c174d64f4c001d6a52d0d49e8d81f9
-generated: "2023-11-21T10:34:09.343662149+01:00"
+digest: sha256:8609921b4e64986a156b9e34628f7f3e01c42227d034038eefe79b8de41c5307
+generated: "2023-11-23T19:42:55.0815619+01:00"
diff --git a/ff-template/Chart.yaml b/ff-template/Chart.yaml
index 385f963..868544d 100644
--- a/ff-template/Chart.yaml
+++ b/ff-template/Chart.yaml
@@ -4,9 +4,9 @@ description: A Helm chart for running a Frank! on Kubernetes
 name: ff-template
 icon: https://raw.githubusercontent.com/frankframework/charts/master/ff-template/icon.svg
 type: application
-version: 0.1.6
+version: 0.1.7
 
 dependencies:
   - name: ff-common
-    version: ~0.1.15
+    version: ~0.1.17
     repository: file://../charts/ff-common
diff --git a/ff-template/values.yaml b/ff-template/values.yaml
index 0281000..8f93d5d 100644
--- a/ff-template/values.yaml
+++ b/ff-template/values.yaml
@@ -12,7 +12,7 @@ fullnameOverride: ""
 ##
 
 ## Frank!Framework image
-## ref: https://https://nexus.frankframework.org/#browse/browse:frankframework-docker:v2%2Ffrankframework%2Ftags/
+## ref: https://nexus.frankframework.org/#browse/browse:frankframework-docker:v2%2Ffrankframework%2Ftags/
 ## @param image.registry Frank!Framework image registry
 ## @param image.repository Frank!Framework image repository
 ## @param image.tag Frank!Framework image tag (immutable tags are recommended)
diff --git a/frontend/pages/[name].vue b/frontend/pages/[name].vue
index c4cc476..a593a8c 100644
--- a/frontend/pages/[name].vue
+++ b/frontend/pages/[name].vue
@@ -1,58 +1,79 @@
 <template>
-    <main class="pt-10">
-      <NuxtLink to="/"><UIcon name="i-heroicons-arrow-left" /> All Charts</NuxtLink>
-        <div class="flex mt-10">
-            <div class="flex-auto">
-                <div class="flex items-top">
-                    <img :src="currentChart[0].icon" v-if="currentChart[0].icon" class="w-28 mr-5 max-h-28" />
-                    <div v-else class="w-28 h-28 mr-5 p-3 rounded-2xl bg-gray-100">
-                        <svg xmlns="http://www.w3.org/2000/svg" class="w-100 h-100 fill-gray-400" viewBox="0 0 500 500">
-                            <path
-                                d="M136.52938,121.13478c-.572-.54252-1.19462-1.12636-1.81-1.71761-12.61677-12.12115-22.38092-26.13637-28.279-42.702-1.65073-4.63637-2.89692-9.36515-2.67587-14.35871.021-.4739.01959-.94915.05226-1.42214.445-6.44594,4.75912-9.70322,11.05839-8.17669a27.325,27.325,0,0,1,5.73149,2.19653c6.89022,3.45538,12.5062,8.56359,17.67051,14.16571a112.52651,112.52651,0,0,1,21.722,33.42965,8.29635,8.29635,0,0,0,.38946.861c.07116.12855.22232.21282.55927.51883A176.357,176.357,0,0,1,241.968,79.06864c-.17651-.8761-.28195-1.54571-.44772-2.2a112.49436,112.49436,0,0,1-2.65292-36.95637,84.07478,84.07478,0,0,1,4.44444-21.76378,31.32555,31.32555,0,0,1,5.47651-10.17139,15.687,15.687,0,0,1,3.16336-2.82149,7.026,7.026,0,0,1,8.03255-.056,17.27854,17.27854,0,0,1,5.8402,6.73185A53.05435,53.05435,0,0,1,271.08657,26.508a112.50469,112.50469,0,0,1,2.12263,33.00356,95.59806,95.59806,0,0,1-3.49052,19.91081c7.12171,1.31193,14.20955,2.32869,21.1473,3.97713a186.37909,186.37909,0,0,1,20.44069,6.0033A188.31671,188.31671,0,0,1,331.0769,97.9721c6.34538,3.16433,12.38553,6.94066,18.71757,10.53829.20571-.433.50439-.94982.706-1.50212A108.65959,108.65959,0,0,1,383.40128,60.246a37.75787,37.75787,0,0,1,11.822-6.883,17.24558,17.24558,0,0,1,3.67827-.84512c6.264-.71729,8.89351,3.2244,9.35653,7.93183a29.94372,29.94372,0,0,1-.77381,10.35466A87.90551,87.90551,0,0,1,396.75426,95.492c-6.79016,10.97178-14.85015,20.85494-25.09307,28.83042-.30234.2354-.56784.51814-1.07988.99029a177.77993,177.77993,0,0,1,26.59293,30.88244,10.96227,10.96227,0,0,1-1.689.29762c-10.59546.015-21.1911-.01829-31.78622.04607a4.004,4.004,0,0,1-3.17246-1.69,147.87522,147.87522,0,0,0-88.17776-46.54846,143.35862,143.35862,0,0,0-30.27955-1.16923,146.40735,146.40735,0,0,0-82.53728,31.81054,140.06663,140.06663,0,0,0-16.97616,15.84186,4.72839,4.72839,0,0,1-3.86326,1.75742c-10.12056-.07028-20.24188-.035-30.36293-.03495h-2.15212c.618-2.408,6.84026-10.93786,13.88352-18.55281C125.31349,132.2744,130.87768,126.8839,136.52938,121.13478Z" />
-                            <path
-                                d="M394.52934,347.9123a176.63854,176.63854,0,0,1-23.97343,27.16338c.70941.59068,1.28594,1.07041,1.86212,1.55057A108.31456,108.31456,0,0,1,406.10131,424.772a34.61831,34.61831,0,0,1,2.202,14.42026,14.88544,14.88544,0,0,1-.74786,3.69206,7.20762,7.20762,0,0,1-8.15793,5.02308,22.23329,22.23329,0,0,1-6.76276-2.00629,51.23237,51.23237,0,0,1-9.18151-5.8151,107.59183,107.59183,0,0,1-32.936-46.7072c-.18746-.51334-.39218-1.0204-.72243-1.87691a194.65008,194.65008,0,0,1-25.01223,14.00774,181.66925,181.66925,0,0,1-26.6869,9.72442,187.55649,187.55649,0,0,1-28.3045,5.38805c.16807.84015.26446,1.5098.43745,2.15907a109.172,109.172,0,0,1,2.9708,36.44311,80.804,80.804,0,0,1-4.42286,22.4773,78.24971,78.24971,0,0,1-4.16475,8.74473,13.39,13.39,0,0,1-2.33865,2.97083c-3.98009,4.109-8.73225,4.144-12.61157-.07366a27.28012,27.28012,0,0,1-3.907-5.61776c-3.07685-5.77569-4.6604-12.056-5.791-18.46021a116.86329,116.86329,0,0,1-1.35893-26.465,94.4795,94.4795,0,0,1,2.88466-19.18513c.14009-.53269.268-1.0696.37134-1.61034.02629-.13754-.06342-.2973-.17067-.73825a176.12108,176.12108,0,0,1-80.96855-24.99386c-.40992.90921-.76206,1.67473-1.10168,2.44579a110.47729,110.47729,0,0,1-30.90112,41.42041,38.16071,38.16071,0,0,1-12.04706,6.95909,12.08987,12.08987,0,0,1-6.51516.70023,7.11858,7.11858,0,0,1-5.40329-4.4892c-1.41614-3.424-1.16526-6.985-.68438-10.51691a55.45267,55.45267,0,0,1,4.30768-14.25037A112.49985,112.49985,0,0,1,134.88761,380.779c.459-.43461.92981-.857,1.38087-1.29954a3.76029,3.76029,0,0,0,.36534-.65529,178.90466,178.90466,0,0,1-28.469-31.31672c.98458-.08018,1.64327-.18,2.30205-.1806,10.51436-.00976,21.029.02736,31.54284-.04358a4.70554,4.70554,0,0,1,3.70344,1.62615,146.94611,146.94611,0,0,0,39.40276,28.88494,139.94667,139.94667,0,0,0,49.70395,14.77367q70.68048,6.87067,121.59971-42.85452a7.64571,7.64571,0,0,1,5.99261-2.44347c9.80139.12121,19.60512.04986,29.408.04986h2.53353Z" />
-                            <path
-                                d="M350.73576,197.76167c2.78711,0,5.47037.18919,8.11487-.0501,2.9951-.271,5.139.8001,7.32354,2.81308,12.61275,11.62214,25.35732,23.10129,38.05863,34.62729.63855.57948,1.29039,1.14432,2.1101,1.8701.76445-.65718,1.48119-1.24318,2.16483-1.8655Q428.14636,217.27914,447.756,199.37a5.44772,5.44772,0,0,1,4.20358-1.64576c3.21888.13038,6.44673.03746,9.8412.03746V303.13036c-1.72309.50368-24.8756.60366-27.63911.0611v-53.362l-.53656-.25427c-9.01079,8.21784-18.0216,16.43564-27.23786,24.8408-9.22584-8.31119-18.34194-16.52347-27.458-24.73577l-.52449.19192c-.023,4.45359-.00774,8.90828-.01046,13.36233q-.00408,6.63942-.00058,13.27882v26.87211h-27.428C350.45161,301.61243,350.21289,203.72342,350.73576,197.76167Z" />
-                            <path
-                                d="M97.63436,197.88229h27.26325c.55054,1.75251.65821,102.97139.09469,105.525H97.70468c-.15021-6.70344-.04736-13.38394-.06622-20.06131-.01871-6.62261-.0041-13.24531-.0041-20.03958H63.84679V303.047c-2.05946.61518-25.33374.67417-27.64758.123V197.89436H63.73742v37.18876c1.96793.56844,30.92319.67339,33.872.12942.00818-2.97713.02-6.02646.024-9.0758q.0063-4.7433.00094-9.4866,0-4.625,0-9.25C97.63437,204.32179,97.63436,201.24346,97.63436,197.88229Z" />
-                            <path
-                                d="M157.5757,303.3683V198.1946c1.617-.52913,61.545-.73586,65.46219-.20457v22.41432c-.87869.063-1.7857.18341-2.69279.18454q-16.0086.01994-32.01725.00881l-2.96767,0v17.43353H218.7067V261.2229H185.65838c-.55339,1.98509-.70531,15.81681-.25622,19.64583.84488.05679,1.75.16952,2.6553.17059q16.00862.01863,32.01727.00822h2.96945V303.3683Z" />
-                            <path
-                                d="M254.28291,303.40855c-.50074-2.82232-.39948-103.60181.09747-105.51735h27.16208v77.76453c1.17173.06084,2.09122.14921,3.01077.15005q16.128.01468,32.2561.00658c.92562,0,1.85125,0,2.90733,0v27.59622Z" />
-                        </svg>
-                    </div>
-                    <div>
-                        <h1 class="text-4xl font-bold">{{ currentChart[0].name }}</h1>
-                        <p>{{ currentChart[0].description }}</p>
-                        <span
-                            class="bg-yellow-100 text-yellow-800 text-xs font-medium px-2.5 py-0.5 rounded-full dark:bg-yellow-900 dark:text-yellow-300">{{
-                                currentChart[0].version }}</span>
-                    </div>
-                </div>
-                <hr class="h-px my-8 bg-gray-200 border-0 dark:bg-gray-700" />
-                <ContentDoc class="prose max-w-full dark:text-white" :path="`${path}/readme`" />
+  <main class="pt-10">
+    <div class="flex justify-between">
+      <NuxtLink to="/">
+        <UIcon name="i-heroicons-arrow-left"/>
+        All Charts
+      </NuxtLink>
+      <NuxtLink class="flex items-center gap-1" :to="'https://github.com/frankframework/charts/tree/master/charts/' + currentChart[0].name">
+        <svg class="gh-icon" xmlns="http://www.w3.org/2000/svg" width="16px" height="16px" viewBox="0 0 32.58 31.77">
+          <path
+              d="M16.29,0a16.29,16.29,0,0,0-5.15,31.75c.82.15,1.11-.36,1.11-.79s0-1.41,0-2.77C7.7,29.18,6.74,26,6.74,26a4.36,4.36,0,0,0-1.81-2.39c-1.47-1,.12-1,.12-1a3.43,3.43,0,0,1,2.49,1.68,3.48,3.48,0,0,0,4.74,1.36,3.46,3.46,0,0,1,1-2.18c-3.62-.41-7.42-1.81-7.42-8a6.3,6.3,0,0,1,1.67-4.37,5.94,5.94,0,0,1,.16-4.31s1.37-.44,4.48,1.67a15.41,15.41,0,0,1,8.16,0c3.11-2.11,4.47-1.67,4.47-1.67A5.91,5.91,0,0,1,25,11.07a6.3,6.3,0,0,1,1.67,4.37c0,6.26-3.81,7.63-7.44,8a3.85,3.85,0,0,1,1.11,3c0,2.18,0,3.94,0,4.47s.29.94,1.12.78A16.29,16.29,0,0,0,16.29,0Z"></path>
+        </svg>
+        View on GitHub
+      </NuxtLink>
+    </div>
+    <div class="flex mt-10">
+      <div class="flex-auto">
+        <div class="flex items-top">
+          <img :src="currentChart[0].icon" v-if="currentChart[0].icon" class="w-28 mr-5 max-h-28"/>
+          <div v-else class="w-28 h-28 mr-5 p-3 rounded-2xl bg-gray-100">
+            <svg xmlns="http://www.w3.org/2000/svg" class="w-100 h-100 fill-gray-400" viewBox="0 0 500 500">
+              <path
+                  d="M136.52938,121.13478c-.572-.54252-1.19462-1.12636-1.81-1.71761-12.61677-12.12115-22.38092-26.13637-28.279-42.702-1.65073-4.63637-2.89692-9.36515-2.67587-14.35871.021-.4739.01959-.94915.05226-1.42214.445-6.44594,4.75912-9.70322,11.05839-8.17669a27.325,27.325,0,0,1,5.73149,2.19653c6.89022,3.45538,12.5062,8.56359,17.67051,14.16571a112.52651,112.52651,0,0,1,21.722,33.42965,8.29635,8.29635,0,0,0,.38946.861c.07116.12855.22232.21282.55927.51883A176.357,176.357,0,0,1,241.968,79.06864c-.17651-.8761-.28195-1.54571-.44772-2.2a112.49436,112.49436,0,0,1-2.65292-36.95637,84.07478,84.07478,0,0,1,4.44444-21.76378,31.32555,31.32555,0,0,1,5.47651-10.17139,15.687,15.687,0,0,1,3.16336-2.82149,7.026,7.026,0,0,1,8.03255-.056,17.27854,17.27854,0,0,1,5.8402,6.73185A53.05435,53.05435,0,0,1,271.08657,26.508a112.50469,112.50469,0,0,1,2.12263,33.00356,95.59806,95.59806,0,0,1-3.49052,19.91081c7.12171,1.31193,14.20955,2.32869,21.1473,3.97713a186.37909,186.37909,0,0,1,20.44069,6.0033A188.31671,188.31671,0,0,1,331.0769,97.9721c6.34538,3.16433,12.38553,6.94066,18.71757,10.53829.20571-.433.50439-.94982.706-1.50212A108.65959,108.65959,0,0,1,383.40128,60.246a37.75787,37.75787,0,0,1,11.822-6.883,17.24558,17.24558,0,0,1,3.67827-.84512c6.264-.71729,8.89351,3.2244,9.35653,7.93183a29.94372,29.94372,0,0,1-.77381,10.35466A87.90551,87.90551,0,0,1,396.75426,95.492c-6.79016,10.97178-14.85015,20.85494-25.09307,28.83042-.30234.2354-.56784.51814-1.07988.99029a177.77993,177.77993,0,0,1,26.59293,30.88244,10.96227,10.96227,0,0,1-1.689.29762c-10.59546.015-21.1911-.01829-31.78622.04607a4.004,4.004,0,0,1-3.17246-1.69,147.87522,147.87522,0,0,0-88.17776-46.54846,143.35862,143.35862,0,0,0-30.27955-1.16923,146.40735,146.40735,0,0,0-82.53728,31.81054,140.06663,140.06663,0,0,0-16.97616,15.84186,4.72839,4.72839,0,0,1-3.86326,1.75742c-10.12056-.07028-20.24188-.035-30.36293-.03495h-2.15212c.618-2.408,6.84026-10.93786,13.88352-18.55281C125.31349,132.2744,130.87768,126.8839,136.52938,121.13478Z"/>
+              <path
+                  d="M394.52934,347.9123a176.63854,176.63854,0,0,1-23.97343,27.16338c.70941.59068,1.28594,1.07041,1.86212,1.55057A108.31456,108.31456,0,0,1,406.10131,424.772a34.61831,34.61831,0,0,1,2.202,14.42026,14.88544,14.88544,0,0,1-.74786,3.69206,7.20762,7.20762,0,0,1-8.15793,5.02308,22.23329,22.23329,0,0,1-6.76276-2.00629,51.23237,51.23237,0,0,1-9.18151-5.8151,107.59183,107.59183,0,0,1-32.936-46.7072c-.18746-.51334-.39218-1.0204-.72243-1.87691a194.65008,194.65008,0,0,1-25.01223,14.00774,181.66925,181.66925,0,0,1-26.6869,9.72442,187.55649,187.55649,0,0,1-28.3045,5.38805c.16807.84015.26446,1.5098.43745,2.15907a109.172,109.172,0,0,1,2.9708,36.44311,80.804,80.804,0,0,1-4.42286,22.4773,78.24971,78.24971,0,0,1-4.16475,8.74473,13.39,13.39,0,0,1-2.33865,2.97083c-3.98009,4.109-8.73225,4.144-12.61157-.07366a27.28012,27.28012,0,0,1-3.907-5.61776c-3.07685-5.77569-4.6604-12.056-5.791-18.46021a116.86329,116.86329,0,0,1-1.35893-26.465,94.4795,94.4795,0,0,1,2.88466-19.18513c.14009-.53269.268-1.0696.37134-1.61034.02629-.13754-.06342-.2973-.17067-.73825a176.12108,176.12108,0,0,1-80.96855-24.99386c-.40992.90921-.76206,1.67473-1.10168,2.44579a110.47729,110.47729,0,0,1-30.90112,41.42041,38.16071,38.16071,0,0,1-12.04706,6.95909,12.08987,12.08987,0,0,1-6.51516.70023,7.11858,7.11858,0,0,1-5.40329-4.4892c-1.41614-3.424-1.16526-6.985-.68438-10.51691a55.45267,55.45267,0,0,1,4.30768-14.25037A112.49985,112.49985,0,0,1,134.88761,380.779c.459-.43461.92981-.857,1.38087-1.29954a3.76029,3.76029,0,0,0,.36534-.65529,178.90466,178.90466,0,0,1-28.469-31.31672c.98458-.08018,1.64327-.18,2.30205-.1806,10.51436-.00976,21.029.02736,31.54284-.04358a4.70554,4.70554,0,0,1,3.70344,1.62615,146.94611,146.94611,0,0,0,39.40276,28.88494,139.94667,139.94667,0,0,0,49.70395,14.77367q70.68048,6.87067,121.59971-42.85452a7.64571,7.64571,0,0,1,5.99261-2.44347c9.80139.12121,19.60512.04986,29.408.04986h2.53353Z"/>
+              <path
+                  d="M350.73576,197.76167c2.78711,0,5.47037.18919,8.11487-.0501,2.9951-.271,5.139.8001,7.32354,2.81308,12.61275,11.62214,25.35732,23.10129,38.05863,34.62729.63855.57948,1.29039,1.14432,2.1101,1.8701.76445-.65718,1.48119-1.24318,2.16483-1.8655Q428.14636,217.27914,447.756,199.37a5.44772,5.44772,0,0,1,4.20358-1.64576c3.21888.13038,6.44673.03746,9.8412.03746V303.13036c-1.72309.50368-24.8756.60366-27.63911.0611v-53.362l-.53656-.25427c-9.01079,8.21784-18.0216,16.43564-27.23786,24.8408-9.22584-8.31119-18.34194-16.52347-27.458-24.73577l-.52449.19192c-.023,4.45359-.00774,8.90828-.01046,13.36233q-.00408,6.63942-.00058,13.27882v26.87211h-27.428C350.45161,301.61243,350.21289,203.72342,350.73576,197.76167Z"/>
+              <path
+                  d="M97.63436,197.88229h27.26325c.55054,1.75251.65821,102.97139.09469,105.525H97.70468c-.15021-6.70344-.04736-13.38394-.06622-20.06131-.01871-6.62261-.0041-13.24531-.0041-20.03958H63.84679V303.047c-2.05946.61518-25.33374.67417-27.64758.123V197.89436H63.73742v37.18876c1.96793.56844,30.92319.67339,33.872.12942.00818-2.97713.02-6.02646.024-9.0758q.0063-4.7433.00094-9.4866,0-4.625,0-9.25C97.63437,204.32179,97.63436,201.24346,97.63436,197.88229Z"/>
+              <path
+                  d="M157.5757,303.3683V198.1946c1.617-.52913,61.545-.73586,65.46219-.20457v22.41432c-.87869.063-1.7857.18341-2.69279.18454q-16.0086.01994-32.01725.00881l-2.96767,0v17.43353H218.7067V261.2229H185.65838c-.55339,1.98509-.70531,15.81681-.25622,19.64583.84488.05679,1.75.16952,2.6553.17059q16.00862.01863,32.01727.00822h2.96945V303.3683Z"/>
+              <path
+                  d="M254.28291,303.40855c-.50074-2.82232-.39948-103.60181.09747-105.51735h27.16208v77.76453c1.17173.06084,2.09122.14921,3.01077.15005q16.128.01468,32.2561.00658c.92562,0,1.85125,0,2.90733,0v27.59622Z"/>
+            </svg>
+          </div>
+          <div>
+            <h1 class="text-4xl font-bold">{{ currentChart[0].name }}</h1>
+            <p>{{ currentChart[0].description }}</p>
+            <div class="mb-0.5">
+              <span
+                  class="bg-[#fdc300] font-bold text-black text-xs mr-0.5 px-2.5 py-0.5 rounded-full">{{
+                  currentChart[0].version
+                }}</span>
+              <span v-if="currentChart[0].deprecated"
+                    class="bg-red-100 text-red-800 text-xs mr-0.5 font-medium px-2.5 py-0.5 rounded-full dark:bg-red-900 dark:text-red-300">deprecated</span>
             </div>
-            <div class="flex-none ml-5 w-64 border-l-1 border-gray-100">
-                <div class="sticky top-10">
-                    <h1 class="font-bold">Chart Versions</h1>
-                    <div v-for="chart in charts.entries[currentChart[0].name]">
-                        {{ chart.version }} - {{ formatDate(chart.created) }}
-                    </div>
-                    <h1 class="font-bold mt-3">Chart</h1>
-                    <NuxtLink :to="charts.entries[currentChart[0].name][0].urls[0]">Download</NuxtLink>
-                </div>
+            <div>
+              <span v-for="keyword in currentChart[0].keywords"
+                    class="bg-yellow-100 text-yellow-800 text-xs mr-0.5 font-medium px-2.5 py-0.5 rounded-full dark:bg-yellow-900 dark:text-yellow-300">{{ keyword }}</span>
             </div>
+          </div>
         </div>
-    </main>
+        <hr class="h-px my-8 bg-gray-200 border-0 dark:bg-gray-700"/>
+        <ContentDoc class="prose max-w-full dark:text-white" :path="`${path}/readme`"/>
+      </div>
+      <div class="flex-none ml-5 border-l-1 border-gray-100">
+        <div class="sticky top-10">
+          <h1 class="font-bold">Chart Versions</h1>
+          <div v-for="chart in charts.entries[currentChart[0].name]">
+            {{ chart.version }} - {{ formatDate(chart.created) }}
+          </div>
+          <h1 class="font-bold mt-3">Chart</h1>
+          <NuxtLink :to="charts.entries[currentChart[0].name][0].urls[0]">Download</NuxtLink>
+        </div>
+      </div>
+    </div>
+  </main>
 </template>
 
 <script setup>
 const route = useRoute()
 const path = 'charts/' + route.params.name
-const { data: currentChart } = await useAsyncData(path, () => {
-    return queryContent(path).find()
+const {data: currentChart} = await useAsyncData(path, () => {
+  return queryContent(path).find()
 })
-const { data: charts } = await useAsyncData('charts', () => queryContent('charts').findOne())
+const {data: charts} = await useAsyncData('charts', () => queryContent('charts').findOne())
 const formatDate = (date) => new Date(date).toLocaleDateString('en-GB');
 </script>
 
diff --git a/frontend/pages/index.vue b/frontend/pages/index.vue
index 255cec0..1ad77b7 100644
--- a/frontend/pages/index.vue
+++ b/frontend/pages/index.vue
@@ -1,37 +1,47 @@
 <template>
   <main>
-      <h1 class="text-4xl font-extrabold mt-10 mb-5">Charts</h1>
-      <NuxtLink v-for="chart in data.entries" :to="`/${chart[0].name}`">
-          <UCard class="mb-3 hover:bg-slate-50">
-              <div class="flex items-top">
-                  <img :src="chart[0].icon" v-if="chart[0].icon" class="w-28 mr-5 max-h-28" />
-                  <div v-else class="w-28 h-28 mr-5 p-3 rounded-2xl bg-gray-100">
-                      <svg xmlns="http://www.w3.org/2000/svg" class="w-100 h-100 fill-gray-400" viewBox="0 0 500 500">
-                          <path
-                              d="M136.52938,121.13478c-.572-.54252-1.19462-1.12636-1.81-1.71761-12.61677-12.12115-22.38092-26.13637-28.279-42.702-1.65073-4.63637-2.89692-9.36515-2.67587-14.35871.021-.4739.01959-.94915.05226-1.42214.445-6.44594,4.75912-9.70322,11.05839-8.17669a27.325,27.325,0,0,1,5.73149,2.19653c6.89022,3.45538,12.5062,8.56359,17.67051,14.16571a112.52651,112.52651,0,0,1,21.722,33.42965,8.29635,8.29635,0,0,0,.38946.861c.07116.12855.22232.21282.55927.51883A176.357,176.357,0,0,1,241.968,79.06864c-.17651-.8761-.28195-1.54571-.44772-2.2a112.49436,112.49436,0,0,1-2.65292-36.95637,84.07478,84.07478,0,0,1,4.44444-21.76378,31.32555,31.32555,0,0,1,5.47651-10.17139,15.687,15.687,0,0,1,3.16336-2.82149,7.026,7.026,0,0,1,8.03255-.056,17.27854,17.27854,0,0,1,5.8402,6.73185A53.05435,53.05435,0,0,1,271.08657,26.508a112.50469,112.50469,0,0,1,2.12263,33.00356,95.59806,95.59806,0,0,1-3.49052,19.91081c7.12171,1.31193,14.20955,2.32869,21.1473,3.97713a186.37909,186.37909,0,0,1,20.44069,6.0033A188.31671,188.31671,0,0,1,331.0769,97.9721c6.34538,3.16433,12.38553,6.94066,18.71757,10.53829.20571-.433.50439-.94982.706-1.50212A108.65959,108.65959,0,0,1,383.40128,60.246a37.75787,37.75787,0,0,1,11.822-6.883,17.24558,17.24558,0,0,1,3.67827-.84512c6.264-.71729,8.89351,3.2244,9.35653,7.93183a29.94372,29.94372,0,0,1-.77381,10.35466A87.90551,87.90551,0,0,1,396.75426,95.492c-6.79016,10.97178-14.85015,20.85494-25.09307,28.83042-.30234.2354-.56784.51814-1.07988.99029a177.77993,177.77993,0,0,1,26.59293,30.88244,10.96227,10.96227,0,0,1-1.689.29762c-10.59546.015-21.1911-.01829-31.78622.04607a4.004,4.004,0,0,1-3.17246-1.69,147.87522,147.87522,0,0,0-88.17776-46.54846,143.35862,143.35862,0,0,0-30.27955-1.16923,146.40735,146.40735,0,0,0-82.53728,31.81054,140.06663,140.06663,0,0,0-16.97616,15.84186,4.72839,4.72839,0,0,1-3.86326,1.75742c-10.12056-.07028-20.24188-.035-30.36293-.03495h-2.15212c.618-2.408,6.84026-10.93786,13.88352-18.55281C125.31349,132.2744,130.87768,126.8839,136.52938,121.13478Z" />
-                          <path
-                              d="M394.52934,347.9123a176.63854,176.63854,0,0,1-23.97343,27.16338c.70941.59068,1.28594,1.07041,1.86212,1.55057A108.31456,108.31456,0,0,1,406.10131,424.772a34.61831,34.61831,0,0,1,2.202,14.42026,14.88544,14.88544,0,0,1-.74786,3.69206,7.20762,7.20762,0,0,1-8.15793,5.02308,22.23329,22.23329,0,0,1-6.76276-2.00629,51.23237,51.23237,0,0,1-9.18151-5.8151,107.59183,107.59183,0,0,1-32.936-46.7072c-.18746-.51334-.39218-1.0204-.72243-1.87691a194.65008,194.65008,0,0,1-25.01223,14.00774,181.66925,181.66925,0,0,1-26.6869,9.72442,187.55649,187.55649,0,0,1-28.3045,5.38805c.16807.84015.26446,1.5098.43745,2.15907a109.172,109.172,0,0,1,2.9708,36.44311,80.804,80.804,0,0,1-4.42286,22.4773,78.24971,78.24971,0,0,1-4.16475,8.74473,13.39,13.39,0,0,1-2.33865,2.97083c-3.98009,4.109-8.73225,4.144-12.61157-.07366a27.28012,27.28012,0,0,1-3.907-5.61776c-3.07685-5.77569-4.6604-12.056-5.791-18.46021a116.86329,116.86329,0,0,1-1.35893-26.465,94.4795,94.4795,0,0,1,2.88466-19.18513c.14009-.53269.268-1.0696.37134-1.61034.02629-.13754-.06342-.2973-.17067-.73825a176.12108,176.12108,0,0,1-80.96855-24.99386c-.40992.90921-.76206,1.67473-1.10168,2.44579a110.47729,110.47729,0,0,1-30.90112,41.42041,38.16071,38.16071,0,0,1-12.04706,6.95909,12.08987,12.08987,0,0,1-6.51516.70023,7.11858,7.11858,0,0,1-5.40329-4.4892c-1.41614-3.424-1.16526-6.985-.68438-10.51691a55.45267,55.45267,0,0,1,4.30768-14.25037A112.49985,112.49985,0,0,1,134.88761,380.779c.459-.43461.92981-.857,1.38087-1.29954a3.76029,3.76029,0,0,0,.36534-.65529,178.90466,178.90466,0,0,1-28.469-31.31672c.98458-.08018,1.64327-.18,2.30205-.1806,10.51436-.00976,21.029.02736,31.54284-.04358a4.70554,4.70554,0,0,1,3.70344,1.62615,146.94611,146.94611,0,0,0,39.40276,28.88494,139.94667,139.94667,0,0,0,49.70395,14.77367q70.68048,6.87067,121.59971-42.85452a7.64571,7.64571,0,0,1,5.99261-2.44347c9.80139.12121,19.60512.04986,29.408.04986h2.53353Z" />
-                          <path
-                              d="M350.73576,197.76167c2.78711,0,5.47037.18919,8.11487-.0501,2.9951-.271,5.139.8001,7.32354,2.81308,12.61275,11.62214,25.35732,23.10129,38.05863,34.62729.63855.57948,1.29039,1.14432,2.1101,1.8701.76445-.65718,1.48119-1.24318,2.16483-1.8655Q428.14636,217.27914,447.756,199.37a5.44772,5.44772,0,0,1,4.20358-1.64576c3.21888.13038,6.44673.03746,9.8412.03746V303.13036c-1.72309.50368-24.8756.60366-27.63911.0611v-53.362l-.53656-.25427c-9.01079,8.21784-18.0216,16.43564-27.23786,24.8408-9.22584-8.31119-18.34194-16.52347-27.458-24.73577l-.52449.19192c-.023,4.45359-.00774,8.90828-.01046,13.36233q-.00408,6.63942-.00058,13.27882v26.87211h-27.428C350.45161,301.61243,350.21289,203.72342,350.73576,197.76167Z" />
-                          <path
-                              d="M97.63436,197.88229h27.26325c.55054,1.75251.65821,102.97139.09469,105.525H97.70468c-.15021-6.70344-.04736-13.38394-.06622-20.06131-.01871-6.62261-.0041-13.24531-.0041-20.03958H63.84679V303.047c-2.05946.61518-25.33374.67417-27.64758.123V197.89436H63.73742v37.18876c1.96793.56844,30.92319.67339,33.872.12942.00818-2.97713.02-6.02646.024-9.0758q.0063-4.7433.00094-9.4866,0-4.625,0-9.25C97.63437,204.32179,97.63436,201.24346,97.63436,197.88229Z" />
-                          <path
-                              d="M157.5757,303.3683V198.1946c1.617-.52913,61.545-.73586,65.46219-.20457v22.41432c-.87869.063-1.7857.18341-2.69279.18454q-16.0086.01994-32.01725.00881l-2.96767,0v17.43353H218.7067V261.2229H185.65838c-.55339,1.98509-.70531,15.81681-.25622,19.64583.84488.05679,1.75.16952,2.6553.17059q16.00862.01863,32.01727.00822h2.96945V303.3683Z" />
-                          <path
-                              d="M254.28291,303.40855c-.50074-2.82232-.39948-103.60181.09747-105.51735h27.16208v77.76453c1.17173.06084,2.09122.14921,3.01077.15005q16.128.01468,32.2561.00658c.92562,0,1.85125,0,2.90733,0v27.59622Z" />
-                      </svg>
-                  </div>
-                  <div>
-                      <h2 class="text-2xl font-bold">{{ chart[0].name }}</h2>
-                      <p>{{ chart[0].description }}</p>
-                      <span
-                          class="bg-yellow-100 text-yellow-800 text-xs font-medium px-2.5 py-0.5 rounded-full dark:bg-yellow-900 dark:text-yellow-300">{{ chart[0].version }}</span>
-                  </div>
-              </div>
-          </UCard>
-      </NuxtLink>
+    <h1 class="text-4xl font-extrabold mt-10 mb-5">Charts</h1>
+    <NuxtLink v-for="chart in data.entries" :to="`/${chart[0].name}`">
+      <UCard class="mb-3 hover:bg-slate-50">
+        <div class="flex items-top">
+          <img :src="chart[0].icon" v-if="chart[0].icon" class="w-28 mr-5 max-h-28"/>
+          <div v-else class="w-28 h-28 mr-5 p-3 rounded-2xl bg-gray-100">
+            <svg xmlns="http://www.w3.org/2000/svg" class="w-100 h-100 fill-gray-400" viewBox="0 0 500 500">
+              <path
+                  d="M136.52938,121.13478c-.572-.54252-1.19462-1.12636-1.81-1.71761-12.61677-12.12115-22.38092-26.13637-28.279-42.702-1.65073-4.63637-2.89692-9.36515-2.67587-14.35871.021-.4739.01959-.94915.05226-1.42214.445-6.44594,4.75912-9.70322,11.05839-8.17669a27.325,27.325,0,0,1,5.73149,2.19653c6.89022,3.45538,12.5062,8.56359,17.67051,14.16571a112.52651,112.52651,0,0,1,21.722,33.42965,8.29635,8.29635,0,0,0,.38946.861c.07116.12855.22232.21282.55927.51883A176.357,176.357,0,0,1,241.968,79.06864c-.17651-.8761-.28195-1.54571-.44772-2.2a112.49436,112.49436,0,0,1-2.65292-36.95637,84.07478,84.07478,0,0,1,4.44444-21.76378,31.32555,31.32555,0,0,1,5.47651-10.17139,15.687,15.687,0,0,1,3.16336-2.82149,7.026,7.026,0,0,1,8.03255-.056,17.27854,17.27854,0,0,1,5.8402,6.73185A53.05435,53.05435,0,0,1,271.08657,26.508a112.50469,112.50469,0,0,1,2.12263,33.00356,95.59806,95.59806,0,0,1-3.49052,19.91081c7.12171,1.31193,14.20955,2.32869,21.1473,3.97713a186.37909,186.37909,0,0,1,20.44069,6.0033A188.31671,188.31671,0,0,1,331.0769,97.9721c6.34538,3.16433,12.38553,6.94066,18.71757,10.53829.20571-.433.50439-.94982.706-1.50212A108.65959,108.65959,0,0,1,383.40128,60.246a37.75787,37.75787,0,0,1,11.822-6.883,17.24558,17.24558,0,0,1,3.67827-.84512c6.264-.71729,8.89351,3.2244,9.35653,7.93183a29.94372,29.94372,0,0,1-.77381,10.35466A87.90551,87.90551,0,0,1,396.75426,95.492c-6.79016,10.97178-14.85015,20.85494-25.09307,28.83042-.30234.2354-.56784.51814-1.07988.99029a177.77993,177.77993,0,0,1,26.59293,30.88244,10.96227,10.96227,0,0,1-1.689.29762c-10.59546.015-21.1911-.01829-31.78622.04607a4.004,4.004,0,0,1-3.17246-1.69,147.87522,147.87522,0,0,0-88.17776-46.54846,143.35862,143.35862,0,0,0-30.27955-1.16923,146.40735,146.40735,0,0,0-82.53728,31.81054,140.06663,140.06663,0,0,0-16.97616,15.84186,4.72839,4.72839,0,0,1-3.86326,1.75742c-10.12056-.07028-20.24188-.035-30.36293-.03495h-2.15212c.618-2.408,6.84026-10.93786,13.88352-18.55281C125.31349,132.2744,130.87768,126.8839,136.52938,121.13478Z"/>
+              <path
+                  d="M394.52934,347.9123a176.63854,176.63854,0,0,1-23.97343,27.16338c.70941.59068,1.28594,1.07041,1.86212,1.55057A108.31456,108.31456,0,0,1,406.10131,424.772a34.61831,34.61831,0,0,1,2.202,14.42026,14.88544,14.88544,0,0,1-.74786,3.69206,7.20762,7.20762,0,0,1-8.15793,5.02308,22.23329,22.23329,0,0,1-6.76276-2.00629,51.23237,51.23237,0,0,1-9.18151-5.8151,107.59183,107.59183,0,0,1-32.936-46.7072c-.18746-.51334-.39218-1.0204-.72243-1.87691a194.65008,194.65008,0,0,1-25.01223,14.00774,181.66925,181.66925,0,0,1-26.6869,9.72442,187.55649,187.55649,0,0,1-28.3045,5.38805c.16807.84015.26446,1.5098.43745,2.15907a109.172,109.172,0,0,1,2.9708,36.44311,80.804,80.804,0,0,1-4.42286,22.4773,78.24971,78.24971,0,0,1-4.16475,8.74473,13.39,13.39,0,0,1-2.33865,2.97083c-3.98009,4.109-8.73225,4.144-12.61157-.07366a27.28012,27.28012,0,0,1-3.907-5.61776c-3.07685-5.77569-4.6604-12.056-5.791-18.46021a116.86329,116.86329,0,0,1-1.35893-26.465,94.4795,94.4795,0,0,1,2.88466-19.18513c.14009-.53269.268-1.0696.37134-1.61034.02629-.13754-.06342-.2973-.17067-.73825a176.12108,176.12108,0,0,1-80.96855-24.99386c-.40992.90921-.76206,1.67473-1.10168,2.44579a110.47729,110.47729,0,0,1-30.90112,41.42041,38.16071,38.16071,0,0,1-12.04706,6.95909,12.08987,12.08987,0,0,1-6.51516.70023,7.11858,7.11858,0,0,1-5.40329-4.4892c-1.41614-3.424-1.16526-6.985-.68438-10.51691a55.45267,55.45267,0,0,1,4.30768-14.25037A112.49985,112.49985,0,0,1,134.88761,380.779c.459-.43461.92981-.857,1.38087-1.29954a3.76029,3.76029,0,0,0,.36534-.65529,178.90466,178.90466,0,0,1-28.469-31.31672c.98458-.08018,1.64327-.18,2.30205-.1806,10.51436-.00976,21.029.02736,31.54284-.04358a4.70554,4.70554,0,0,1,3.70344,1.62615,146.94611,146.94611,0,0,0,39.40276,28.88494,139.94667,139.94667,0,0,0,49.70395,14.77367q70.68048,6.87067,121.59971-42.85452a7.64571,7.64571,0,0,1,5.99261-2.44347c9.80139.12121,19.60512.04986,29.408.04986h2.53353Z"/>
+              <path
+                  d="M350.73576,197.76167c2.78711,0,5.47037.18919,8.11487-.0501,2.9951-.271,5.139.8001,7.32354,2.81308,12.61275,11.62214,25.35732,23.10129,38.05863,34.62729.63855.57948,1.29039,1.14432,2.1101,1.8701.76445-.65718,1.48119-1.24318,2.16483-1.8655Q428.14636,217.27914,447.756,199.37a5.44772,5.44772,0,0,1,4.20358-1.64576c3.21888.13038,6.44673.03746,9.8412.03746V303.13036c-1.72309.50368-24.8756.60366-27.63911.0611v-53.362l-.53656-.25427c-9.01079,8.21784-18.0216,16.43564-27.23786,24.8408-9.22584-8.31119-18.34194-16.52347-27.458-24.73577l-.52449.19192c-.023,4.45359-.00774,8.90828-.01046,13.36233q-.00408,6.63942-.00058,13.27882v26.87211h-27.428C350.45161,301.61243,350.21289,203.72342,350.73576,197.76167Z"/>
+              <path
+                  d="M97.63436,197.88229h27.26325c.55054,1.75251.65821,102.97139.09469,105.525H97.70468c-.15021-6.70344-.04736-13.38394-.06622-20.06131-.01871-6.62261-.0041-13.24531-.0041-20.03958H63.84679V303.047c-2.05946.61518-25.33374.67417-27.64758.123V197.89436H63.73742v37.18876c1.96793.56844,30.92319.67339,33.872.12942.00818-2.97713.02-6.02646.024-9.0758q.0063-4.7433.00094-9.4866,0-4.625,0-9.25C97.63437,204.32179,97.63436,201.24346,97.63436,197.88229Z"/>
+              <path
+                  d="M157.5757,303.3683V198.1946c1.617-.52913,61.545-.73586,65.46219-.20457v22.41432c-.87869.063-1.7857.18341-2.69279.18454q-16.0086.01994-32.01725.00881l-2.96767,0v17.43353H218.7067V261.2229H185.65838c-.55339,1.98509-.70531,15.81681-.25622,19.64583.84488.05679,1.75.16952,2.6553.17059q16.00862.01863,32.01727.00822h2.96945V303.3683Z"/>
+              <path
+                  d="M254.28291,303.40855c-.50074-2.82232-.39948-103.60181.09747-105.51735h27.16208v77.76453c1.17173.06084,2.09122.14921,3.01077.15005q16.128.01468,32.2561.00658c.92562,0,1.85125,0,2.90733,0v27.59622Z"/>
+            </svg>
+          </div>
+          <div>
+            <h2 class="text-2xl font-bold">{{ chart[0].name }}</h2>
+            <p>{{ chart[0].description }}</p>
+            <div class="mb-0.5">
+              <span
+                  class="bg-[#fdc300] font-bold text-black text-xs mr-0.5 px-2.5 py-0.5 rounded-full">{{
+                  chart[0].version
+                }}</span>
+              <span v-if="chart[0].deprecated"
+                    class="bg-red-100 text-red-800 text-xs mr-0.5 font-medium px-2.5 py-0.5 rounded-full dark:bg-red-900 dark:text-red-300">deprecated</span>
+            </div>
+            <div>
+              <span v-for="keyword in chart[0].keywords"
+                    class="bg-yellow-100 text-yellow-800 text-xs mr-0.5 font-medium px-2.5 py-0.5 rounded-full dark:bg-yellow-900 dark:text-yellow-300">{{ keyword }}</span>
+            </div>
+          </div>
+        </div>
+      </UCard>
+    </NuxtLink>
   </main>
 </template>
 <script setup>
-const { data } = await useAsyncData('charts', () => queryContent('charts').findOne())
+const {data} = await useAsyncData('charts', () => queryContent('charts').findOne())
 </script>
\ No newline at end of file