{"id":195,"date":"2026-05-24T11:15:06","date_gmt":"2026-05-24T11:15:06","guid":{"rendered":"https:\/\/blog.ngocha.biz\/?p=195"},"modified":"2026-05-24T11:15:06","modified_gmt":"2026-05-24T11:15:06","slug":"helm-notes-txt-file","status":"publish","type":"post","link":"https:\/\/blog.ngocha.biz\/?p=195","title":{"rendered":"What is Helm NOTES.txt and How Do You Create One?"},"content":{"rendered":"<p>When you install a <a href=\"https:\/\/devopscube.com\/create-helm-chart\/\">Helm Chart<\/a>, at the end of the deployment you usually see operational instructions in your terminal like what to do next, commands to check the service health, Chart repository, etc.<\/p>\n<p>This is done by via NOTES.txt in Helm chart.<\/p>\n<p>In this blog, you will learn about:<\/p>\n<ul>\n<li>What is Helm Notes.txt<\/li>\n<li>How it works and its use cases<\/li>\n<li>How to view notes before and after chart installation.<\/li>\n<li>Simple hands-on guide to show the Notes.txt functionality.<\/li>\n<li>How to suppress notes output<\/li>\n<\/ul>\n<p>Lets get started.<\/p>\n<h2 id=\"what-is-notestxt-in-helm-chart\">What is NOTES.txt in Helm Chart?<\/h2>\n<p>Lets understand NOTES.txt with a use case.<\/p>\n<p>Lets say you are developing a Helm chart to deploy a backend application. <\/p>\n<p>After the chart deployment, you want to print the the key details about the deployment like its configured DNS endpoint, API paths etc..<\/p>\n<p><strong><code>NOTES.txt<\/code><\/strong> solves this.<\/p>\n<p><strong><code>NOTES.txt<\/code><\/strong> is an <strong>optional text file<\/strong> in the Helm chart that contains the <strong>post install instructions<\/strong> that is displayed in the terminal after a successful Helm deployment or upgrade command. We need to add <strong><code>NOTES.txt<\/code><\/strong> under templates as shown below.<\/p>\n<pre><code class=\"language-bash\">web-app\/\n\u251c\u2500\u2500 Chart.yaml\n\u251c\u2500\u2500 values.yaml\n\u2514\u2500\u2500 templates\/\n    \u251c\u2500\u2500 deployment.yaml\n    \u251c\u2500\u2500 service.yaml\n    \u2514\u2500\u2500 NOTES.txt<\/code><\/pre>\n<p><strong><code>NOTES.txt<\/code><\/strong> is processed with <strong>Helm rendering engine<\/strong> even though it is text file. So it supports<strong> GO templating. <\/strong>Instead of sending anything to <a href=\"https:\/\/devopscube.com\/kubernetes-tutorials-beginners\/\" rel=\"noreferrer\">Kubernetes<\/a> API, it just <strong>prints the rendered output to the terminal<\/strong> with the operational instructions you added to it.<\/p>\n<p>With Go templating support, it can get dynamic values like release name, namespace used, Chart.yaml, values.yaml, etc..<\/p>\n<p>You can also make use of values from the <a href=\"https:\/\/devopscube.com\/_helpers-tpl-file-in-helm-charts\/\" rel=\"noreferrer\">_helpers.tpl named templates<\/a>. This way the outputs can add more value to chart users.<\/p>\n<figure class=\"kg-card kg-image-card\"><img decoding=\"async\" src=\"https:\/\/storage.ghost.io\/c\/5f\/2f\/5f2f4d20-2abf-4534-8d40-7aa233aedd43\/content\/images\/2026\/05\/image-58.png\" class=\"kg-image\" alt=\"image illustrating the helm notes.txt workflow\" loading=\"lazy\" width=\"1993\" height=\"2050\" srcset=\"https:\/\/storage.ghost.io\/c\/5f\/2f\/5f2f4d20-2abf-4534-8d40-7aa233aedd43\/content\/images\/size\/w600\/2026\/05\/image-58.png 600w, https:\/\/storage.ghost.io\/c\/5f\/2f\/5f2f4d20-2abf-4534-8d40-7aa233aedd43\/content\/images\/size\/w1000\/2026\/05\/image-58.png 1000w, https:\/\/storage.ghost.io\/c\/5f\/2f\/5f2f4d20-2abf-4534-8d40-7aa233aedd43\/content\/images\/size\/w1600\/2026\/05\/image-58.png 1600w, https:\/\/storage.ghost.io\/c\/5f\/2f\/5f2f4d20-2abf-4534-8d40-7aa233aedd43\/content\/images\/2026\/05\/image-58.png 1993w\" sizes=\"auto, (min-width: 720px) 720px\"><\/figure>\n<h2 id=\"notestxt-example\">NOTES.txt Example<\/h2>\n<p>The best way to understand <strong><code>NOTES.txt<\/code><\/strong> is through community Helm Charts. If you download any <strong>community Helm charts<\/strong>, you can find this file under <strong><code>\/templates<\/code><\/strong> folder with other template files.<\/p>\n<p>For example, Grafana&#8217;s Helm charts NOTES.txt file gives you the post install <a href=\"https:\/\/devopscube.com\/kubectl-set-context\/\" rel=\"noreferrer\">kubectl<\/a> commands to get the admin password as shown below.<\/p>\n<figure class=\"kg-card kg-image-card\"><img decoding=\"async\" src=\"https:\/\/storage.ghost.io\/c\/5f\/2f\/5f2f4d20-2abf-4534-8d40-7aa233aedd43\/content\/images\/2026\/05\/image-43.png\" class=\"kg-image\" alt=\"example helm output based on the context in notes.txt\" loading=\"lazy\" width=\"2000\" height=\"1196\" srcset=\"https:\/\/storage.ghost.io\/c\/5f\/2f\/5f2f4d20-2abf-4534-8d40-7aa233aedd43\/content\/images\/size\/w600\/2026\/05\/image-43.png 600w, https:\/\/storage.ghost.io\/c\/5f\/2f\/5f2f4d20-2abf-4534-8d40-7aa233aedd43\/content\/images\/size\/w1000\/2026\/05\/image-43.png 1000w, https:\/\/storage.ghost.io\/c\/5f\/2f\/5f2f4d20-2abf-4534-8d40-7aa233aedd43\/content\/images\/size\/w1600\/2026\/05\/image-43.png 1600w, https:\/\/storage.ghost.io\/c\/5f\/2f\/5f2f4d20-2abf-4534-8d40-7aa233aedd43\/content\/images\/size\/w2400\/2026\/05\/image-43.png 2400w\" sizes=\"auto, (min-width: 720px) 720px\"><\/figure>\n<p>Here is a custom <strong><code>NOTES.txt<\/code><\/strong> example for your reference. It is a combination of plain text instructions and Go templates to get the rendered chart values dynamically.<\/p>\n<pre><code class=\"language-bash\">1. Get the application URL:\n\n   {{- if .Values.ingress.enabled }}\n   http:\/\/{{ .Values.ingress.host }}\n   {{- else }}\n   export POD_NAME=$(kubectl get pods --namespace {{ .Release.Namespace }} \\\n     -l \"app.kubernetes.io\/name={{ .Chart.Name }}\" \\\n     -o jsonpath=\"{.items[0].metadata.name}\")\n\n   kubectl --namespace {{ .Release.Namespace }} port-forward $POD_NAME 8080\n   {{- end }}\n\n2. Get the admin password:\n\n   kubectl get secret --namespace {{ .Release.Namespace }} {{ .Release.Name }} \\\n     -o jsonpath=\"{.data.password}\" | base64 --decode ; echo\n\n3. Check the pod status:\n\n   kubectl get pods -l app.kubernetes.io\/name={{ .Chart.Name }} \\\n     -n {{ .Release.Namespace }}<\/code><\/pre>\n<p>It prints the following.<\/p>\n<ul>\n<li>Ingress URL<\/li>\n<li>How to get the admin password.<\/li>\n<li>How to validate deployment by checking the pod status.<\/li>\n<\/ul>\n<p>Now that you have an understanding of how NOTES.txt works, let&#8217;s do a simple hands-on in the next section.<\/p>\n<h2 id=\"viewing-notes-before-installation\">Viewing Notes Before Installation<\/h2>\n<p>If you want to render the post installation instruction from the Notes.txt before the chart installation, you need to perform a dry run.<\/p>\n<p>For example, here is the command that displays the notes of the <a href=\"https:\/\/devopscube.com\/setup-prometheus-helm-chart\/\" rel=\"noreferrer\">Prometheus helm chart.<\/a><\/p>\n<pre><code>helm install prometheus prometheus-community\/prometheus \\\n  --dry-run --debug<\/code><\/pre>\n<p>Post installation there is a helm command to render the notes that we will look at it in the next section.<\/p>\n<h2 id=\"helm-notestxt-hands-on-example\">Helm NOTES.txt Hands-on Example<\/h2>\n<p>In this section, we will create a Helm chart boilerplate with NOTES.txt and modify it to print the custom information we add to it.<\/p>\n<h3 id=\"step-1-create-a-helm-boilerplate\">Step 1: Create a Helm Boilerplate<\/h3>\n<p>Run the following command to create a boilerplate.<\/p>\n<pre><code class=\"language-bash\">helm create web-app<\/code><\/pre>\n<h3 id=\"step-2-modify-the-existing-notestxt-file\">Step 2: Modify the Existing NOTES.txt file<\/h3>\n<p>Open the NOTES.txt file in an editor.<\/p>\n<pre><code class=\"language-bash\">vi web-app\/templates\/NOTES.txt<\/code><\/pre>\n<p>Replace the default notes with the following content. It contains plain text and Go template to get the Dynamic chart information.<\/p>\n<pre><code class=\"language-bash\">Release \"{{ .Release.Name }}\" deployed to namespace \"{{ .Release.Namespace }}\".\n\n-------------------------------------------------------\nGet the secret your app uses:\n\n  kubectl get secret {{ .Release.Name }}-secret \\\n    -n {{ .Release.Namespace }} \\\n    -o jsonpath=\"{.data.password}\" | base64 --decode\n\n  This decodes and prints the password your app is reading from Kubernetes Secrets.\n\n-------------------------------------------------------\nCheck if your app is healthy:\n\n  kubectl get pods -l app.kubernetes.io\/name={{ .Chart.Name }} \\\n    -n {{ .Release.Namespace }}\n\n  This lists all pods for this release. STATUS should show \"Running\"\n  and READY should show \"1\/1\" before you send any traffic.\n-------------------------------------------------------<\/code><\/pre>\n<p>You can validate the Notes using the following dry-run command.<\/p>\n<pre><code class=\"language-bash\">helm install web-app .\/web-app -n frontend --create-namespace --dry-run --debug<\/code><\/pre>\n<h3 id=\"step-3-deploy-the-helm-chart\">Step 3: Deploy the Helm Chart<\/h3>\n<p>Now, run the following command to deploy the chart.<\/p>\n<pre><code class=\"language-bash\">helm install web-app .\/web-app -n frontend --create-namespace<\/code><\/pre>\n<p>After installation, you will see the information in the <strong><code>NOTES.txt<\/code><\/strong> file in the output as shown below.<\/p>\n<pre><code class=\"language-bash\">NAME: web-app\nLAST DEPLOYED: Wed May 20 11:15:17 2026\nNAMESPACE: frontend\nSTATUS: deployed\nREVISION: 1\nDESCRIPTION: Install complete\nNOTES:\nRelease \"web-app\" deployed to namespace \"frontend\".\n\n-------------------------------------------------------\nGet the secret your app uses:\n\n  kubectl get secret web-app-secret \\\n    -n frontend \\\n    -o jsonpath=\"{.data.password}\" | base64 --decode\n\n  This decodes and prints the password your app is reading from Kubernetes Secrets.\n\n-------------------------------------------------------\nCheck if your app is healthy:\n\n  kubectl get pods -l app.kubernetes.io\/name=web-app \\\n    -n frontend\n\n  This lists all pods for this release. STATUS should show \"Running\"\n  and READY should show \"1\/1\" before you send any traffic.\n-------------------------------------------------------<\/code><\/pre>\n<h3 id=\"step-4-view-helm-notes\">Step 4: View Helm Notes<\/h3>\n<p>After the chart installation, you can use the following command to view the notes again in the terminal.<\/p>\n<pre><code class=\"language-bash\">helm get notes web-app -n frontend<\/code><\/pre>\n<p>This will list only the notes, as shown below.<\/p>\n<pre><code class=\"language-bash\">NOTES:\nRelease \"web-app\" deployed to namespace \"frontend\".\n\n-------------------------------------------------------\nGet the secret your app uses:\n\n  kubectl get secret web-app-secret \\\n    -n frontend \\\n    -o jsonpath=\"{.data.password}\" | base64 --decode\n\n  This decodes and prints the password your app is reading from Kubernetes Secrets.\n\n-------------------------------------------------------\nCheck if your app is healthy:\n\n  kubectl get pods -l app.kubernetes.io\/name=web-app \\\n    -n frontend\n\n  This lists all pods for this release. STATUS should show \"Running\"\n  and READY should show \"1\/1\" before you send any traffic.\n-------------------------------------------------------<\/code><\/pre>\n<h2 id=\"suppressing-notes\">Suppressing Notes<\/h2>\n<p>When you use CI\/CD tools like <a href=\"https:\/\/devopscube.com\/docker-image-build-promotion-piepeline\/\" rel=\"noreferrer\">Github actions<\/a> or <a href=\"https:\/\/devopscube.com\/jenkins-2-tutorials-getting-started-guide\/\" rel=\"noreferrer\">Jenkins<\/a>, you might not want to clustter the output logs with notes output. In such scenarios you can suppress the notes using output redirection.<\/p>\n<p>Here is an example.<\/p>\n<pre><code>helm install web-app .\/web-app -n frontend --create-namespace  &gt; \/dev\/null<\/code><\/pre>\n<div class=\"kg-card kg-callout-card kg-callout-card-blue\">\n<div class=\"kg-callout-emoji\">\ud83d\udca1<\/div>\n<div class=\"kg-callout-text\">In Helm 3, you can hide chart notes using the <code spellcheck=\"false\" style=\"white-space: pre-wrap;\">--hide-notes<\/code> flag. However, <a href=\"https:\/\/devopscube.com\/install-configure-helm-kubernetes\/\" rel=\"noreferrer\">Helm 4<\/a> removed\/deprecated this flag. So if you are using Helm 4, you need to use shell redirection as given above.<\/div>\n<\/div>\n<h2 id=\"conclusion\">Conclusion<\/h2>\n<p>In this guide we looked at what is NOTES.txt and how to setup post installation instructions using NOTES.txt.<\/p>\n<p>If you are using community chart, pull the charts to local, modify the NOTES.txt  as per your requirements and then deploy it.<\/p>\n<p>By doing this, you can remove all the unwanted information from the output and keep only the information that helps in moving forward smoothly.<\/p>\n<hr>\n<p><strong>Ngu\u1ed3n:<\/strong> <a href=\"https:\/\/devopscube.com\/helm-notes-txt-file\/\" target=\"_blank\" rel=\"noopener noreferrer\">What is Helm NOTES.txt and How Do You Create One? \u2014 DevOpsCube<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Source: https:\/\/devopscube.com\/helm-notes-txt-file\/<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-195","post","type-post","status-publish","format-standard","hentry","category-devops"],"_links":{"self":[{"href":"https:\/\/blog.ngocha.biz\/index.php?rest_route=\/wp\/v2\/posts\/195","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.ngocha.biz\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.ngocha.biz\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.ngocha.biz\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.ngocha.biz\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=195"}],"version-history":[{"count":0,"href":"https:\/\/blog.ngocha.biz\/index.php?rest_route=\/wp\/v2\/posts\/195\/revisions"}],"wp:attachment":[{"href":"https:\/\/blog.ngocha.biz\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=195"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.ngocha.biz\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=195"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.ngocha.biz\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=195"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}