From aea9e4c29d5a6d4c3ee3f00e726b39411b753641 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B8rn=20Erik=20Pedersen?= Date: Tue, 8 Jul 2025 16:35:48 +0200 Subject: [PATCH 01/62] netlify: Update Hugo version --- netlify.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/netlify.toml b/netlify.toml index ad4dd525e..5995a2903 100644 --- a/netlify.toml +++ b/netlify.toml @@ -3,7 +3,7 @@ command = "hugo --gc --minify" [build.environment] - HUGO_VERSION = "0.147.9" + HUGO_VERSION = "0.148.0" [context.production.environment] HUGO_ENV = "production" From 6ecb96bcdb253a53c24a307ea3b42af08dcf901d Mon Sep 17 00:00:00 2001 From: Joe Mooring Date: Tue, 8 Jul 2025 08:24:56 -0700 Subject: [PATCH 02/62] content: Updates for v0.148.0 --- content/en/configuration/front-matter.md | 38 +++++++----- content/en/configuration/markup.md | 58 ++++++++++++------- content/en/configuration/output-formats.md | 7 ++- .../en/content-management/page-resources.md | 15 +++-- content/en/render-hooks/images.md | 15 ++--- content/en/render-hooks/links.md | 15 ++--- content/en/shortcodes/ref.md | 8 ++- content/en/shortcodes/relref.md | 8 ++- 8 files changed, 92 insertions(+), 72 deletions(-) diff --git a/content/en/configuration/front-matter.md b/content/en/configuration/front-matter.md index 9f51b8a5a..b6f001b56 100644 --- a/content/en/configuration/front-matter.md +++ b/content/en/configuration/front-matter.md @@ -60,25 +60,33 @@ The default front matter configuration includes these aliases. ## Tokens -Hugo provides several [tokens](g) to assist with front matter configuration. +Hugo provides the following [tokens](g) to help you configure your front matter: -Token|Description -:--|:-- -`:default`|The default ordered sequence of date fields. -`:fileModTime`|The file's last modification timestamp. -`:filename`|The date from the file name, if present. -`:git`|The Git author date for the file's last revision. +`:default` +: The default ordered sequence of date fields. -When Hugo extracts a date from a file name, it uses the rest of the file name to generate the page's [`slug`], but only if a slug isn't already specified in the page's front matter. For example, given the name `2025-02-01-article.md`, Hugo will set the `date` to `2025-02-01` and the `slug` to `article`. +`:fileModTime` +: The file's last modification timestamp. -[`slug`]: /content-management/front-matter/#slug +`:filename` +: Extracts the date from the file name, provided the file name begins with a date in one of the following formats: -To enable access to the Git author date, set [`enableGitInfo`] to `true`, or use\ -the `--enableGitInfo` flag when building your site. + - `YYYY-MM-DD` + - `YYYY-MM-DD-HH-MM-SS` {{< new-in 0.148.0 />}} -[`enableGitInfo`]: /configuration/all/#enablegitinfo -Consider this example: + Within the `YYYY-MM-DD-HH-MM-SS` format, the date and time values may be separated by any character including a space (e.g., `2025-02-01T14-30-00`). + + Hugo resolves the extracted date to the [`timeZone`] defined in your site configuration, falling back to the system time zone. After extracting the date, Hugo uses the remaining part of the file name to generate the page's [`slug`], but only if you haven't already specified a slug in the page's front matter. + + For example, if you name your file `2025-02-01-article.md`, Hugo will set the date to `2025-02-01` and the slug to `article`. + +`:git` +: The Git author date for the file's last revision. To enable access to the Git author date, set [`enableGitInfo`] to `true`, or use the `--enableGitInfo` flag when building your site. + +## Example + +Consider this site configuration: {{< code-toggle file=hugo >}} [frontmatter] @@ -89,3 +97,7 @@ lastmod = ['lastmod', ':fileModTime'] To determine `date`, Hugo tries to extract the date from the file name, falling back to the default ordered sequence of date fields. To determine `lastmod`, Hugo looks for a `lastmod` field in front matter, falling back to the file's last modification timestamp. + +[`enableGitInfo`]: /configuration/all/#enablegitinfo +[`slug`]: /content-management/front-matter/#slug +[`timeZone`]: /configuration/all/#timezone diff --git a/content/en/configuration/markup.md b/content/en/configuration/markup.md index 4a2efb5e8..0b7f2fe8d 100644 --- a/content/en/configuration/markup.md +++ b/content/en/configuration/markup.md @@ -133,13 +133,13 @@ parser.autoHeadingID : (`bool`) Whether to automatically add `id` attributes to headings (i.e., `h1`, `h2`, `h3`, `h4`, `h5`, and `h6` elements). parser.autoIDType -: (`string`) The strategy used to automatically generate `id` attributes, one of `github`, `github-ascii` or `blackfriday`. +: (`string`) The strategy used to automatically generate `id` attributes, one of `github`, `github-ascii` or `blackfriday`. Default is `github`. - - `github` produces GitHub-compatible `id` attributes - - `github-ascii` drops any non-ASCII characters after accent normalization - - `blackfriday` produces `id` attributes compatible with the Blackfriday Markdown renderer + - `github`: Generate GitHub-compatible `id` attributes + - `github-ascii`: Drop any non-ASCII characters after accent normalization + - `blackfriday`: Generate `id` attributes compatible with the Blackfriday Markdown renderer - This is also the strategy used by the [anchorize](/functions/urls/anchorize) template function. Default is `github`. + This is also the strategy used by the [anchorize](/functions/urls/anchorize) template function. parser.attribute.block : (`bool`) Whether to enable [Markdown attributes] for block elements. Default is `false`. @@ -147,19 +147,35 @@ parser.attribute.block parser.attribute.title : (`bool`) Whether to enable [Markdown attributes] for headings. Default is `true`. + renderHooks.image.enableDefault : {{< new-in 0.123.0 />}} -: (`bool`) Whether to enable the [embedded image render hook]. Default is `false`. +: Deprecated in v0.148.0. Use `renderHooks.image.useEmbedded` instead. - > [!note] - > The embedded image render hook is automatically enabled for multilingual single-host sites if [duplication of shared page resources] is disabled. This is the default configuration for multilingual single-host sites. +renderHooks.image.useEmbedded +: {{< new-in 0.148.0 />}} +: (`string`) When to use the [embedded image render hook]. One of `auto`, `never`, `always`, or `fallback`. Default is `auto`. + - `auto`: Automatically use the embedded image render hook for multilingual single-host sites, specifically when the [duplication of shared page resources] feature is disabled. This is the default behavior for such sites. + If a custom image render hook is defined by your project, modules, or themes, it will be utilized instead. + - `never`: Never use the embedded image render hook. If a custom image render hook is defined by your project, modules, or themes, it will be utilized instead. + - `always`: Always use the embedded image render hook, even if a custom image render hook is provided by your project, modules, or themes. In this case, the embedded hook takes precedence. + - `fallback`: Use the embedded image render hook only if no custom image render hook is provided by your project, modules, or themes. If a custom hook exists, it will be used instead. + + renderHooks.link.enableDefault : {{< new-in 0.123.0 />}} -: (`bool`) Whether to enable the [embedded link render hook]. Default is `false`. +: Deprecated in v0.148.0. Use `renderHooks.link.useEmbedded` instead. - > [!note] - > The embedded link render hook is automatically enabled for multilingual single-host sites if [duplication of shared page resources] is disabled. This is the default configuration for multilingual single-host sites. +renderHooks.link.useEmbedded +: {{< new-in 0.148.0 />}} +: (`string`) When to use the [embedded link render hook]. One of `auto`, `never`, `always`, or `fallback`. Default is `auto`. + + - `auto`: Automatically use the embedded link render hook for multilingual single-host sites, specifically when the [duplication of shared page resources] feature is disabled. This is the default behavior for such sites. + If a custom link render hook is defined by your project, modules, or themes, it will be utilized instead. + - `never`: Never use the embedded link render hook. If a custom link render hook is defined by your project, modules, or themes, it will be utilized instead. + - `always`: Always use the embedded link render hook, even if a custom link render hook is provided by your project, modules, or themes. In this case, the embedded hook takes precedence. + - `fallback`: Use the embedded link render hook only if no custom link render hook is provided by your project, modules, or themes. If a custom hook exists, it will be used instead. renderer.hardWraps : (`bool`) Whether to replace newline characters within a paragraph with `br` elements. Default is `false`. @@ -301,26 +317,26 @@ endLevel ordered : (`bool`) Whether to generates an ordered list instead of an unordered list. Default is `false`. + [`Fragments.Identifiers`]: /methods/page/fragments/#identifiers [`TableOfContents`]: /methods/page/tableofcontents/ +[AsciiDoc]: https://asciidoc.org/ [asciidoctor-diagram]: https://asciidoctor.org/docs/asciidoctor-diagram/ [attributes]: https://asciidoctor.org/docs/asciidoc-syntax-quick-reference/#attributes-and-substitutions [CommonMark]: https://spec.commonmark.org/current/ [deleted text]: https://developer.mozilla.org/en-US/docs/Web/HTML/Element/del [duplication of shared page resources]: /configuration/markup/#duplicateresourcefiles -[duplication of shared page resources]: /configuration/markup/#duplicateresourcefiles -[embedded image render hook]: /render-hooks/images/#default -[embedded image render hook]: /render-hooks/images/#default -[embedded link render hook]: /render-hooks/links/#default -[embedded link render hook]: /render-hooks/links/#default -[GitHub Flavored Markdown]: https://github.github.com/gfm/ +[Emacs Org Mode]: https://orgmode.org/ +[embedded image render hook]: /render-hooks/images/#embedded +[embedded link render hook]: /render-hooks/links/#embedded [GitHub Flavored Markdown: Autolinks]: https://github.github.com/gfm/#autolinks-extension- [GitHub Flavored Markdown: Strikethrough]: https://github.github.com/gfm/#strikethrough-extension- [GitHub Flavored Markdown: Tables]: https://github.github.com/gfm/#tables-extension- [GitHub Flavored Markdown: Task list items]: https://github.github.com/gfm/#task-list-items-extension- -[Goldmark]: https://github.com/yuin/goldmark/ +[GitHub Flavored Markdown]: https://github.github.com/gfm/ [Goldmark Extensions: CJK]: https://github.com/yuin/goldmark?tab=readme-ov-file#cjk-extension [Goldmark Extensions: Typographer]: https://github.com/yuin/goldmark?tab=readme-ov-file#typographer-extension +[Goldmark]: https://github.com/yuin/goldmark/ [Hugo Goldmark Extensions: Extras]: https://github.com/gohugoio/hugo-goldmark-extensions?tab=readme-ov-file#extras-extension [Hugo Goldmark Extensions: Passthrough]: https://github.com/gohugoio/hugo-goldmark-extensions?tab=readme-ov-file#passthrough-extension [image render hook]: /render-hooks/images/ @@ -330,12 +346,10 @@ ordered [Markdown attributes]: /content-management/markdown-attributes/ [mathematics in Markdown]: content-management/mathematics/ [multilingual page resources]: /content-management/page-resources/#multilingual +[Pandoc]: https://pandoc.org/ [PHP Markdown Extra: Definition lists]: https://michelf.ca/projects/php-markdown/extra/#def-list [PHP Markdown Extra: Footnotes]: https://michelf.ca/projects/php-markdown/extra/#footnotes +[reStructuredText]: https://docutils.sourceforge.io/rst.html [security policy]: /configuration/security/ [subscript]: https://developer.mozilla.org/en-US/docs/Web/HTML/Element/sub [superscript]: https://developer.mozilla.org/en-US/docs/Web/HTML/Element/sup -[AsciiDoc]: https://asciidoc.org/ -[Emacs Org Mode]: https://orgmode.org/ -[Pandoc]: https://pandoc.org/ -[reStructuredText]: https://docutils.sourceforge.io/rst.html diff --git a/content/en/configuration/output-formats.md b/content/en/configuration/output-formats.md index f3dbceec5..ef91e3ede 100644 --- a/content/en/configuration/output-formats.md +++ b/content/en/configuration/output-formats.md @@ -56,7 +56,7 @@ noUgly : (`bool`) Whether to disable ugly URLs for this output format when [`uglyURLs`] are enabled in your site configuration. Default is `false`. path -: (`string`) The published file's directory path, relative to the root of the publish directory. If not specified, the file will be published using its content path. +: (`string`) The first segment of the publication path for this output format. This path segment is relative to the root of your [`publishDir`]. If omitted, Hugo will use the file's original content path for publishing. permalinkable : (`bool`) Whether to return the rendering output format rather than main output format when invoking the [`Permalink`] and [`RelPermalink`] methods on a `Page` object. See [details](#link-to-output-formats). Enabled by default for the `html` and `amp` output formats. Default is `false`. @@ -193,11 +193,12 @@ Output format|Template path `rss`|`layouts/section.rss.xml` [`AlternativeOutputFormats`]: /methods/page/alternativeoutputformats/ +[`baseURL`]: /configuration/all/#baseurl [`OutputFormats`]: /methods/page/outputformats/ [`Permalink`]: /methods/page/permalink/ -[`RelPermalink`]: /methods/page/relpermalink/ -[`baseURL`]: /configuration/all/#baseurl [`permalinkable`]: #permalinkable +[`publishDir`]: /configuration/all/#publishdir +[`RelPermalink`]: /methods/page/relpermalink/ [`uglyURLs`]: /configuration/ugly-urls/ [configure media types]: /configuration/media-types/ [configure outputs]: /configuration/outputs/ diff --git a/content/en/content-management/page-resources.md b/content/en/content-management/page-resources.md index 204ca5301..d4ceac6d5 100644 --- a/content/en/content-management/page-resources.md +++ b/content/en/content-management/page-resources.md @@ -271,12 +271,12 @@ public/ This approach reduces build times, storage requirements, bandwidth consumption, and deployment times, ultimately reducing cost. -> [!note] +> [!important] > To resolve Markdown link and image destinations to the correct location, you must use link and image render hooks that capture the page resource with the [`Resources.Get`] method, and then invoke its [`RelPermalink`] method. > -> By default, with multilingual single-host sites, Hugo enables its [embedded link render hook] and [embedded image render hook] to resolve Markdown link and image destinations. +> In its default configuration, Hugo automatically uses the [embedded link render hook] and the [embedded image render hook] for multilingual single-host sites, specifically when the [duplication of shared page resources] feature is disabled. This is the default behavior for such sites. > -> You may override the embedded render hooks as needed, provided they capture the resource as described above. +> The embedded render hooks will not override any custom link or image render hooks that are provided by your project, modules, or themes. You can change this behavior in your site configuration by setting and [`markup.goldmark.renderHooks.link.useEmbedded`] and [`markup.goldmark.renderHooks.image.useEmbedded`] . Although duplicating shared page resources is inefficient, you can enable this feature in your site configuration if desired: @@ -285,13 +285,16 @@ Although duplicating shared page resources is inefficient, you can enable this f duplicateResourceFiles = true {{< /code-toggle >}} +[`markup.goldmark.renderHooks.image.useEmbedded`]: /configuration/markup/#renderhooksimageuseembedded +[`markup.goldmark.renderHooks.link.useEmbedded`]: /configuration/markup/#renderhookslinkenabledefault [`RelPermalink`]: /methods/resource/relpermalink/ [`Resource`]: /methods/resource [`Resources.ByType`]: /methods/page/resources#bytype -[`Resources.Get`]: /methods/page/resources#get [`Resources.Get`]: /methods/page/resources/#get +[`Resources.Get`]: /methods/page/resources#get [`Resources.GetMatch`]: /methods/page/resources#getmatch [`Resources.Match`]: /methods/page/resources#match [content formats]: /content-management/formats/ -[embedded image render hook]: /render-hooks/images/#default -[embedded link render hook]: /render-hooks/links/#default +[duplication of shared page resources]: /configuration/markup/#duplicateresourcefiles +[embedded image render hook]: /render-hooks/images/#embedded +[embedded link render hook]: /render-hooks/links/#embedded diff --git a/content/en/render-hooks/images.md b/content/en/render-hooks/images.md index 9f8ef1efb..2ea32fe1a 100755 --- a/content/en/render-hooks/images.md +++ b/content/en/render-hooks/images.md @@ -97,21 +97,14 @@ Note that the above requires the following site configuration: wrapStandAloneImageWithinParagraph = false {{< /code-toggle >}} -## Default +## Embedded {{< new-in 0.123.0 />}} -Hugo includes an [embedded image render hook] to resolve Markdown image destinations. Disabled by default, you can enable it in your site configuration: +Hugo includes an [embedded image render hook] to resolve Markdown image destinations. -{{< code-toggle file=hugo >}} -[markup.goldmark.renderHooks.image] -enableDefault = true -{{< /code-toggle >}} - -A custom render hook, even when provided by a theme or module, will override the embedded render hook regardless of the configuration setting above. - -> [!note] -> The embedded image render hook is automatically enabled for multilingual single-host sites if [duplication of shared page resources] is disabled. This is the default configuration for multilingual single-host sites. +> [!important] +> In its default configuration, Hugo automatically uses the embedded image render hook for multilingual single-host sites, specifically when the [duplication of shared page resources] feature is disabled. This is the default behavior for such sites. The default behavior will not override any custom image render hooks that are provided by your project, modules, or themes. You can change this behavior in your site configuration. See [details](/configuration/markup/#renderhooksimageuseembedded). The embedded image render hook resolves internal Markdown destinations by looking for a matching [page resource](g), falling back to a matching [global resource](g). Remote destinations are passed through, and the render hook will not throw an error or warning if unable to resolve a destination. diff --git a/content/en/render-hooks/links.md b/content/en/render-hooks/links.md index af0a8f0dd..e97de0c68 100755 --- a/content/en/render-hooks/links.md +++ b/content/en/render-hooks/links.md @@ -70,21 +70,14 @@ To include a `rel` attribute set to `external` for external links: {{- /* chomp trailing newline */ -}} ``` -## Default +## Embedded {{< new-in 0.123.0 />}} -Hugo includes an [embedded link render hook] to resolve Markdown link destinations. Disabled by default, you can enable it in your site configuration: +Hugo includes an [embedded link render hook] to resolve Markdown link destinations. -{{< code-toggle file=hugo >}} -[markup.goldmark.renderHooks.link] -enableDefault = true -{{< /code-toggle >}} - -A custom render hook, even when provided by a theme or module, will override the embedded render hook regardless of the configuration setting above. - -> [!note] -> The embedded link render hook is automatically enabled for multilingual single-host sites if [duplication of shared page resources] is disabled. This is the default configuration for multilingual single-host sites. +> [!important] +> In its default configuration, Hugo automatically uses the embedded link render hook for multilingual single-host sites, specifically when the [duplication of shared page resources] feature is disabled. This is the default behavior for such sites. The default behavior will not override any custom link render hooks that are provided by your project, modules, or themes. You can change this behavior in your site configuration. See [details](/configuration/markup/#renderhookslinkuseembedded). The embedded link render hook resolves internal Markdown destinations by looking for a matching page, falling back to a matching [page resource](g), then falling back to a matching [global resource](g). Remote destinations are passed through, and the render hook will not throw an error or warning if unable to resolve a destination. diff --git a/content/en/shortcodes/ref.md b/content/en/shortcodes/ref.md index b38413c63..2fb8ee760 100755 --- a/content/en/shortcodes/ref.md +++ b/content/en/shortcodes/ref.md @@ -10,7 +10,9 @@ keywords: [] > To override Hugo's embedded `ref` shortcode, copy the [source code] to a file with the same name in the `layouts/_shortcodes` directory. > [!note] -> When working with Markdown, this shortcode is obsolete. Instead, use a [link render hook] that resolves the link destination using the `GetPage` method on the `Page` object. You can either create your own, or simply enable the [embedded link render hook]. The embedded link render hook is automatically enabled for multilingual single-host projects. +> When working with Markdown this shortcode is obsolete. Instead, to properly resolve Markdown link destinations, use the [embedded link render hook] or create your own. +> +> In its default configuration, Hugo automatically uses the embedded link render hook for multilingual single-host sites, specifically when the [duplication of shared page resources] feature is disabled. This is the default behavior for such sites. The default behavior will not override any custom link render hooks that are provided by your project, modules, or themes. You can change this behavior in your site configuration. See [details](/configuration/markup/#renderhookslinkuseembedded). ## Usage @@ -56,7 +58,7 @@ Rendered: {{% include "_common/ref-and-relref-error-handling.md" %}} [content format]: /content-management/formats/ -[embedded link render hook]: /render-hooks/links/#default -[link render hook]: /render-hooks/links/ +[duplication of shared page resources]: http://localhost:1313/configuration/markup/#duplicateresourcefiles +[embedded link render hook]: /render-hooks/links/#embedded [Markdown notation]: /content-management/shortcodes/#notation [source code]: {{% eturl relref %}} diff --git a/content/en/shortcodes/relref.md b/content/en/shortcodes/relref.md index d4f4c2425..c94b691a2 100755 --- a/content/en/shortcodes/relref.md +++ b/content/en/shortcodes/relref.md @@ -10,7 +10,9 @@ keywords: [] > To override Hugo's embedded `relref` shortcode, copy the [source code] to a file with the same name in the `layouts/_shortcodes` directory. > [!note] -> When working with Markdown, this shortcode is obsolete. Instead, use a [link render hook] that resolves the link destination using the `GetPage` method on the `Page` object. You can either create your own, or simply enable the [embedded link render hook]. The embedded link render hook is automatically enabled for multilingual single-host projects. +> When working with Markdown this shortcode is obsolete. Instead, to properly resolve Markdown link destinations, use the [embedded link render hook] or create your own. +> +> In its default configuration, Hugo automatically uses the embedded link render hook for multilingual single-host sites, specifically when the [duplication of shared page resources] feature is disabled. This is the default behavior for such sites. The default behavior will not override any custom link render hooks that are provided by your project, modules, or themes. You can change this behavior in your site configuration. See [details](/configuration/markup/#renderhookslinkuseembedded). ## Usage @@ -56,7 +58,7 @@ Rendered: {{% include "_common/ref-and-relref-error-handling.md" %}} [content format]: /content-management/formats/ -[embedded link render hook]: /render-hooks/links/#default -[link render hook]: /render-hooks/links/ +[duplication of shared page resources]: http://localhost:1313/configuration/markup/#duplicateresourcefiles +[embedded link render hook]: /render-hooks/links/#embedded [Markdown notation]: /content-management/shortcodes/#notation [source code]: {{% eturl relref %}} From b7247a8ea53f0c4ddd8b57e5e48fc29f911d285d Mon Sep 17 00:00:00 2001 From: Joe Mooring Date: Tue, 8 Jul 2025 08:27:52 -0700 Subject: [PATCH 03/62] content: Remove command chaining from GitHub Actions workflow Co-authored-by: Khemarato Bhikkhu --- .../host-and-deploy/host-on-github-pages/index.md | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/content/en/host-and-deploy/host-on-github-pages/index.md b/content/en/host-and-deploy/host-on-github-pages/index.md index 165c9934c..097eae719 100644 --- a/content/en/host-and-deploy/host-on-github-pages/index.md +++ b/content/en/host-and-deploy/host-on-github-pages/index.md @@ -100,6 +100,7 @@ concurrency: # Default to bash defaults: run: + # GitHub-hosted runners automatically enable `set -eo pipefail` for Bash shells. shell: bash jobs: @@ -114,14 +115,14 @@ jobs: steps: - name: Install Hugo CLI run: | - wget -O ${{ runner.temp }}/hugo.deb https://github.com/gohugoio/hugo/releases/download/v${HUGO_VERSION}/hugo_extended_${HUGO_VERSION}_linux-amd64.deb \ - && sudo dpkg -i ${{ runner.temp }}/hugo.deb + wget -O ${{ runner.temp }}/hugo.deb https://github.com/gohugoio/hugo/releases/download/v${HUGO_VERSION}/hugo_extended_${HUGO_VERSION}_linux-amd64.deb + sudo dpkg -i ${{ runner.temp }}/hugo.deb - name: Install Dart Sass run: | - wget -O ${{ runner.temp }}/dart-sass.tar.gz https://github.com/sass/dart-sass/releases/download/${DART_SASS_VERSION}/dart-sass-${DART_SASS_VERSION}-linux-x64.tar.gz \ - && tar -xf ${{ runner.temp }}/dart-sass.tar.gz --directory ${{ runner.temp }} \ - && mv ${{ runner.temp }}/dart-sass/ /usr/local/bin \ - && echo "/usr/local/bin/dart-sass" >> $GITHUB_PATH + wget -O ${{ runner.temp }}/dart-sass.tar.gz https://github.com/sass/dart-sass/releases/download/${DART_SASS_VERSION}/dart-sass-${DART_SASS_VERSION}-linux-x64.tar.gz + tar -xf ${{ runner.temp }}/dart-sass.tar.gz --directory ${{ runner.temp }} + mv ${{ runner.temp }}/dart-sass/ /usr/local/bin + echo "/usr/local/bin/dart-sass" >> $GITHUB_PATH - name: Checkout uses: actions/checkout@v4 with: From a5a4fa9075f5a13f0338b34c6d36945cebdeaffc Mon Sep 17 00:00:00 2001 From: Joe Mooring Date: Tue, 8 Jul 2025 11:03:21 -0700 Subject: [PATCH 04/62] content: More updates for v0.148.0 --- content/en/configuration/markup.md | 18 ++++++++---------- .../en/content-management/page-resources.md | 4 ++-- content/en/methods/page/GitInfo.md | 18 +++++++++++++++--- content/en/render-hooks/images.md | 12 +++++++++--- content/en/render-hooks/links.md | 12 +++++++++--- content/en/shortcodes/ref.md | 4 +++- content/en/shortcodes/relref.md | 4 +++- data/docs.yaml | 9 +++++++++ 8 files changed, 58 insertions(+), 23 deletions(-) diff --git a/content/en/configuration/markup.md b/content/en/configuration/markup.md index 0b7f2fe8d..5846564f5 100644 --- a/content/en/configuration/markup.md +++ b/content/en/configuration/markup.md @@ -156,11 +156,10 @@ renderHooks.image.useEmbedded : {{< new-in 0.148.0 />}} : (`string`) When to use the [embedded image render hook]. One of `auto`, `never`, `always`, or `fallback`. Default is `auto`. - - `auto`: Automatically use the embedded image render hook for multilingual single-host sites, specifically when the [duplication of shared page resources] feature is disabled. This is the default behavior for such sites. - If a custom image render hook is defined by your project, modules, or themes, it will be utilized instead. - - `never`: Never use the embedded image render hook. If a custom image render hook is defined by your project, modules, or themes, it will be utilized instead. - - `always`: Always use the embedded image render hook, even if a custom image render hook is provided by your project, modules, or themes. In this case, the embedded hook takes precedence. - - `fallback`: Use the embedded image render hook only if no custom image render hook is provided by your project, modules, or themes. If a custom hook exists, it will be used instead. + - `auto`: Automatically use the embedded image render hook for multilingual single-host sites, specifically when the [duplication of shared page resources] feature is disabled. This is the default behavior for such sites. If custom image render hooks are defined by your project, modules, or themes, these will be used instead. + - `never`: Never use the embedded image render hook. If custom image render hooks are defined by your project, modules, or themes, these will be used instead. + - `always`: Always use the embedded image render hook, even if custom image render hooks are provided by your project, modules, or themes. In this case, the embedded hook takes precedence. + - `fallback`: Use the embedded image render hook only if custom image render hooks are not provided by your project, modules, or themes. If custom image render hooks exist, these will be used instead. renderHooks.link.enableDefault @@ -171,11 +170,10 @@ renderHooks.link.useEmbedded : {{< new-in 0.148.0 />}} : (`string`) When to use the [embedded link render hook]. One of `auto`, `never`, `always`, or `fallback`. Default is `auto`. - - `auto`: Automatically use the embedded link render hook for multilingual single-host sites, specifically when the [duplication of shared page resources] feature is disabled. This is the default behavior for such sites. - If a custom link render hook is defined by your project, modules, or themes, it will be utilized instead. - - `never`: Never use the embedded link render hook. If a custom link render hook is defined by your project, modules, or themes, it will be utilized instead. - - `always`: Always use the embedded link render hook, even if a custom link render hook is provided by your project, modules, or themes. In this case, the embedded hook takes precedence. - - `fallback`: Use the embedded link render hook only if no custom link render hook is provided by your project, modules, or themes. If a custom hook exists, it will be used instead. + - `auto`: Automatically use the embedded link render hook for multilingual single-host sites, specifically when the [duplication of shared page resources] feature is disabled. This is the default behavior for such sites. If custom link render hooks are defined by your project, modules, or themes, these will be used instead. + - `never`: Never use the embedded link render hook. If custom link render hooks are defined by your project, modules, or themes, these will be used instead. + - `always`: Always use the embedded link render hook, even if custom link render hooks are provided by your project, modules, or themes. In this case, the embedded hook takes precedence. + - `fallback`: Use the embedded link render hook only if custom link render hooks are not provided by your project, modules, or themes. If custom link render hooks exist, these will be used instead. renderer.hardWraps : (`bool`) Whether to replace newline characters within a paragraph with `br` elements. Default is `false`. diff --git a/content/en/content-management/page-resources.md b/content/en/content-management/page-resources.md index d4ceac6d5..d9bc851a0 100644 --- a/content/en/content-management/page-resources.md +++ b/content/en/content-management/page-resources.md @@ -274,9 +274,9 @@ This approach reduces build times, storage requirements, bandwidth consumption, > [!important] > To resolve Markdown link and image destinations to the correct location, you must use link and image render hooks that capture the page resource with the [`Resources.Get`] method, and then invoke its [`RelPermalink`] method. > -> In its default configuration, Hugo automatically uses the [embedded link render hook] and the [embedded image render hook] for multilingual single-host sites, specifically when the [duplication of shared page resources] feature is disabled. This is the default behavior for such sites. +> In its default configuration, Hugo automatically uses the [embedded link render hook] and the [embedded image render hook] for multilingual single-host sites, specifically when the [duplication of shared page resources] feature is disabled. This is the default behavior for such sites. If custom link or image render hooks are defined by your project, modules, or themes, these will be used instead. > -> The embedded render hooks will not override any custom link or image render hooks that are provided by your project, modules, or themes. You can change this behavior in your site configuration by setting and [`markup.goldmark.renderHooks.link.useEmbedded`] and [`markup.goldmark.renderHooks.image.useEmbedded`] . +> You can also configure Hugo to `always` use the embedded link or image render hook, use it only as a `fallback`, or `never` use it. See [details](/configuration/markup/#renderhookslinkuseembedded). Although duplicating shared page resources is inefficient, you can enable this feature in your site configuration if desired: diff --git a/content/en/methods/page/GitInfo.md b/content/en/methods/page/GitInfo.md index 90dc3870a..c83645226 100644 --- a/content/en/methods/page/GitInfo.md +++ b/content/en/methods/page/GitInfo.md @@ -5,7 +5,7 @@ categories: [] keywords: [] params: functions_and_methods: - returnType: source.GitInfo + returnType: '*gitmap.GitInfo' signatures: [PAGE.GitInfo] --- @@ -119,7 +119,9 @@ hugo --enableGitInfo ### Ancestors -(`*source.GitInfo`) The file-filtered ancestor commits, if any. +(`gitmap.GitInfos`) A slice of file-filtered ancestor commits, if any, ordered from most recent to least recent. + +For example, to list the last 5 commits: ```go-html-template {{ with .GitInfo }} @@ -129,9 +131,19 @@ hugo --enableGitInfo {{ end }} ``` +To reverse the order: + +```go-html-template +{{ with .GitInfo }} + {{ range .Ancestors.Reverse | first 5 }} + {{ .CommitDate.Format "2006-01-02" }}: {{ .Subject }} + {{ end }} +{{ end }} +``` + ### Parent -(`*source.GitInfo`) The first file-filtered ancestor commit, if any. +(`*gitmap.GitInfo`) The first file-filtered ancestor commit, if any. ## Last modified date diff --git a/content/en/render-hooks/images.md b/content/en/render-hooks/images.md index 2ea32fe1a..ae043e477 100755 --- a/content/en/render-hooks/images.md +++ b/content/en/render-hooks/images.md @@ -101,10 +101,16 @@ wrapStandAloneImageWithinParagraph = false {{< new-in 0.123.0 />}} -Hugo includes an [embedded image render hook] to resolve Markdown image destinations. +Hugo includes an [embedded image render hook] to resolve Markdown image destinations. You can adjust its behavior in your site configuration. This is the default setting: -> [!important] -> In its default configuration, Hugo automatically uses the embedded image render hook for multilingual single-host sites, specifically when the [duplication of shared page resources] feature is disabled. This is the default behavior for such sites. The default behavior will not override any custom image render hooks that are provided by your project, modules, or themes. You can change this behavior in your site configuration. See [details](/configuration/markup/#renderhooksimageuseembedded). +{{< code-toggle file=hugo >}} +[markup.goldmark.renderHooks.image] +useEmbedded = 'auto' +{{< /code-toggle >}} + +When set to `auto` as shown above, Hugo automatically uses the embedded image render hook for multilingual single-host sites, specifically when the [duplication of shared page resources] feature is disabled. This is the default behavior for such sites. If custom image render hooks are defined by your project, modules, or themes, these will be used instead. + +You can also configure Hugo to `always` use the embedded image render hook, use it only as a `fallback`, or `never` use it. See [details](/configuration/markup/#renderhooksimageuseembedded). The embedded image render hook resolves internal Markdown destinations by looking for a matching [page resource](g), falling back to a matching [global resource](g). Remote destinations are passed through, and the render hook will not throw an error or warning if unable to resolve a destination. diff --git a/content/en/render-hooks/links.md b/content/en/render-hooks/links.md index e97de0c68..08047b026 100755 --- a/content/en/render-hooks/links.md +++ b/content/en/render-hooks/links.md @@ -74,10 +74,16 @@ To include a `rel` attribute set to `external` for external links: {{< new-in 0.123.0 />}} -Hugo includes an [embedded link render hook] to resolve Markdown link destinations. +Hugo includes an [embedded link render hook] to resolve Markdown link destinations. You can adjust its behavior in your site configuration. This is the default setting: -> [!important] -> In its default configuration, Hugo automatically uses the embedded link render hook for multilingual single-host sites, specifically when the [duplication of shared page resources] feature is disabled. This is the default behavior for such sites. The default behavior will not override any custom link render hooks that are provided by your project, modules, or themes. You can change this behavior in your site configuration. See [details](/configuration/markup/#renderhookslinkuseembedded). +{{< code-toggle file=hugo >}} +[markup.goldmark.renderHooks.link] +useEmbedded = 'auto' +{{< /code-toggle >}} + +When set to `auto` as shown above, Hugo automatically uses the embedded link render hook for multilingual single-host sites, specifically when the [duplication of shared page resources] feature is disabled. This is the default behavior for such sites. If custom link render hooks are defined by your project, modules, or themes, these will be used instead. + +You can also configure Hugo to `always` use the embedded link render hook, use it only as a `fallback`, or `never` use it. See [details](/configuration/markup/#renderhookslinkuseembedded). The embedded link render hook resolves internal Markdown destinations by looking for a matching page, falling back to a matching [page resource](g), then falling back to a matching [global resource](g). Remote destinations are passed through, and the render hook will not throw an error or warning if unable to resolve a destination. diff --git a/content/en/shortcodes/ref.md b/content/en/shortcodes/ref.md index 2fb8ee760..3baa0a52a 100755 --- a/content/en/shortcodes/ref.md +++ b/content/en/shortcodes/ref.md @@ -12,7 +12,9 @@ keywords: [] > [!note] > When working with Markdown this shortcode is obsolete. Instead, to properly resolve Markdown link destinations, use the [embedded link render hook] or create your own. > -> In its default configuration, Hugo automatically uses the embedded link render hook for multilingual single-host sites, specifically when the [duplication of shared page resources] feature is disabled. This is the default behavior for such sites. The default behavior will not override any custom link render hooks that are provided by your project, modules, or themes. You can change this behavior in your site configuration. See [details](/configuration/markup/#renderhookslinkuseembedded). +> In its default configuration, Hugo automatically uses the embedded link render hook for multilingual single-host sites, specifically when the [duplication of shared page resources] feature is disabled. This is the default behavior for such sites. If custom link render hooks are defined by your project, modules, or themes, these will be used instead. +> +> You can also configure Hugo to `always` use the embedded link render hook, use it only as a `fallback`, or `never` use it. See [details](/configuration/markup/#renderhookslinkuseembedded). ## Usage diff --git a/content/en/shortcodes/relref.md b/content/en/shortcodes/relref.md index c94b691a2..e94ad9ebc 100755 --- a/content/en/shortcodes/relref.md +++ b/content/en/shortcodes/relref.md @@ -12,7 +12,9 @@ keywords: [] > [!note] > When working with Markdown this shortcode is obsolete. Instead, to properly resolve Markdown link destinations, use the [embedded link render hook] or create your own. > -> In its default configuration, Hugo automatically uses the embedded link render hook for multilingual single-host sites, specifically when the [duplication of shared page resources] feature is disabled. This is the default behavior for such sites. The default behavior will not override any custom link render hooks that are provided by your project, modules, or themes. You can change this behavior in your site configuration. See [details](/configuration/markup/#renderhookslinkuseembedded). +> In its default configuration, Hugo automatically uses the embedded link render hook for multilingual single-host sites, specifically when the [duplication of shared page resources] feature is disabled. This is the default behavior for such sites. If custom link render hooks are defined by your project, modules, or themes, these will be used instead. +> +> You can also configure Hugo to `always` use the embedded link render hook, use it only as a `fallback`, or `never` use it. See [details](/configuration/markup/#renderhookslinkuseembedded). ## Usage diff --git a/data/docs.yaml b/data/docs.yaml index 62c8919a0..f6d2a96ae 100644 --- a/data/docs.yaml +++ b/data/docs.yaml @@ -189,6 +189,9 @@ chroma: - Aliases: - coq Name: Coq + - Aliases: + - core + Name: Core - Aliases: - cr - crystal @@ -515,6 +518,10 @@ chroma: - Aliases: - monkeyc Name: MonkeyC + - Aliases: + - moonscript + - moon + Name: MoonScript - Aliases: - morrowind - mwscript @@ -1253,8 +1260,10 @@ config: renderHooks: image: enableDefault: false + useEmbedded: auto link: enableDefault: false + useEmbedded: auto renderer: hardWraps: false unsafe: false From 1ac119d26fa546bfdb0706d738e12e9dd4749a15 Mon Sep 17 00:00:00 2001 From: Joe Mooring Date: Tue, 8 Jul 2025 11:30:16 -0700 Subject: [PATCH 05/62] content: Fix typo --- content/en/configuration/front-matter.md | 1 - 1 file changed, 1 deletion(-) diff --git a/content/en/configuration/front-matter.md b/content/en/configuration/front-matter.md index b6f001b56..a97648b61 100644 --- a/content/en/configuration/front-matter.md +++ b/content/en/configuration/front-matter.md @@ -74,7 +74,6 @@ Hugo provides the following [tokens](g) to help you configure your front matter: - `YYYY-MM-DD` - `YYYY-MM-DD-HH-MM-SS` {{< new-in 0.148.0 />}} - Within the `YYYY-MM-DD-HH-MM-SS` format, the date and time values may be separated by any character including a space (e.g., `2025-02-01T14-30-00`). Hugo resolves the extracted date to the [`timeZone`] defined in your site configuration, falling back to the system time zone. After extracting the date, Hugo uses the remaining part of the file name to generate the page's [`slug`], but only if you haven't already specified a slug in the page's front matter. From 040f14a3c70cc7e2d674e60aed0443659efdf339 Mon Sep 17 00:00:00 2001 From: Joe Mooring Date: Tue, 8 Jul 2025 11:30:51 -0700 Subject: [PATCH 06/62] content: Fix typo --- content/en/shortcodes/ref.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/en/shortcodes/ref.md b/content/en/shortcodes/ref.md index 3baa0a52a..53aaa3326 100755 --- a/content/en/shortcodes/ref.md +++ b/content/en/shortcodes/ref.md @@ -60,7 +60,7 @@ Rendered: {{% include "_common/ref-and-relref-error-handling.md" %}} [content format]: /content-management/formats/ -[duplication of shared page resources]: http://localhost:1313/configuration/markup/#duplicateresourcefiles +[duplication of shared page resources]: /configuration/markup/#duplicateresourcefiles [embedded link render hook]: /render-hooks/links/#embedded [Markdown notation]: /content-management/shortcodes/#notation [source code]: {{% eturl relref %}} From d008ea6ac9accc2df1b5c0376e167a3441970473 Mon Sep 17 00:00:00 2001 From: Joe Mooring Date: Tue, 8 Jul 2025 11:31:23 -0700 Subject: [PATCH 07/62] content: Fix typo --- content/en/shortcodes/relref.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/en/shortcodes/relref.md b/content/en/shortcodes/relref.md index e94ad9ebc..346750c52 100755 --- a/content/en/shortcodes/relref.md +++ b/content/en/shortcodes/relref.md @@ -60,7 +60,7 @@ Rendered: {{% include "_common/ref-and-relref-error-handling.md" %}} [content format]: /content-management/formats/ -[duplication of shared page resources]: http://localhost:1313/configuration/markup/#duplicateresourcefiles +[duplication of shared page resources]: /configuration/markup/#duplicateresourcefiles [embedded link render hook]: /render-hooks/links/#embedded [Markdown notation]: /content-management/shortcodes/#notation [source code]: {{% eturl relref %}} From c27dfdef335c0aaf3eac530efa7af954fefe9cb0 Mon Sep 17 00:00:00 2001 From: Joe Mooring Date: Tue, 8 Jul 2025 11:35:25 -0700 Subject: [PATCH 08/62] content: Move link reference --- content/en/configuration/markup.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/content/en/configuration/markup.md b/content/en/configuration/markup.md index 5846564f5..66071d588 100644 --- a/content/en/configuration/markup.md +++ b/content/en/configuration/markup.md @@ -139,7 +139,7 @@ parser.autoIDType - `github-ascii`: Drop any non-ASCII characters after accent normalization - `blackfriday`: Generate `id` attributes compatible with the Blackfriday Markdown renderer - This is also the strategy used by the [anchorize](/functions/urls/anchorize) template function. + This is also the strategy used by the [anchorize] template function. parser.attribute.block : (`bool`) Whether to enable [Markdown attributes] for block elements. Default is `false`. @@ -318,6 +318,7 @@ ordered [`Fragments.Identifiers`]: /methods/page/fragments/#identifiers [`TableOfContents`]: /methods/page/tableofcontents/ +[anchorize]: /functions/urls/anchorize [AsciiDoc]: https://asciidoc.org/ [asciidoctor-diagram]: https://asciidoctor.org/docs/asciidoctor-diagram/ [attributes]: https://asciidoctor.org/docs/asciidoc-syntax-quick-reference/#attributes-and-substitutions From b71388cac4e4dba93f00d866d0d4b62506302cf4 Mon Sep 17 00:00:00 2001 From: Joe Mooring Date: Tue, 8 Jul 2025 12:51:59 -0700 Subject: [PATCH 09/62] content: Fix typo --- content/en/methods/page/GitInfo.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/en/methods/page/GitInfo.md b/content/en/methods/page/GitInfo.md index c83645226..bf15338ba 100644 --- a/content/en/methods/page/GitInfo.md +++ b/content/en/methods/page/GitInfo.md @@ -16,7 +16,7 @@ The `GitInfo` method on a `Page` object returns an object with additional method ## Prerequisites -Install [Git], create a repository, and commit your project files. +Install Git, create a repository, and commit your project files. You must also allow Hugo to access your repository. In your site configuration: From b6077449c8b62314e5a1a8b0586bdb501ca0d948 Mon Sep 17 00:00:00 2001 From: Joe Mooring Date: Tue, 8 Jul 2025 13:19:43 -0700 Subject: [PATCH 10/62] content: Update version references --- content/en/configuration/module.md | 4 ++-- content/en/contribute/development.md | 4 ++-- content/en/functions/css/Sass.md | 4 ++-- content/en/functions/hugo/Generator.md | 2 +- content/en/functions/hugo/Version.md | 2 +- content/en/functions/resources/FromString.md | 6 +++--- content/en/host-and-deploy/host-on-aws-amplify/index.md | 2 +- content/en/host-and-deploy/host-on-codeberg-pages.md | 4 ++-- content/en/host-and-deploy/host-on-github-pages/index.md | 2 +- content/en/host-and-deploy/host-on-gitlab-pages.md | 2 +- content/en/host-and-deploy/host-on-netlify/index.md | 4 ++-- 11 files changed, 18 insertions(+), 18 deletions(-) diff --git a/content/en/configuration/module.md b/content/en/configuration/module.md index d736b7c6f..59216bd2e 100644 --- a/content/en/configuration/module.md +++ b/content/en/configuration/module.md @@ -75,10 +75,10 @@ extended : (`bool`) Whether the extended edition of Hugo is required, satisfied by installing either the extended or extended/deploy edition. max -: (`string`) The maximum Hugo version supported, for example `0.143.0`. +: (`string`) The maximum Hugo version supported, for example `0.148.0`. min -: (`string`) The minimum Hugo version supported, for example `0.123.0`. +: (`string`) The minimum Hugo version supported, for example `0.102.0`. [`themesDir`]: /configuration/all/#themesdir diff --git a/content/en/contribute/development.md b/content/en/contribute/development.md index e2cfee4ff..fdbe4e4c2 100644 --- a/content/en/contribute/development.md +++ b/content/en/contribute/development.md @@ -153,7 +153,7 @@ CGO_ENABLED=1 go install -tags extended github.com/gohugoio/hugo@latest To build and install a specific release: ```sh -CGO_ENABLED=1 go install -tags extended github.com/gohugoio/hugo@v0.147.1 +CGO_ENABLED=1 go install -tags extended github.com/gohugoio/hugo@v0.148.0 ``` To build and install at the latest commit on the master branch: @@ -165,7 +165,7 @@ CGO_ENABLED=1 go install -tags extended github.com/gohugoio/hugo@master To build and install at a specific commit: ```sh -CGO_ENABLED=1 go install -tags extended github.com/gohugoio/hugo@0851c17 +CGO_ENABLED=1 go install -tags extended github.com/gohugoio/hugo@c0d9beb ``` [bugs]: https://github.com/gohugoio/hugo/issues?q=is%3Aopen+is%3Aissue+label%3ABug diff --git a/content/en/functions/css/Sass.md b/content/en/functions/css/Sass.md index ae628a15f..73440879a 100644 --- a/content/en/functions/css/Sass.md +++ b/content/en/functions/css/Sass.md @@ -141,7 +141,7 @@ To install Dart Sass for your builds on GitLab Pages, the `.gitlab-ci.yml` file ```yaml variables: - HUGO_VERSION: 0.147.9 + HUGO_VERSION: 0.148.0 DART_SASS_VERSION: 1.89.2 GIT_DEPTH: 0 GIT_STRATEGY: clone @@ -175,7 +175,7 @@ To install Dart Sass for your builds on Netlify, the `netlify.toml` file should ```toml [build.environment] -HUGO_VERSION = "0.147.9" +HUGO_VERSION = "0.148.0" DART_SASS_VERSION = "1.89.2" NODE_VERSION = "22" TZ = "America/Los_Angeles" diff --git a/content/en/functions/hugo/Generator.md b/content/en/functions/hugo/Generator.md index c044a210c..176d8e6bf 100644 --- a/content/en/functions/hugo/Generator.md +++ b/content/en/functions/hugo/Generator.md @@ -11,5 +11,5 @@ params: --- ```go-html-template -{{ hugo.Generator }} → +{{ hugo.Generator }} → ``` diff --git a/content/en/functions/hugo/Version.md b/content/en/functions/hugo/Version.md index a23bd75cd..33827737a 100644 --- a/content/en/functions/hugo/Version.md +++ b/content/en/functions/hugo/Version.md @@ -11,5 +11,5 @@ params: --- ```go-html-template -{{ hugo.Version }} → 0.147.9 +{{ hugo.Version }} → 0.148.0 ``` diff --git a/content/en/functions/resources/FromString.md b/content/en/functions/resources/FromString.md index bd2d894b1..c86f90cbb 100644 --- a/content/en/functions/resources/FromString.md +++ b/content/en/functions/resources/FromString.md @@ -22,9 +22,9 @@ Let's say you need to publish a file named "site.json" in the root of your `publ ```json { - "build_date": "2025-05-03T19:14:41-08:00", - "hugo_version": "0.147.9", - "last_modified": "2025-05-03T19:14:46-08:00" + "build_date": "2025-07-08T13:12:19-07:00", + "hugo_version": "0.148.0", + "last_modified": "2025-07-07T22:09:13-07:00" } ``` diff --git a/content/en/host-and-deploy/host-on-aws-amplify/index.md b/content/en/host-and-deploy/host-on-aws-amplify/index.md index e2b35dbbe..706394dd9 100644 --- a/content/en/host-and-deploy/host-on-aws-amplify/index.md +++ b/content/en/host-and-deploy/host-on-aws-amplify/index.md @@ -46,7 +46,7 @@ env: # Application versions DART_SASS_VERSION: 1.89.2 GO_VERSION: 1.24.2 - HUGO_VERSION: 0.147.9 + HUGO_VERSION: 0.148.0 # Time zone TZ: America/Los_Angeles # Cache diff --git a/content/en/host-and-deploy/host-on-codeberg-pages.md b/content/en/host-and-deploy/host-on-codeberg-pages.md index 2a881f718..c9e199eb4 100644 --- a/content/en/host-and-deploy/host-on-codeberg-pages.md +++ b/content/en/host-and-deploy/host-on-codeberg-pages.md @@ -109,7 +109,7 @@ jobs: runs-on: codeberg-tiny-lazy container: # Specify "hugomods/hugo:exts" if you want to always use the latest version of Hugo for building. - image: "hugomods/hugo:exts-0.147.9" + image: "hugomods/hugo:exts-0.148.0" steps: - name: Clone the repository uses: https://code.forgejo.org/actions/checkout@v4 @@ -195,7 +195,7 @@ jobs: runs-on: codeberg-tiny-lazy container: # Specify "hugomods/hugo:exts" if you want to always use the latest version of Hugo for building. - image: "hugomods/hugo:exts-0.147.9" + image: "hugomods/hugo:exts-0.148.0" steps: - name: Clone the repository uses: https://code.forgejo.org/actions/checkout@v4 diff --git a/content/en/host-and-deploy/host-on-github-pages/index.md b/content/en/host-and-deploy/host-on-github-pages/index.md index 097eae719..bfb49a613 100644 --- a/content/en/host-and-deploy/host-on-github-pages/index.md +++ b/content/en/host-and-deploy/host-on-github-pages/index.md @@ -109,7 +109,7 @@ jobs: runs-on: ubuntu-latest env: DART_SASS_VERSION: 1.89.2 - HUGO_VERSION: 0.147.9 + HUGO_VERSION: 0.148.0 HUGO_ENVIRONMENT: production TZ: America/Los_Angeles steps: diff --git a/content/en/host-and-deploy/host-on-gitlab-pages.md b/content/en/host-and-deploy/host-on-gitlab-pages.md index cf4220888..36bdf44c8 100644 --- a/content/en/host-and-deploy/host-on-gitlab-pages.md +++ b/content/en/host-and-deploy/host-on-gitlab-pages.md @@ -27,7 +27,7 @@ variables: GIT_DEPTH: 0 GIT_STRATEGY: clone GIT_SUBMODULE_STRATEGY: recursive - HUGO_VERSION: 0.147.9 + HUGO_VERSION: 0.148.0 NODE_VERSION: 22.x TZ: America/Los_Angeles image: diff --git a/content/en/host-and-deploy/host-on-netlify/index.md b/content/en/host-and-deploy/host-on-netlify/index.md index 61ac15da8..b5e9f12ab 100644 --- a/content/en/host-and-deploy/host-on-netlify/index.md +++ b/content/en/host-and-deploy/host-on-netlify/index.md @@ -114,7 +114,7 @@ Create a new file named netlify.toml in the root of your project directory. In i ```toml {file="netlify.toml"} [build.environment] GO_VERSION = "1.24.2" -HUGO_VERSION = "0.147.9" +HUGO_VERSION = "0.148.0" NODE_VERSION = "22" TZ = "America/Los_Angeles" @@ -129,7 +129,7 @@ If your site requires Dart Sass to transpile Sass to CSS, the configuration file [build.environment] DART_SASS_VERSION = "1.89.2" GO_VERSION = "1.24.2" -HUGO_VERSION = "0.147.9" +HUGO_VERSION = "0.148.0" NODE_VERSION = "22" TZ = "America/Los_Angeles" From fc9a868c925bc3a994782f9f04db091931b52b4d Mon Sep 17 00:00:00 2001 From: Farhad <94342419+tffarhad@users.noreply.github.com> Date: Thu, 10 Jul 2025 20:14:35 +0600 Subject: [PATCH 11/62] content: Add Sitepins to list of commercial CMS platforms --- content/en/tools/front-ends.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/content/en/tools/front-ends.md b/content/en/tools/front-ends.md index 0c52a4687..90fc8f57c 100644 --- a/content/en/tools/front-ends.md +++ b/content/en/tools/front-ends.md @@ -19,6 +19,9 @@ aliases: [/tools/frontends/] [PubCrank](https://www.pubcrank.com/) : PubCrank is a static site editor which lets you define templates for different front matter layouts in your site. This gives writers an easy-to-use visual interface to create and edit content while maintaining the guardrails that the developer has created. PubCrank is free for local editing. +[Sitepins](https://sitepins.com) +: Sitepins is a Git-based CMS built for static site generators like Hugo. It offers a clean visual editor, media management, role-based permissions, shortcode support, and more. To get started, simply connect your GitHub repository, configure your content folders, and start visually editing your Hugo site with Sitepins. + ## Open-source [Decap CMS](https://decapcms.org/) From cdd20a4330739e6c0975ee67b2e73aaa8efd55ce Mon Sep 17 00:00:00 2001 From: Joe Mooring Date: Thu, 10 Jul 2025 10:19:27 -0700 Subject: [PATCH 12/62] content: Indicate language sort order for relevant page methods --- content/en/methods/page/AllTranslations.md | 2 +- content/en/methods/page/Translations.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/content/en/methods/page/AllTranslations.md b/content/en/methods/page/AllTranslations.md index 62117b429..ed92cd482 100644 --- a/content/en/methods/page/AllTranslations.md +++ b/content/en/methods/page/AllTranslations.md @@ -1,6 +1,6 @@ --- title: AllTranslations -description: Returns all translations of the given page, including the current language. +description: Returns all translations of the given page, including the current language, sorted by language weight. categories: [] keywords: [] params: diff --git a/content/en/methods/page/Translations.md b/content/en/methods/page/Translations.md index 4bab9fe11..c342a8618 100644 --- a/content/en/methods/page/Translations.md +++ b/content/en/methods/page/Translations.md @@ -1,6 +1,6 @@ --- title: Translations -description: Returns all translations of the given page, excluding the current language. +description: Returns all translations of the given page, excluding the current language, sorted by language weight. categories: [] keywords: [] params: From 5bf153531b536ff4a2850751727fcf9b72592b71 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B8rn=20Erik=20Pedersen?= Date: Fri, 11 Jul 2025 15:23:12 +0200 Subject: [PATCH 13/62] Update netlify.toml --- netlify.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/netlify.toml b/netlify.toml index 5995a2903..0629f73fc 100644 --- a/netlify.toml +++ b/netlify.toml @@ -3,7 +3,7 @@ command = "hugo --gc --minify" [build.environment] - HUGO_VERSION = "0.148.0" + HUGO_VERSION = "0.148.1" [context.production.environment] HUGO_ENV = "production" From 072536ef6a4945ceae2eceb04f8d0929d548e2c2 Mon Sep 17 00:00:00 2001 From: Joe Mooring Date: Fri, 11 Jul 2025 15:50:17 -0700 Subject: [PATCH 14/62] content: Update template type documentation --- .../methods/taxonomy/get-a-taxonomy-object.md | 2 +- content/en/about/features.md | 2 +- content/en/configuration/related-content.md | 2 +- .../en/content-management/content-adapters.md | 2 +- content/en/content-management/mathematics.md | 8 +- content/en/content-management/multilingual.md | 2 +- content/en/content-management/sections.md | 2 +- content/en/content-management/shortcodes.md | 10 +- content/en/content-management/taxonomies.md | 4 +- content/en/contribute/documentation.md | 16 +++ content/en/functions/css/TailwindCSS.md | 4 +- content/en/functions/global/page.md | 10 +- content/en/functions/go-template/define.md | 12 --- content/en/functions/go-template/range.md | 5 +- content/en/functions/go-template/return.md | 4 +- content/en/functions/go-template/template.md | 2 +- content/en/functions/go-template/with.md | 5 +- content/en/functions/hugo/Store.md | 2 +- content/en/functions/js/Batch.md | 2 +- content/en/functions/partials/Include.md | 8 +- .../en/functions/partials/IncludeCached.md | 6 +- content/en/functions/templates/Current.md | 4 +- content/en/functions/templates/Defer.md | 2 +- content/en/methods/page/Data.md | 4 +- content/en/methods/page/Page.md | 8 +- content/en/methods/page/Paginate.md | 10 +- content/en/methods/page/Paginator.md | 10 +- content/en/methods/page/RenderShortcodes.md | 2 +- content/en/methods/page/Store.md | 2 +- content/en/methods/shortcode/IsNamedParams.md | 2 +- content/en/methods/shortcode/Ordinal.md | 2 +- content/en/methods/site/GetPage.md | 10 +- content/en/methods/site/MainSections.md | 4 +- content/en/methods/site/Menus.md | 2 +- content/en/methods/site/Store.md | 2 +- content/en/render-hooks/_index.md | 2 +- content/en/render-hooks/blockquotes.md | 4 +- content/en/render-hooks/code-blocks.md | 4 +- content/en/render-hooks/headings.md | 4 +- content/en/render-hooks/images.md | 4 +- content/en/render-hooks/links.md | 2 +- content/en/render-hooks/passthrough.md | 4 +- content/en/render-hooks/tables.md | 4 +- content/en/templates/introduction.md | 4 +- content/en/templates/menu.md | 2 +- .../templates/new-templatesystem-overview.md | 13 +-- content/en/templates/pagination.md | 4 +- content/en/templates/shortcode.md | 6 +- content/en/templates/types.md | 102 +++++++++++------- content/en/troubleshooting/faq.md | 6 +- content/en/troubleshooting/performance.md | 4 +- 51 files changed, 187 insertions(+), 156 deletions(-) diff --git a/content/en/_common/methods/taxonomy/get-a-taxonomy-object.md b/content/en/_common/methods/taxonomy/get-a-taxonomy-object.md index a6c46b8b7..c90224338 100644 --- a/content/en/_common/methods/taxonomy/get-a-taxonomy-object.md +++ b/content/en/_common/methods/taxonomy/get-a-taxonomy-object.md @@ -32,7 +32,7 @@ To capture the "genres" `Taxonomy` object from within any template, use the [`Ta {{ $taxonomyObject := .Site.Taxonomies.genres }} ``` -To capture the "genres" `Taxonomy` object when rendering its page with a taxonomy template, use the [`Terms`] method on the page's [`Data`] object: +To capture the "genres" `Taxonomy` object when rendering its page with a _taxonomy_ template, use the [`Terms`] method on the page's [`Data`] object: ```go-html-template {file="layouts/taxonomy.html"} {{ $taxonomyObject := .Data.Terms }} diff --git a/content/en/about/features.md b/content/en/about/features.md index ff1a6b8eb..d9fd36f61 100644 --- a/content/en/about/features.md +++ b/content/en/about/features.md @@ -92,7 +92,7 @@ weight: 20 ## Performance [Caching] -: Reduce build time and cost by rendering a partial template once then cache the result, either globally or within a given context. For example, cache the result of an asset pipeline to prevent reprocessing on every rendered page. +: Reduce build time and cost by rendering a _partial_ template once then cache the result, either globally or within a given context. For example, cache the result of an asset pipeline to prevent reprocessing on every rendered page. [Segmentation] : Reduce build time and cost by partitioning your sites into segments. For example, render the home page and the "news section" every hour, and render the entire site once a week. diff --git a/content/en/configuration/related-content.md b/content/en/configuration/related-content.md index 7f2aa9831..421a1ea77 100644 --- a/content/en/configuration/related-content.md +++ b/content/en/configuration/related-content.md @@ -95,7 +95,7 @@ weight = 1 We've configured the `authors` index with a weight of `2` and the `genres` index with a weight of `1`. This means Hugo prioritizes shared `authors` as twice as significant as shared `genres`. -Then render a list of 5 related reviews with a partial template like this: +Then render a list of 5 related reviews with a _partial_ template like this: ```go-html-template {file="layouts/_partials/related.html" copy=true} {{ with site.RegularPages.Related . | first 5 }} diff --git a/content/en/content-management/content-adapters.md b/content/en/content-management/content-adapters.md index e22962531..a3ac17c0e 100644 --- a/content/en/content-management/content-adapters.md +++ b/content/en/content-management/content-adapters.md @@ -237,7 +237,7 @@ Create the content adapter. ### Step 4 -Create a page template to render each book review. +Create a _page_ template to render each book review. ```go-html-template {file="layouts/books/page.html" copy=true} {{ define "main" }} diff --git a/content/en/content-management/mathematics.md b/content/en/content-management/mathematics.md index dc47cbde4..0dbe4ef25 100644 --- a/content/en/content-management/mathematics.md +++ b/content/en/content-management/mathematics.md @@ -85,7 +85,7 @@ inline = [['@', '@']] ### Step 2 -Create a partial template to load MathJax or KaTeX. The example below loads MathJax, or you can use KaTeX as described in the [engines](#engines) section. +Create a _partial_ template to load MathJax or KaTeX. The example below loads MathJax, or you can use KaTeX as described in the [engines](#engines) section. ```go-html-template {file="layouts/_partials/math.html" copy=true} @@ -106,7 +106,7 @@ The delimiters above must match the delimiters in your site configuration. ### Step 3 -Conditionally call the partial template from the base template. +Conditionally call the _partial_ template from the base template. ```go-html-template {file="layouts/baseof.html"} @@ -118,7 +118,7 @@ Conditionally call the partial template from the base template. ``` -The example above loads the partial template if you have set the `math` parameter in front matter to `true`. If you have not set the `math` parameter in front matter, the conditional statement falls back to the `math` parameter in your site configuration. +The example above loads the _partial_ template if you have set the `math` parameter in front matter to `true`. If you have not set the `math` parameter in front matter, the conditional statement falls back to the `math` parameter in your site configuration. ### Step 4 @@ -179,7 +179,7 @@ MathJax and KaTeX are open-source JavaScript display engines. Both engines are f > >See the [inline delimiters](#inline-delimiters) section for details. -To use KaTeX instead of MathJax, replace the partial template from [Step 2] with this: +To use KaTeX instead of MathJax, replace the _partial_ template from [Step 2] with this: ```go-html-template {file="layouts/_partials/math.html" copy=true} }} [security] @@ -69,7 +69,7 @@ In the example above, the inline shortcode is executed twice: once upon definiti

Today is Thursday, January 30, 2025

``` -Inline shortcodes process their inner content within the same context as regular shortcode templates, allowing you to use any available [shortcode method]. +Inline shortcodes process their inner content within the same context as regular _shortcode_ templates, allowing you to use any available [shortcode method]. > [!note] > You cannot [nest](#nesting) inline shortcodes. @@ -179,7 +179,7 @@ Hugo processes the shortcode before the page content is rendered by the Markdown With standard notation, Hugo processes the shortcode separately, merging the output into the page content after Markdown rendering. This means, for instance, that Markdown headings inside a standard-notation shortcode will be excluded when invoking the `TableOfContents` method on the `Page` object. -By way of example, with this shortcode template: +By way of example, with this _shortcode_ template: ```go-html-template {file="layouts/_shortcodes/foo.html"} {{ .Inner }} diff --git a/content/en/content-management/taxonomies.md b/content/en/content-management/taxonomies.md index 6caf70b0c..e52f9fe35 100644 --- a/content/en/content-management/taxonomies.md +++ b/content/en/content-management/taxonomies.md @@ -139,7 +139,7 @@ title = "John Smith" affiliation = "University of Chicago" {{< /code-toggle >}} -Then create a taxonomy template specific to the "authors" taxonomy: +Then create a _taxonomy_ template specific to the "authors" taxonomy: ```go-html-template {file="layouts/authors/taxonomy.html"} {{ define "main" }} @@ -159,7 +159,7 @@ Then create a taxonomy template specific to the "authors" taxonomy: In the example above we list each author including their affiliation and portrait. -Or create a term template specific to the "authors" taxonomy: +Or create a _term_ template specific to the "authors" taxonomy: ```go-html-template {file="layouts/authors/term.html"} {{ define "main" }} diff --git a/content/en/contribute/documentation.md b/content/en/contribute/documentation.md index c72ddd03f..af847ad64 100644 --- a/content/en/contribute/documentation.md +++ b/content/en/contribute/documentation.md @@ -70,6 +70,22 @@ Link to the [glossary] as needed and use terms consistently. Pay particular atte - "Markdown" (capitalized) - "open-source" (hyphenated adjective) +### Template types + +When you refer to a template type, italicize it: + +```text +When creating a _taxonomy_ template, do this... +``` + +However, if the template type is also a link, do not italicize it to avoid distracting formatting: + +```text +When creating a [taxonomy] template, do this... +``` + +Do not italicize the template type in a title, heading, or front matter description. + ### Titles and headings - Use sentence-style capitalization. diff --git a/content/en/functions/css/TailwindCSS.md b/content/en/functions/css/TailwindCSS.md index 9d40ad0aa..f7368299f 100644 --- a/content/en/functions/css/TailwindCSS.md +++ b/content/en/functions/css/TailwindCSS.md @@ -75,7 +75,7 @@ Tailwind CSS respects `.gitignore` files. This means that if `hugo_stats.json` i ### Step 4 -Create a partial template to process the CSS with the Tailwind CSS CLI: +Create a _partial_ template to process the CSS with the Tailwind CSS CLI: ```go-html-template {file="layouts/_partials/css.html" copy=true} {{ with resources.Get "css/main.css" }} @@ -94,7 +94,7 @@ Create a partial template to process the CSS with the Tailwind CSS CLI: ### Step 5 -Call the partial template from your base template, deferring template execution until after all sites and output formats have been rendered: +Call the _partial_ template from your base template, deferring template execution until after all sites and output formats have been rendered: ```go-html-template {file="layouts/baseof.html" copy=true} diff --git a/content/en/functions/global/page.md b/content/en/functions/global/page.md index 40f6aba8f..a7672d947 100644 --- a/content/en/functions/global/page.md +++ b/content/en/functions/global/page.md @@ -53,9 +53,9 @@ content/ └── _index.md <-- title is "My Home Page" ``` -And this code in the home template: +And this code in the _home_ template: -```go-html-template +```go-html-template {file="layouts/home.html"} {{ range site.Sections }} {{ range .Pages }} {{ page.Title }} @@ -71,7 +71,7 @@ My Home Page My Home Page ``` -In the example above, the global `page` function accesses the `Page` object passed into the home template; it does not access the `Page` object of the iterated pages. +In the example above, the global `page` function accesses the `Page` object passed into the _home_ template; it does not access the `Page` object of the iterated pages. ### Be aware of caching @@ -83,9 +83,9 @@ Do not use the global `page` function in: Hugo caches rendered shortcodes. If you use the global `page` function within a shortcode, and the page content is rendered in two or more templates, the cached shortcode may be incorrect. -Consider this section template: +Consider this _section_ template: -```go-html-template +```go-html-template {file="layouts/section.html"} {{ range .Pages }}

{{ .LinkTitle }}

{{ .Summary }} diff --git a/content/en/functions/go-template/define.md b/content/en/functions/go-template/define.md index 40d495bd9..b951ee3e1 100644 --- a/content/en/functions/go-template/define.md +++ b/content/en/functions/go-template/define.md @@ -43,18 +43,6 @@ Use with the [`template`] function: {{ end }} ``` -> [!warning] -> Only [template comments] are allowed outside of the `define` and `end` statements. Avoid placing any other text, including HTML comments, outside of these boundaries. Doing so will cause rendering issues, potentially resulting in a blank page. See the example below. - -```go-html-template {file="layouts/do-not-do-this.html"} -
This div element broke your template.
-{{ define "main" }} -

{{ .Title }}

- {{ .Content }} -{{ end }} - -``` - {{% include "/_common/functions/go-template/text-template.md" %}} [`block`]: /functions/go-template/block/ diff --git a/content/en/functions/go-template/range.md b/content/en/functions/go-template/range.md index 50f714140..3c50068f1 100644 --- a/content/en/functions/go-template/range.md +++ b/content/en/functions/go-template/range.md @@ -38,7 +38,9 @@ Within a range block: ## Understanding context -At the top of a page template, the [context](g) (the dot) is a `Page` object. Within the `range` block, the context is bound to each successive element. +See the [context] section in the introduction to templating. + +For example, at the top of a _page_ template, the [context](g) (the dot) is a `Page` object. Within the `range` block, the context is bound to each successive element. With this contrived example: @@ -217,3 +219,4 @@ Ranging over a non-positive integer executes the block zero times. [`break`]: /functions/go-template/break/ [`continue`]: /functions/go-template/continue/ [`else`]: /functions/go-template/else/ +[context]: /templates/introduction/#context diff --git a/content/en/functions/go-template/return.md b/content/en/functions/go-template/return.md index 911c0925c..e96908565 100644 --- a/content/en/functions/go-template/return.md +++ b/content/en/functions/go-template/return.md @@ -10,7 +10,7 @@ params: signatures: ['return [VALUE]'] --- -The `return` statement is a non-standard extension to Go's [text/template package]. Used within partial templates, the `return` statement terminates template execution and returns the given value, if any. +The `return` statement is a non-standard extension to Go's [text/template package]. Used within _partial_ templates, the `return` statement terminates template execution and returns the given value, if any. The returned value may be of any data type including, but not limited to, [`bool`](g), [`float`](g), [`int`](g), [`map`](g), [`resource`](g), [`slice`](g), or [`string`](g). @@ -21,7 +21,7 @@ A `return` statement without a value returns an empty string of type `template.H ## Example -By way of example, let's create a partial template that _renders_ HTML, describing whether the given number is odd or even: +By way of example, let's create a _partial_ template that _renders_ HTML, describing whether the given number is odd or even: ```go-html-template {file="layouts/_partials/odd-or-even.html"} {{ if math.ModBool . 2 }} diff --git a/content/en/functions/go-template/template.md b/content/en/functions/go-template/template.md index 903f1490a..3a631f695 100644 --- a/content/en/functions/go-template/template.md +++ b/content/en/functions/go-template/template.md @@ -20,7 +20,7 @@ Use the `template` function to execute a defined template: {{ end }} ``` -The example above can be rewritten using an inline partial template: +The example above can be rewritten using an inline _partial_ template: ```go-html-template {{ partial "inline/foo.html" (dict "answer" 42) }} diff --git a/content/en/functions/go-template/with.md b/content/en/functions/go-template/with.md index c25ce3fba..7354f1608 100644 --- a/content/en/functions/go-template/with.md +++ b/content/en/functions/go-template/with.md @@ -57,7 +57,9 @@ Initialize a variable, scoped to the current block: ## Understanding context -At the top of a page template, the [context](g) (the dot) is a `Page` object. Inside of the `with` block, the context is bound to the value passed to the `with` statement. +See the [context] section in the introduction to templating. + +For example, at the top of a _page_ template, the [context](g) (the dot) is a `Page` object. Inside of the `with` block, the context is bound to the value passed to the `with` statement. With this contrived example: @@ -90,3 +92,4 @@ This template will render the page title as desired: {{% include "/_common/functions/go-template/text-template.md" %}} [`else`]: /functions/go-template/else/ +[context]: /templates/introduction/#context diff --git a/content/en/functions/hugo/Store.md b/content/en/functions/hugo/Store.md index 08c684146..c0d5c5933 100644 --- a/content/en/functions/hugo/Store.md +++ b/content/en/functions/hugo/Store.md @@ -100,7 +100,7 @@ Removes the given key. ## Determinate values -The `Store` method is often used to set scratch pad values within a shortcode, a partial template called by a shortcode, or by a Markdown render hook. In all three cases, the scratch pad values are indeterminate until Hugo renders the page content. +The `Store` method is often used to set scratch pad values within a _shortcode_ template, a _partial_ template called by a _shortcode_ template, or by a _render hook_ template. In all three cases, the scratch pad values are indeterminate until Hugo renders the page content. If you need to access a scratch pad value from a parent template, and the parent template has not yet rendered the page content, you can trigger content rendering by assigning the returned value to a [noop](g) variable: diff --git a/content/en/functions/js/Batch.md b/content/en/functions/js/Batch.md index a2c8bb893..aa57dd71d 100644 --- a/content/en/functions/js/Batch.md +++ b/content/en/functions/js/Batch.md @@ -158,7 +158,7 @@ import * as params from "@params"; import * as config from "@params/config"; ``` -Setting the `Config` for a batch can be done from any template (including shortcode templates), but will only be set once (the first will win): +Setting the `Config` for a batch can be done from any template (including _shortcode_ templates), but will only be set once (the first will win): ```go-html-template {{ with js.Batch "js/mybatch" }} diff --git a/content/en/functions/partials/Include.md b/content/en/functions/partials/Include.md index 0474bf77f..8551366da 100644 --- a/content/en/functions/partials/Include.md +++ b/content/en/functions/partials/Include.md @@ -1,6 +1,6 @@ --- title: partials.Include -description: Executes the given partial template, optionally passing context. If the partial template contains a return statement, returns the given value, else returns the rendered output. +description: Executes the given , optionally passing context. If the contains a return statement, returns the given value, else returns the rendered output. categories: [] keywords: [] params: @@ -15,7 +15,7 @@ Without a [`return`] statement, the `partial` function returns a string of type [`return`]: /functions/go-template/return/ -In this example we have three partial templates: +In this example we have three _partial_ templates: ```text layouts/ @@ -56,7 +56,7 @@ You can pass anything in context: a page, a page collection, a scalar value, a s {{ partial "render-student-info.html" $ctx }} ``` -Then, within the partial template: +Then, within the _partial_ template: ```go-html-template

{{ .name }} is majoring in {{ .major }}.

@@ -64,7 +64,7 @@ Then, within the partial template:

See details.

``` -To return a value from a partial template, it must contain only one `return` statement, placed at the end of the template: +To return a value from a _partial_ template, it must contain only one `return` statement, placed at the end of the template: ```go-html-template {{ $result := "" }} diff --git a/content/en/functions/partials/IncludeCached.md b/content/en/functions/partials/IncludeCached.md index 9bf1d5384..4d1167803 100644 --- a/content/en/functions/partials/IncludeCached.md +++ b/content/en/functions/partials/IncludeCached.md @@ -1,6 +1,6 @@ --- title: partials.IncludeCached -description: Executes the given template and caches the result, optionally passing context. If the partial template contains a return statement, returns the given value, else returns the rendered output. +description: Executes the given template and caches the result, optionally passing context. If the contains a return statement, returns the given value, else returns the rendered output. categories: [] keywords: [] params: @@ -38,9 +38,9 @@ Pass additional arguments, of any data type, as needed to create unique variants {{ partialCached "footer.html" . .Params.country .Params.province }} ``` -The variant arguments are not available to the underlying partial template; they are only used to create unique cache keys. +The variant arguments are not available to the underlying _partial_ template; they are only used to create unique cache keys. -To return a value from a partial template, it must contain only one `return` statement, placed at the end of the template: +To return a value from a _partial_ template, it must contain only one `return` statement, placed at the end of the template: ```go-html-template {{ $result := "" }} diff --git a/content/en/functions/templates/Current.md b/content/en/functions/templates/Current.md index d2c2c9609..b82818c47 100644 --- a/content/en/functions/templates/Current.md +++ b/content/en/functions/templates/Current.md @@ -64,7 +64,7 @@ To visually mark where a template begins and ends execution: ### Call stack -To display the chain of templates that led to the current one, create a partial template that iterates through its ancestors: +To display the chain of templates that led to the current one, create a _partial_ template that iterates through its ancestors: ```go-html-template {file="layouts/_partials/template-call-stack.html" copy=true} {{ with templates.Current }} @@ -113,7 +113,7 @@ To reverse the order of the entries, chain the `Reverse` method to the `Ancestor ### VS Code -To render links that, when clicked, will open the template in Microsoft Visual Studio Code, create a partial template with anchor elements that use the `vscode` URI scheme: +To render links that, when clicked, will open the template in Microsoft Visual Studio Code, create a _partial_ template with anchor elements that use the `vscode` URI scheme: ```go-html-template {file="layouts/_partials/template-open-in-vs-code.html" copy=true} {{ with templates.Current.Parent }} diff --git a/content/en/functions/templates/Defer.md b/content/en/functions/templates/Defer.md index 16c32724e..fa666c731 100644 --- a/content/en/functions/templates/Defer.md +++ b/content/en/functions/templates/Defer.md @@ -14,7 +14,7 @@ aliases: [/functions/templates.defer] {{< new-in 0.128.0 />}} > [!note] -> This feature should only be used in the main page template, typically `layouts/baseof.html`. Using it in shortcodes, partials, or render hook templates may lead to unpredictable results. For further details, please refer to [this issue]. +> This feature should only be used in the main template, typically `layouts/baseof.html`. Using it in shortcodes, partials, or _render hook_ templates may lead to unpredictable results. For further details, please refer to [this issue]. [this issue]: https://github.com/gohugoio/hugo/issues/13492#issuecomment-2734700391 diff --git a/content/en/methods/page/Data.md b/content/en/methods/page/Data.md index bb88dbde6..387422901 100644 --- a/content/en/methods/page/Data.md +++ b/content/en/methods/page/Data.md @@ -38,7 +38,7 @@ content/ ## In a taxonomy template -Use these methods on the `Data` object within a taxonomy template. +Use these methods on the `Data` object within a _taxonomy_ template. Singular : (`string`) Returns the singular name of the taxonomy. @@ -68,7 +68,7 @@ Learn more about [taxonomy templates]. ## In a term template -Use these methods on the `Data` object within a term template. +Use these methods on the `Data` object within a _term_ template. Singular : (`string`) Returns the singular name of the taxonomy. diff --git a/content/en/methods/page/Page.md b/content/en/methods/page/Page.md index 01abb3103..b7bdf3558 100644 --- a/content/en/methods/page/Page.md +++ b/content/en/methods/page/Page.md @@ -9,25 +9,25 @@ params: signatures: [PAGE.Page] --- -This is a convenience method, useful within partial templates that are called from both [shortcodes](g) and page templates. +This is a convenience method, useful within _partial_ templates that are called from both _shortcode_ and other template types. ```go-html-template {file="layouts/_shortcodes/foo.html"} {{ partial "my-partial.html" . }} ``` -When the shortcode calls the partial, it passes the current [context](g) (the dot). The context includes identifiers such as `Page`, `Params`, `Inner`, and `Name`. +When the _shortcode_ template calls the _partial_ template, it passes the current [context](g) (the dot). The context includes identifiers such as `Page`, `Params`, `Inner`, and `Name`. ```go-html-template {file="layouts/page.html"} {{ partial "my-partial.html" . }} ``` -When the page template calls the partial, it also passes the current context (the dot). But in this case, the dot _is_ the `Page` object. +When the _page_ template calls the _partial_ template, it also passes the current context (the dot). But in this case, the dot _is_ the `Page` object. ```go-html-template {file="layouts/_partials/my-partial.html"} The page title is: {{ .Page.Title }} ``` -To handle both scenarios, the partial template must be able to access the `Page` object with `Page.Page`. +To handle both scenarios, the _partial_ template must be able to access the `Page` object with `Page.Page`. > [!note] > And yes, that means you can do `.Page.Page.Page.Page.Title` too. diff --git a/content/en/methods/page/Paginate.md b/content/en/methods/page/Paginate.md index 7792980e6..337811240 100644 --- a/content/en/methods/page/Paginate.md +++ b/content/en/methods/page/Paginate.md @@ -18,7 +18,7 @@ By default, the number of elements on each pager is determined by your [site con > > The `Paginate` method is more flexible. -You can invoke pagination on the [home template], [section templates], [taxonomy templates], and [term templates]. +You can invoke pagination in [home], [section], [taxonomy], and [term] templates. ```go-html-template {file="layouts/section.html"} {{ $pages := where .Site.RegularPages "Section" "articles" }} @@ -40,8 +40,8 @@ In the example above, we: > [!note] > Please note that the results of pagination are cached. Once you have invoked either the `Paginator` or `Paginate` method, the paginated collection is immutable. Additional invocations of these methods will have no effect. -[home template]: /templates/types/#home -[section templates]: /templates/types/#section +[home]: /templates/types/#home +[section]: /templates/types/#section [site configuration]: /configuration/pagination/ -[taxonomy templates]: /templates/types/#taxonomy -[term templates]: /templates/types/#term +[taxonomy]: /templates/types/#taxonomy +[term]: /templates/types/#term diff --git a/content/en/methods/page/Paginator.md b/content/en/methods/page/Paginator.md index 1518ac95d..02b5d5719 100644 --- a/content/en/methods/page/Paginator.md +++ b/content/en/methods/page/Paginator.md @@ -13,7 +13,7 @@ Pagination is the process of splitting a list page into two or more pagers, wher The number of elements on each pager is determined by your [site configuration]. The default is `10`. -You can invoke pagination on the [home template], [section templates], [taxonomy templates], and [term templates]. Each of these receives a collection of regular pages in [context](g). When you invoke the `Paginator` method, it paginates the page collection received in context. +You can invoke pagination in [home], [section], [taxonomy], and [term] templates. Each of these receives a collection of regular pages in [context](g). When you invoke the `Paginator` method, it paginates the page collection received in context. ```go-html-template {file="layouts/section.html"} {{ range .Paginator.Pages }} @@ -32,9 +32,9 @@ In the example above, the embedded pagination template creates navigation links > [!note] > Please note that the results of pagination are cached. Once you have invoked either the `Paginator` or `Paginate` method, the paginated collection is immutable. Additional invocations of these methods will have no effect. -[home template]: /templates/types/#home -[section templates]: /templates/types/#section +[home]: /templates/types/#home +[section]: /templates/types/#section [site configuration]: /configuration/pagination/ -[taxonomy templates]: /templates/types/#taxonomy -[term templates]: /templates/types/#term +[taxonomy]: /templates/types/#taxonomy +[term]: /templates/types/#term [`Paginate`]: /methods/page/paginate/ diff --git a/content/en/methods/page/RenderShortcodes.md b/content/en/methods/page/RenderShortcodes.md index 81a78b04b..e440302dc 100644 --- a/content/en/methods/page/RenderShortcodes.md +++ b/content/en/methods/page/RenderShortcodes.md @@ -9,7 +9,7 @@ params: signatures: [PAGE.RenderShortcodes] --- -Use this method in shortcode templates to compose a page from multiple content files, while preserving a global context for footnotes and the table of contents. +Use this method in _shortcode_ templates to compose a page from multiple content files, while preserving a global context for footnotes and the table of contents. For example: diff --git a/content/en/methods/page/Store.md b/content/en/methods/page/Store.md index 0b1049b0a..c5ad6b316 100644 --- a/content/en/methods/page/Store.md +++ b/content/en/methods/page/Store.md @@ -18,7 +18,7 @@ Use the `Store` method on a `Page` object to create a [scratch pad](g) to store ## Determinate values -The `Store` method is often used to set scratch pad values within a shortcode, a partial template called by a shortcode, or by a Markdown render hook. In all three cases, the scratch pad values are indeterminate until Hugo renders the page content. +The `Store` method is often used to set scratch pad values within a _shortcode_ template, a _partial_ template called by a _shortcode_ template, or by a _render hook_ template. In all three cases, the scratch pad values are indeterminate until Hugo renders the page content. If you need to access a scratch pad value from a parent template, and the parent template has not yet rendered the page content, you can trigger content rendering by assigning the returned value to a [noop](g) variable: diff --git a/content/en/methods/shortcode/IsNamedParams.md b/content/en/methods/shortcode/IsNamedParams.md index c95398313..0574128ec 100644 --- a/content/en/methods/shortcode/IsNamedParams.md +++ b/content/en/methods/shortcode/IsNamedParams.md @@ -11,7 +11,7 @@ params: To support both positional and named arguments when calling a shortcode, use the `IsNamedParams` method to determine how the shortcode was called. -With this shortcode template: +With this _shortcode_ template: ```go-html-template {file="layouts/_shortcodes/myshortcode.html"} {{ if .IsNamedParams }} diff --git a/content/en/methods/shortcode/Ordinal.md b/content/en/methods/shortcode/Ordinal.md index 4c32705c1..b16758952 100644 --- a/content/en/methods/shortcode/Ordinal.md +++ b/content/en/methods/shortcode/Ordinal.md @@ -47,6 +47,6 @@ Hugo renders the page to: ``` > [!note] -> In the shortcode template above, the [`with`] statement is used to create conditional blocks. Remember that the `with` statement binds context (the dot) to its expression. Inside of a `with` block, preface shortcode method calls with a `$` to access the top-level context passed into the template. +> In the _shortcode_ template above, the [`with`] statement is used to create conditional blocks. Remember that the `with` statement binds context (the dot) to its expression. Inside of a `with` block, preface shortcode method calls with a `$` to access the top-level context passed into the template. [`with`]: /functions/go-template/with/ diff --git a/content/en/methods/site/GetPage.md b/content/en/methods/site/GetPage.md index 2a3bd7d59..34f531720 100644 --- a/content/en/methods/site/GetPage.md +++ b/content/en/methods/site/GetPage.md @@ -34,9 +34,9 @@ content/ └── _index.md ``` -This home template: +This _home_ template: -```go-html-template +```go-html-template {file="layouts/home.html"} {{ with .Site.GetPage "/works/paintings" }} ``` + This example will list all taxonomies and their terms, as well as all the content assigned to each of the terms. ```go-html-template {file="layouts/_partials/all-taxonomies.html"} diff --git a/content/en/quick-reference/syntax-highlighting-styles.md b/content/en/quick-reference/syntax-highlighting-styles.md index 14b313cbc..76aa77bf4 100644 --- a/content/en/quick-reference/syntax-highlighting-styles.md +++ b/content/en/quick-reference/syntax-highlighting-styles.md @@ -11,7 +11,7 @@ Hugo provides several methods to add syntax highlighting to code examples: - Use the [`transform.Highlight`] function within your templates - Use the [`highlight`] shortcode with any [content format](g) -- Use fenced code blocks with the Markdown content format +- Use [fenced code blocks] with the Markdown content format Regardless of method, use any of the syntax highlighting styles below. diff --git a/content/en/shortcodes/qr.md b/content/en/shortcodes/qr.md index 27d9ae02f..3cbc5d3fd 100755 --- a/content/en/shortcodes/qr.md +++ b/content/en/shortcodes/qr.md @@ -104,4 +104,4 @@ title [QR code]: https://en.wikipedia.org/wiki/QR_code [related documentation]: /functions/images/qr/ [source code]: {{% eturl qr %}} -[vCard]: https://en.wikipedia.org/wiki/VCard +[vCard]: diff --git a/content/en/shortcodes/ref.md b/content/en/shortcodes/ref.md index 53aaa3326..0cd5b52dc 100755 --- a/content/en/shortcodes/ref.md +++ b/content/en/shortcodes/ref.md @@ -59,7 +59,6 @@ Rendered: {{% include "_common/ref-and-relref-error-handling.md" %}} -[content format]: /content-management/formats/ [duplication of shared page resources]: /configuration/markup/#duplicateresourcefiles [embedded link render hook]: /render-hooks/links/#embedded [Markdown notation]: /content-management/shortcodes/#notation diff --git a/content/en/shortcodes/relref.md b/content/en/shortcodes/relref.md index 346750c52..22cdb9f2f 100755 --- a/content/en/shortcodes/relref.md +++ b/content/en/shortcodes/relref.md @@ -59,7 +59,6 @@ Rendered: {{% include "_common/ref-and-relref-error-handling.md" %}} -[content format]: /content-management/formats/ [duplication of shared page resources]: /configuration/markup/#duplicateresourcefiles [embedded link render hook]: /render-hooks/links/#embedded [Markdown notation]: /content-management/shortcodes/#notation diff --git a/content/en/showcase/_template/index.md b/content/en/showcase/_template/index.md index 3103903e1..6a115961b 100644 --- a/content/en/showcase/_template/index.md +++ b/content/en/showcase/_template/index.md @@ -17,7 +17,7 @@ To complete this showcase: 1. Write the story about your site in this file. 1. Add a summary to the `bio.md` file in this directory. 1. Replace the `featured-template.png` with a screenshot of your site. You can rename it, but it must contain the word `featured`. -1. Create a new pull request in https://github.com/gohugoio/hugoDocs/pulls +1. Create a new pull request in The content of this bundle explained: diff --git a/content/en/showcase/ampio-help/bio.md b/content/en/showcase/ampio-help/bio.md index a08b26be7..bc0a9a937 100644 --- a/content/en/showcase/ampio-help/bio.md +++ b/content/en/showcase/ampio-help/bio.md @@ -1,6 +1,6 @@ -__We are Ampio.__ We design and manufacture a building automation system that provides control, comfort, safety and reliability. Visit [our page](http://ampio.com/) to learn more about our solution! +We are Ampio. We design and manufacture a building automation system that provides control, comfort, safety and reliability. Visit [our page](http://ampio.com/) to learn more about our solution! -__Ampio Knowledge Base__ is a service built and maintained with Hugo. It is a self-service support platform for our customers and certified installers. It also contains a complete portfolio of our modules---building blocks of the Ampio building automation system. +Ampio Knowledge Base is a service built and maintained with Hugo. It is a self-service support platform for our customers and certified installers. It also contains a complete portfolio of our modules---building blocks of the Ampio building automation system. The site is built by: diff --git a/content/en/showcase/ampio-help/index.md b/content/en/showcase/ampio-help/index.md index 462452cb1..20e767289 100644 --- a/content/en/showcase/ampio-help/index.md +++ b/content/en/showcase/ampio-help/index.md @@ -15,10 +15,10 @@ Over and above that, we could not overlook the fact that our internal team of ed We started our journey with the following requirements: - - Ease of contribution - - Efficient search capabilities - - The possibility of deployment to simple shared hosting - - Proper support for multilingualism +- Ease of contribution +- Efficient search capabilities +- The possibility of deployment to simple shared hosting +- Proper support for multilingualism ## Dark ages of WordPress diff --git a/content/en/showcase/hartwell-insurance/index.md b/content/en/showcase/hartwell-insurance/index.md index 07ee6182c..1e15510a8 100644 --- a/content/en/showcase/hartwell-insurance/index.md +++ b/content/en/showcase/hartwell-insurance/index.md @@ -8,7 +8,7 @@ byline: "[Trys Mudford](http://www.trysmudford.com), Lead Developer, Tomango" We've just launched a shiny new website for [Hartwell Insurance](https://www.hartwell-insurance.com/). I'm really proud of it. It was tackled in a different way to most previous Tomango site builds, using some fancy new tools and some vintage web standards. -It's a multi-page, single-page (!) website written in Hugo, a static site generator built with performance as a first-class feature. _I've outlined a load of benefits to Hugo & static sites [here](https://why-static.netlify.com/), in case you're interested._ +It's a multi-page, single-page (!) website written in Hugo, a static site generator built with performance as a first-class feature. I've outlined a load of benefits to Hugo and static sites [on a page explaining the benefits of static sites](https://why-static.netlify.com/), in case you're interested. > **In essence, a static site generator pre-renders the whole site into HTML files and serves them like it's 1995.** diff --git a/content/en/showcase/pharmaseal/index.md b/content/en/showcase/pharmaseal/index.md index 3a8da2377..fa8c8a8ab 100644 --- a/content/en/showcase/pharmaseal/index.md +++ b/content/en/showcase/pharmaseal/index.md @@ -10,13 +10,13 @@ We wanted to shake the status quo with PHARMASEAL, opting for a fast and scalabl We had two goals: -**Make it fast** +## Make it fast We wanted to optimize the site as much as possible, so we opted for using Cloudinary, enabling us to take advantage of on-the-fly image manipulation, and thanks to the sheer speed of static sites, we achieved a perfect optimization score with Google audits. Because we're hosting the site through Netlify and our target audience is in America, we are taking advantage of Netlify edge (Their alternative to a CDN). We're talking blazing fast. -**Make it easy** +## Make it easy We're big fans of simplicity, and that's what we delivered with the Forestry building blocks. Every element on the site is built with building blocks in mind, allowing PHARMASEAL to generate multiple pages in the blink of an eye. diff --git a/content/en/templates/introduction.md b/content/en/templates/introduction.md index 916ffeea2..9d94032c9 100644 --- a/content/en/templates/introduction.md +++ b/content/en/templates/introduction.md @@ -9,7 +9,6 @@ weight: 10 {{< newtemplatesystem >}} - {{% glossary-term template %}} Templates use [variables], [functions], and [methods] to transform your content, resources, and data into a published page. @@ -508,29 +507,24 @@ In the template example above, each of the keys is a valid identifier. For examp [`end`]: /functions/go-template/end/ [`if`]: /functions/go-template/if/ [`index`]: /functions/collections/indexfunction/ -[`index`]: /functions/collections/indexfunction/ [`or`]: /functions/go-template/or [`Page`]: /methods/page/ [`partial`]: /functions/partials/include/ [`partialCached`]: /functions/partials/includecached/ [`range`]: /functions/go-template/range/ -[`range`]: /functions/go-template/range/ [`safeHTML`]: /functions/safe/html [`Site`]: /methods/site/ [`template`]: /functions/go-template/template/ [`Title`]: /methods/page/title [`with`]: /functions/go-template/with/ -[`with`]: /functions/go-template/with/ [current context]: #current-context [embedded templates]: /templates/embedded/ [front matter]: /content-management/front-matter/ [front matter fields]: /content-management/front-matter/#fields [functions]: /functions/ -[functions]: /functions [go-templates]: /functions/go-template/ [html/template]: https://pkg.go.dev/html/template [methods]: /methods/ -[methods]: /methods/ [partial templates]: /templates/types/#partial [templates]: /templates/ [text/template]: https://pkg.go.dev/text/template diff --git a/content/en/templates/new-templatesystem-overview.md b/content/en/templates/new-templatesystem-overview.md index 12e193593..a3b53197b 100644 --- a/content/en/templates/new-templatesystem-overview.md +++ b/content/en/templates/new-templatesystem-overview.md @@ -1,4 +1,3 @@ - --- title: New template system in Hugo v0.146.0 linktitle: New template system @@ -50,9 +49,9 @@ The identifiers used in the template weighting, in order of importance, are: For templates placed in a `layouts` folder partly or completely matching a [Page path], a closer match upwards will be considered _better_. In the [Example folder structure] below, this means that: -* `layouts/docs/api/_markup/render-link.html` will be used to render links from the Page path `/docs/api` and below. -* `layouts/docs/baseof.html` will be used as the base template for the Page path `/docs` and below. -* `layouts/tags/term.html` will be used for all `term` rendering in the `tags` taxonomy, except for the `blue` term, which will use `layouts/tags/blue/list.html`. +- `layouts/docs/api/_markup/render-link.html` will be used to render links from the Page path `/docs/api` and below. +- `layouts/docs/baseof.html` will be used as the base template for the Page path `/docs` and below. +- `layouts/tags/term.html` will be used for all `term` rendering in the `tags` taxonomy, except for the `blue` term, which will use `layouts/tags/blue/list.html`. ## Example folder structure diff --git a/content/en/templates/pagination.md b/content/en/templates/pagination.md index fb2799319..6d4203949 100644 --- a/content/en/templates/pagination.md +++ b/content/en/templates/pagination.md @@ -237,5 +237,4 @@ public/ [`Paginator`]: /methods/page/paginator/ [`partial`]: /functions/partials/include/ [grouping methods]: /quick-reference/page-collections/#group -[grouping methods]: /quick-reference/page-collections/#group [source code]: {{% eturl pagination %}} diff --git a/content/en/templates/robots.md b/content/en/templates/robots.md index 2d412d775..807a6027a 100644 --- a/content/en/templates/robots.md +++ b/content/en/templates/robots.md @@ -46,8 +46,7 @@ This template creates a robots.txt file with a `Disallow` directive for each pag > 1. Set `enableRobotsTXT` to `false` in the site configuration. > 1. Create a robots.txt file in the `static` directory. > -> Remember that Hugo copies everything in the [`static` directory][static] to the root of `publishDir` (typically `public`) when you build your site. +> Remember that Hugo copies everything in the static director to the root of `publishDir` (typically `public`) when you build your site. [embedded template]: {{% eturl robots %}} [site configuration]: /configuration/ -[static]: /getting-started/directory-structure/ diff --git a/content/en/templates/shortcode.md b/content/en/templates/shortcode.md index 740da3264..f07206f6a 100644 --- a/content/en/templates/shortcode.md +++ b/content/en/templates/shortcode.md @@ -9,7 +9,6 @@ aliases: [/templates/shortcode-templates/] {{< newtemplatesystem >}} - > [!note] > Before creating custom shortcodes, please review the [shortcodes] page in the [content management] section. Understanding the usage details will help you design and create better templates. diff --git a/content/en/templates/types.md b/content/en/templates/types.md index a2a5c7ffd..19e0e32dd 100644 --- a/content/en/templates/types.md +++ b/content/en/templates/types.md @@ -69,7 +69,7 @@ Hugo can apply a _base_ template to the following template types: [home](#home), > [!note] > If a template doesn't meet all these criteria, Hugo executes it exactly as provided, without applying a _base_ template. -When Hugo applies a _base_ template, it replaces its `block` actions with content from the corresponding `define` actions found in the template to which the base template is applied. +When Hugo applies a _base_ template, it replaces its [`block`] actions with content from the corresponding `define` actions found in the template to which the base template is applied. For example, the _base_ template below calls the [`partial`] function to include `head`, `header`, and `footer` elements. The `block` action acts as a placeholder, and its content will be replaced by a matching `define` action from the template to which it is applied. @@ -393,7 +393,6 @@ Use other specialized templates to create: [`partial`]: /functions/partials/include/ [`partialCached`]: /functions/partials/includeCached/ [`Render`]: /methods/page/render/ -[`Taxonomy`]: /methods/taxonomy/ [`Term`]: /methods/page/data/#term [`Terms`]: /methods/page/data/#terms [taxonomy-plural]: /methods/page/data/#plural diff --git a/content/en/tools/editors.md b/content/en/tools/editors.md index c375fcba8..612e06987 100644 --- a/content/en/tools/editors.md +++ b/content/en/tools/editors.md @@ -12,16 +12,16 @@ weight: 10 : Once you go for a static site, you need to think about how you are going to manage your articles. Front matter is a tool that helps you maintain the metadata/front matter of your articles like: creation date, modified date, slug, tile, SEO check, and more. [Hugo Helper](https://marketplace.visualstudio.com/items?itemName=rusnasonov.vscode-hugo) -: Hugo Helper is a plugin for Visual Studio Code that has some useful commands for Hugo. The source code can be found [here](https://github.com/rusnasonov/vscode-hugo). +: Hugo Helper is a plugin for Visual Studio Code that has some useful commands for Hugo. The source code can be found on its [GitHub repository](https://github.com/rusnasonov/vscode-hugo). [Hugo Language and Syntax Support](https://marketplace.visualstudio.com/items?itemName=budparr.language-hugo-vscode) -: Hugo Language and Syntax Support is a Visual Studio Code plugin for Hugo syntax highlighting and snippets. The source code can be found [here](https://github.com/budparr/language-hugo-vscode). +: Hugo Language and Syntax Support is a Visual Studio Code plugin for Hugo syntax highlighting and snippets. The source code can be found on its [GitHub repository](https://github.com/budparr/language-hugo-vscode). [Hugo Themer](https://marketplace.visualstudio.com/items?itemName=eliostruyf.vscode-hugo-themer) : Hugo Themer is an extension to help you while developing themes. It allows you to easily navigate through your theme files. [Hugofy](https://marketplace.visualstudio.com/items?itemName=akmittal.hugofy) -: Hugofy is a plugin for Visual Studio Code to "make life easier" when developing with Hugo. The source code can be found [here](https://github.com/akmittal/hugofy-vscode). +: Hugofy is a plugin for Visual Studio Code to "make life easier" when developing with Hugo. The source code can be found on its [GitHub repository](https://github.com/akmittal/hugofy-vscode). [Prettier Plugin for Go Templates](https://github.com/NiklasPor/prettier-plugin-go-template) : Format Hugo templates using this [Prettier](https://prettier.io/) plugin. See [installation instructions](https://discourse.gohugo.io/t/38403). @@ -35,7 +35,7 @@ weight: 10 : Emacs major mode for managing hugo blogs. Note that Hugo also supports [Org-mode][formats]. [ox-hugo.el](https://ox-hugo.scripter.co) -: Native Org-mode exporter that exports to Blackfriday Markdown with Hugo front-matter. `ox-hugo` supports two common Org blogging flows --- exporting multiple Org subtrees in a single file to multiple Hugo posts, and exporting a single Org file to a single Hugo post. It also leverages the Org tag and property inheritance features. See [*Why ox-hugo?*](https://ox-hugo.scripter.co/doc/why-ox-hugo/) for more. +: Native Org-mode exporter that exports to Blackfriday Markdown with Hugo front-matter. `ox-hugo` supports two common Org blogging flows --- exporting multiple Org subtrees in a single file to multiple Hugo posts, and exporting a single Org file to a single Hugo post. It also leverages the Org tag and property inheritance features. See [Why ox-hugo?](https://ox-hugo.scripter.co/doc/why-ox-hugo/) for more. ## Sublime Text diff --git a/content/en/troubleshooting/faq.md b/content/en/troubleshooting/faq.md index fc171b238..3e519b0e0 100644 --- a/content/en/troubleshooting/faq.md +++ b/content/en/troubleshooting/faq.md @@ -106,7 +106,5 @@ Which page methods trigger content rendering? [`Paginator`]: /methods/page/paginator/ [`Store`]: /methods/page/store [forum]: https://discourse.gohugo.io -[forum]: https://discourse.gohugo.io [installation]: /installation/ [requesting help]: https://discourse.gohugo.io/t/requesting-help/9132 -[requesting help]: https://discourse.gohugo.io/t/requesting-help/9132 From 480ae9014c8bb462855e40e05d5515379381686f Mon Sep 17 00:00:00 2001 From: Joe Mooring Date: Mon, 18 Aug 2025 06:15:48 -0700 Subject: [PATCH 51/62] content: Improve file names in the PageInner description --- content/en/_common/render-hooks/pageinner.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/content/en/_common/render-hooks/pageinner.md b/content/en/_common/render-hooks/pageinner.md index e5c0afb79..3efbc9ce3 100644 --- a/content/en/_common/render-hooks/pageinner.md +++ b/content/en/_common/render-hooks/pageinner.md @@ -22,14 +22,14 @@ The primary use case for `PageInner` is to resolve links and [page resources](g) Then call the shortcode in your Markdown: -```text {file="content/posts/p1.md"} -{{%/* include "/posts/p2" */%}} +```text {file="content/posts/post-1.md"} +{{%/* include "/posts/post-2" */%}} ``` -Any render hook triggered while rendering `/posts/p2` will get: +Any render hook triggered while rendering `/posts/post-2` will get: -- `/posts/p1` when calling `Page` -- `/posts/p2` when calling `PageInner` +- `/posts/post-1` when calling `Page` +- `/posts/post-2` when calling `PageInner` `PageInner` falls back to the value of `Page` if not relevant, and always returns a value. From 81bd0056a8195b5c876940e344ca0fa926408462 Mon Sep 17 00:00:00 2001 From: Joe Mooring Date: Mon, 18 Aug 2025 09:41:27 -0700 Subject: [PATCH 52/62] mics: Update configuration for the Markdown linter --- .markdownlint-cli2.yaml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.markdownlint-cli2.yaml b/.markdownlint-cli2.yaml index b02ce2b73..42af1cc2b 100644 --- a/.markdownlint-cli2.yaml +++ b/.markdownlint-cli2.yaml @@ -1,7 +1,6 @@ # Glob patterns to include globs: - - "content/**/*.md" # the - + - "content/**/*.md" # Glob patterns to exclude ignores: - "content/**/commands/**" From 32e450b7c545a4f69f5931b6f3fa941fd8f0059a Mon Sep 17 00:00:00 2001 From: Joe Mooring Date: Mon, 18 Aug 2025 09:48:55 -0700 Subject: [PATCH 53/62] misc: Fix typo in configuration for the Markdown linter --- .markdownlint-cli2.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/.markdownlint-cli2.yaml b/.markdownlint-cli2.yaml index 42af1cc2b..fd71f7aa2 100644 --- a/.markdownlint-cli2.yaml +++ b/.markdownlint-cli2.yaml @@ -1,6 +1,7 @@ # Glob patterns to include globs: - "content/**/*.md" + # Glob patterns to exclude ignores: - "content/**/commands/**" From e76f17815ca6f39f1b81397de9edc08e6864aadc Mon Sep 17 00:00:00 2001 From: Joe Mooring Date: Tue, 19 Aug 2025 05:41:11 -0700 Subject: [PATCH 54/62] misc: Fix typo in configuration for the Markdown linter --- .markdownlint-cli2.yaml | 1 - 1 file changed, 1 deletion(-) diff --git a/.markdownlint-cli2.yaml b/.markdownlint-cli2.yaml index fd71f7aa2..1ededafd0 100644 --- a/.markdownlint-cli2.yaml +++ b/.markdownlint-cli2.yaml @@ -11,7 +11,6 @@ ignores: # Markdownlint rules and configuration # https://github.com/DavidAnson/markdownlint?tab=readme-ov-file#rules--aliases config: - # default: false # disable all rules MD001: true # MD002 deprecated MD003: From 8f14be5da7c35ccf1d1dc25bfd3bbb8a6307648a Mon Sep 17 00:00:00 2001 From: Joe Mooring Date: Tue, 19 Aug 2025 05:44:15 -0700 Subject: [PATCH 55/62] content: Remove duplicate list items Fixes #3173 --- content/en/templates/sitemap.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/content/en/templates/sitemap.md b/content/en/templates/sitemap.md index 2691ae471..b1b0046d9 100644 --- a/content/en/templates/sitemap.md +++ b/content/en/templates/sitemap.md @@ -38,14 +38,12 @@ title = 'News' To override the built-in sitemap.xml template, create a new file in either of these locations: -- `layouts/sitemap.xml` - `layouts/sitemap.xml` When ranging through the page collection, access the _change frequency_ and _priority_ with `.Sitemap.ChangeFreq` and `.Sitemap.Priority` respectively. To override the built-in sitemapindex.xml template, create a new file in either of these locations: -- `layouts/sitemapindex.xml` - `layouts/sitemapindex.xml` ## Disable sitemap generation From 0569c68cac976526590ea0bbb41b0334ae94466f Mon Sep 17 00:00:00 2001 From: Joe Mooring Date: Tue, 19 Aug 2025 06:26:06 -0700 Subject: [PATCH 56/62] content: Fix typo --- content/en/templates/sitemap.md | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/content/en/templates/sitemap.md b/content/en/templates/sitemap.md index b1b0046d9..8eb358d87 100644 --- a/content/en/templates/sitemap.md +++ b/content/en/templates/sitemap.md @@ -36,15 +36,9 @@ title = 'News' ## Override built-in templates -To override the built-in sitemap.xml template, create a new file in either of these locations: +To override the built-in sitemap.xml template, create a new `layouts/sitemap.xml` file. When ranging through the page collection, access the _change frequency_ and _priority_ with `.Sitemap.ChangeFreq` and `.Sitemap.Priority` respectively. -- `layouts/sitemap.xml` - -When ranging through the page collection, access the _change frequency_ and _priority_ with `.Sitemap.ChangeFreq` and `.Sitemap.Priority` respectively. - -To override the built-in sitemapindex.xml template, create a new file in either of these locations: - -- `layouts/sitemapindex.xml` +To override the built-in sitemapindex.xml template, create a new `layouts/sitemapindex.xml` file. ## Disable sitemap generation From 82885415fac1bddd26f3d8b5d9c0538738196cf0 Mon Sep 17 00:00:00 2001 From: Joe Mooring Date: Wed, 20 Aug 2025 06:41:04 -0700 Subject: [PATCH 57/62] content: Change build.sh file perms in Cloudflare hosting docs --- content/en/host-and-deploy/host-on-cloudflare/index.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/content/en/host-and-deploy/host-on-cloudflare/index.md b/content/en/host-and-deploy/host-on-cloudflare/index.md index ca8ea8b09..aebd7b868 100644 --- a/content/en/host-and-deploy/host-on-cloudflare/index.md +++ b/content/en/host-and-deploy/host-on-cloudflare/index.md @@ -28,15 +28,15 @@ Create a `wrangler.toml` file in the root of your project. ```toml {file="wrangler.toml" copy=true} # Configure Cloudflare Worker -name = 'hosting-cloudflare-worker' -compatibility_date = '2025-07-31' +name = "hosting-cloudflare-worker" +compatibility_date = "2025-07-31" [build] -command = './build.sh' +command = "chmod a+x build.sh && ./build.sh" [assets] -directory = './public' -not_found_handling = '404-page' +directory = "./public" +not_found_handling = "404" ``` ### Step 2 From d77b06aa6c71aad7f714ebe1424ecbebd61843f9 Mon Sep 17 00:00:00 2001 From: Joe Mooring Date: Wed, 20 Aug 2025 08:03:10 -0700 Subject: [PATCH 58/62] content: Fix formatting --- content/en/functions/resources/PostProcess.md | 86 +++++++++---------- 1 file changed, 43 insertions(+), 43 deletions(-) diff --git a/content/en/functions/resources/PostProcess.md b/content/en/functions/resources/PostProcess.md index 00720e3f9..766817ff5 100644 --- a/content/en/functions/resources/PostProcess.md +++ b/content/en/functions/resources/PostProcess.md @@ -27,51 +27,51 @@ Step 1 Step 2 : Install the required Node.js packages in the root of your project: -```sh -npm i -D postcss postcss-cli autoprefixer @fullhuman/postcss-purgecss -``` + ```sh {copy=true} + npm i -D postcss postcss-cli autoprefixer @fullhuman/postcss-purgecss + ``` Step 3 : Enable creation of the `hugo_stats.json` file when building the site. If you are only using this for the production build, consider placing it below [`config/production`]. -{{< code-toggle file=hugo >}} -[build.buildStats] -enable = true -{{< /code-toggle >}} + {{< code-toggle file=hugo copy=true >}} + [build.buildStats] + enable = true + {{< /code-toggle >}} -See the [configure build] documentation for details and options. + See the [configure build] documentation for details and options. Step 4 : Create a PostCSS configuration file in the root of your project. -```js {file="postcss.config.js" copy=true} -const autoprefixer = require('autoprefixer'); -const purgeCSSPlugin = require('@fullhuman/postcss-purgecss').default; + ```js {file="postcss.config.js" copy=true} + const autoprefixer = require('autoprefixer'); + const purgeCSSPlugin = require('@fullhuman/postcss-purgecss').default; -const purgecss = purgeCSSPlugin({ - content: ['./hugo_stats.json'], - defaultExtractor: content => { - const els = JSON.parse(content).htmlElements; - return [ - ...(els.tags || []), - ...(els.classes || []), - ...(els.ids || []), - ]; - }, - // https://purgecss.com/safelisting.html - safelist: [] -}); + const purgecss = purgeCSSPlugin({ + content: ['./hugo_stats.json'], + defaultExtractor: content => { + const els = JSON.parse(content).htmlElements; + return [ + ...(els.tags || []), + ...(els.classes || []), + ...(els.ids || []), + ]; + }, + // https://purgecss.com/safelisting.html + safelist: [] + }); -module.exports = { - plugins: [ - process.env.HUGO_ENVIRONMENT !== 'development' ? purgecss : null, - autoprefixer, - ] -}; -``` + module.exports = { + plugins: [ + process.env.HUGO_ENVIRONMENT !== 'development' ? purgecss : null, + autoprefixer, + ] + }; + ``` -> [!note] -> If you are a Windows user, and the path to your project contains a space, you must place the PostCSS configuration within the package.json file. See [this example] and issue [#7333]. + > [!note] + > If you are a Windows user, and the path to your project contains a space, you must place the PostCSS configuration within the package.json file. See [this example] and issue [#7333]. Step 5 : Place your CSS file within the `assets/css` directory. @@ -79,17 +79,17 @@ Step 5 Step 6 : If the current environment is not `development`, process the resource with PostCSS: -```go-html-template -{{ with resources.Get "css/main.css" }} - {{ if hugo.IsDevelopment }} - - {{ else }} - {{ with . | postCSS | minify | fingerprint | resources.PostProcess }} - + ```go-html-template {copy=true} + {{ with resources.Get "css/main.css" }} + {{ if hugo.IsDevelopment }} + + {{ else }} + {{ with . | postCSS | minify | fingerprint | resources.PostProcess }} + + {{ end }} {{ end }} {{ end }} -{{ end }} -``` + ``` ## Environment variables @@ -124,7 +124,7 @@ let tailwindConfig = process.env.HUGO_FILE_TAILWIND_CONFIG_JS || './tailwind.con ## Limitations -Do not use `resources.PostProcess` when running Hugo's built-in development server. The examples above specifically prevent this by verifying that the current environment is not "development". +Do not use `resources.PostProcess` when running Hugo's built-in development server. The examples above specifically prevent this by verifying that the current environment is not `development`. The `resources.PostProcess` function only works within templates that produce HTML files. From 3aaca6c0ad6f170d81b540ab5533d86082831e15 Mon Sep 17 00:00:00 2001 From: Joe Mooring Date: Wed, 20 Aug 2025 14:02:34 -0700 Subject: [PATCH 59/62] content: Add hosting guide for Render --- content/en/host-and-deploy/host-on-render.md | 78 -------- .../host-and-deploy/host-on-render/index.md | 181 ++++++++++++++++++ .../host-on-render/render-01.png | Bin 0 -> 6828 bytes .../host-on-render/render-02.png | Bin 0 -> 6810 bytes .../host-on-render/render-03.png | Bin 0 -> 16902 bytes .../host-on-render/render-04.png | Bin 0 -> 5850 bytes .../host-on-render/render-05.png | Bin 0 -> 31955 bytes .../host-on-render/render-06.png | Bin 0 -> 5415 bytes .../host-on-render/render-07.png | Bin 0 -> 23683 bytes .../host-on-render/render-08.png | Bin 0 -> 5987 bytes .../host-on-render/render-09.png | Bin 0 -> 8057 bytes .../host-on-render/render-10.png | Bin 0 -> 7484 bytes 12 files changed, 181 insertions(+), 78 deletions(-) delete mode 100644 content/en/host-and-deploy/host-on-render.md create mode 100644 content/en/host-and-deploy/host-on-render/index.md create mode 100644 content/en/host-and-deploy/host-on-render/render-01.png create mode 100644 content/en/host-and-deploy/host-on-render/render-02.png create mode 100644 content/en/host-and-deploy/host-on-render/render-03.png create mode 100644 content/en/host-and-deploy/host-on-render/render-04.png create mode 100644 content/en/host-and-deploy/host-on-render/render-05.png create mode 100644 content/en/host-and-deploy/host-on-render/render-06.png create mode 100644 content/en/host-and-deploy/host-on-render/render-07.png create mode 100644 content/en/host-and-deploy/host-on-render/render-08.png create mode 100644 content/en/host-and-deploy/host-on-render/render-09.png create mode 100644 content/en/host-and-deploy/host-on-render/render-10.png diff --git a/content/en/host-and-deploy/host-on-render.md b/content/en/host-and-deploy/host-on-render.md deleted file mode 100644 index 3dbd9a04b..000000000 --- a/content/en/host-and-deploy/host-on-render.md +++ /dev/null @@ -1,78 +0,0 @@ ---- -title: Host on Render -description: Host your site on Render. -categories: [] -keywords: [] -aliases: [/hosting-and-deployment/hosting-on-render/] ---- - -## Introduction - -[Render](https://render.com) is a fully-managed cloud platform where you can host static sites, backend APIs, databases, cron jobs, and all your other apps in one place. - -Static sites are **completely free** on Render and include the following: - -- Continuous, automatic builds & deploys from [GitHub](https://render.com/docs/github) and [GitLab](https://render.com/docs/gitlab). -- Automatic SSL certificates through [Let's Encrypt](https://letsencrypt.org). -- Instant cache invalidation with a lightning fast, global CDN. -- Unlimited collaborators. -- Unlimited [custom domains](https://render.com/docs/custom-domains). -- Automatic [Brotli compression](https://en.wikipedia.org/wiki/Brotli) for faster sites. -- Native HTTP/2 support. -- [Pull Request Previews](https://render.com/docs/pull-request-previews). -- Automatic HTTP → HTTPS redirects. -- Custom URL redirects and rewrites. - -## Assumptions - -- You have an account with GitHub or GitLab. -- You have completed the [Quick Start] or have a Hugo website you are ready to deploy and share with the world. -- You have a Render account. You can sign up at . - -## Deployment - -You can set up a Hugo site on Render in two quick steps: - -1. Create a new **Static Site** on Render, and give Render permission to access your GitHub/GitLab repo. -1. Use the following values during creation: - -Field | Value -------------------- | ------------------- -**Build Command** | `hugo --gc --minify` (or your own build command) -**Publish Directory** | `public` (or your own output directory) - -That's it! Your site will be live on your Render URL (which looks like `yoursite.onrender.com`) as soon as the build is done. - -## Continuous deploys - -Now that Render is connected to your repo, it will **automatically build and publish your site** any time you push to your GitHub/GitLab. - -You can choose to disable auto deploys under the **Settings** section for your site and deploy it manually from the Render dashboard. - -## CDN and cache invalidation - -Render hosts your site on a global, lightning fast CDN which ensures the fastest possible download times for all your users across the globe. - -Every deploy automatically and instantly invalidates the CDN cache, so your users can always access the latest content on your site. - -## Custom domains - -Add your own domains to your site easily using Render's [custom domains](https://render.com/docs/custom-domains) guide. - -## Pull Request previews - -With Pull Request (PR) previews, you can visualize changes introduced in a pull request instead of simply relying on code reviews. - -Once enabled, every PR for your site will automatically generate a new static site based on the code in the PR. It will have its own URL, and it will be deleted automatically when the PR is closed. - -Read more about [Pull Request Previews](https://render.com/docs/pull-request-previews) on Render. - -## Hugo themes - -Render automatically downloads all Git submodules defined in your Git repo on every build. This way Hugo themes added as submodules work as expected. - -## Support - -Chat with Render developers at or email `support@render.com` if you need help. - -[Quick Start]: /getting-started/quick-start/ diff --git a/content/en/host-and-deploy/host-on-render/index.md b/content/en/host-and-deploy/host-on-render/index.md new file mode 100644 index 000000000..e24e1df41 --- /dev/null +++ b/content/en/host-and-deploy/host-on-render/index.md @@ -0,0 +1,181 @@ +--- +title: Host on Render +description: Host your site on Render. +categories: [] +keywords: [] +aliases: [/hosting-and-deployment/hosting-on-render/] +--- + +Use these instructions to enable continuous deployment from a GitHub repository. The same general steps apply if you are using GitLab or Bitbucket for version control. + +## Prerequisites + +Please complete the following tasks before continuing: + +1. [Create](https://dashboard.render.com/register) a Render account +1. [Log in](https://dashboard.render.com/login) to your Render account +1. [Create](https://github.com/signup) a GitHub account +1. [Log in](https://github.com/login) to your GitHub account +1. [Create](https://github.com/new) a GitHub repository for your project +1. [Create](https://git-scm.com/docs/git-init) a local Git repository for your project with a [remote](https://git-scm.com/docs/git-remote) reference to your GitHub repository +1. Create a Hugo site within your local Git repository and test it with the `hugo server` command + +## Procedure + +### Step 1 + +Create a [Render Blueprint][] in the root of your project. + +``` {file="render.yaml" copy=true} +services: + - type: web + name: hosting-render + repo: https://github.com/jmooring/hosting-render + runtime: static + buildCommand: chmod a+x build.sh && ./build.sh + staticPublishPath: public + envVars: + - key: DART_SASS_VERSION + value: 1.90.0 + - key: GO_VERSION + value: 1.24.5 + - key: HUGO_VERSION + value: 0.148.2 + - key: NODE_VERSION + value: 22.18.0 + - key: TZ + value: Europe/Oslo +``` + +### Step 2 + +Create a `build.sh` file in the root of your project. + +```sh {file="build.sh" copy=true} +#!/usr/bin/env bash + +#------------------------------------------------------------------------------ +# @file +# Builds a Hugo site hosted on a Render. +# +# Render automatically installs Node.js dependencies. +#------------------------------------------------------------------------------ + +main() { + + # Create directory for user-specific executable files + echo "Creating directory for user-specific executable files..." + mkdir -p "${HOME}/.local" + + # Install Dart Sass + echo "Installing Dart Sass ${DART_SASS_VERSION}..." + curl -sLJO "https://github.com/sass/dart-sass/releases/download/${DART_SASS_VERSION}/dart-sass-${DART_SASS_VERSION}-linux-x64.tar.gz" + tar -C "${HOME}/.local" -xf "dart-sass-${DART_SASS_VERSION}-linux-x64.tar.gz" + rm "dart-sass-${DART_SASS_VERSION}-linux-x64.tar.gz" + export PATH="${HOME}/.local/dart-sass:${PATH}" + + # Install Go + echo "Installing Go ${GO_VERSION}..." + curl -sLJO "https://go.dev/dl/go${GO_VERSION}.linux-amd64.tar.gz" + tar -C "${HOME}/.local" -xf "go${GO_VERSION}.linux-amd64.tar.gz" + rm "go${GO_VERSION}.linux-amd64.tar.gz" + export PATH="${HOME}/.local/go/bin:${PATH}" + + # Install Hugo + echo "Installing Hugo ${HUGO_VERSION}..." + curl -sLJO "https://github.com/gohugoio/hugo/releases/download/v${HUGO_VERSION}/hugo_extended_${HUGO_VERSION}_linux-amd64.tar.gz" + mkdir -p "${HOME}/.local/hugo" + tar -C "${HOME}/.local/hugo" -xf "hugo_extended_${HUGO_VERSION}_linux-amd64.tar.gz" + rm "hugo_extended_${HUGO_VERSION}_linux-amd64.tar.gz" + export PATH="${HOME}/.local/hugo:${PATH}" + + # Verify installations + echo "Verifying installations..." + echo Dart Sass: "$(sass --version)" + echo Go: "$(go version)" + echo Hugo: "$(hugo version)" + echo Node.js: "$(node --version)" + + # Configure Git + echo "Configuring Git..." + git config core.quotepath false + if [ "$(git rev-parse --is-shallow-repository)" = "true" ]; then + git fetch --unshallow + fi + + # Build the site + echo "Building the site..." + hugo --gc --minify --baseURL "${RENDER_EXTERNAL_URL}" + +} + +set -euo pipefail +main "$@" +``` + +### Step 3 + +Commit the changes to your local Git repository and push to your GitHub repository. + +### Step 4 + +On the Render [dashboard][], press the **Add new** button and select "Blueprint" from the drop-down menu. + +![screen capture](render-01.png) + +### Step 5 + +Press the **GitHub** button to connect to your GitHub account. + +![screen capture](render-02.png) + +### Step 6 + +Press the **Authorize Render** button to allow the Render application to access your GitHub account. + +![screen capture](render-03.png) + +### Step 7 + +Select the GitHub account where you want to install the Render application. + +![screen capture](render-04.png) + +### Step 8 + +Authorize the Render application to access all repositories or only select repositories, then press the **Install** button. + +![screen capture](render-05.png) + +### Step 9 + +On the "Create a new Blueprint Instance in My Workspacee" page, click on the **Connect** button to the right of the name of your GitHub repository. + +![screen capture](render-06.png) + +### Step 10 + +Enter a unique name for your Blueprint, then press the **Deploy Blueprint** button at the bottom of the page. + +![screen capture](render-07.png) + +### Step 11 + +Wait for the site to build and deploy, then click on the "Resources" link on the left side of the page. + +![screen capture](render-08.png) + +### Step 12 + +Click on the link to the static site resource. + +![screen capture](render-09.png) + +### Step 13 + +Click on the link to your published site. + +![screen capture](render-10.png) + +[Render Blueprint]: https://render.com/docs/blueprint-spec +[dashboard]: https://dashboard.render.com/ diff --git a/content/en/host-and-deploy/host-on-render/render-01.png b/content/en/host-and-deploy/host-on-render/render-01.png new file mode 100644 index 0000000000000000000000000000000000000000..b325a679c68ce9f489d08470b153232bbf974f64 GIT binary patch literal 6828 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 literal 0 HcmV?d00001 diff --git a/content/en/host-and-deploy/host-on-render/render-03.png b/content/en/host-and-deploy/host-on-render/render-03.png new file mode 100644 index 0000000000000000000000000000000000000000..731d8ff261d1454c0e22f9f7e3b27e41f4822045 GIT binary patch literal 16902 zcmc(Gbx>SS*CrAI48g)6!F6D;;O;tuGeFQ_L4&(H1b26vL4yU?Bv^0{E)YCT_xtOueYf_HTYXR8+o!wkJ^gf_r_YI0Q<298kOGj9kg%Z;85j~03h?=Qhk^QB z!_RYE`&^*9NI^9*Fff+ZRewE8NNP%&vZSP>`%h=JC)digWmIATh8#?r^)|uokyLa{ zx|V?!q2gn${`37?Ew$=&8S$c`qPidKpH4@eZS6lrELjESV_L74EMIO9mc?XbXMPEw z3lcm%X`rGL!3)?)@^LPLEB^g^<(Jh`GPvoj!RwSF9^5#fmOe`*>bP++Y7(<%?Y+ot zUdcnp)X@BGxjtrW>!Lj_P_E|ko0k-MkYL)_^+d~tp;PQ|M&QZJPE%B%Qgr6i(_wp* zbD9!UQtzR>g6j5kySW}TJ;k`Js{V^5ub-2%T-eUj)eZeg<0@20Lh+@WltAkPS-6yx&!%)-LLuXOh5>FMn3nmp!X(DySz z=dMaOwT7)*Dh}(->nB!Gt&%`{jk9*i zqjl4V*PD&P0>mkJG;4DJ6Zp_+Z*WTll}B`ZJ4)GnYDa2mIdWt^838z z{K4KfAvq6T`E-58&CT7?SAfAsEw+e-D0{9Z%{~qBeW#-^-b;^2PFa zj67XqNE-oGzPZS~PZQTds1Z+vXKpX?o}@PqUQs`W_s_kNxW|pH;SRi}A~mu^Iurko zH&DI<=agl87xQ4+T#Y(UuOIG_zjoG6Te{MFv|sh(ZED8(ebsvE8f9pN?^v6WriqWJQKfXUgXMD7!*bd}YEIXsJLFoM zAJ>Pwzr(KIc7#h*hk@4Z!BT(u&c1ae2e0dbmwV-lS3qbvj;nhh!#exqjr5cZBcBi; zY8E-Om?YR2K;89k!QC`oNKYI_}u+&init zVAh8zcLt+3ngj*+p!cL+h8|laz&(i@l3LAC&g9^SC%*S&7v0qf3A=26)F_Ij{TH4N z_Bd%KOSh%J*7FE?E0!_$IT*3V;zau2Gkb~tc?w(B%DU;xNKj_o`_OF*iw`4MFd5bc zT>V6n7Z;!#d4Hah6UsXYjZb=24im_w3W7Ru)oFibmR(T@auvR0+`z>uj#v6Jz2~wr zMsQ{`Q_Q0#b-M4*G&^~j{BdYKU}ap`iVq43^ryq_-u0S;+Bj_>dM1{p*%j)xPi5}K zu|KOp-Sc);RVpNw-j9Cgk8Fr;iIaH{YIAY_)0W!yHNCAOAht3r3g~tMV4+srrosw7 zR+&F=^rr0e#^}zSSoaKmH~K_soGZE8m`0SPF(noNqDYqH1Iu-n{6;HO&FZ3cqR^+b zqBcLE?nA~P^hhM{;Fhyjs^$V8dk1xzzjn27NE6Z6Nh<9 zz}fddStKh@174W$nE9^(ozvLiNaW)+G~izydyk4JIt%lJe}8x1HaY?kA+r*glctDr zZ?S&&I$GI5nW-lX9$ff0l)_-Ff)|!c@ay-qESk*b-HUEiwaqTo%z^^mS8vuKDk{x9 z9OUQPNb-BKDNqc&nIeZaAm(R!F|GtZ`YNChaN2amg9vayhT8d!7_{#$eSDXTZ@}>L zO%wYULe*|PNfNBcbhK~gdRJu9uMN$&dDNcej4ufvck9ds1xST`Uik8oF;V!hfUw`()XDc zqJj;r%&NcNu!|Je^S0;L?^oPq{FFdtkg*L@%Gv$yny68))Pa^Q@vi%>$eQHyz9vNdb#^dK3 zgh}{)B~VVKSr3JKd%jBE!1lz_y4QDTOM}+AT!#T04cwEy-qF7DgKd3$pVs0a@cxEG z6jS@zh>cKTnh!OF#1t65^y%jk>ybSArtZKpym=F8h8H!vyk921IjaLDrs|XoER?C( zq;~kis#pV*#!S#wq}VpckG>QroZ+ViZH1v_lFU)?Kbxm3L}(+1+BaM7VleoXjgksz zh@x_so*NU{SyzibiFgd^cCv8t?x=YR<3#}Eti!xE@&o^^8p_Kf2ltYbNT9g3(pO9fic-FoMN61}>9$)I}fM3Y&VJZ_ty-c{HVlSOx$`9~mAXf5GS>!?ly% zvreqRJB0;gD}@?3G$M(WnuEUwWefov%E!~_i{PGOr^Wjg<+MwbAw1V+*Nr z`?9?XhSf^hP?yJ$?j`xtcZ%v=Q!V`9oGmRlLeYh=lAMwk>zuHLk%BXTt|TmsT?yTa z>Rnt8mg-1m7+DEe>DCXp4bi|JJ6P?(;GU4JQk0Di-oRigmSM z6?%A1fz9oVgPKDtO9z`jM-N^#fCt8Ljeh#T@{1{KafiM1Eh&T<^=L)q292x&!;fn< zl~{di@(0;at#gbt!7uu-wzQQ}weY%EDgc4<(yyEnY03V}a~J9#fB%m2iwgPz#6)Jl z1rDQ<+KX98zL};-x)WM1#eaVENnuwG76`EUnJevs;$vN)IvD}nW;@WBP)?#mFsimy zG-@vlRby3r4wcTaFv|&n+!%IT8>|w8`aEiumzFX>>Hr5|E5+N(QJ!ki3*ED-S4!Ir& z`o2-gQ8~{gYU)WdxPAa1o)k}o2*rzy)lP;hg11(G%YRCX5zCNw{(T*Q7UXZ}yN2ca`XfQJ12}=ilvwla+t~P-SYNly?HcAT+v2gtvn}~u&MP9%;qJYY;IEydom!^K zH4DfOCP&_L&TmMSem!%UcgSxTioX zQR*p9gh}hf>QhUCR97+d*jZ?G()C%#D=aj}!6CXl`holL1YL>;LzI;HuKS#b-d6Wf z`Pk_j@a4$L4m)7LC-w%XU4)g%Bny<6ogp9BeQd?2CKU^H%G`1e4O*UpU{Iq$Tnvgs z6a6i93a1J?ZNLQuSaLBWGCwC1-;dIGb+rm-IaYk8IFPb$i3jm7=OQNNVuk52+Um4l z4u$P7mn(HIigB*Jz!trI?g0N&~) zq~cs8eM%gM&Sx}vC3fqVQSmpJi+Nbl=%bMuQFbs%9Pc%nt3~ZhUVkf#4TSMTCn5b9 zmspYm3$Is+nG3BJ&C15NQ_J0j>(hfN zVw5buDohxri`=ix_k@5!{%q*hl zD3+`rH$t3zA1oBB1Oz_6{%D(N^}25qo}p?MT|RyTXMr4UGO#zp0Q1N|m4IA!!f4&zB0{d#miCW*6031#SJ` z4ysere$*2?!Pfs~M?|jni^2}oPjp9#?NIUM3$~d+Rq}YPI?>EE2nlmG1(P{;JF%z& z_OwJi$s*f_o%5fIUkZL+_Keb-&O>SJTO?{4U$kXtvL~Xz>UKi3(u#rQeTl3nlf~av zEF}p`EE1KeaSlHnF_toXFQjiGNC>u5iHF3|frE_FHuS8e5CSU(rdc^JTca7iZvn`^ zE1WCRW&EU7teaQ(qWb!cO(f9XI#eV!``GF)VV?`9x8I21BoTKGwR(~1;(SXthMrv% z5+8VIvvDQ7t}-b!m0gXuL5jMMS{U3AGXF?T4lK2l7f@8s#}$Bb&H{eQ2@`EuP2@6x zqAXHt^)EgwVH1>QSbJN7smpT00{fciE6uFKzGJzVgt|}ViTZGjd`7iOmfB~0DL*iW zADYa>q^}nMw<-sQDFIsVaPQvq3dP{ST0V-ArkI}BBqWoxbt;0XU0GZ874^aBV7_c? zvDXnmkYUs)A6ROzd;q4&1d%iqlw_p5L;MnE*_Ybev*@AhTiVg00j{&y8}pXc>`ij$ykGG zx;ZDH$c-mNKoYxz8W*lUbi@h6154<{rM;39*Nh2ZoUxZAZ8Dj?-+OK#$k-!h+wV-x zM3imld*=3P+4u01oAjGPfMz+2S?BGkQy*)|tAH9u@B-<+gGvaz>?D&-=oM5uvmtsQ zj0)3-I32hIHx{OWL7)pfwuJWD)rX6>y4COm+Wc5!AMr#{hJFt(G2PCpO70Sq2*50;4KU%MqbP+C3*|q|G z1kmMp1z7D~Z6Yw#Tk~~*yrXXcHT3eD3>daUy_;EFW({b1>xvCpiK$H7gv$F0HOLj;wsZRA z74Y6;8OFb?lUGOYKjRUNRn*YY~detr=&*+-!y>d#oiJAEz|HoO{gfPfqz1@J{U7638O6@vb=#q%oIHHecl+_Fv- zLG{d=b<0>fPL<8Z=)*Z8TYYRJHUx8cDzu&-9OlodtQ8Vgk&Z(oKet3$7ScQhg~J2w zKVeo`Re34^Owr;b^}v+LD4)N{lQ+UdsAU^7r0w5r39xrUXMV6RjZ@0!C&zfc!i7v~ zcj~VvM2PVTTf1@R!)=mHBkUAYy6Zh90ARURqxISp2)>|FZhK*5OU^1T;*>Qnq5Bd> zE6bKy^ucR8PBFJ(Md7F5LKJgNs$3jFO<(E{o0_TCB8x=E$MnQf#M)OqGSK*=9Ocgd z+IHAd>_{Dc|6ioqo4t|sh3SUr%>e_ajbE}(u-9JjM>H<}UQ?FL*paplXOHxD{$7Tv zBA?{al;rN>66>#wxB={%rHz|S^yr-KkzCkfMDl;DMdd(NY8El56>)Nz4MxP3ky}c7 zTjZ0G7;Tr@T(hL76~J*7y83F?8aP4w5g&`omqhD=;HK#EK1@~=3AdSKp==O^&>DNr28M9}`P=F&IIcyP}v{)YU~vPSAJ%y>KYS zS+erriBL;x@ zw*?)H#QLDP`RI9MW2*9&2N-&}-a$%+)|1JpwtUaX-b?YY$0`X+)y;$*%Y-(yw??%w zsM@4=JAk3Kd~{eo#!S$%9R)!_FIt%-$QV4Sc;of-mZ|43mwWxst@j59V{vAzG4%coC`z$S1H5H@WMB)P%pBU)#a`RIsSG)>s6Qq7 zF&C~i#yt5clV}Mv=aeF~is~iJND|EZV@LWokq|*TGfhf+5=zoDXlV>(R(9|4kei9y z>Iu)m=qDEX2jI)!TgO$3VFMbE6WAJ0X;{GnkyC`=6mnTgM6%XoOk><*oriGNL>JB% zt#U3#GEDSbqGqy^+ZLKjD;y0C~9dadf=EIwPObWF0_${c2ydcR{R8 zNdhQ-#JYeo2@>M;QYMWdtw~*wZgY^bjpcfC%D`4QUQY$i&#G$1=_Nr0NnToYX%)C- z=7^^Aiyugme9zXPYv+Y|q96&fWz(wE%uS9}x@>ww>ePAwu}IC%A!^VwyHH((bEGQ~ zTnJBkmFB{!>qpSSWn=94%}%)&T=#XII6B1!&zaOygGb2Ijf_f^!0C8rH7@w)54c`> z!v2bpqmk)r);+0C8%ZwsMH=ujLUeHgh9QDkx5WfnOW2sY0@O`M2f?Q~_Pom(*7wu~ zFhS026ZH`LIkpTS7}j)(S4E*{$%X9n!p$L~)-~wkV#1CTVDE+XacMJ4P)W8@5Kfgi z8JBw`UV2Q0COiR9uguY)R+54>1meybmPUCVg}vgJF%0EE&k?;BZGU1sl4$qrciCdX z=bUK;lbz!R_$I!;<9?p7dBDfGhX(g%0VcE_f4z2n%9LOe@v0Rz-2Vo(p1*!baJ33- z8r$?qi<7~Bg*H|JsfL3Q%&n-SX8@1n3>D0)t!;) z>{T|JYyj)IkoB)u%!t@Y1-CGF4ohQfb59~rpza%A%qRA_Nt z^i+c~2e<6a#E`I92l7hZn`v44(7}MKRby9SJZK&e6Vv3C-%&TQAeM>_B15Q!sxd)r z5U_k)iFU4$>wC_Ee|L+kc{d@~`0LD~K^1^dDtU6S@}OBcA$qu0w|A2SdG**|Ie3}A z`ILM1%v6~x*7MS?`KF>z?so?j?Qw~V(hxzd?k%{`Fw?kt#-zJN&&f%6UPfGL*$!Lp zz4)>rz)2mj;+&bGr(_XSsjqBl*P8Z4X{LY5dVN5TYbkrm*R1h#hCQ1eeIL^;u;U|Q zfdnB!uTCYWEwH*7I=jhiFxfsj#A;Uo+<)PML(nhzWqG7cICXlQ58TkbJ$9Z zIJM*#Yug+f@K%#V;)cxs+5n#i_q{W3;!oKCStSB94;R|PQ?5+T(W!3^F*~>qr%A&j z7VqzUlbe*DHGNhnRN?qdjn-&YpE<_-ifxS5le5pDWd#ZlB6!0?BbZIgiaeJtwB_l#3ma44(g0G0nW9POwsQ?4Vu7W3PkKb}X_ z9*5}G?8m95pO`4WU`y%Ac)K(HZcmO#cf9c6>FIT`(AaEd$%0I{b2T$=U@f!uQBKZW zz2xV^|N3KPZD)+QkIeT)@U`f1TJUnSvm!si8O3p$ltVXWke;ah6X%2=l`k@u)7xt- z&QMf@gn%00e-%CLFtZ%R>S`6S@J)iJ{z_QP>%JV9-_EB$2K?jr5d-+id+Bvt$!Cn8 z{9}m`B<5In#T@UhxmS~ELwu3ZT?ZJ&=8!ChUa&Gzqxj?>H*3OwNGBF;qE4bJAl|%=Cz(+je z-Ocvm;^DmbxV(>PIIeO2J_(r!fm5kJX`A+gBpWeTaE?0rUf<+Bz`aMD|4BB~$#@U< zPS~MN?>0L?zisY(Fu2lUn9(Dw|IcHXFPXz`hBCq^^c9oe=F#VhF;oTNV^i?J0YA|% z?Rt^mD|nfODl3H2|Z^q*>F_FQ1-)Ya~6KNHN zPOqInXmEdYcwnk@@gN^lnEW$x7x$8!8*w$#gv3HqA(CGk9|i+?{C@W%s1r>C^Ayem z9+P@LJnNMPkuqlh1sgulC~~?I8=QILp&0UlWVKF|cTnMT$Smu;8KJ7I=NN_^UO(p^ zcL?vC9ptAlUUBs7(wQYUZce?&GPF_x?D3OC9P-u!zjktfwus3mykB&T#yb8&H^o5r zca3xWm2UfgPjmI0fisbiD6RjA1^9P}v*$^Ug&kZV{G}{aG;YMRp>cbDsX;BOLl`^Q zzMh|Z**Ohe#O~6K@;;kLVUlL}I)h`0nW4i~E?tlH%~#zIOghez3IXS@VyPJkgv};3 z30@ls->!Ub`D0>p?w@C`Le&g%ul5n-=j0A{Lha3@+%1kG^h3f$AXbQDRqB$cP{nRL} zmkuRI&GefU6&IA5%Um?`?L)l&;b0Cuyhr=SWT^sSD9b+0pCR4Qx*~kNMc)_!*3a!9 zy>vYnNn2r81T(+Tpt$LGZI%7;1t^DbysjhFG~A?$kDza``K`t_s*B_3$_g4ESTmB3 z`xJ34-p9Xt?(vv4lCn=LSsdzD$(_IhqQ3GQPu+}_V{=DX1=nyml45DXT;X5XNF1G_ zm4&ELZB-_b2M=1=i%kh{LO|)@cH5(%O93*oo76_mraNpTlHmxs>QKUa9m{X=`?kSE z>`P}itgHlkP$Cn@?~O%2b4l@i|DQETE#j=Yej8unCzJ zO<}OBhV@+tY&ju~kE*76q<#DqjC=%50rBSyxx0%C5%s}3^#u$p1YCkn9ylc2y453w zwO_uI-X|h>?L(+YU=BnqN^&L3pL<3Ls9eNio5qsPEDx_eqCeMb4(nWaFAgH(c&T5@SSglQDRQmx%g66H@ll( z968ubiqs~ow{qscq1ef6h)pe#iFPM=Wc_*EvF9#>y%1&Il_N1^2~e8IY+4cI-EH?0 z6xG2l*B4O0|5GfHm75&tB~C>o1e6|cFxD^ng$G6nrCTCcUo@hm29i@g@N0~3#uWgOCCBXOXICWi4>7PyeJ#)zU~P=wbPRgq~7huOks|`#t@$u7Cq@$R-@X#YZW}yVR5ZCCp#B4( z^Pr3>0A~?Ykaz0{PpQ??jHRJw1Gf{3P!%RI9{sY(yb0=k-B0z21Ja64E4k+w=1qF87D+w{S8G!P5-t3_&n+|IzW z6&>=M1$_#!f5e8!ay+VxJTFMWqF!dQsPWkV9+4wtFfCQi>cD1|L{wDGBo?KELL$Fu zZv;42GwBXtB|`LVaX@}-LwZs`kF~GRtPVek`)4TDf;4(eeAQhKsmXDj1J1#$v|YNd zo7l+!J-44&AT8RBQ?302+Br3=bPyOH4%wv{c|d|Q<#=-3SGLv-an~y}y>VTH68+5w zVrGwq4H)|*z1yOj9!;Z}j+cvxRn*fG%n+F_Q%o6njK@n44dP;$4?S(riOT8EL1LK+ ztpElqy2;eVw7H10B@@+p z9QS0MuvrJ7904_H7nRCpyt#B8l&uhMl~+~J!5Gg`Pw$m=D(S{y`oxO) z5pJ0ZG`2_f@A5LWfVB?wtwS9-584n)7jBxf$U8gLsR|twbP}mN6E#GOgL{caVFnts)Fbr2P6a z?TDp#oJm2aoto&5hb-3wLa)UwynsmREHk=Au zKY6<1nfH@%igKDat(3{e*$in{2UspshY3^^x)sZygHv`k8w9P2?1@r0%!-b0`%ccu z5zhcPeYAjt4#o)vM#=ypUN%`;$Wk6jQU>%shO|r)q>VK{|G=-Qi8=cn33U-1S$hU7V$l`L@6%| zq6YklBhNO9yOUm-6_u7<%Xv{~v@C#Dw$E57lryO|vFrA;6Nc9SwzU`stmPXvY=pn{ z6%igt=^{5f9$$kTp@Xscspgdm%z$Wi`zmlJ#Fa-rhmm5GYLK8#6HL2pX`%IkJQ6S< z%=Tn?Gmzl171G0Um1IvX|i=|Szylto7EEVsyasP{XlB5@0Py zLd6Qnz{sW%^xz32jDw{Fuwv*x**e;az3w6i9aNRNL>IN5aJ!=-Ng}$$+sVOFgC}fR zS`bQA()ebBo*3WU*>Pi_Wgk8FCPyU$D8Gk=mQmQN#1lVLs$)_FsM1r>rH+5rUwc4k zpshcP=I8va*KTk34a}>?sjtBH2`^4GTE2u0_9A*~Yx&b0Z51lN;$%l-M8Jj{cuE}G&N`2RNzj5#Xj>!{BgzzgeU4iB zn+vr!^VOrAnl>>Hb z=~(IDJ4SO=6|Aq{ zC#oUAUdW~}|^+ol^+9492DSlWh!K87`K?28@FC`1#^O-<(&q{b?Vj zKCE4u!}GI+A#E?1%Q;(S%fY#rO($0BZL`-@cB)dIx~qQ`9Aa-sL?d>Wu8BR4#DuHf z`)>TznOY{cXSC_J5Nl~&`%_eN@|5B~^8U-_P)N4!OxcQ)Y^o`Ddz8%}(PAb1cDlX> z1|E9r_FC2lob;tM()3MTG&wy+oa`;I!H32{g|zU4)1gCHBx}guD0Zns>zfm?KR%@2 z9~C=gOWz$u6kjrUpx(V7XIC5-yW)K)F_FQD9=U9-# zMqkqR)7;=Oyek(xWZoLI!ZOi zpphSQ1?X*ey|Q9kHiBTO@n(FUm#Wq`tA%c?>xL<62-lEz1r&B>rQ*iVf$+^?GJN9E z43<+M`zx9(wICv;`P98zoGc)y=pQn_`Bt0*WMs#5IpmZ;w!sgBTW)$3+@pynb_>WX z2L^Q;of3fY0#N?N3H?`>^#4*SmW6f1HGCAIMVsQ2{C{wO|6f4?r^H~&Rntx<+PsQY zpOst!xH-(#;8zo-1zExdO75qQ3Kt0EPZ}%nfjU6-*BVUoQcUIP;64O6?GqSnUGq;R z4p>MGPqaWY>#RFt7uhN8cd2`v{nPyzf(FZUu&pruBrcBKM@-1OLRV-)@b*a3B5mUv z)}+2wn4-fWAc*?(G#EkS&_m=*S}U>NVjggkkkGD>37iuCs>Ak`z0;=RXVGCNoo%a4 zjpk)v2AZ~H{4s6^#qU%un~N67C{)FO`8BWTpHpl1OH-X`sze67`eLmtJSA6ew-%{{ zEHw6rX;2l`JcTPOE&`|G+I0Zux3Or}W{eM;7Os@W{*2zUk8f91G^RMfpV29`>B71$ zKrTPf3OR9YVSgW&s;T}4;CIfQ_b>HPc!a&XT!kIx(%RfTcO2f_3za6GAo_ZNo2L3Q z5G!Az?4%{kpjn!jJl%ikC*_E>>a=ei;uD1y!fV!{C z^_c(h!S{jhaAHAAYT(rc!q?}~nSa0qhN(OT@UmbD$rTJQ;jkmo?YFMUo#>CsX*dIi z6#Jw1N;Ol`Ix>IfMCq(=zfeH1;Eyvf1* zqzNKvS0)8s{zL{R0pyB8YZwWeD>=ax-VR(;)SYq4Z~%W0)J)*4AL$}!Rlh(LACNoB z$}mc-|2eaBt%-78HU#s?N~(Agf01_3Ht|Z#mDu*R@{|<&2vgXdRVEOQAK2ziE%bl7 z_vUWQ4}ZHe5{#_)8?QF83`vki;UOq6u&b>?moCU2++Ne>A+R+Pw@g%yvjksSXTyLGE@`Fi zN0{K_>uFJT;;;M8PQ~}XAAOEi)xm!*ejm8B^T|igg8Cw_d%VO|*}Ei}#nU##kNnqu z9v_9*+;>TWEet#6`lhr;k~AONOGy_+8D+F(e zL(Cpo`bIi=2@cWgJvtU^fz@7!V_Y&H3uP-~nM2k-uS|T8xVHH%oyj&hWPh?WrHhHm zUBF=#o|X0OvJxlW@QIw2TddpD^y8dny1sZs%cd$Zv~kq->8|>{<)^ME3!nMv zyIKy#iuO{Qx#}kY`|7)MFyt~^ZS&-Ns_+-%&a=Gm)W@Kkuu?Qy_yiGtJPeJ-z^W|X-HbE;p1Pk(Z!>1ELG zuYTrLBzdFBz_SKo_N zmaBx=wGKA6T|(V5D2V8!(fPET9u)=o&wO>6{#)Q_$#}GOc4)EhysZZOKT+rgT$M)if z(DCDI0^6JTyOT`J8XAKR+@yPA5}@nJNT->@kz#d(=?)u%>`E=~r;gxq+wX&3g~R^r zbkXADbbq2Q^}&xW;s%qBTEbAtePYAWWyLmtG4lIw@IaY-ziWV~Dc%u#LR^XF`Hb{a z1l@29HCm*I&zdFK)9>C+4{}D9KMa{0xpdqo4Kxppb_#WB)?#9LOH~2g;*wESeP4hf z0~_PbUz{SpDx9t3x=ttO3o1Ir*8{JZU=!EW=$HUk9*5yz2^7iTE{`OX?vb;rL5a=2 zfFQ!6PM{snGacjCmU5pz^Fda5G*sB`+3YVwzlb=pW0Ux^^ik-3U21XKG{iWAgP=!2 zfQIb?*hE^`Y$Y?AwMd)$gKDmwr_>9YlM^QM5Bjoz*}n-pbSc=%V)yzxJi?4}yGv!j z+xS=dPifhA2dO{0*p&5jjgyP+H>*}YI4ffLh)h0AOv?H%P5L5E4J-Oj#P16?%K5Jp zPNd`OH^5o|wLn*%wI`)i6y`f_y|an(jw9TU@-928+p2!o(kuDm?MJw(V3_NJeEZw& zIE$Nf)y|u6AIrZ6<_@x@F-^>2U4I=7S9j-NZJ!5OFjg&+rHuHG9Sy_Pyd5fyJ!10} zByZ7i6Xjm?zgns4ceD~~>lQfo(~1gzJgeY6_fQpuD|{Ei`FbK$Z<%9u|D}=^?I^1| z0jNit4W#O>4t|sihu35w#HD(#ANohE>C9-kvL5@QWzNC%+)BV0nmA{i4(Z5`&Qn?T6VQW z8=X1)^xR>2Z0?Q^a$d5%J2S18hqo~J^UYgG%Z3D@1Q;I%kB|s6!eg>;pm|Rh8_{{U zL3Q+_-{kQd0V>u4DKhiYAAIsB0w!7-Npp6RJ^@*}pYjb;=ai#?4owL;!LwLumf zWsl3=*m=;ruq=_wmnesDZ2exLwmrZfplLMq62XD9mnjNKV(yAde)jRI2xaR&^9d*z zOi@&?9Nzx=J(7s4GGxg0G(F#qp~GLfdoWd?+9PBgFL`e31fAz(vDP<56z!{l*Jtu6 z>ukiL+9+ZL^xb$&PwBap$r|SYEW1=CS~hw$1zA#|lZ>UxBB zs!;|?fGQ!&LugS=&)2-Cy~>5cIGFEy z=F}g_EAgTAFy-BqY^cMZjFt;APdkLBBhIr2by{8Eol3_BjuM}N-oM@)-dp| zn4hWLau47Tr(tw50vMcPfB#sy!MB zOTwwuDh1^CueiE-#UMC_dCK7wTLZAkavjCKx%tvlw(SOF#xrAIKeuL8X+#l*T_$Uo zE3MDsYZAZbcsr%xadF;dP}mze;P(aF3|*|v@X(=A3q!!>BnBt1rcm8`@>g_(y8n{_ z5fD^XXwwId>)mRVBw2)#FHA91JbKruD#C9X1i^X=cKRK%3(vDs7^fE+re5_~V;A#T zXp@NyA#Uw}dfEK<*;Hi|^+*0Uxx?(s{vUq@{Us2G>vBHc!;WorJ|u*Zs?CXsieyQ& z4+fmAYu7o$nhvpf3{TIAevs$NTBLn%ufX9b#eimMqJPNtj3(;7Hr!V(#QMY_KzB~G z4VolB?*xbE=&p@Z|01u~1rgz2oqUj1j;={bz*IiZh<<&|$dq|@p|Nuo!Yte5I8Mk5 zx3<*olUE3R`C8Vbe4FBH#Si53>!$IgOMb~ZwQTVU_&O68h^jtWqc=O0+;4Fq4?`Rd zNef>%Bp8E%iEE$VbarLfp?reJ3ya+9S#R-&%a;-<1{Gh-?aqqdt?XXbb+OlzO%TEH z08I?l?ThAic}@D)+TF7!(Wuy7bYojbpCPORYwk^s8wA#A=}=&hc>i$saw3XMRM;iH zP3T=PXuo0U$LydFwa-5Us$N=)s?svQqRIzyj660R9$*a50F30t`qF9RU6RkP1sg8j zP8GfooDH3E3`4cKo%M6Psz`m_*f)w z^|NG4o7i+{3>Fk%B`>>+++v=XU_6Ge@pIcr0`zv`V4pb{CBj~S00)pcSXP2(e&!?C zV2Nf}z|lx|Dajo`>WF6j&SBa^Ia7)G*a(v5%emLOOLi(!k^>4 zWVg#}A0F2R3SFTo)Czqd;YCVwN3R^Fk_Llc{MyC-OD3JbMm0<%8-bSyBT z+S5odWJ#qpIeJbzIeE(jo4*C>yEw-sDzgT8bfrI5bDV_Cz;s$f>!gVk)cc-Qrks!M|@%_qSTWYYHW0Oki z#;@e=4zi*aH{URI)8UD{CDOe=|uYd09N0&enIeX?>WjY39 zVn7glg3SY4+Esc`2`0?U;_%8%4F9A~oGw`-FkLEuX>;P$q4qNANJOMyFB(7_W=1(Q z;7QTSFfbs{i~cO*u_fq-DiN!+q)CaRw#qu{K2#$l?5+O;>DOmZ$Rnh`@&9&{g*_*# OBSB?VWU8f%gZ~F_JH&qg literal 0 HcmV?d00001 diff --git a/content/en/host-and-deploy/host-on-render/render-04.png b/content/en/host-and-deploy/host-on-render/render-04.png new file mode 100644 index 0000000000000000000000000000000000000000..94e5ea87b025ce49301a85044aba902b1c4b1b28 GIT binary patch literal 5850 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 literal 0 HcmV?d00001 diff --git a/content/en/host-and-deploy/host-on-render/render-07.png b/content/en/host-and-deploy/host-on-render/render-07.png new file mode 100644 index 0000000000000000000000000000000000000000..2a645d13a3eee74c94a90a647703784a98b96eec GIT binary patch literal 23683 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 mMk`=i=`8<(-!k`nC6AbwP literal 0 HcmV?d00001 diff --git a/content/en/host-and-deploy/host-on-render/render-08.png b/content/en/host-and-deploy/host-on-render/render-08.png new file mode 100644 index 0000000000000000000000000000000000000000..1dc75ae6c5dab4fad21e867cfc8abc8a1d102a6a GIT binary patch literal 5987 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 NG1N8Fsnl{r{uj+DOXvUq literal 0 HcmV?d00001 diff --git a/content/en/host-and-deploy/host-on-render/render-09.png b/content/en/host-and-deploy/host-on-render/render-09.png new file mode 100644 index 0000000000000000000000000000000000000000..48e9404a92e26c9bd4015dad0ec09894ae04499b GIT binary patch literal 8057 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 YC_ZhQXEr&1XM=dk@)~kwG8WMP0wAb>7ytkO literal 0 HcmV?d00001 diff --git a/content/en/host-and-deploy/host-on-render/render-10.png b/content/en/host-and-deploy/host-on-render/render-10.png new file mode 100644 index 0000000000000000000000000000000000000000..4df0dcffdf10b437aa1c25475cf665a26dab1e5d GIT binary patch literal 7484 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 z Date: Thu, 21 Aug 2025 21:32:49 -0700 Subject: [PATCH 60/62] content: Add hosting guide for Vercel --- .../host-and-deploy/host-on-render/index.md | 2 +- .../host-and-deploy/host-on-vercel/index.md | 176 ++++++++++++++++++ .../host-on-vercel/vercel-01.png | Bin 0 -> 3601 bytes .../host-on-vercel/vercel-02.png | Bin 0 -> 7228 bytes .../host-on-vercel/vercel-03.png | Bin 0 -> 16364 bytes .../host-on-vercel/vercel-04.png | Bin 0 -> 4583 bytes .../host-on-vercel/vercel-05.png | Bin 0 -> 5822 bytes .../host-on-vercel/vercel-06.png | Bin 0 -> 30267 bytes .../host-on-vercel/vercel-07.png | Bin 0 -> 8068 bytes .../host-on-vercel/vercel-08.png | Bin 0 -> 16094 bytes .../host-on-vercel/vercel-09.png | Bin 0 -> 11250 bytes .../host-on-vercel/vercel-10.png | Bin 0 -> 9097 bytes 12 files changed, 177 insertions(+), 1 deletion(-) create mode 100644 content/en/host-and-deploy/host-on-vercel/index.md create mode 100644 content/en/host-and-deploy/host-on-vercel/vercel-01.png create mode 100644 content/en/host-and-deploy/host-on-vercel/vercel-02.png create mode 100644 content/en/host-and-deploy/host-on-vercel/vercel-03.png create mode 100644 content/en/host-and-deploy/host-on-vercel/vercel-04.png create mode 100644 content/en/host-and-deploy/host-on-vercel/vercel-05.png create mode 100644 content/en/host-and-deploy/host-on-vercel/vercel-06.png create mode 100644 content/en/host-and-deploy/host-on-vercel/vercel-07.png create mode 100644 content/en/host-and-deploy/host-on-vercel/vercel-08.png create mode 100644 content/en/host-and-deploy/host-on-vercel/vercel-09.png create mode 100644 content/en/host-and-deploy/host-on-vercel/vercel-10.png diff --git a/content/en/host-and-deploy/host-on-render/index.md b/content/en/host-and-deploy/host-on-render/index.md index e24e1df41..f1190aae2 100644 --- a/content/en/host-and-deploy/host-on-render/index.md +++ b/content/en/host-and-deploy/host-on-render/index.md @@ -149,7 +149,7 @@ Authorize the Render application to access all repositories or only select repos ### Step 9 -On the "Create a new Blueprint Instance in My Workspacee" page, click on the **Connect** button to the right of the name of your GitHub repository. +On the "Create a new Blueprint Instance in My Workspacee" page, press the **Connect** button to the right of the name of your GitHub repository. ![screen capture](render-06.png) diff --git a/content/en/host-and-deploy/host-on-vercel/index.md b/content/en/host-and-deploy/host-on-vercel/index.md new file mode 100644 index 000000000..2a48325e6 --- /dev/null +++ b/content/en/host-and-deploy/host-on-vercel/index.md @@ -0,0 +1,176 @@ +--- +title: Host on Vercel +description: Host your site on Vercel. +categories: [] +keywords: [] +--- + +Use these instructions to enable continuous deployment from a GitHub repository. The same general steps apply if you are using GitLab or Bitbucket for version control. + +## Prerequisites + +Please complete the following tasks before continuing: + +1. [Create](https://vercel.com/signup) a Vercel account +1. [Log in](https://vercel.com/login) to your Vercel account +1. [Create](https://github.com/signup) a GitHub account +1. [Log in](https://github.com/login) to your GitHub account +1. [Create](https://github.com/new) a GitHub repository for your project +1. [Create](https://git-scm.com/docs/git-init) a local Git repository for your project with a [remote](https://git-scm.com/docs/git-remote) reference to your GitHub repository +1. Create a Hugo site within your local Git repository and test it with the `hugo server` command + +## Procedure + +### Step 1 + +Create a `vercel.json` file in the root of your project. + +```json {file="vercel.json" copy=true} +{ + "$schema": "https://openapi.vercel.sh/vercel.json", + "buildCommand": "chmod a+x build.sh && ./build.sh", + "outputDirectory": "public" +} +``` + +### Step 2 + +Create a `build.sh` file in the root of your project. + +```sh {file="build.sh" copy=true} +#!/usr/bin/env bash + +#------------------------------------------------------------------------------ +# @file +# Builds a Hugo site hosted on Vercel. +# +# The Vercel build image automatically installs Node.js dependencies. +#------------------------------------------------------------------------------ + +main() { + + DART_SASS_VERSION=1.90.0 + GO_VERSION=1.24.5 + HUGO_VERSION=0.148.2 + NODE_VERSION=22.18.0 + + export TZ=Europe/Oslo + + # Install Dart Sass + echo "Installing Dart Sass ${DART_SASS_VERSION}..." + curl -sLJO "https://github.com/sass/dart-sass/releases/download/${DART_SASS_VERSION}/dart-sass-${DART_SASS_VERSION}-linux-x64.tar.gz" + tar -C "${HOME}/.local" -xf "dart-sass-${DART_SASS_VERSION}-linux-x64.tar.gz" + rm "dart-sass-${DART_SASS_VERSION}-linux-x64.tar.gz" + export PATH="${HOME}/.local/dart-sass:${PATH}" + + # Install Go + echo "Installing Go ${GO_VERSION}..." + curl -sLJO "https://go.dev/dl/go${GO_VERSION}.linux-amd64.tar.gz" + tar -C "${HOME}/.local" -xf "go${GO_VERSION}.linux-amd64.tar.gz" + rm "go${GO_VERSION}.linux-amd64.tar.gz" + export PATH="${HOME}/.local/go/bin:${PATH}" + + # Install Hugo + echo "Installing Hugo ${HUGO_VERSION}..." + curl -sLJO "https://github.com/gohugoio/hugo/releases/download/v${HUGO_VERSION}/hugo_extended_${HUGO_VERSION}_linux-amd64.tar.gz" + mkdir "${HOME}/.local/hugo" + tar -C "${HOME}/.local/hugo" -xf "hugo_extended_${HUGO_VERSION}_linux-amd64.tar.gz" + rm "hugo_extended_${HUGO_VERSION}_linux-amd64.tar.gz" + export PATH="${HOME}/.local/hugo:${PATH}" + + # Install Node.js + echo "Installing Node.js ${NODE_VERSION}..." + curl -sLJO "https://nodejs.org/dist/v${NODE_VERSION}/node-v${NODE_VERSION}-linux-x64.tar.xz" + tar -C "${HOME}/.local" -xf "node-v${NODE_VERSION}-linux-x64.tar.xz" + rm "node-v${NODE_VERSION}-linux-x64.tar.xz" + export PATH="${HOME}/.local/node-v${NODE_VERSION}-linux-x64/bin:${PATH}" + + # Verify installations + echo "Verifying installations..." + echo Dart Sass: "$(sass --version)" + echo Go: "$(go version)" + echo Hugo: "$(hugo version)" + echo Node.js: "$(node --version)" + + # Configure Git + echo "Configuring Git..." + git config core.quotepath false + if [ "$(git rev-parse --is-shallow-repository)" = "true" ]; then + git fetch --unshallow + fi + + # Build the site + echo "Building the site" + hugo --gc --minify --baseURL "https://${VERCEL_PROJECT_PRODUCTION_URL}" + +} + +set -euo pipefail +main "$@" +``` + +### Step 3 + +Commit the changes to your local Git repository and push to your GitHub repository. + +### Step 4 + +In the upper right corner of the Vercel dashboard, press the **Add New** button and select "Project" from the drop down menu. + +![screen capture](vercel-01.png) + +### Step 5 + +Press the "Continue with GitHub" button. + +![screen capture](vercel-02.png) + +### Step 6 + +Press the **Authorize Vercel** button to allow the Vercel application to access your GitHub account. + +![screen capture](vercel-03.png) + +### Step 7 + +Press the **Install** button to install the Vercel application. + +![screen capture](vercel-04.png) + +### Step 8 + +Select the GitHub account where you want to install the Vercel application. + +![screen capture](vercel-05.png) + +### Step 9 + +Authorize the Vercel application to access all repositories or only select repositories, then press the **Install** button. + +![screen capture](vercel-06.png) + +Your browser will be redirected to the Cloudflare dashboard. + +### Step 10 + +Press the **Import** button to the right of the name of your GitHub repository. + +![screen capture](vercel-07.png) + +### Step 11 + +On the "New Project" page, leave the settings at their default values and press the **Deploy** button. + +![screen capture](vercel-08.png) + +### Step 12 + +When the deployment completes, press the **Continue to Dashboard" button at the bottom of the page. + +![screen capture](vercel-09.png) + +### Step 13 + +On the "Production Deployment" page, click on the link to your published site. + +![screen capture](vercel-10.png) diff --git a/content/en/host-and-deploy/host-on-vercel/vercel-01.png b/content/en/host-and-deploy/host-on-vercel/vercel-01.png new file mode 100644 index 0000000000000000000000000000000000000000..dd0215d0ce59f9c7491f25a35cd6e1ba4d6f2ad7 GIT binary patch literal 3601 zcmb7{c{CL48o-BYP^cvPmSl;T8T*oT?9I#f}3206uFgsN|xI4!otEV7OSkR%+SzqadGkB;2}+Rer;d)!`1rW2tn6XJ@bK{X`1r!Y!m6q&cX#(!uU@IDs%~v<;cz$x zgYo0X4^vaqd-v|WfB#-eN-8)w*vrdHOG|5NY6=E}#l*xoJ3F_vwdv{Uef|2izrWwx z+nY!v5(tFc+}yWs-#&ZxjLBp+G&H28rKzZ>$jQl-mX=yrSgftB&Ckz|jEsOlAPfd0 zBO^nn(<37zZES1|3=FEPt35qEMMOjr6BB7PT4-qK#fukRU0schjRyt>nwpvPKju9_h_dGWOS@gQ~Qx{5S~5;Ab&AC*o|f(EG`1gK)*{q14TCH*vNMH98c1m9#cmhB7c z^FM@o8a(0i$}pbGCrplXwPT?Bk`!?65gR7`Zf#3_o+3ldBZ7;|dnC?icUxvnP)?{) zO9rfex|b3@p*8XAkK6dmHL=heCZ;ze3KBrVm5)`=Ur+)s?sDAZJy%W6pL~DSLC=D}DO12G$eK)^u>)HU75lEZW|F@`2_>|4RcTG6=N+oLQGoa^eZn|>y$1}Rgwv=J^^BZ4$6 zN~QRn@cY2~4=_8VX@TvMIb7vr7oxaouMvPZcOSO>nKYV!+tvw`dL^a$)NRMNn6h-< z+MiU*l0wo`>&M8LeDwhO#S6xU5f2AEYI-Q8>hJQ@t_~my#Qky}U~B-^8a*(%$0@QZ zD17CulciQ7zJoT4YEabuaSbsSe=};!g+Zaf^{rHoEA z7-YO&yEc4YM@fG{T5?)7!uS=>{$TeVX50ua~!a}`6T>{x=R&Ko|h z-(~j6-2qPkQ zI7(h2y=r0Xg>s~OKzLnGa==F&2*YD(G%lh~*xQ#=Xki;#VIKUDu<1RSb^$|4TyA+) z3+W%yTT)p5+(nJ{%z&xCw8uA&5-etl z6o@{$Q@rhrOaitCu{Fr}u^Fen#m4(yK<7?1e{I7c6UnAqm!>`OD%TD!wH*Y>DK^B; zroRaISYmj|scfurM%S?_^Sg#E2K`I3Rvn6Bm z2L9$Cg&N<||L$9i8tvLTpsx~JO%~+xgUdb~1WNxEeLeghe-t-yxbO<5x?Gk% z*kgBlcZm`duy&?vuyip}z8ai+Y@1GhSynDtfP+E`X8^EgHpg55_yP`DX8GP(>9C|* zA+XQ$-+e!ANEB=XZ{AZBy(x5&oAv<(unhd`yLvO}$3kx3UUp!aq{rarLep+*3kXqf z=}|t3P7z~$io&n3x){BBb7xt9Vs!0Ro)o59$5`zvw=aH{c`^$86B6OH>^0GUcKUr0HB@|D3jg=9SwnB8j$zmNU8?Voq-2@z*=NZ!jG|x@t4U8D z7Nad=(!%SsNwovyn{yHpRT0g#fkAapL8Z&ep#ewhw86B3eN>`pj1G6p!i=$zOL{q0 z_s-gbKEz}489(utx3VH8K`3ZFhL;&9Q$+;s!h@L< z$4#QPquz>{x8m4!TBp!^s#HE)rMgSJc-gfa52OU%zmR+I3?Qg(sN{SEQ=z!3)7`;Os#e z6MP`O!+gSe^k$~jNkGNoWMGOvCKw!alzLc+&3S(a2r7i$**cw1ifiVXYnkle(7fNZ zHpn-zlZ2YRK>C4Hn&&N$hj0?oK-d!v}TxP2P@pSDY3+$5Ao z7nPQ)bEj2t1^0!SG@D+CRaSYvnuTSDq^%zNLlu@V*ldOU9=x`)lF7G8H4dG+4CXUZ zZ}ysMfjqzG)u~nE1z07gt2}s4ZB$r`Rtlq{Qi6YSZ+$6=SgJev%=@ueU!~|j;Hvus zMNof<_-*j+2GGnbKz$FPw1C#EK5S!XD{MBo_mtDO3NZc#Yp6dcp#i>Q8r-vo%dq+C(leFf&Glphl~+<eLgIh2hj|wMk9jQ#v>-S`^`2}dB7*6SZ#6<8^< XdmHuZ@T0Yd9}IxCIUHJV>Ye&8_XPN@ literal 0 HcmV?d00001 diff --git a/content/en/host-and-deploy/host-on-vercel/vercel-02.png b/content/en/host-and-deploy/host-on-vercel/vercel-02.png new file mode 100644 index 0000000000000000000000000000000000000000..ef3a788aebb93899116be7a70a99270a8cd49f48 GIT binary patch literal 7228 zcmbt(cQhQ%*EfO?Er{Mrl#pmawCF^%)q4%X>Sc98^iH&7qYG9SO5)uWf~fq>FH@KonfF>i>pp65D08&tY@rN>o%-Wo6}?H*bFQ?8o~I*k-I48X8WI98~8o ze1h&NDJc<~js^z@!(cGgj|*rtdSGCnV;a4+iXQ6Nv9hwdzPT$bEKEsBftD>vN=o*% zZUtC(tgNi8?_WTn(8Zl|>A*Q3A0H7Bk=>1xFVW)#Z3kLfTEE7QsjSD{a@L0zF=uCI zB_$=xbAR~x`FnbL4)@PuDtFAy%|E>FPDn_Y**F^;8%s}5H%M4o*gmVTum297Lm&_i z4h|wdGhK}vxw*OCChf<^#}N?`9v&V$J3HSxP?+uqU#bY-&x6DT5#L8)A_$ax>*uv(?&gS3D%uE#(6)`cf z`jSO?dHK7$JMVξ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∨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 BE>_1-`De8_j9;$!u`0Syp}u&1X6TD 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 literal 0 HcmV?d00001 diff --git a/content/en/host-and-deploy/host-on-vercel/vercel-05.png b/content/en/host-and-deploy/host-on-vercel/vercel-05.png new file mode 100644 index 0000000000000000000000000000000000000000..4ae341aa59b5a1606b13772ccb11e3f872dfec82 GIT binary patch literal 5822 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%0AESGv*4#}J3TMqk^z zmYgAuwFwkr7N#FyZ{T&l{Y%QJ;aY;Ll;KSR0!o*EEqD0+r02#Gf0yzZ){o&gsHfrY zVp}Snr?vtL+hv&4zCSQWt4BBQ-2c>T0+)Grabv?Kvha!ZAdW)b%S&70! zJeBIxrpvR&upDdd=A67mZo`Idh_-eD&lYz yr?aCr<}5RG5vQZN_#enh|EDbfM~vDFvW&cR=0<99=&8U)1wPbKFH?Q-_P+oC0w%!# literal 0 HcmV?d00001 diff --git a/content/en/host-and-deploy/host-on-vercel/vercel-06.png b/content/en/host-and-deploy/host-on-vercel/vercel-06.png new file mode 100644 index 0000000000000000000000000000000000000000..3b34cd44ca06363fba97ba7a07bdb0c674b1ea2c GIT binary patch literal 30267 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 literal 0 HcmV?d00001 diff --git a/content/en/host-and-deploy/host-on-vercel/vercel-07.png b/content/en/host-and-deploy/host-on-vercel/vercel-07.png new file mode 100644 index 0000000000000000000000000000000000000000..ec4355b858ac2f6b1ba1400581aeb9bbaf4680cf GIT binary patch literal 8068 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 literal 0 HcmV?d00001 diff --git a/content/en/host-and-deploy/host-on-vercel/vercel-10.png b/content/en/host-and-deploy/host-on-vercel/vercel-10.png new file mode 100644 index 0000000000000000000000000000000000000000..5fdd0aab6533ce3e2788c68b2c4b5bb705f0d2ca GIT binary patch literal 9097 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 literal 0 HcmV?d00001 From 420a78802563182ffed8ec36b7ce1b21583971e0 Mon Sep 17 00:00:00 2001 From: Joe Mooring Date: Fri, 22 Aug 2025 09:03:41 -0700 Subject: [PATCH 61/62] content: Remove 21YunBox hosting guide --- .../en/host-and-deploy/host-on-21yunbox.md | 52 ------------------- 1 file changed, 52 deletions(-) delete mode 100644 content/en/host-and-deploy/host-on-21yunbox.md diff --git a/content/en/host-and-deploy/host-on-21yunbox.md b/content/en/host-and-deploy/host-on-21yunbox.md deleted file mode 100644 index 4cfbd1143..000000000 --- a/content/en/host-and-deploy/host-on-21yunbox.md +++ /dev/null @@ -1,52 +0,0 @@ ---- -title: Host on 21YunBox -description: Host your site on 21YunBox. -categories: [] -keywords: [] -aliases: [/hosting-and-deployment/hosting-on-21yunbox/] ---- - -[21YunBox](https://www.21cloudbox.com/) is a fully-managed cloud platform dedicated to make web deployment easy within the Chinese Great Firewall where you can host static sites, backend APIs, databases, cron jobs, and all your other apps in one place. It provides blazing fast Chinese CDN, continuous deployment, one-click HTTPS and [other services like managed databases and backend web services](https://www.21cloudbox.com/docs/), providing an avenue to launch web projects in China. - -21YunBox includes the following features: - -- Continuous, automatic builds & deploys from GitHub and Gitee -- Automatic SSL certificates through [Let's Encrypt](https://letsencrypt.org) -- Instant cache invalidation with a blazing fast, Chinese CDN -- Unlimited [custom domains](https://www.21cloudbox.com/dns-configuration.html) -- Automatic [Brotli compression](https://en.wikipedia.org/wiki/Brotli) for faster sites -- Native HTTP/2 support -- Automatic HTTP → HTTPS redirects -- Custom URL redirects and rewrites - -## Prerequisites - -This guide assumes you already have a Hugo project to deploy. If you need a project, use the [Quick Start](/getting-started/quick-start/) to get started or fork 21YunBox's [Hugo Example](https://gitee.com/eryiyunbox-examples/hello-hugo) before continuing. - -## Setup - -You can set up a Hugo site on 21YunBox in two quick steps: - -1. Create a new web service on 21YunBox, and give 21YunBox permission to access your GitHub or Gitee repo. -1. Use the following values during creation: - | Field | Value | - | ----------------- | ------------------------------------------------ | - | Environment | `Static Site` | - | Build Command | `hugo --gc --minify` (or your own build command) | - | Publish Directory | `./public` (or your own output directory) | - -That's it! Your site will be live on your 21YunBox URL (which looks like `yoursite.21yunbox.com`) as soon as the build is done. - -## Continuous deploys - -Now that 21YunBox is connected to your repo, it will automatically build and publish your site any time you push to GitHub. - -Every deploy automatically and instantly invalidates the CDN cache, so your users can always access the latest content on your site. - -## Custom domains - -Add your own domains to your site easily using 21YunBox's [custom domains](https://www.21cloudbox.com/dns-configuration.html) guide. - -## Support - -You can [contact 21YunBox's experts](https://www.21cloudbox.com/contact.html) if you need help. From 71f739460f43e3e1226d3b778ccd1c20c4ca9af3 Mon Sep 17 00:00:00 2001 From: Joe Mooring Date: Fri, 22 Aug 2025 11:36:45 -0700 Subject: [PATCH 62/62] content: Reformat procedures to use description lists instead of H3 elements --- content/en/configuration/markup.md | 68 ++-- content/en/configuration/output-formats.md | 90 +++-- .../en/content-management/content-adapters.md | 188 +++++----- content/en/content-management/mathematics.md | 169 +++++---- content/en/contribute/development.md | 126 +++---- content/en/contribute/documentation.md | 77 ++-- content/en/functions/css/PostCSS.md | 59 ++- content/en/functions/css/TailwindCSS.md | 123 +++---- content/en/functions/js/Babel.md | 29 +- content/en/functions/transform/ToMath.md | 93 +++-- .../host-on-aws-amplify/index.md | 230 ++++++------ .../host-on-cloudflare/index.md | 216 ++++++----- .../{gh-pages-1.png => gh-pages-01.png} | Bin .../{gh-pages-2.png => gh-pages-02.png} | Bin .../{gh-pages-3.png => gh-pages-03.png} | Bin .../{gh-pages-4.png => gh-pages-04.png} | Bin .../{gh-pages-5.png => gh-pages-05.png} | Bin .../host-on-github-pages/index.md | 341 ++++++++---------- .../host-and-deploy/host-on-netlify/index.md | 115 +++--- .../host-and-deploy/host-on-render/index.md | 225 ++++++------ .../host-and-deploy/host-on-vercel/index.md | 219 ++++++----- 21 files changed, 1108 insertions(+), 1260 deletions(-) rename content/en/host-and-deploy/host-on-github-pages/{gh-pages-1.png => gh-pages-01.png} (100%) rename content/en/host-and-deploy/host-on-github-pages/{gh-pages-2.png => gh-pages-02.png} (100%) rename content/en/host-and-deploy/host-on-github-pages/{gh-pages-3.png => gh-pages-03.png} (100%) rename content/en/host-and-deploy/host-on-github-pages/{gh-pages-4.png => gh-pages-04.png} (100%) rename content/en/host-and-deploy/host-on-github-pages/{gh-pages-5.png => gh-pages-05.png} (100%) diff --git a/content/en/configuration/markup.md b/content/en/configuration/markup.md index ee2996b9b..bf5aac374 100644 --- a/content/en/configuration/markup.md +++ b/content/en/configuration/markup.md @@ -246,49 +246,47 @@ workingFolderCurrent Follow the steps below to enable syntax highlighting. -#### Step 1 +Step 1 +: Set the `source-highlighter` attribute in your site configuration. For example: -Set the `source-highlighter` attribute in your site configuration. For example: + {{< code-toggle file=hugo >}} + [markup.asciidocExt.attributes] + source-highlighter = 'rouge' + {{< /code-toggle >}} -{{< code-toggle file=hugo >}} -[markup.asciidocExt.attributes] -source-highlighter = 'rouge' -{{< /code-toggle >}} +Step 2 +: Generate the highlighter CSS. For example: -#### Step 2 + ```text + rougify style monokai.sublime > assets/css/syntax.css + ``` -Generate the highlighter CSS. For example: +Step 3 +: In your base template add a link to the CSS file: -```text -rougify style monokai.sublime > assets/css/syntax.css -``` + ```go-html-template {file="layouts/baseof.html"} + + ... + {{ with resources.Get "css/syntax.css" }} + + {{ end }} + ... + + ``` -#### Step 3 +Step 4 +: Add the code to be highlighted to your markup: -In your base template add a link to the CSS file: + ```text + [#hello,ruby] + ---- + require 'sinatra' -```go-html-template {file="layouts/baseof.html"} - - ... - {{ with resources.Get "css/syntax.css" }} - - {{ end }} - ... - -``` - -Then add the code to be highlighted to your markup: - -```text -[#hello,ruby] ----- -require 'sinatra' - -get '/hi' do - "Hello World!" -end ----- -``` + get '/hi' do + "Hello World!" + end + ---- + ``` ### Troubleshooting diff --git a/content/en/configuration/output-formats.md b/content/en/configuration/output-formats.md index ef91e3ede..7e80d30fb 100644 --- a/content/en/configuration/output-formats.md +++ b/content/en/configuration/output-formats.md @@ -44,25 +44,25 @@ isHTML : (`bool`) Whether to classify the output format as HTML. Hugo uses this value to determine when to create alias redirects and when to inject the LiveReload script. Default is `false`. isPlainText -: (`bool`) Whether to parse templates for this output format with Go's [text/template] package instead of the [html/template] package. Default is `false`. +: (`bool`) Whether to parse templates for this output format with Go's [text/template][] package instead of the [html/template][] package. Default is `false`. mediaType -: (`string`) The [media type](g) of the published file. This must match one of the [configured media types]. +: (`string`) The [media type](g) of the published file. This must match one of the [configured media types][]. notAlternative -: (`bool`) Whether to exclude this output format from the values returned by the [`AlternativeOutputFormats`] method on a `Page` object. Default is `false`. +: (`bool`) Whether to exclude this output format from the values returned by the [`AlternativeOutputFormats`][] method on a `Page` object. Default is `false`. noUgly -: (`bool`) Whether to disable ugly URLs for this output format when [`uglyURLs`] are enabled in your site configuration. Default is `false`. +: (`bool`) Whether to disable ugly URLs for this output format when [`uglyURLs`][] are enabled in your site configuration. Default is `false`. path -: (`string`) The first segment of the publication path for this output format. This path segment is relative to the root of your [`publishDir`]. If omitted, Hugo will use the file's original content path for publishing. +: (`string`) The first segment of the publication path for this output format. This path segment is relative to the root of your [`publishDir`][]. If omitted, Hugo will use the file's original content path for publishing. permalinkable -: (`bool`) Whether to return the rendering output format rather than main output format when invoking the [`Permalink`] and [`RelPermalink`] methods on a `Page` object. See [details](#link-to-output-formats). Enabled by default for the `html` and `amp` output formats. Default is `false`. +: (`bool`) Whether to return the rendering output format rather than main output format when invoking the [`Permalink`][] and [`RelPermalink`][] methods on a `Page` object. See [details](#link-to-output-formats). Enabled by default for the `html` and `amp` output formats. Default is `false`. protocol -: (`string`) The protocol (scheme) of the URL for this output format. For example, `https://` or `webcal://`. Default is the scheme of the [`baseURL`] parameter in your site configuration, typically `https://`. +: (`string`) The protocol (scheme) of the URL for this output format. For example, `https://` or `webcal://`. Default is the scheme of the [`baseURL`][] parameter in your site configuration, typically `https://`. rel : (`string`) If provided, you can assign this value to `rel` attributes in `link` elements when iterating over output formats in your templates. Default is `alternate`. @@ -93,56 +93,52 @@ The example above shows that when you modify a default content format, you only You can create new output formats as needed. For example, you may wish to create an output format to support Atom feeds. -### Step 1 +Step 1 +: Output formats require a specified media type. Because Atom feeds use `application/atom+xml`, which is not one of the [default media types][], you must create it first. -Output formats require a specified media type. Because Atom feeds use `application/atom+xml`, which is not one of the [default media types], you must create it first. + {{< code-toggle file=hugo >}} + [mediaTypes.'application/atom+xml'] + suffixes = ['atom'] + {{< /code-toggle >}} -{{< code-toggle file=hugo >}} -[mediaTypes.'application/atom+xml'] -suffixes = ['atom'] -{{< /code-toggle >}} + See [configure media types][] for more information. -See [configure media types] for more information. +Step 2 +: Create a new output format: -### Step 2 + {{< code-toggle file=hugo >}} + [outputFormats.atom] + mediaType = 'application/atom+xml' + noUgly = true + {{< /code-toggle >}} -Create a new output format: + Note that we use the default settings for all other output format properties. -{{< code-toggle file=hugo >}} -[outputFormats.atom] -mediaType = 'application/atom+xml' -noUgly = true -{{< /code-toggle >}} +Step 3 +: Specify the page [kinds](g) for which to render this output format: -Note that we use the default settings for all other output format properties. + {{< code-toggle file=hugo >}} + [outputs] + home = ['html', 'rss', 'atom'] + section = ['html', 'rss', 'atom'] + taxonomy = ['html', 'rss', 'atom'] + term = ['html', 'rss', 'atom'] + {{< /code-toggle >}} -### Step 3 + See [configure outputs][] for more information. -Specify the page [kinds](g) for which to render this output format: +Step 4 +: Create a template to render the output format. Since Atom feeds are lists, you need to create a list template. Consult the [template lookup order] to find the correct template path: -{{< code-toggle file=hugo >}} -[outputs] -home = ['html', 'rss', 'atom'] -section = ['html', 'rss', 'atom'] -taxonomy = ['html', 'rss', 'atom'] -term = ['html', 'rss', 'atom'] -{{< /code-toggle >}} + ```text + layouts/list.atom.atom + ``` -See [configure outputs] for more information. - -### Step 4 - -Create a template to render the output format. Since Atom feeds are lists, you need to create a list template. Consult the [template lookup order] to find the correct template path: - -```text -layouts/list.atom.atom -``` - -We leave writing the template code as an exercise for you. Aim for a result similar to the [embedded RSS template]. + We leave writing the template code as an exercise for you. Aim for a result similar to the [embedded RSS template][]. ## List output formats -To access output formats, each `Page` object provides two methods: [`OutputFormats`] (for all formats, including the current one) and [`AlternativeOutputFormats`]. Use `AlternativeOutputFormats` to create a link `rel` list within your site's `head` element, as shown below: +To access output formats, each `Page` object provides two methods: [`OutputFormats`][] (for all formats, including the current one) and [`AlternativeOutputFormats`][]. Use `AlternativeOutputFormats` to create a link `rel` list within your site's `head` element, as shown below: ```go-html-template {{ range .AlternativeOutputFormats }} @@ -152,7 +148,7 @@ To access output formats, each `Page` object provides two methods: [`OutputForma ## Link to output formats -By default, a `Page` object's [`Permalink`] and [`RelPermalink`] methods return the URL of the [primary output format](g), typically `html`. This behavior remains consistent regardless of the template used. +By default, a `Page` object's [`Permalink`][] and [`RelPermalink`][] methods return the URL of the [primary output format](g), typically `html`. This behavior remains consistent regardless of the template used. For example, in `page.json.json`, you'll see: @@ -163,7 +159,7 @@ For example, in `page.json.json`, you'll see: {{ end }} ``` -To make these methods return the URL of the _current_ template's output format, you must set the [`permalinkable`] setting to `true` for that format. +To make these methods return the URL of the _current_ template's output format, you must set the [`permalinkable`][] setting to `true` for that format. With `permalinkable` set to true for `json` in the same `page.json.json` template: @@ -176,7 +172,7 @@ With `permalinkable` set to true for `json` in the same `page.json.json` templat ## Template lookup order -Each output format requires a template conforming to the [template lookup order]. +Each output format requires a template conforming to the [template lookup order][]. For the highest specificity in the template lookup order, include the page kind, output format, and suffix in the file name: @@ -204,7 +200,7 @@ Output format|Template path [configure outputs]: /configuration/outputs/ [configured media types]: /configuration/media-types/ [default media types]: /configuration/media-types/ -[embedded RSS template]: {{% eturl rss %}} +[embedded RSS template]: <{{% eturl rss %}}> [html/template]: https://pkg.go.dev/html/template [template lookup order]: /templates/lookup-order/ [text/template]: https://pkg.go.dev/text/template diff --git a/content/en/content-management/content-adapters.md b/content/en/content-management/content-adapters.md index e2f567ce8..9eae86266 100644 --- a/content/en/content-management/content-adapters.md +++ b/content/en/content-management/content-adapters.md @@ -161,113 +161,109 @@ Key|Description|Required Create pages from remote data, where each page represents a book review. -### Step 1 +Step 1 +: Create the content structure. -Create the content structure. + ```text + content/ + └── books/ + ├── _content.gotmpl <-- content adapter + └── _index.md + ``` -```text -content/ -└── books/ - ├── _content.gotmpl <-- content adapter - └── _index.md -``` +Step 2 +: Inspect the remote data to determine how to map key-value pairs to front matter fields.\ + -### Step 2 +Step 3 +: Create the content adapter. -Inspect the remote data to determine how to map key-value pairs to front matter fields.\ - - -### Step 3 - -Create the content adapter. - -```go-html-template {file="content/books/_content.gotmpl" copy=true} -{{/* Get remote data. */}} -{{ $data := dict }} -{{ $url := "https://gohugo.io/shared/examples/data/books.json" }} -{{ with try (resources.GetRemote $url) }} - {{ with .Err }} - {{ errorf "Unable to get remote resource %s: %s" $url . }} - {{ else with .Value }} - {{ $data = . | transform.Unmarshal }} - {{ else }} - {{ errorf "Unable to get remote resource %s" $url }} - {{ end }} -{{ end }} - -{{/* Add pages and page resources. */}} -{{ range $data }} - - {{/* Add page. */}} - {{ $content := dict "mediaType" "text/markdown" "value" .summary }} - {{ $dates := dict "date" (time.AsTime .date) }} - {{ $params := dict "author" .author "isbn" .isbn "rating" .rating "tags" .tags }} - {{ $page := dict - "content" $content - "dates" $dates - "kind" "page" - "params" $params - "path" .title - "title" .title - }} - {{ $.AddPage $page }} - - {{/* Add page resource. */}} - {{ $item := . }} - {{ with $url := $item.cover }} - {{ with try (resources.GetRemote $url) }} - {{ with .Err }} - {{ errorf "Unable to get remote resource %s: %s" $url . }} - {{ else with .Value }} - {{ $content := dict "mediaType" .MediaType.Type "value" .Content }} - {{ $params := dict "alt" $item.title }} - {{ $resource := dict - "content" $content - "params" $params - "path" (printf "%s/cover.%s" $item.title .MediaType.SubType) - }} - {{ $.AddResource $resource }} - {{ else }} - {{ errorf "Unable to get remote resource %s" $url }} - {{ end }} + ```go-html-template {file="content/books/_content.gotmpl" copy=true} + {{/* Get remote data. */}} + {{ $data := dict }} + {{ $url := "https://gohugo.io/shared/examples/data/books.json" }} + {{ with try (resources.GetRemote $url) }} + {{ with .Err }} + {{ errorf "Unable to get remote resource %s: %s" $url . }} + {{ else with .Value }} + {{ $data = . | transform.Unmarshal }} + {{ else }} + {{ errorf "Unable to get remote resource %s" $url }} {{ end }} {{ end }} -{{ end }} -``` + {{/* Add pages and page resources. */}} + {{ range $data }} -### Step 4 + {{/* Add page. */}} + {{ $content := dict "mediaType" "text/markdown" "value" .summary }} + {{ $dates := dict "date" (time.AsTime .date) }} + {{ $params := dict "author" .author "isbn" .isbn "rating" .rating "tags" .tags }} + {{ $page := dict + "content" $content + "dates" $dates + "kind" "page" + "params" $params + "path" .title + "title" .title + }} + {{ $.AddPage $page }} -Create a _page_ template to render each book review. - -```go-html-template {file="layouts/books/page.html" copy=true} -{{ define "main" }} -

{{ .Title }}

- - {{ with .Resources.GetMatch "cover.*" }} - {{ .Params.alt }} - {{ end }} - -

Author: {{ .Params.author }}

- -

- ISBN: {{ .Params.isbn }}
- Rating: {{ .Params.rating }}
- Review date: {{ .Date | time.Format ":date_long" }} -

- - {{ with .GetTerms "tags" }} -

Tags:

-
- {{ end }} + {{ end }} - {{ .Content }} -{{ end }} -``` + {{ end }} + ``` + +Step 4 +: Create a _page_ template to render each book review. + + ```go-html-template {file="layouts/books/page.html" copy=true} + {{ define "main" }} +

{{ .Title }}

+ + {{ with .Resources.GetMatch "cover.*" }} + {{ .Params.alt }} + {{ end }} + +

Author: {{ .Params.author }}

+ +

+ ISBN: {{ .Params.isbn }}
+ Rating: {{ .Params.rating }}
+ Review date: {{ .Date | time.Format ":date_long" }} +

+ + {{ with .GetTerms "tags" }} +

Tags:

+ + {{ end }} + + {{ .Content }} + {{ end }} + ``` ## Multilingual sites diff --git a/content/en/content-management/mathematics.md b/content/en/content-management/mathematics.md index 0dbe4ef25..aaa8c2394 100644 --- a/content/en/content-management/mathematics.md +++ b/content/en/content-management/mathematics.md @@ -45,117 +45,114 @@ Whether an equation or expression appears inline, or as a block, depends on the Follow these instructions to include mathematical equations and expressions in your Markdown using LaTeX markup. -### Step 1 +Step 1 +: Enable and configure the Goldmark [passthrough extension] in your site configuration. The passthrough extension preserves raw Markdown within delimited snippets of text, including the delimiters themselves. -Enable and configure the Goldmark [passthrough extension] in your site configuration. The passthrough extension preserves raw Markdown within delimited snippets of text, including the delimiters themselves. + {{< code-toggle file=hugo copy=true >}} + [markup.goldmark.extensions.passthrough] + enable = true -{{< code-toggle file=hugo copy=true >}} -[markup.goldmark.extensions.passthrough] -enable = true + [markup.goldmark.extensions.passthrough.delimiters] + block = [['\[', '\]'], ['$$', '$$']] + inline = [['\(', '\)']] -[markup.goldmark.extensions.passthrough.delimiters] -block = [['\[', '\]'], ['$$', '$$']] -inline = [['\(', '\)']] + [params] + math = true + {{< /code-toggle >}} -[params] -math = true -{{< /code-toggle >}} + The configuration above enables mathematical rendering on every page unless you set the `math` parameter to `false` in front matter. To enable mathematical rendering as needed, set the `math` parameter to `false` in your site configuration, and set the `math` parameter to `true` in front matter. Use this parameter in your base template as shown in [Step 3](#step-3). -The configuration above enables mathematical rendering on every page unless you set the `math` parameter to `false` in front matter. To enable mathematical rendering as needed, set the `math` parameter to `false` in your site configuration, and set the `math` parameter to `true` in front matter. Use this parameter in your base template as shown in [Step 3]. + > [!note] + > The configuration above precludes the use of the `$...$` delimiter pair for inline equations. Although you can add this delimiter pair to the configuration and JavaScript, you must double-escape the `$` symbol when used outside of math contexts to avoid unintended formatting. + > + > See the [inline delimiters](#inline-delimiters) section for details. -> [!note] -> The configuration above precludes the use of the `$...$` delimiter pair for inline equations. Although you can add this delimiter pair to the configuration and JavaScript, you must double-escape the `$` symbol when used outside of math contexts to avoid unintended formatting. -> -> See the [inline delimiters](#inline-delimiters) section for details. + To disable passthrough of inline snippets, omit the `inline` key from the configuration: -To disable passthrough of inline snippets, omit the `inline` key from the configuration: + {{< code-toggle file=hugo >}} + [markup.goldmark.extensions.passthrough.delimiters] + block = [['\[', '\]'], ['$$', '$$']] + {{< /code-toggle >}} -{{< code-toggle file=hugo >}} -[markup.goldmark.extensions.passthrough.delimiters] -block = [['\[', '\]'], ['$$', '$$']] -{{< /code-toggle >}} + You can define your own opening and closing delimiters, provided they match the delimiters that you set in [Step 2]. -You can define your own opening and closing delimiters, provided they match the delimiters that you set in [Step 2]. + {{< code-toggle file=hugo >}} + [markup.goldmark.extensions.passthrough.delimiters] + block = [['@@', '@@']] + inline = [['@', '@']] + {{< /code-toggle >}} -{{< code-toggle file=hugo >}} -[markup.goldmark.extensions.passthrough.delimiters] -block = [['@@', '@@']] -inline = [['@', '@']] -{{< /code-toggle >}} +Step 2 +: Create a _partial_ template to load MathJax or KaTeX. The example below loads MathJax, or you can use KaTeX as described in the [engines](#engines) section. -### Step 2 + ```go-html-template {file="layouts/_partials/math.html" copy=true} + + + ``` -Create a _partial_ template to load MathJax or KaTeX. The example below loads MathJax, or you can use KaTeX as described in the [engines](#engines) section. + The delimiters above must match the delimiters in your site configuration. -```go-html-template {file="layouts/_partials/math.html" copy=true} - - -``` +Step 3 +: Conditionally call the _partial_ template from the base template. -The delimiters above must match the delimiters in your site configuration. + ```go-html-template {file="layouts/baseof.html"} + + ... + {{ if .Param "math" }} + {{ partialCached "math.html" . }} + {{ end }} + ... + + ``` -### Step 3 + The example above loads the _partial_ template if you have set the `math` parameter in front matter to `true`. If you have not set the `math` parameter in front matter, the conditional statement falls back to the `math` parameter in your site configuration. -Conditionally call the _partial_ template from the base template. +Step 4 +: If you set the `math` parameter to `false` in your site configuration, you must set the `math` parameter to `true` in front matter. For example: -```go-html-template {file="layouts/baseof.html"} - - ... - {{ if .Param "math" }} - {{ partialCached "math.html" . }} - {{ end }} - ... - -``` + {{< code-toggle file=content/math-examples.md fm=true >}} + title = 'Math examples' + date = 2024-01-24T18:09:49-08:00 + [params] + math = true + {{< /code-toggle >}} -The example above loads the _partial_ template if you have set the `math` parameter in front matter to `true`. If you have not set the `math` parameter in front matter, the conditional statement falls back to the `math` parameter in your site configuration. +Step 5 +: Include mathematical equations and expressions in Markdown using LaTeX markup. -### Step 4 + ```text {file="content/math-examples.md" copy=true} + This is an inline \(a^*=x-b^*\) equation. -Include mathematical equations and expressions in Markdown using LaTeX markup. + These are block equations: -```text {file="content/math-examples.md" copy=true} -This is an inline \(a^*=x-b^*\) equation. + \[a^*=x-b^*\] -These are block equations: + \[ a^*=x-b^* \] -\[a^*=x-b^*\] + \[ + a^*=x-b^* + \] -\[ a^*=x-b^* \] + These are also block equations: -\[ -a^*=x-b^* -\] + $$a^*=x-b^*$$ -These are also block equations: + $$ a^*=x-b^* $$ -$$a^*=x-b^*$$ - -$$ a^*=x-b^* $$ - -$$ -a^*=x-b^* -$$ -``` - -If you set the `math` parameter to `false` in your site configuration, you must set the `math` parameter to `true` in front matter. For example: - -{{< code-toggle file=content/math-examples.md fm=true >}} -title = 'Math examples' -date = 2024-01-24T18:09:49-08:00 -[params] -math = true -{{< /code-toggle >}} + $$ + a^*=x-b^* + $$ + ``` ## Inline delimiters @@ -227,12 +224,10 @@ $$C_p[\ce{H2O(l)}] = \pu{75.3 J // mol K}$$ $$C_p[\ce{H2O(l)}] = \pu{75.3 J // mol K}$$ -As shown in [Step 2] above, MathJax supports chemical equations without additional configuration. To add chemistry support to KaTeX, enable the mhchem extension as described in the KaTeX [documentation](https://katex.org/docs/libs). +As shown in [Step 2](#step-2) above, MathJax supports chemical equations without additional configuration. To add chemistry support to KaTeX, enable the mhchem extension as described in the KaTeX [documentation](https://katex.org/docs/libs). [`transform.ToMath`]: /functions/transform/tomath/ [KaTeX]: https://katex.org/ [LaTeX]: https://www.latex-project.org/ [MathJax]: https://www.mathjax.org/ [passthrough extension]: /configuration/markup/#passthrough -[Step 2]: #step-2 -[Step 3]: #step-3 diff --git a/content/en/contribute/development.md b/content/en/contribute/development.md index fdbe4e4c2..5930fbf52 100644 --- a/content/en/contribute/development.md +++ b/content/en/contribute/development.md @@ -46,99 +46,89 @@ To build the extended or extended/deploy edition from source you must: Use this workflow to create and submit pull requests. -### Step 1 +Step 1 +: Fork the [project repository]. -Fork the [project repository]. +Step 2 +: Clone your fork. -### Step 2 +Step 3 +: Create a new branch with a descriptive name that includes the corresponding issue number. -Clone your fork. + For a new feature: -### Step 3 + ```sh + git checkout -b feat/implement-some-feature-99999 + ``` -Create a new branch with a descriptive name that includes the corresponding issue number. + For a bug fix: -For a new feature: + ```sh + git checkout -b fix/fix-some-bug-99999 + ``` -```sh -git checkout -b feat/implement-some-feature-99999 -``` +Step 4 +: Make changes. -For a bug fix: +Step 5 +: Compile and install. -```sh -git checkout -b fix/fix-some-bug-99999 -``` + To compile and install the standard edition: -### Step 4 + ```text + go install + ``` -Make changes. + To compile and install the extended edition: -### Step 5 + ```text + CGO_ENABLED=1 go install -tags extended + ``` -Compile and install. + To compile and install the extended/deploy edition: -To compile and install the standard edition: + ```text + CGO_ENABLED=1 go install -tags extended,withdeploy + ``` -```text -go install -``` +Step 6 +: Test your changes: -To compile and install the extended edition: + ```text + go test ./... + ``` -```text -CGO_ENABLED=1 go install -tags extended -``` +Step 7 +: Commit your changes with a descriptive commit message: -To compile and install the extended/deploy edition: + - Provide a summary on the first line, typically 50 characters or less, followed by a blank line. + - Begin the summary with one of content, theme, config, all, or misc, followed by a colon, a space, and a brief description of the change beginning with a capital letter + - Use imperative present tense + - See the [commit message guidelines] for requirements + - Optionally, provide a detailed description where each line is 72 characters or less, followed by a blank line. + - Add one or more "Fixes" or "Closes" keywords, each on its own line, referencing the [issues] addressed by this change. -```text -CGO_ENABLED=1 go install -tags extended,withdeploy -``` + For example: -### Step 6 + ```sh + git commit -m "tpl/strings: Create wrap function -Test your changes: + The strings.Wrap function wraps a string into one or more lines, + splitting the string after the given number of characters, but not + splitting in the middle of a word. -```text -go test ./... -``` + Fixes #99998 + Closes #99999" + ``` -### Step 7 +Step 8 +: Push the new branch to your fork of the documentation repository. -Commit your changes with a descriptive commit message: +Step 9 +: Visit the [project repository] and create a pull request (PR). -- Provide a summary on the first line, typically 50 characters or less, followed by a blank line. - - Begin the summary with one of content, theme, config, all, or misc, followed by a colon, a space, and a brief description of the change beginning with a capital letter - - Use imperative present tense - - See the [commit message guidelines] for requirements -- Optionally, provide a detailed description where each line is 72 characters or less, followed by a blank line. -- Add one or more "Fixes" or "Closes" keywords, each on its own line, referencing the [issues] addressed by this change. - -For example: - -```sh -git commit -m "tpl/strings: Create wrap function - -The strings.Wrap function wraps a string into one or more lines, -splitting the string after the given number of characters, but not -splitting in the middle of a word. - -Fixes #99998 -Closes #99999" -``` - -### Step 8 - -Push the new branch to your fork of the documentation repository. - -### Step 9 - -Visit the [project repository] and create a pull request (PR). - -### Step 10 - -A project maintainer will review your PR and may request changes. You may delete your branch after the maintainer merges your PR. +Step 10 +: A project maintainer will review your PR and may request changes. You may delete your branch after the maintainer merges your PR. ## Building from source diff --git a/content/en/contribute/documentation.md b/content/en/contribute/documentation.md index 289e59cdd..2ce2db169 100644 --- a/content/en/contribute/documentation.md +++ b/content/en/contribute/documentation.md @@ -471,63 +471,54 @@ Set the `expiryDate` to two years from the date of deprecation, and add a brief Use this workflow to create and submit pull requests. -### Step 1 +Step 1 +: Fork the [documentation repository]. -Fork the [documentation repository]. +Step 2 +: Clone your fork. -### Step 2 +Step 3 +: Create a new branch with a descriptive name that includes the corresponding issue number, if any: -Clone your fork. + ```sh + git checkout -b restructure-foo-page-99999 + ``` -### Step 3 +Step 4 +: Make changes. -Create a new branch with a descriptive name that includes the corresponding issue number, if any: +Step 5 +: Build the site locally to preview your changes. -```sh -git checkout -b restructure-foo-page-99999 -``` +Step 6 +: Commit your changes with a descriptive commit message: -### Step 4 + - Provide a summary on the first line, typically 50 characters or less, followed by a blank line. + - Begin the summary with one of `content`, `theme`, `config`, `all`, or `misc`, followed by a colon, a space, and a brief description of the change beginning with a capital letter + - Use imperative present tense + - Optionally, provide a detailed description where each line is 72 characters or less, followed by a blank line. + - Optionally, add one or more "Fixes" or "Closes" keywords, each on its own line, referencing the [issues] addressed by this change. -Make changes. + For example: -### Step 5 + ```text + git commit -m "content: Restructure the taxonomy page -Build the site locally to preview your changes. + This restructures the taxonomy page by splitting topics into logical + sections, each with one or more examples. -### Step 6 + Fixes #9999 + Closes #9998" + ``` -Commit your changes with a descriptive commit message: +Step 7 +: Push the new branch to your fork of the documentation repository. -- Provide a summary on the first line, typically 50 characters or less, followed by a blank line. - - Begin the summary with one of `content`, `theme`, `config`, `all`, or `misc`, followed by a colon, a space, and a brief description of the change beginning with a capital letter - - Use imperative present tense -- Optionally, provide a detailed description where each line is 72 characters or less, followed by a blank line. -- Optionally, add one or more "Fixes" or "Closes" keywords, each on its own line, referencing the [issues] addressed by this change. +Step 8 +: Visit the [documentation repository] and create a pull request (PR). -For example: - -```text -git commit -m "content: Restructure the taxonomy page - -This restructures the taxonomy page by splitting topics into logical -sections, each with one or more examples. - -Fixes #9999 -Closes #9998" -``` - -### Step 7 - -Push the new branch to your fork of the documentation repository. - -### Step 8 - -Visit the [documentation repository] and create a pull request (PR). - -### Step 9 - -A project maintainer will review your PR and may request changes. You may delete your branch after the maintainer merges your PR. +Step 9 +: A project maintainer will review your PR and may request changes. You may delete your branch after the maintainer merges your PR. [ATX]: https://spec.commonmark.org/current/#atx-headings [basic english]: https://simple.wikipedia.org/wiki/Basic_English diff --git a/content/en/functions/css/PostCSS.md b/content/en/functions/css/PostCSS.md index 9cc698248..4dce705be 100644 --- a/content/en/functions/css/PostCSS.md +++ b/content/en/functions/css/PostCSS.md @@ -22,46 +22,41 @@ params: Follow the steps below to transform CSS using any of the available [PostCSS plugins]. -### Step 1 +Step 1 +: Install [Node.js]. -Install [Node.js]. +Step 2 +: Install the required Node.js packages in the root of your project. For example, to add vendor prefixes to your CSS rules: -### Step 2 + ```sh + npm i -D postcss postcss-cli autoprefixer + ``` -Install the required Node.js packages in the root of your project. For example, to add vendor prefixes to your CSS rules: +Step 3 +: Create a PostCSS configuration file in the root of your project. -```sh -npm i -D postcss postcss-cli autoprefixer -``` + ```js {file="postcss.config.js"} + module.exports = { + plugins: [ + require('autoprefixer') + ] + }; + ``` -### Step 3 + > [!note] + > If you are a Windows user, and the path to your project contains a space, you must place the PostCSS configuration within the package.json file. See [this example] and issue [#7333]. -Create a PostCSS configuration file in the root of your project. +Step 4 +: Place your CSS file within the `assets/css` directory. -```js {file="postcss.config.js"} -module.exports = { - plugins: [ - require('autoprefixer') - ] -}; -``` +Step 5 +: Process the resource with PostCSS: -> [!note] -> If you are a Windows user, and the path to your project contains a space, you must place the PostCSS configuration within the package.json file. See [this example] and issue [#7333]. - -### Step 4 - -Place your CSS file within the `assets/css` directory. - -### Step 5 - -Process the resource with PostCSS: - -```go-html-template -{{ with resources.Get "css/main.css" | postCSS }} - -{{ end }} -``` + ```go-html-template + {{ with resources.Get "css/main.css" | postCSS }} + + {{ end }} + ``` ## Options diff --git a/content/en/functions/css/TailwindCSS.md b/content/en/functions/css/TailwindCSS.md index f9ac90316..e8514679b 100644 --- a/content/en/functions/css/TailwindCSS.md +++ b/content/en/functions/css/TailwindCSS.md @@ -25,85 +25,80 @@ Use the `css.TailwindCSS` function to process your Tailwind CSS files. This func ## Setup -### Step 1 +Step 1 +: Install the Tailwind CSS CLI v4.0 or later: -Install the Tailwind CSS CLI v4.0 or later: + ```sh {copy=true} + npm install --save-dev tailwindcss @tailwindcss/cli + ``` -```sh {copy=true} -npm install --save-dev tailwindcss @tailwindcss/cli -``` + The Tailwind CSS CLI is also available as a [standalone executable]. You must install it outside of your project directory and ensure its path is included in your system's `PATH` environment variable. -The Tailwind CSS CLI is also available as a [standalone executable]. You must install it outside of your project directory and ensure its path is included in your system's `PATH` environment variable. + [standalone executable]: https://github.com/tailwindlabs/tailwindcss/releases/latest -[standalone executable]: https://github.com/tailwindlabs/tailwindcss/releases/latest +Step 2 +: Add this to your site configuration: -### Step 2 + {{< code-toggle file=hugo copy=true >}} + [build] + [build.buildStats] + enable = true + [[build.cachebusters]] + source = 'assets/notwatching/hugo_stats\.json' + target = 'css' + [[build.cachebusters]] + source = '(postcss|tailwind)\.config\.js' + target = 'css' + [module] + [[module.mounts]] + source = 'assets' + target = 'assets' + [[module.mounts]] + disableWatch = true + source = 'hugo_stats.json' + target = 'assets/notwatching/hugo_stats.json' + {{< /code-toggle >}} -Add this to your site configuration: +Step 3 +: Create a CSS entry file: -{{< code-toggle file=hugo copy=true >}} -[build] - [build.buildStats] - enable = true - [[build.cachebusters]] - source = 'assets/notwatching/hugo_stats\.json' - target = 'css' - [[build.cachebusters]] - source = '(postcss|tailwind)\.config\.js' - target = 'css' -[module] - [[module.mounts]] - source = 'assets' - target = 'assets' - [[module.mounts]] - disableWatch = true - source = 'hugo_stats.json' - target = 'assets/notwatching/hugo_stats.json' -{{< /code-toggle >}} + ```css {file="assets/css/main.css" copy=true} + @import "tailwindcss"; + @source "hugo_stats.json"; + ``` -### Step 3 + Tailwind CSS respects `.gitignore` files. This means that if `hugo_stats.json` is listed in your `.gitignore` file, Tailwind CSS will ignore it. To make `hugo_stats.json` available to Tailwind CSS you must explicitly source it as shown in the example above. -Create a CSS entry file: +Step 4 +: Create a _partial_ template to process the CSS with the Tailwind CSS CLI: -```css {file="assets/css/main.css" copy=true} -@import "tailwindcss"; -@source "hugo_stats.json"; -``` - -Tailwind CSS respects `.gitignore` files. This means that if `hugo_stats.json` is listed in your `.gitignore` file, Tailwind CSS will ignore it. To make `hugo_stats.json` available to Tailwind CSS you must explicitly source it as shown in the example above. - -### Step 4 - -Create a _partial_ template to process the CSS with the Tailwind CSS CLI: - -```go-html-template {file="layouts/_partials/css.html" copy=true} -{{ with resources.Get "css/main.css" }} - {{ $opts := dict "minify" (not hugo.IsDevelopment) }} - {{ with . | css.TailwindCSS $opts }} - {{ if hugo.IsDevelopment }} - - {{ else }} - {{ with . | fingerprint }} - + ```go-html-template {file="layouts/_partials/css.html" copy=true} + {{ with resources.Get "css/main.css" }} + {{ $opts := dict "minify" (not hugo.IsDevelopment) }} + {{ with . | css.TailwindCSS $opts }} + {{ if hugo.IsDevelopment }} + + {{ else }} + {{ with . | fingerprint }} + + {{ end }} {{ end }} {{ end }} {{ end }} -{{ end }} -``` + ``` -### Step 5 +Step 5 +: Call the _partial_ template from your base template, deferring template execution until after all sites and output formats have been rendered: -Call the _partial_ template from your base template, deferring template execution until after all sites and output formats have been rendered: - -```go-html-template {file="layouts/baseof.html" copy=true} - - ... - {{ with (templates.Defer (dict "key" "global")) }} - {{ partial "css.html" . }} - {{ end }} - ... - -``` + ```go-html-template {file="layouts/baseof.html" copy=true} + + ... + {{ with (templates.Defer (dict "key" "global")) }} + {{ partial "css.html" . }} + {{ end }} + ... + + ``` ## Options diff --git a/content/en/functions/js/Babel.md b/content/en/functions/js/Babel.md index d0007aaa0..488c80503 100644 --- a/content/en/functions/js/Babel.md +++ b/content/en/functions/js/Babel.md @@ -31,26 +31,23 @@ params: ## Setup -### Step 1 +Step 1 +: Install [Node.js](https://nodejs.org/en/download) -Install [Node.js](https://nodejs.org/en/download) +Step 2 +: Install the required Node.js packages in the root of your project. -### Step 2 + ```sh + npm install --save-dev @babel/core @babel/cli + ``` -Install the required Node.js packages in the root of your project. +Step 3 +: Add the babel executable to Hugo's `security.exec.allow` list in your site configuration: -```sh -npm install --save-dev @babel/core @babel/cli -``` - -### Step 3 - -Add the babel executable to Hugo's `security.exec.allow` list in your site configuration: - -{{< code-toggle file=hugo >}} -[security.exec] - allow = ['^(dart-)?sass(-embedded)?$', '^go$', '^npx$', '^postcss$', '^babel$'] -{{< /code-toggle >}} + {{< code-toggle file=hugo >}} + [security.exec] + allow = ['^(dart-)?sass(-embedded)?$', '^go$', '^npx$', '^postcss$', '^babel$'] + {{< /code-toggle >}} ## Configuration diff --git a/content/en/functions/transform/ToMath.md b/content/en/functions/transform/ToMath.md index 3a54e65d3..be62e8bce 100644 --- a/content/en/functions/transform/ToMath.md +++ b/content/en/functions/transform/ToMath.md @@ -92,70 +92,65 @@ The example below demonstrates error handing within a template. Instead of client-side JavaScript rendering of mathematical markup using MathJax or KaTeX, create a passthrough render hook which calls the `transform.ToMath` function. -### Step 1 - -Enable and configure the Goldmark [passthrough extension] in your site configuration. The passthrough extension preserves raw Markdown within delimited snippets of text, including the delimiters themselves. +Step 1 +: Enable and configure the Goldmark [passthrough extension][] in your site configuration. The passthrough extension preserves raw Markdown within delimited snippets of text, including the delimiters themselves. [passthrough extension]: /configuration/markup/#passthrough -{{< code-toggle file=hugo copy=true >}} -[markup.goldmark.extensions.passthrough] -enable = true + {{< code-toggle file=hugo copy=true >}} + [markup.goldmark.extensions.passthrough] + enable = true + [markup.goldmark.extensions.passthrough.delimiters] + block = [['\[', '\]'], ['$$', '$$']] + inline = [['\(', '\)']] + {{< /code-toggle >}} -[markup.goldmark.extensions.passthrough.delimiters] -block = [['\[', '\]'], ['$$', '$$']] -inline = [['\(', '\)']] -{{< /code-toggle >}} + > [!note] + > The configuration above precludes the use of the `$...$` delimiter pair for inline equations. Although you can add this delimiter pair to the configuration, you must double-escape the `$` symbol when used outside of math contexts to avoid unintended formatting. -> [!note] -> The configuration above precludes the use of the `$...$` delimiter pair for inline equations. Although you can add this delimiter pair to the configuration, you must double-escape the `$` symbol when used outside of math contexts to avoid unintended formatting. - -### Step 2 - -Create a [passthrough render hook] to capture and render the LaTeX markup. +Step 2 +: Create a [passthrough render hook][] to capture and render the LaTeX markup.4 [passthrough render hook]: /render-hooks/passthrough/ -```go-html-template {file="layouts/_markup/render-passthrough.html" copy=true} -{{- $opts := dict "output" "htmlAndMathml" "displayMode" (eq .Type "block") }} -{{- with try (transform.ToMath .Inner $opts) }} - {{- with .Err }} - {{- errorf "Unable to render mathematical markup to HTML using the transform.ToMath function. The KaTeX display engine threw the following error: %s: see %s." . $.Position }} - {{- else }} - {{- .Value }} - {{- $.Page.Store.Set "hasMath" true }} - {{- end }} -{{- end -}} -``` + ```go-html-template {file="layouts/_markup/render-passthrough.html" copy=true} + {{- $opts := dict "output" "htmlAndMathml" "displayMode" (eq .Type "block") }} + {{- with try (transform.ToMath .Inner $opts) }} + {{- with .Err }} + {{- errorf "Unable to render mathematical markup to HTML using the transform.ToMath function. The KaTeX display engine threw the following error: %s: see %s." . $.Position }} + {{- else }} + {{- .Value }} + {{- $.Page.Store.Set "hasMath" true }} + {{- end }} + {{- end -}} + ``` + +Step 3 +: In your base template, conditionally include the KaTeX CSS within the head element. -### Step 3 + ```go-html-template {file="layouts/baseof.html" copy=true} + + {{ $noop := .WordCount }} + {{ if .Page.Store.Get "hasMath" }} + + {{ end }} + + ``` -In your base template, conditionally include the KaTeX CSS within the head element. + In the above, note the use of a [noop](g) statement to force content rendering before we check the value of `hasMath` with the `Store.Get` method. -```go-html-template {file="layouts/baseof.html" copy=true} - - {{ $noop := .WordCount }} - {{ if .Page.Store.Get "hasMath" }} - - {{ end }} - -``` +Step 4 +: Add some mathematical markup to your content, then test. -In the above, note the use of a [noop](g) statement to force content rendering before we check the value of `hasMath` with the `Store.Get` method. + ```text {file="content/example.md"} + This is an inline \(a^*=x-b^*\) equation. -### Step 4 + These are block equations: -Add some mathematical markup to your content, then test. + \[a^*=x-b^*\] -```text {file="content/example.md"} -This is an inline \(a^*=x-b^*\) equation. - -These are block equations: - -\[a^*=x-b^*\] - -$$a^*=x-b^*$$ -``` + $$a^*=x-b^*$$ + ``` ## Chemistry diff --git a/content/en/host-and-deploy/host-on-aws-amplify/index.md b/content/en/host-and-deploy/host-on-aws-amplify/index.md index a6d3b7419..4fd71f3f9 100644 --- a/content/en/host-and-deploy/host-on-aws-amplify/index.md +++ b/content/en/host-and-deploy/host-on-aws-amplify/index.md @@ -6,166 +6,152 @@ keywords: [] aliases: [/hosting-and-deployment/hosting-on-aws-amplify/] --- +Use these instructions to enable continuous deployment from a GitHub repository. The same general steps apply if you are using GitLab for version control. + ## Prerequisites Please complete the following tasks before continuing: -1. [Create an AWS account] -1. [Install Git] -1. [Create a Hugo site] and test it locally with `hugo server` -1. Commit the changes to your local repository -1. Push the local repository to your [GitHub], [GitLab], or [Bitbucket] account - -[Bitbucket]: https://bitbucket.org/product -[Create a Hugo site]: /getting-started/quick-start/ -[Create an AWS account]: https://aws.amazon.com/resources/create-account/ -[GitHub]: https://github.com -[GitLab]: https://about.gitlab.com/ -[Install Git]: https://git-scm.com/book/en/v2/Getting-Started-Installing-Git +1. [Create](https://aws.amazon.com/resources/create-account/) an AWS account +1. [Log in](https://console.aws.amazon.com/) to your AWS account +1. [Create](https://github.com/signup) a GitHub account +1. [Log in](https://github.com/login) to your GitHub account +1. [Create](https://github.com/new) a GitHub repository for your project +1. [Create](https://git-scm.com/docs/git-init) a local Git repository for your project with a [remote](https://git-scm.com/docs/git-remote) reference to your GitHub repository +1. Create a Hugo site within your local Git repository and test it with the `hugo server` command +1. Commit the changes to your local Git repository and push to your GitHub repository. ## Procedure This procedure will enable continuous deployment from a GitHub repository. The procedure is essentially the same if you are using GitLab or Bitbucket. -### Step 1 +Step 1 +: Create a file named `amplify.yml` in the root of your project. -Create a file named `amplify.yml` in the root of your project. + ```sh + touch amplify.yml + ``` -```sh -touch amplify.yml -``` +Step 2 +: Copy and paste the YAML below into the file you created. Change the application versions and time zone as needed. -### Step 2 + ```yaml {file="amplify.yml" copy=true} + version: 1 + env: + variables: + # Application versions + DART_SASS_VERSION: 1.90.0 + GO_VERSION: 1.24.5 + HUGO_VERSION: 0.148.2 + # Time zone + TZ: Europe/Oslo + # Cache + HUGO_CACHEDIR: ${PWD}/.hugo + NPM_CONFIG_CACHE: ${PWD}/.npm + frontend: + phases: + preBuild: + commands: + # Create directory for user-specific executable files + - echo "Creating directory for user-specific executable files..." + - mkdir -p "${HOME}/.local" -Copy and paste the YAML below into the file you created. Change the application versions and time zone as needed. + # Install Dart Sass + - echo "Installing Dart Sass ${DART_SASS_VERSION}..." + - curl -sLJO "https://github.com/sass/dart-sass/releases/download/${DART_SASS_VERSION}/dart-sass-${DART_SASS_VERSION}-linux-x64.tar.gz" + - tar -C "${HOME}/.local" -xf "dart-sass-${DART_SASS_VERSION}-linux-x64.tar.gz" + - rm "dart-sass-${DART_SASS_VERSION}-linux-x64.tar.gz" + - export PATH="${HOME}/.local/dart-sass:${PATH}" -```yaml {file="amplify.yml" copy=true} -version: 1 -env: - variables: - # Application versions - DART_SASS_VERSION: 1.90.0 - GO_VERSION: 1.24.5 - HUGO_VERSION: 0.148.2 - # Time zone - TZ: Europe/Oslo - # Cache - HUGO_CACHEDIR: ${PWD}/.hugo - NPM_CONFIG_CACHE: ${PWD}/.npm -frontend: - phases: - preBuild: - commands: - # Create directory for user-specific executable files - - echo "Creating directory for user-specific executable files..." - - mkdir -p "${HOME}/.local" + # Install Go + - echo "Installing Go ${GO_VERSION}..." + - curl -sLJO "https://go.dev/dl/go${GO_VERSION}.linux-amd64.tar.gz" + - tar -C "${HOME}/.local" -xf "go${GO_VERSION}.linux-amd64.tar.gz" + - rm "go${GO_VERSION}.linux-amd64.tar.gz" + - export PATH="${HOME}/.local/go/bin:${PATH}" - # Install Dart Sass - - echo "Installing Dart Sass ${DART_SASS_VERSION}..." - - curl -sLJO "https://github.com/sass/dart-sass/releases/download/${DART_SASS_VERSION}/dart-sass-${DART_SASS_VERSION}-linux-x64.tar.gz" - - tar -C "${HOME}/.local" -xf "dart-sass-${DART_SASS_VERSION}-linux-x64.tar.gz" - - rm "dart-sass-${DART_SASS_VERSION}-linux-x64.tar.gz" - - export PATH="${HOME}/.local/dart-sass:${PATH}" + # Install Hugo + - echo "Installing Hugo ${HUGO_VERSION}..." + - curl -sLJO "https://github.com/gohugoio/hugo/releases/download/v${HUGO_VERSION}/hugo_extended_${HUGO_VERSION}_linux-amd64.tar.gz" + - mkdir "${HOME}/.local/hugo" + - tar -C "${HOME}/.local/hugo" -xf "hugo_extended_${HUGO_VERSION}_linux-amd64.tar.gz" + - rm "hugo_extended_${HUGO_VERSION}_linux-amd64.tar.gz" + - export PATH="${HOME}/.local/hugo:${PATH}" - # Install Go - - echo "Installing Go ${GO_VERSION}..." - - curl -sLJO "https://go.dev/dl/go${GO_VERSION}.linux-amd64.tar.gz" - - tar -C "${HOME}/.local" -xf "go${GO_VERSION}.linux-amd64.tar.gz" - - rm "go${GO_VERSION}.linux-amd64.tar.gz" - - export PATH="${HOME}/.local/go/bin:${PATH}" + # Verify installations + - echo "Verifying installations..." + - "echo Dart Sass: $(sass --version)" + - "echo Go: $(go version)" + - "echo Hugo: $(hugo version)" + - "echo Node.js: $(node --version)" - # Install Hugo - - echo "Installing Hugo ${HUGO_VERSION}..." - - curl -sLJO "https://github.com/gohugoio/hugo/releases/download/v${HUGO_VERSION}/hugo_extended_${HUGO_VERSION}_linux-amd64.tar.gz" - - mkdir "${HOME}/.local/hugo" - - tar -C "${HOME}/.local/hugo" -xf "hugo_extended_${HUGO_VERSION}_linux-amd64.tar.gz" - - rm "hugo_extended_${HUGO_VERSION}_linux-amd64.tar.gz" - - export PATH="${HOME}/.local/hugo:${PATH}" + # Install Node.js dependencies + - echo "Installing Node.js dependencies..." + - "[[ -f package-lock.json || -f npm-shrinkwrap.json ]] && npm ci --prefer-offline || true" - # Verify installations - - echo "Verifying installations..." - - "echo Dart Sass: $(sass --version)" - - "echo Go: $(go version)" - - "echo Hugo: $(hugo version)" - - "echo Node.js: $(node --version)" + # Configure Git + - echo "Configuring Git..." + - git config core.quotepath false + build: + commands: + - echo "Building site..." + - hugo --gc --minify + artifacts: + baseDirectory: public + files: + - '**/*' + cache: + paths: + - ${HUGO_CACHEDIR}/**/* + - ${NPM_CONFIG_CACHE}/**/* + ``` - # Install Node.js dependencies - - echo "Installing Node.js dependencies..." - - "[[ -f package-lock.json || -f npm-shrinkwrap.json ]] && npm ci --prefer-offline || true" +Step 3 +: Commit and push the change to your GitHub repository. - # Configure Git - - echo "Configuring Git..." - - git config core.quotepath false - build: - commands: - - echo "Building site..." - - hugo --gc --minify - artifacts: - baseDirectory: public - files: - - '**/*' - cache: - paths: - - ${HUGO_CACHEDIR}/**/* - - ${NPM_CONFIG_CACHE}/**/* -``` + ```sh + git add -A + git commit -m "Create amplify.yml" + git push + ``` -### Step 3 +Step 4 +: Log in to your AWS account, navigate to the [Amplify Console], then press the **Deploy an app** button. -Commit and push the change to your GitHub repository. - -```sh -git add -A -git commit -m "Create amplify.yml" -git push -``` - -### Step 4 - -Log in to your AWS account, navigate to the [Amplify Console], then press the **Deploy an app** button. - -[Amplify Console]: https://console.aws.amazon.com/amplify/apps - -### Step 5 - -Choose a source code provider, then press the **Next** button. +Step 5 +: Choose a source code provider, then press the **Next** button. ![screen capture](amplify-step-05.png) -### Step 6 - -Authorize AWS Amplify to access your GitHub account. +Step 6 +: Authorize AWS Amplify to access your GitHub account. ![screen capture](amplify-step-06.png) -### Step 7 - -Select your personal account or relevant organization. +Step 7 +: Select your personal account or relevant organization. ![screen capture](amplify-step-07.png) -### Step 8 - -Authorize access to one or more repositories. +Step 8 +: Authorize access to one or more repositories. ![screen capture](amplify-step-08.png) -### Step 9 - -Select a repository and branch, then press the **Next** button. +Step 9 +: Select a repository and branch, then press the **Next** button. ![screen capture](amplify-step-09.png) -### Step 10 +Step 10 +: On the "App settings" page, scroll to the bottom then press the **Next** button. Amplify reads the `amplify.yml` file you created in Steps 1-3 instead of using the values on this page. -On the "App settings" page, scroll to the bottom then press the **Next** button. Amplify reads the `amplify.yml` file you created in Steps 1-3 instead of using the values on this page. +Step 11 +: On the "Review" page, scroll to the bottom then press the **Save and deploy** button. -### Step 11 - -On the "Review" page, scroll to the bottom then press the **Save and deploy** button. - -### Step 12 - -When your site has finished deploying, press the **Visit deployed URL** button to view your published site. +Step 12 +: When your site has finished deploying, press the **Visit deployed URL** button to view your published site. ![screen capture](amplify-step-11.png) + +[Amplify Console]: https://console.aws.amazon.com/amplify/apps diff --git a/content/en/host-and-deploy/host-on-cloudflare/index.md b/content/en/host-and-deploy/host-on-cloudflare/index.md index aebd7b868..018c50f0a 100644 --- a/content/en/host-and-deploy/host-on-cloudflare/index.md +++ b/content/en/host-and-deploy/host-on-cloudflare/index.md @@ -21,156 +21,146 @@ Please complete the following tasks before continuing: ## Procedure -### Step 1 +Step 1 +: Create a `wrangler.toml` file in the root of your project. -Create a `wrangler.toml` file in the root of your project. + ```toml {file="wrangler.toml" copy=true} + # Configure Cloudflare Worker -```toml {file="wrangler.toml" copy=true} -# Configure Cloudflare Worker + name = "hosting-cloudflare-worker" + compatibility_date = "2025-07-31" -name = "hosting-cloudflare-worker" -compatibility_date = "2025-07-31" + [build] + command = "chmod a+x build.sh && ./build.sh" -[build] -command = "chmod a+x build.sh && ./build.sh" + [assets] + directory = "./public" + not_found_handling = "404" + ``` -[assets] -directory = "./public" -not_found_handling = "404" -``` +Step 2 +: Create a `build.sh` file in the root of your project. -### Step 2 + ```sh {file="build.sh" copy=true} + #!/usr/bin/env bash -Create a `build.sh` file in the root of your project. + #------------------------------------------------------------------------------ + # @file + # Builds a Hugo site hosted on a Cloudflare Worker. + # + # The Cloudflare Worker automatically installs Node.js dependencies. + #------------------------------------------------------------------------------ -```sh {file="build.sh" copy=true} -#!/usr/bin/env bash + main() { -#------------------------------------------------------------------------------ -# @file -# Builds a Hugo site hosted on a Cloudflare Worker. -# -# The Cloudflare Worker automatically installs Node.js dependencies. -#------------------------------------------------------------------------------ + DART_SASS_VERSION=1.90.0 + GO_VERSION=1.24.5 + HUGO_VERSION=0.148.2 + NODE_VERSION=22.18.0 -main() { + export TZ=Europe/Oslo - DART_SASS_VERSION=1.90.0 - GO_VERSION=1.24.5 - HUGO_VERSION=0.148.2 - NODE_VERSION=22.18.0 + # Install Dart Sass + echo "Installing Dart Sass ${DART_SASS_VERSION}..." + curl -sLJO "https://github.com/sass/dart-sass/releases/download/${DART_SASS_VERSION}/dart-sass-${DART_SASS_VERSION}-linux-x64.tar.gz" + tar -C "${HOME}/.local" -xf "dart-sass-${DART_SASS_VERSION}-linux-x64.tar.gz" + rm "dart-sass-${DART_SASS_VERSION}-linux-x64.tar.gz" + export PATH="${HOME}/.local/dart-sass:${PATH}" - export TZ=Europe/Oslo + # Install Go + echo "Installing Go ${GO_VERSION}..." + curl -sLJO "https://go.dev/dl/go${GO_VERSION}.linux-amd64.tar.gz" + tar -C "${HOME}/.local" -xf "go${GO_VERSION}.linux-amd64.tar.gz" + rm "go${GO_VERSION}.linux-amd64.tar.gz" + export PATH="${HOME}/.local/go/bin:${PATH}" - # Install Dart Sass - echo "Installing Dart Sass ${DART_SASS_VERSION}..." - curl -sLJO "https://github.com/sass/dart-sass/releases/download/${DART_SASS_VERSION}/dart-sass-${DART_SASS_VERSION}-linux-x64.tar.gz" - tar -C "${HOME}/.local" -xf "dart-sass-${DART_SASS_VERSION}-linux-x64.tar.gz" - rm "dart-sass-${DART_SASS_VERSION}-linux-x64.tar.gz" - export PATH="${HOME}/.local/dart-sass:${PATH}" + # Install Hugo + echo "Installing Hugo ${HUGO_VERSION}..." + curl -sLJO "https://github.com/gohugoio/hugo/releases/download/v${HUGO_VERSION}/hugo_extended_${HUGO_VERSION}_linux-amd64.tar.gz" + mkdir "${HOME}/.local/hugo" + tar -C "${HOME}/.local/hugo" -xf "hugo_extended_${HUGO_VERSION}_linux-amd64.tar.gz" + rm "hugo_extended_${HUGO_VERSION}_linux-amd64.tar.gz" + export PATH="${HOME}/.local/hugo:${PATH}" - # Install Go - echo "Installing Go ${GO_VERSION}..." - curl -sLJO "https://go.dev/dl/go${GO_VERSION}.linux-amd64.tar.gz" - tar -C "${HOME}/.local" -xf "go${GO_VERSION}.linux-amd64.tar.gz" - rm "go${GO_VERSION}.linux-amd64.tar.gz" - export PATH="${HOME}/.local/go/bin:${PATH}" + # Install Node.js + echo "Installing Node.js ${NODE_VERSION}..." + curl -sLJO "https://nodejs.org/dist/v${NODE_VERSION}/node-v${NODE_VERSION}-linux-x64.tar.xz" + tar -C "${HOME}/.local" -xf "node-v${NODE_VERSION}-linux-x64.tar.xz" + rm "node-v${NODE_VERSION}-linux-x64.tar.xz" + export PATH="${HOME}/.local/node-v${NODE_VERSION}-linux-x64/bin:${PATH}" - # Install Hugo - echo "Installing Hugo ${HUGO_VERSION}..." - curl -sLJO "https://github.com/gohugoio/hugo/releases/download/v${HUGO_VERSION}/hugo_extended_${HUGO_VERSION}_linux-amd64.tar.gz" - mkdir "${HOME}/.local/hugo" - tar -C "${HOME}/.local/hugo" -xf "hugo_extended_${HUGO_VERSION}_linux-amd64.tar.gz" - rm "hugo_extended_${HUGO_VERSION}_linux-amd64.tar.gz" - export PATH="${HOME}/.local/hugo:${PATH}" + # Verify installations + echo "Verifying installations..." + echo Dart Sass: "$(sass --version)" + echo Go: "$(go version)" + echo Hugo: "$(hugo version)" + echo Node.js: "$(node --version)" - # Install Node.js - echo "Installing Node.js ${NODE_VERSION}..." - curl -sLJO "https://nodejs.org/dist/v${NODE_VERSION}/node-v${NODE_VERSION}-linux-x64.tar.xz" - tar -C "${HOME}/.local" -xf "node-v${NODE_VERSION}-linux-x64.tar.xz" - rm "node-v${NODE_VERSION}-linux-x64.tar.xz" - export PATH="${HOME}/.local/node-v${NODE_VERSION}-linux-x64/bin:${PATH}" + # Configure Git + echo "Configuring Git..." + git config core.quotepath false + if [ "$(git rev-parse --is-shallow-repository)" = "true" ]; then + git fetch --unshallow + fi - # Verify installations - echo "Verifying installations..." - echo Dart Sass: "$(sass --version)" - echo Go: "$(go version)" - echo Hugo: "$(hugo version)" - echo Node.js: "$(node --version)" + # Build the site + echo "Building the site..." + hugo --gc --minify - # Configure Git - echo "Configuring Git..." - git config core.quotepath false - if [ "$(git rev-parse --is-shallow-repository)" = "true" ]; then - git fetch --unshallow - fi + } - # Build the site - echo "Building the site..." - hugo --gc --minify + set -euo pipefail + main "$@" + ``` -} +Step 3 +: Commit the changes to your local Git repository and push to your GitHub repository. -set -euo pipefail -main "$@" -``` +Step 4 +: In the upper right corner of the Cloudflare [dashboard](https://dash.cloudflare.com/), press the **Add** button and select "Workers" from the drop down menu. -### Step 3 + ![screen capture](cloudflare-01.png) -Commit the changes to your local Git repository and push to your GitHub repository. +Step 5 +: On the "Workers" tab, press the **Get started** button to the right of the "Import a repository" item. -### Step 4 + ![screen capture](cloudflare-02.png) -In the upper right corner of the Cloudflare [dashboard](https://dash.cloudflare.com/), press the **Add** button and select "Workers" from the drop down menu. +Step 6 +: Connect to GitHub. -![screen capture](cloudflare-01.png) + ![screen capture](cloudflare-03.png) -### Step 5 +Step 7 +: Select the GitHub account where you want to install the Cloudflare Workers and Pages application. -On the "Workers" tab, press the **Get started** button to the right of the "Import a repository" item. + ![screen capture](cloudflare-04.png) -![screen capture](cloudflare-02.png) +Step 8 +: Authorize the Cloudflare Workers and Pages application to access all repositories or only select repositories, then press the **Install & Authorize** button. -### Step 6 + ![screen capture](cloudflare-05.png) -Connect to GitHub. + Your browser will be redirected to the Cloudflare dashboard. -![screen capture](cloudflare-03.png) +Step 9 +: On the "Workers" tab, press the **Get started** button to the right of the "Import a repository" item. -### Step 7 + ![screen capture](cloudflare-02.png) -Select the GitHub account where you want to install the Cloudflare Workers and Pages application. +Step 10 +: Select the repository to import. -![screen capture](cloudflare-04.png) + ![screen capture](cloudflare-06.png) -### Step 8 +Step 11 +: On the "Set up your application" screen, provide a project name, leave the build command blank, then press the **Create and deploy** button. -Authorize the Cloudflare Workers and Pages application to access all repositories or only select repositories, then press the **Install & Authorize** button. + ![screen capture](cloudflare-07.png) -![screen capture](cloudflare-05.png) +Step 12 +: Wait for the site to build and deploy, then visit your site. -Your browser will be redirected to the Cloudflare dashboard. + ![screen capture](cloudflare-08.png) -### Step 9 - -On the "Workers" tab, press the **Get started** button to the right of the "Import a repository" item. - -![screen capture](cloudflare-02.png) - -### Step 10 - -Select the repository to import. - -![screen capture](cloudflare-06.png) - -### Step 11 - -On the "Set up your application" screen, provide a project name, leave the build command blank, then press the **Create and deploy** button. - -![screen capture](cloudflare-07.png) - -### Step 12 - -Wait for the site to build and deploy, then visit your site. - -![screen capture](cloudflare-08.png) +In the future, whenever you push a change from your local Git repository, Cloudflare will rebuild and deploy your site. diff --git a/content/en/host-and-deploy/host-on-github-pages/gh-pages-1.png b/content/en/host-and-deploy/host-on-github-pages/gh-pages-01.png similarity index 100% rename from content/en/host-and-deploy/host-on-github-pages/gh-pages-1.png rename to content/en/host-and-deploy/host-on-github-pages/gh-pages-01.png diff --git a/content/en/host-and-deploy/host-on-github-pages/gh-pages-2.png b/content/en/host-and-deploy/host-on-github-pages/gh-pages-02.png similarity index 100% rename from content/en/host-and-deploy/host-on-github-pages/gh-pages-2.png rename to content/en/host-and-deploy/host-on-github-pages/gh-pages-02.png diff --git a/content/en/host-and-deploy/host-on-github-pages/gh-pages-3.png b/content/en/host-and-deploy/host-on-github-pages/gh-pages-03.png similarity index 100% rename from content/en/host-and-deploy/host-on-github-pages/gh-pages-3.png rename to content/en/host-and-deploy/host-on-github-pages/gh-pages-03.png diff --git a/content/en/host-and-deploy/host-on-github-pages/gh-pages-4.png b/content/en/host-and-deploy/host-on-github-pages/gh-pages-04.png similarity index 100% rename from content/en/host-and-deploy/host-on-github-pages/gh-pages-4.png rename to content/en/host-and-deploy/host-on-github-pages/gh-pages-04.png diff --git a/content/en/host-and-deploy/host-on-github-pages/gh-pages-5.png b/content/en/host-and-deploy/host-on-github-pages/gh-pages-05.png similarity index 100% rename from content/en/host-and-deploy/host-on-github-pages/gh-pages-5.png rename to content/en/host-and-deploy/host-on-github-pages/gh-pages-05.png diff --git a/content/en/host-and-deploy/host-on-github-pages/index.md b/content/en/host-and-deploy/host-on-github-pages/index.md index e708cffd3..dd4039dd8 100644 --- a/content/en/host-and-deploy/host-on-github-pages/index.md +++ b/content/en/host-and-deploy/host-on-github-pages/index.md @@ -6,14 +6,6 @@ keywords: [] aliases: [/hosting-and-deployment/hosting-on-github/] --- -## Prerequisites - -Please complete the following tasks before continuing: - -1. [Create a GitHub account] -1. [Install Git] -1. [Create a Hugo site] and test it locally with `hugo server`. - ## Types of sites There are three types of GitHub Pages sites: project, user, and organization. Project sites are connected to a specific project hosted on GitHub. User and organization sites are connected to a specific account on GitHub.com. @@ -21,200 +13,177 @@ There are three types of GitHub Pages sites: project, user, and organization. Pr > [!note] > See the [GitHub Pages documentation] to understand the requirements for repository ownership and naming. +## Prerequisites + +Please complete the following tasks before continuing: + +1. [Create](https://github.com/signup) a GitHub account +1. [Log in](https://github.com/login) to your GitHub account +1. [Create](https://github.com/new) a GitHub repository for your project +1. [Create](https://git-scm.com/docs/git-init) a local Git repository for your project with a [remote](https://git-scm.com/docs/git-remote) reference to your GitHub repository +1. Create a Hugo site within your local Git repository and test it with the `hugo server` command +1. Commit the changes to your local Git repository and push to your GitHub repository + ## Procedure -### Step 1 +Step 1 +: Visit your GitHub repository. From the main menu choose **Settings** > **Pages**. In the center of your screen you will see this: -Create a GitHub repository. + ![screen capture](gh-pages-01.png) -### Step 2 + Change the **Source** to `GitHub Actions`. The change is immediate; you do not have to press a Save button. -Push your local repository to GitHub. + ![screen capture](gh-pages-02.png) -### Step 3 +Step 2 +: In your site configuration, change the location of the image cache to the [`cacheDir`] as shown below: -Visit your GitHub repository. From the main menu choose **Settings** > **Pages**. In the center of your screen you will see this: + {{< code-toggle file=hugo copy=true >}} + [caches.images] + dir = ":cacheDir/images" + {{< /code-toggle >}} -![screen capture](gh-pages-1.png) -{style="max-width: 280px"} + See [configure file caches] for more information. -### Step 4 +Step 3 +: Create a file named `hugo.yaml` in a directory named `.github/workflows`. -Change the **Source** to `GitHub Actions`. The change is immediate; you do not have to press a Save button. + ```text + mkdir -p .github/workflows + touch .github/workflows/hugo.yaml + ``` -![screen capture](gh-pages-2.png) -{style="max-width: 280px"} +Step 4 +: Copy and paste the YAML below into the file you created. -### Step 5 + ```yaml {file=".github/workflows/hugo.yaml" copy=true} + name: Build and deploy + on: + push: + branches: + - main + workflow_dispatch: + permissions: + contents: read + pages: write + id-token: write + concurrency: + group: pages + cancel-in-progress: false + defaults: + run: + shell: bash + jobs: + build: + runs-on: ubuntu-latest + env: + DART_SASS_VERSION: 1.90.0 + GO_VERSION: 1.24.5 + HUGO_VERSION: 0.148.2 + NODE_VERSION: 22.18.0 + TZ: Europe/Oslo + steps: + - name: Checkout + uses: actions/checkout@v5 + with: + submodules: recursive + fetch-depth: 0 + - name: Setup Go + uses: actions/setup-go@v5 + with: + go-version: ${{ env.GO_VERSION }} + cache: false + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version: ${{ env.NODE_VERSION }} + - name: Setup Pages + id: pages + uses: actions/configure-pages@v5 + - name: Create directory for user-specific executable files + run: | + mkdir -p "${HOME}/.local" + - name: Install Dart Sass + run: | + curl -sLJO "https://github.com/sass/dart-sass/releases/download/${DART_SASS_VERSION}/dart-sass-${DART_SASS_VERSION}-linux-x64.tar.gz" + tar -C "${HOME}/.local" -xf "dart-sass-${DART_SASS_VERSION}-linux-x64.tar.gz" + rm "dart-sass-${DART_SASS_VERSION}-linux-x64.tar.gz" + echo "${HOME}/.local/dart-sass" >> "${GITHUB_PATH}" + - name: Install Hugo + run: | + curl -sLJO "https://github.com/gohugoio/hugo/releases/download/v${HUGO_VERSION}/hugo_extended_${HUGO_VERSION}_linux-amd64.tar.gz" + mkdir "${HOME}/.local/hugo" + tar -C "${HOME}/.local/hugo" -xf "hugo_extended_${HUGO_VERSION}_linux-amd64.tar.gz" + rm "hugo_extended_${HUGO_VERSION}_linux-amd64.tar.gz" + echo "${HOME}/.local/hugo" >> "${GITHUB_PATH}" + - name: Verify installations + run: | + echo "Dart Sass: $(sass --version)" + echo "Go: $(go version)" + echo "Hugo: $(hugo version)" + echo "Node.js: $(node --version)" + - name: Install Node.js dependencies + run: | + [[ -f package-lock.json || -f npm-shrinkwrap.json ]] && npm ci || true + - name: Configure Git + run: | + git config core.quotepath false + - name: Cache restore + id: cache-restore + uses: actions/cache/restore@v4 + with: + path: ${{ runner.temp }}/hugo_cache + key: hugo-${{ github.run_id }} + restore-keys: + hugo- + - name: Build the site + run: | + hugo \ + --gc \ + --minify \ + --baseURL "${{ steps.pages.outputs.base_url }}/" \ + --cacheDir "${{ runner.temp }}/hugo_cache" + - name: Cache save + id: cache-save + uses: actions/cache/save@v4 + with: + path: ${{ runner.temp }}/hugo_cache + key: ${{ steps.cache-restore.outputs.cache-primary-key }} + - name: Upload artifact + uses: actions/upload-pages-artifact@v3 + with: + path: ./public + deploy: + environment: + name: github-pages + url: ${{ steps.deployment.outputs.page_url }} + runs-on: ubuntu-latest + needs: build + steps: + - name: Deploy to GitHub Pages + id: deployment + uses: actions/deploy-pages@v4 + ``` -In your site configuration, change the location of the image cache to the [`cacheDir`] as shown below: +Step 5 +: Commit the changes to your local Git repository and push to your GitHub repository. -{{< code-toggle file=hugo >}} -[caches.images] -dir = ":cacheDir/images" -{{< /code-toggle >}} +Step 6 +: From GitHub's main menu, choose **Actions**. You will see something like this: -See [configure file caches] for more information. + ![screen capture](gh-pages-03.png) -### Step 6 +Step 7 +: When GitHub has finished building and deploying your site, the color of the status indicator will change to green. -Create a file named `hugo.yaml` in a directory named `.github/workflows`. + ![screen capture](gh-pages-04.png) -```text -mkdir -p .github/workflows -touch .github/workflows/hugo.yaml -``` +Step 8 +: Click on the commit message as shown above. Under the deploy step, you will see a link to your live site. -### Step 7 + ![screen capture](gh-pages-05.png) -> [!note] -> The workflow below ensures Hugo's `cacheDir` is persistent, preserving modules, processed images, and [`resources.GetRemote`] data between builds. - -Copy and paste the YAML below into the file you created. Change the branch name and Hugo version as needed. - -```yaml {file=".github/workflows/hugo.yaml" copy=true} -name: Build and deploy -on: - push: - branches: - - main - workflow_dispatch: -permissions: - contents: read - pages: write - id-token: write -concurrency: - group: pages - cancel-in-progress: false -defaults: - run: - shell: bash -jobs: - build: - runs-on: ubuntu-latest - env: - DART_SASS_VERSION: 1.90.0 - GO_VERSION: 1.24.5 - HUGO_VERSION: 0.148.2 - NODE_VERSION: 22.18.0 - TZ: Europe/Oslo - steps: - - name: Checkout - uses: actions/checkout@v5 - with: - submodules: recursive - fetch-depth: 0 - - name: Setup Go - uses: actions/setup-go@v5 - with: - go-version: ${{ env.GO_VERSION }} - cache: false - - name: Setup Node.js - uses: actions/setup-node@v4 - with: - node-version: ${{ env.NODE_VERSION }} - - name: Setup Pages - id: pages - uses: actions/configure-pages@v5 - - name: Create directory for user-specific executable files - run: | - mkdir -p "${HOME}/.local" - - name: Install Dart Sass - run: | - curl -sLJO "https://github.com/sass/dart-sass/releases/download/${DART_SASS_VERSION}/dart-sass-${DART_SASS_VERSION}-linux-x64.tar.gz" - tar -C "${HOME}/.local" -xf "dart-sass-${DART_SASS_VERSION}-linux-x64.tar.gz" - rm "dart-sass-${DART_SASS_VERSION}-linux-x64.tar.gz" - echo "${HOME}/.local/dart-sass" >> "${GITHUB_PATH}" - - name: Install Hugo - run: | - curl -sLJO "https://github.com/gohugoio/hugo/releases/download/v${HUGO_VERSION}/hugo_extended_${HUGO_VERSION}_linux-amd64.tar.gz" - mkdir "${HOME}/.local/hugo" - tar -C "${HOME}/.local/hugo" -xf "hugo_extended_${HUGO_VERSION}_linux-amd64.tar.gz" - rm "hugo_extended_${HUGO_VERSION}_linux-amd64.tar.gz" - echo "${HOME}/.local/hugo" >> "${GITHUB_PATH}" - - name: Verify installations - run: | - echo "Dart Sass: $(sass --version)" - echo "Go: $(go version)" - echo "Hugo: $(hugo version)" - echo "Node.js: $(node --version)" - - name: Install Node.js dependencies - run: | - [[ -f package-lock.json || -f npm-shrinkwrap.json ]] && npm ci || true - - name: Configure Git - run: | - git config core.quotepath false - - name: Cache restore - id: cache-restore - uses: actions/cache/restore@v4 - with: - path: ${{ runner.temp }}/hugo_cache - key: hugo-${{ github.run_id }} - restore-keys: - hugo- - - name: Build the site - run: | - hugo \ - --gc \ - --minify \ - --baseURL "${{ steps.pages.outputs.base_url }}/" \ - --cacheDir "${{ runner.temp }}/hugo_cache" - - name: Cache save - id: cache-save - uses: actions/cache/save@v4 - with: - path: ${{ runner.temp }}/hugo_cache - key: ${{ steps.cache-restore.outputs.cache-primary-key }} - - name: Upload artifact - uses: actions/upload-pages-artifact@v3 - with: - path: ./public - deploy: - environment: - name: github-pages - url: ${{ steps.deployment.outputs.page_url }} - runs-on: ubuntu-latest - needs: build - steps: - - name: Deploy to GitHub Pages - id: deployment - uses: actions/deploy-pages@v4 -``` - -### Step 8 - -Commit and push the change to your GitHub repository. - -```sh -git add -A -git commit -m "Create hugo.yaml" -git push -``` - -### Step 9 - -From GitHub's main menu, choose **Actions**. You will see something like this: - -![screen capture](gh-pages-3.png) -{style="max-width: 350px"} - -### Step 10 - -When GitHub has finished building and deploying your site, the color of the status indicator will change to green. - -![screen capture](gh-pages-4.png) -{style="max-width: 350px"} - -### Step 11 - -Click on the commit message as shown above. You will see this: - -![screen capture](gh-pages-5.png) -{style="max-width: 611px"} - -Under the deploy step, you will see a link to your live site. - -In the future, whenever you push a change from your local repository, GitHub will rebuild your site and deploy the changes. +In the future, whenever you push a change from your local Git repository, GitHub Pages will rebuild and deploy your site. ## Customize the workflow @@ -233,11 +202,7 @@ You may remove this step if your site, themes, and modules do not transpile Sass - [Caching dependencies to speed up workflows](https://docs.github.com/en/actions/using-workflows/caching-dependencies-to-speed-up-workflows) - [Manage a custom domain for your GitHub Pages site](https://docs.github.com/en/pages/configuring-a-custom-domain-for-your-github-pages-site/about-custom-domains-and-github-pages) -[Create a GitHub account]: https://github.com/signup -[Create a Hugo site]: /getting-started/quick-start/ +[`cacheDir`]: /configuration/all/#cachedir +[configure file caches]: /configuration/caches/ [Dart Sass]: /functions/css/sass/#dart-sass [GitHub Pages documentation]: https://docs.github.com/en/pages/getting-started-with-github-pages/about-github-pages#types-of-github-pages-sites -[Install Git]: https://git-scm.com/book/en/v2/Getting-Started-Installing-Git -[`cacheDir`]: /configuration/all/#cachedir -[`resources.GetRemote`]: /functions/resources/getremote/ -[configure file caches]: /configuration/caches/ diff --git a/content/en/host-and-deploy/host-on-netlify/index.md b/content/en/host-and-deploy/host-on-netlify/index.md index b88a1aa3a..cc0bf6b2b 100644 --- a/content/en/host-and-deploy/host-on-netlify/index.md +++ b/content/en/host-and-deploy/host-on-netlify/index.md @@ -6,104 +6,85 @@ keywords: [] aliases: [/hosting-and-deployment/hosting-on-netlify/] --- +Use these instructions to enable continuous deployment from a GitHub repository. The same general steps apply if you are using Azure DevOps, Bitbucket, or GitLab for version control. + ## Prerequisites Please complete the following tasks before continuing: -1. [Create a Netlify account] -1. [Install Git] -1. [Create a Hugo site] and test it locally with `hugo server` -1. Commit the changes to your local repository -1. Push the local repository to your [GitHub], [GitLab], or [Bitbucket] account - -[Bitbucket]: https://bitbucket.org/product -[Create a Hugo site]: /getting-started/quick-start/ -[Create a Netlify account]: https://app.netlify.com/signup -[GitHub]: https://github.com -[GitLab]: https://about.gitlab.com/ -[Install Git]: https://git-scm.com/book/en/v2/Getting-Started-Installing-Git +1. [Create](https://app.netlify.com/signup) a Netlify account +1. [Log in](https://app.netlify.com/login) to your Netlify account +1. [Create](https://github.com/signup) a GitHub account +1. [Log in](https://github.com/login) to your GitHub account +1. [Create](https://github.com/new) a GitHub repository for your project +1. [Create](https://git-scm.com/docs/git-init) a local Git repository for your project with a [remote](https://git-scm.com/docs/git-remote) reference to your GitHub repository +1. Create a Hugo site within your local Git repository and test it with the `hugo server` command +1. Commit the changes to your local Git repository and push to your GitHub repository. ## Procedure -This procedure will enable continuous deployment from a GitHub repository. The procedure is essentially the same if you are using GitLab or Bitbucket. +Step 1 +: Log in to your Netlify account, navigate to the Sites page, press the **Add new site** button, and choose "Import an existing project" from the dropdown menu. -### Step 1 +Step 2 +: Select your deployment method. -Log in to your Netlify account, navigate to the Sites page, press the **Add new site** button, and choose "Import an existing project" from the dropdown menu. + ![screen capture](netlify-step-02.png) -### Step 2 +Step 3 +: Authorize Netlify to connect with your GitHub account by pressing the **Authorize Netlify** button. -Select your deployment method. + ![screen capture](netlify-step-03.png) -![screen capture](netlify-step-02.png) +Step 4 +: Press the **Configure Netlify on GitHub** button. -### Step 3 + ![screen capture](netlify-step-04.png) -Authorize Netlify to connect with your GitHub account by pressing the **Authorize Netlify** button. +Step 5 +: Install the Netlify app by selecting your GitHub account. -![screen capture](netlify-step-03.png) + ![screen capture](netlify-step-05.png) -### Step 4 +Step 6 +: Press the **Install** button. -Press the **Configure Netlify on GitHub** button. + ![screen capture](netlify-step-06.png) -![screen capture](netlify-step-04.png) +Step 7 +: Click on the site's repository from the list. -### Step 5 + ![screen capture](netlify-step-07.png) -Install the Netlify app by selecting your GitHub account. +Step 8 +: Set the site name and branch from which to deploy. -![screen capture](netlify-step-05.png) + ![screen capture](netlify-step-08.png) -### Step 6 +Step 9 +: Define the build settings, press the **Add environment variables** button, then press the **New variable** button. -Press the **Install** button. + ![screen capture](netlify-step-09.png) -![screen capture](netlify-step-06.png) +Step 10 +: Create a new environment variable named `HUGO_VERSION` and set the value to the [latest version](https://github.com/gohugoio/hugo/releases/latest). -### Step 7 + ![screen capture](netlify-step-10.png) -Click on the site's repository from the list. +Step 11 +: Press the "Deploy my new site" button at the bottom of the page. -![screen capture](netlify-step-07.png) + ![screen capture](netlify-step-11.png) -### Step 8 +Step 12 +: At the bottom of the screen, wait for the deploy to complete, then click on the deploy log entry. -Set the site name and branch from which to deploy. + ![screen capture](netlify-step-12.png) -![screen capture](netlify-step-08.png) +Step 13 +: Press the **Open production deploy** button to view the live site. -### Step 9 - -Define the build settings, press the **Add environment variables** button, then press the **New variable** button. - -![screen capture](netlify-step-09.png) - -### Step 10 - -Create a new environment variable named `HUGO_VERSION` and set the value to the [latest version]. - -[latest version]: https://github.com/gohugoio/hugo/releases/latest - -![screen capture](netlify-step-10.png) - -### Step 11 - -Press the "Deploy my new site" button at the bottom of the page. - -![screen capture](netlify-step-11.png) - -### Step 12 - -At the bottom of the screen, wait for the deploy to complete, then click on the deploy log entry. - -![screen capture](netlify-step-12.png) - -### Step 13 - -Press the **Open production deploy** button to view the live site. - -![screen capture](netlify-step-13.png) + ![screen capture](netlify-step-13.png) ## Configuration file diff --git a/content/en/host-and-deploy/host-on-render/index.md b/content/en/host-and-deploy/host-on-render/index.md index f1190aae2..f52e09280 100644 --- a/content/en/host-and-deploy/host-on-render/index.md +++ b/content/en/host-and-deploy/host-on-render/index.md @@ -6,7 +6,7 @@ keywords: [] aliases: [/hosting-and-deployment/hosting-on-render/] --- -Use these instructions to enable continuous deployment from a GitHub repository. The same general steps apply if you are using GitLab or Bitbucket for version control. +Use these instructions to enable continuous deployment from a GitHub repository. The same general steps apply if you are using Bitbucket or GitLab for version control. ## Prerequisites @@ -22,160 +22,149 @@ Please complete the following tasks before continuing: ## Procedure -### Step 1 +Step 1 +: Create a [Render Blueprint][] in the root of your project. -Create a [Render Blueprint][] in the root of your project. + ``` {file="render.yaml" copy=true} + services: + - type: web + name: hosting-render + repo: https://github.com/jmooring/hosting-render + runtime: static + buildCommand: chmod a+x build.sh && ./build.sh + staticPublishPath: public + envVars: + - key: DART_SASS_VERSION + value: 1.90.0 + - key: GO_VERSION + value: 1.24.5 + - key: HUGO_VERSION + value: 0.148.2 + - key: NODE_VERSION + value: 22.18.0 + - key: TZ + value: Europe/Oslo + ``` -``` {file="render.yaml" copy=true} -services: - - type: web - name: hosting-render - repo: https://github.com/jmooring/hosting-render - runtime: static - buildCommand: chmod a+x build.sh && ./build.sh - staticPublishPath: public - envVars: - - key: DART_SASS_VERSION - value: 1.90.0 - - key: GO_VERSION - value: 1.24.5 - - key: HUGO_VERSION - value: 0.148.2 - - key: NODE_VERSION - value: 22.18.0 - - key: TZ - value: Europe/Oslo -``` +Step 2 +: Create a `build.sh` file in the root of your project. -### Step 2 + ```sh {file="build.sh" copy=true} + #!/usr/bin/env bash -Create a `build.sh` file in the root of your project. + #------------------------------------------------------------------------------ + # @file + # Builds a Hugo site hosted on a Render. + # + # Render automatically installs Node.js dependencies. + #------------------------------------------------------------------------------ -```sh {file="build.sh" copy=true} -#!/usr/bin/env bash + main() { -#------------------------------------------------------------------------------ -# @file -# Builds a Hugo site hosted on a Render. -# -# Render automatically installs Node.js dependencies. -#------------------------------------------------------------------------------ + # Create directory for user-specific executable files + echo "Creating directory for user-specific executable files..." + mkdir -p "${HOME}/.local" -main() { + # Install Dart Sass + echo "Installing Dart Sass ${DART_SASS_VERSION}..." + curl -sLJO "https://github.com/sass/dart-sass/releases/download/${DART_SASS_VERSION}/dart-sass-${DART_SASS_VERSION}-linux-x64.tar.gz" + tar -C "${HOME}/.local" -xf "dart-sass-${DART_SASS_VERSION}-linux-x64.tar.gz" + rm "dart-sass-${DART_SASS_VERSION}-linux-x64.tar.gz" + export PATH="${HOME}/.local/dart-sass:${PATH}" - # Create directory for user-specific executable files - echo "Creating directory for user-specific executable files..." - mkdir -p "${HOME}/.local" + # Install Go + echo "Installing Go ${GO_VERSION}..." + curl -sLJO "https://go.dev/dl/go${GO_VERSION}.linux-amd64.tar.gz" + tar -C "${HOME}/.local" -xf "go${GO_VERSION}.linux-amd64.tar.gz" + rm "go${GO_VERSION}.linux-amd64.tar.gz" + export PATH="${HOME}/.local/go/bin:${PATH}" - # Install Dart Sass - echo "Installing Dart Sass ${DART_SASS_VERSION}..." - curl -sLJO "https://github.com/sass/dart-sass/releases/download/${DART_SASS_VERSION}/dart-sass-${DART_SASS_VERSION}-linux-x64.tar.gz" - tar -C "${HOME}/.local" -xf "dart-sass-${DART_SASS_VERSION}-linux-x64.tar.gz" - rm "dart-sass-${DART_SASS_VERSION}-linux-x64.tar.gz" - export PATH="${HOME}/.local/dart-sass:${PATH}" + # Install Hugo + echo "Installing Hugo ${HUGO_VERSION}..." + curl -sLJO "https://github.com/gohugoio/hugo/releases/download/v${HUGO_VERSION}/hugo_extended_${HUGO_VERSION}_linux-amd64.tar.gz" + mkdir -p "${HOME}/.local/hugo" + tar -C "${HOME}/.local/hugo" -xf "hugo_extended_${HUGO_VERSION}_linux-amd64.tar.gz" + rm "hugo_extended_${HUGO_VERSION}_linux-amd64.tar.gz" + export PATH="${HOME}/.local/hugo:${PATH}" - # Install Go - echo "Installing Go ${GO_VERSION}..." - curl -sLJO "https://go.dev/dl/go${GO_VERSION}.linux-amd64.tar.gz" - tar -C "${HOME}/.local" -xf "go${GO_VERSION}.linux-amd64.tar.gz" - rm "go${GO_VERSION}.linux-amd64.tar.gz" - export PATH="${HOME}/.local/go/bin:${PATH}" + # Verify installations + echo "Verifying installations..." + echo Dart Sass: "$(sass --version)" + echo Go: "$(go version)" + echo Hugo: "$(hugo version)" + echo Node.js: "$(node --version)" - # Install Hugo - echo "Installing Hugo ${HUGO_VERSION}..." - curl -sLJO "https://github.com/gohugoio/hugo/releases/download/v${HUGO_VERSION}/hugo_extended_${HUGO_VERSION}_linux-amd64.tar.gz" - mkdir -p "${HOME}/.local/hugo" - tar -C "${HOME}/.local/hugo" -xf "hugo_extended_${HUGO_VERSION}_linux-amd64.tar.gz" - rm "hugo_extended_${HUGO_VERSION}_linux-amd64.tar.gz" - export PATH="${HOME}/.local/hugo:${PATH}" + # Configure Git + echo "Configuring Git..." + git config core.quotepath false + if [ "$(git rev-parse --is-shallow-repository)" = "true" ]; then + git fetch --unshallow + fi - # Verify installations - echo "Verifying installations..." - echo Dart Sass: "$(sass --version)" - echo Go: "$(go version)" - echo Hugo: "$(hugo version)" - echo Node.js: "$(node --version)" + # Build the site + echo "Building the site..." + hugo --gc --minify --baseURL "${RENDER_EXTERNAL_URL}" - # Configure Git - echo "Configuring Git..." - git config core.quotepath false - if [ "$(git rev-parse --is-shallow-repository)" = "true" ]; then - git fetch --unshallow - fi + } - # Build the site - echo "Building the site..." - hugo --gc --minify --baseURL "${RENDER_EXTERNAL_URL}" + set -euo pipefail + main "$@" + ``` -} +Step 3 +: Commit the changes to your local Git repository and push to your GitHub repository. -set -euo pipefail -main "$@" -``` +Step 4 +: On the Render [dashboard][], press the **Add new** button and select "Blueprint" from the drop-down menu. -### Step 3 + ![screen capture](render-01.png) -Commit the changes to your local Git repository and push to your GitHub repository. +Step 5 +: Press the **GitHub** button to connect to your GitHub account. -### Step 4 + ![screen capture](render-02.png) -On the Render [dashboard][], press the **Add new** button and select "Blueprint" from the drop-down menu. +Step 6 +: Press the **Authorize Render** button to allow the Render application to access your GitHub account. -![screen capture](render-01.png) + ![screen capture](render-03.png) -### Step 5 +Step 7 +: Select the GitHub account where you want to install the Render application. -Press the **GitHub** button to connect to your GitHub account. + ![screen capture](render-04.png) -![screen capture](render-02.png) - -### Step 6 - -Press the **Authorize Render** button to allow the Render application to access your GitHub account. - -![screen capture](render-03.png) - -### Step 7 - -Select the GitHub account where you want to install the Render application. - -![screen capture](render-04.png) - -### Step 8 - -Authorize the Render application to access all repositories or only select repositories, then press the **Install** button. +Step 8 +: Authorize the Render application to access all repositories or only select repositories, then press the **Install** button. ![screen capture](render-05.png) -### Step 9 +Step 9 +: On the "Create a new Blueprint Instance in My Workspacee" page, press the **Connect** button to the right of the name of your GitHub repository. -On the "Create a new Blueprint Instance in My Workspacee" page, press the **Connect** button to the right of the name of your GitHub repository. + ![screen capture](render-06.png) -![screen capture](render-06.png) +Step 10 +: Enter a unique name for your Blueprint, then press the **Deploy Blueprint** button at the bottom of the page. -### Step 10 + ![screen capture](render-07.png) -Enter a unique name for your Blueprint, then press the **Deploy Blueprint** button at the bottom of the page. +Step 11 +: Wait for the site to build and deploy, then click on the "Resources" link on the left side of the page. -![screen capture](render-07.png) + ![screen capture](render-08.png) -### Step 11 +Step 12 +: Click on the link to the static site resource. -Wait for the site to build and deploy, then click on the "Resources" link on the left side of the page. + ![screen capture](render-09.png) -![screen capture](render-08.png) +Step 13 +: Click on the link to your published site. -### Step 12 + ![screen capture](render-10.png) -Click on the link to the static site resource. - -![screen capture](render-09.png) - -### Step 13 - -Click on the link to your published site. - -![screen capture](render-10.png) +In the future, whenever you push a change from your local Git repository, Render will rebuild and deploy your site. [Render Blueprint]: https://render.com/docs/blueprint-spec [dashboard]: https://dashboard.render.com/ diff --git a/content/en/host-and-deploy/host-on-vercel/index.md b/content/en/host-and-deploy/host-on-vercel/index.md index 2a48325e6..8d402cb87 100644 --- a/content/en/host-and-deploy/host-on-vercel/index.md +++ b/content/en/host-and-deploy/host-on-vercel/index.md @@ -5,7 +5,7 @@ categories: [] keywords: [] --- -Use these instructions to enable continuous deployment from a GitHub repository. The same general steps apply if you are using GitLab or Bitbucket for version control. +Use these instructions to enable continuous deployment from a GitHub repository. The same general steps apply if you are using Bitbucket or GitLab for version control. ## Prerequisites @@ -21,156 +21,145 @@ Please complete the following tasks before continuing: ## Procedure -### Step 1 +Step 1 +: Create a `vercel.json` file in the root of your project. -Create a `vercel.json` file in the root of your project. + ```json {file="vercel.json" copy=true} + { + "$schema": "https://openapi.vercel.sh/vercel.json", + "buildCommand": "chmod a+x build.sh && ./build.sh", + "outputDirectory": "public" + } + ``` -```json {file="vercel.json" copy=true} -{ - "$schema": "https://openapi.vercel.sh/vercel.json", - "buildCommand": "chmod a+x build.sh && ./build.sh", - "outputDirectory": "public" -} -``` +Step 2 +: Create a `build.sh` file in the root of your project. -### Step 2 + ```sh {file="build.sh" copy=true} + #!/usr/bin/env bash -Create a `build.sh` file in the root of your project. + #------------------------------------------------------------------------------ + # @file + # Builds a Hugo site hosted on Vercel. + # + # The Vercel build image automatically installs Node.js dependencies. + #------------------------------------------------------------------------------ -```sh {file="build.sh" copy=true} -#!/usr/bin/env bash + main() { -#------------------------------------------------------------------------------ -# @file -# Builds a Hugo site hosted on Vercel. -# -# The Vercel build image automatically installs Node.js dependencies. -#------------------------------------------------------------------------------ + DART_SASS_VERSION=1.90.0 + GO_VERSION=1.24.5 + HUGO_VERSION=0.148.2 + NODE_VERSION=22.18.0 -main() { + export TZ=Europe/Oslo - DART_SASS_VERSION=1.90.0 - GO_VERSION=1.24.5 - HUGO_VERSION=0.148.2 - NODE_VERSION=22.18.0 + # Install Dart Sass + echo "Installing Dart Sass ${DART_SASS_VERSION}..." + curl -sLJO "https://github.com/sass/dart-sass/releases/download/${DART_SASS_VERSION}/dart-sass-${DART_SASS_VERSION}-linux-x64.tar.gz" + tar -C "${HOME}/.local" -xf "dart-sass-${DART_SASS_VERSION}-linux-x64.tar.gz" + rm "dart-sass-${DART_SASS_VERSION}-linux-x64.tar.gz" + export PATH="${HOME}/.local/dart-sass:${PATH}" - export TZ=Europe/Oslo + # Install Go + echo "Installing Go ${GO_VERSION}..." + curl -sLJO "https://go.dev/dl/go${GO_VERSION}.linux-amd64.tar.gz" + tar -C "${HOME}/.local" -xf "go${GO_VERSION}.linux-amd64.tar.gz" + rm "go${GO_VERSION}.linux-amd64.tar.gz" + export PATH="${HOME}/.local/go/bin:${PATH}" - # Install Dart Sass - echo "Installing Dart Sass ${DART_SASS_VERSION}..." - curl -sLJO "https://github.com/sass/dart-sass/releases/download/${DART_SASS_VERSION}/dart-sass-${DART_SASS_VERSION}-linux-x64.tar.gz" - tar -C "${HOME}/.local" -xf "dart-sass-${DART_SASS_VERSION}-linux-x64.tar.gz" - rm "dart-sass-${DART_SASS_VERSION}-linux-x64.tar.gz" - export PATH="${HOME}/.local/dart-sass:${PATH}" + # Install Hugo + echo "Installing Hugo ${HUGO_VERSION}..." + curl -sLJO "https://github.com/gohugoio/hugo/releases/download/v${HUGO_VERSION}/hugo_extended_${HUGO_VERSION}_linux-amd64.tar.gz" + mkdir "${HOME}/.local/hugo" + tar -C "${HOME}/.local/hugo" -xf "hugo_extended_${HUGO_VERSION}_linux-amd64.tar.gz" + rm "hugo_extended_${HUGO_VERSION}_linux-amd64.tar.gz" + export PATH="${HOME}/.local/hugo:${PATH}" - # Install Go - echo "Installing Go ${GO_VERSION}..." - curl -sLJO "https://go.dev/dl/go${GO_VERSION}.linux-amd64.tar.gz" - tar -C "${HOME}/.local" -xf "go${GO_VERSION}.linux-amd64.tar.gz" - rm "go${GO_VERSION}.linux-amd64.tar.gz" - export PATH="${HOME}/.local/go/bin:${PATH}" + # Install Node.js + echo "Installing Node.js ${NODE_VERSION}..." + curl -sLJO "https://nodejs.org/dist/v${NODE_VERSION}/node-v${NODE_VERSION}-linux-x64.tar.xz" + tar -C "${HOME}/.local" -xf "node-v${NODE_VERSION}-linux-x64.tar.xz" + rm "node-v${NODE_VERSION}-linux-x64.tar.xz" + export PATH="${HOME}/.local/node-v${NODE_VERSION}-linux-x64/bin:${PATH}" - # Install Hugo - echo "Installing Hugo ${HUGO_VERSION}..." - curl -sLJO "https://github.com/gohugoio/hugo/releases/download/v${HUGO_VERSION}/hugo_extended_${HUGO_VERSION}_linux-amd64.tar.gz" - mkdir "${HOME}/.local/hugo" - tar -C "${HOME}/.local/hugo" -xf "hugo_extended_${HUGO_VERSION}_linux-amd64.tar.gz" - rm "hugo_extended_${HUGO_VERSION}_linux-amd64.tar.gz" - export PATH="${HOME}/.local/hugo:${PATH}" + # Verify installations + echo "Verifying installations..." + echo Dart Sass: "$(sass --version)" + echo Go: "$(go version)" + echo Hugo: "$(hugo version)" + echo Node.js: "$(node --version)" - # Install Node.js - echo "Installing Node.js ${NODE_VERSION}..." - curl -sLJO "https://nodejs.org/dist/v${NODE_VERSION}/node-v${NODE_VERSION}-linux-x64.tar.xz" - tar -C "${HOME}/.local" -xf "node-v${NODE_VERSION}-linux-x64.tar.xz" - rm "node-v${NODE_VERSION}-linux-x64.tar.xz" - export PATH="${HOME}/.local/node-v${NODE_VERSION}-linux-x64/bin:${PATH}" + # Configure Git + echo "Configuring Git..." + git config core.quotepath false + if [ "$(git rev-parse --is-shallow-repository)" = "true" ]; then + git fetch --unshallow + fi - # Verify installations - echo "Verifying installations..." - echo Dart Sass: "$(sass --version)" - echo Go: "$(go version)" - echo Hugo: "$(hugo version)" - echo Node.js: "$(node --version)" + # Build the site + echo "Building the site" + hugo --gc --minify --baseURL "https://${VERCEL_PROJECT_PRODUCTION_URL}" - # Configure Git - echo "Configuring Git..." - git config core.quotepath false - if [ "$(git rev-parse --is-shallow-repository)" = "true" ]; then - git fetch --unshallow - fi + } - # Build the site - echo "Building the site" - hugo --gc --minify --baseURL "https://${VERCEL_PROJECT_PRODUCTION_URL}" + set -euo pipefail + main "$@" + ``` -} +Step 3 +: Commit the changes to your local Git repository and push to your GitHub repository. -set -euo pipefail -main "$@" -``` +Step 4 +: In the upper right corner of the Vercel dashboard, press the **Add New** button and select "Project" from the drop down menu. -### Step 3 + ![screen capture](vercel-01.png) -Commit the changes to your local Git repository and push to your GitHub repository. +Step 5 +: Press the "Continue with GitHub" button. -### Step 4 + ![screen capture](vercel-02.png) -In the upper right corner of the Vercel dashboard, press the **Add New** button and select "Project" from the drop down menu. +Step 6 +: Press the **Authorize Vercel** button to allow the Vercel application to access your GitHub account. -![screen capture](vercel-01.png) + ![screen capture](vercel-03.png) -### Step 5 +Step 7 +: Press the **Install** button to install the Vercel application. -Press the "Continue with GitHub" button. + ![screen capture](vercel-04.png) -![screen capture](vercel-02.png) +Step 8 +: Select the GitHub account where you want to install the Vercel application. -### Step 6 + ![screen capture](vercel-05.png) -Press the **Authorize Vercel** button to allow the Vercel application to access your GitHub account. +Step 9 +: Authorize the Vercel application to access all repositories or only select repositories, then press the **Install** button. -![screen capture](vercel-03.png) + ![screen capture](vercel-06.png) -### Step 7 + Your browser will be redirected to the Cloudflare dashboard. -Press the **Install** button to install the Vercel application. +Step 10 +: Press the **Import** button to the right of the name of your GitHub repository. -![screen capture](vercel-04.png) + ![screen capture](vercel-07.png) -### Step 8 +Step 11 +: On the "New Project" page, leave the settings at their default values and press the **Deploy** button. -Select the GitHub account where you want to install the Vercel application. + ![screen capture](vercel-08.png) -![screen capture](vercel-05.png) +Step 12 +: When the deployment completes, press the **Continue to Dashboard" button at the bottom of the page. -### Step 9 + ![screen capture](vercel-09.png) -Authorize the Vercel application to access all repositories or only select repositories, then press the **Install** button. +Step 13 +: On the "Production Deployment" page, click on the link to your published site. -![screen capture](vercel-06.png) + ![screen capture](vercel-10.png) -Your browser will be redirected to the Cloudflare dashboard. - -### Step 10 - -Press the **Import** button to the right of the name of your GitHub repository. - -![screen capture](vercel-07.png) - -### Step 11 - -On the "New Project" page, leave the settings at their default values and press the **Deploy** button. - -![screen capture](vercel-08.png) - -### Step 12 - -When the deployment completes, press the **Continue to Dashboard" button at the bottom of the page. - -![screen capture](vercel-09.png) - -### Step 13 - -On the "Production Deployment" page, click on the link to your published site. - -![screen capture](vercel-10.png) +In the future, whenever you push a change from your local Git repository, Vercel will rebuild and deploy your site.
    - {{ range . }} -
  • {{ .LinkTitle }}
  • + {{/* Add page resource. */}} + {{ $item := . }} + {{ with $url := $item.cover }} + {{ with try (resources.GetRemote $url) }} + {{ with .Err }} + {{ errorf "Unable to get remote resource %s: %s" $url . }} + {{ else with .Value }} + {{ $content := dict "mediaType" .MediaType.Type "value" .Content }} + {{ $params := dict "alt" $item.title }} + {{ $resource := dict + "content" $content + "params" $params + "path" (printf "%s/cover.%s" $item.title .MediaType.SubType) + }} + {{ $.AddResource $resource }} + {{ else }} + {{ errorf "Unable to get remote resource %s" $url }} + {{ end }} {{ end }} -