Skip to content



Repository files navigation


Forestry Website

This site wraps Hugo with Gulp as your asset pipeline.

PostCSS and Webpack + Babel are used for CSS and JS compiling & transpiling.

ImageMin is used to optimize and compress images, and SVG Sprite is used to generate a SVG Sprite.

BrowserSync is used for providing a modern local development experience, allowing you to preview your site on multiple devices in sync.

BrowsersList is used for configuring Browser support.



To use Gulp, you must have Node and NPM installed.


Once the prerequisites are installed, clone the repository to your local machine, and then run:

npm install

This will install Hugo as well as all of the Node dependencies needed to run your Hugo environment. This may take a little while!


All development tasks are performed using npm run. See "scripts" in package.json for a full list of commands.

Local Development

Local development is powered by BrowserSync, you will be able to develop sites rapidly through:

  • A local development server at http://localhost:3000/.
  • Automatic CSS & JS updates without reloading the page
  • Automatic page reloads when content is changed

Running the local development server is as simple as running:

npm start

This will display all draft, future-dated, or expired content, which is not included in your production build.

If you'd like to develop with the site as it will appear in production, run:

npm run preview

Production Build

To generate a final production build on your local machine you can run:

npm run build

The fresh production build of your site will end up in the dist/ directory.

Environment Variables

This project uses environment variables to handle the CircleCI deployment, as well as the Algolia index.

For local development, environment variables can be included in .env.js. See .env.js.stub for the available variables.

Project Structure

├── .tmp/                  // Temporary directory for development server
├── dist/                  // The production build
├── hugo/                  // The Hugo project, with all content and static files
|   ├── .forestry/         // Contains configuration files
|   ├── content/           // Where all site content is stored 
|   ├── data/              // TOML, YAML or JSON files containing site data 
|   ├── layouts/           // Your site's layouts
|   |   ├── partials/      // Your site's partials
|   |   └── shortcodes/    // Your site's shortcodes
|   ├── static/            // Where all static files live
|   |   ├── css/           // Where compiled CSS files live
|   |   ├── js/            // Where compiled JS files live
|   |   ├── img/           // Where theme images live
|   |   └── uploads/       // Where user uploads are stored
|   └── config.toml        // The Hugo configuration file
└─── src/
     ├── css               // CSS source files to be compiled to /css/
     ├── scss              // Sass source files to be compiled to /css/
     ├── js                // JS source files to be compiled to /js/
     └── img               // Unoptimized raw image source files to be compiled to /img/


Images found in src/img/ will be optimized and compressed and sent to hugo/static/img/ for usage in your layouts and content.

Inline SVG

Any SVGs found in src/img/ will be combined into a single SVG Sprite at hugo/static/svg/sprite.symbol.svg

This can then be used in layouts as a Hugo partial:

{{ partial "svg" (dict "id" "logos--github" "class" "example-class" "width" "64" "height" "64") }}


Algolia powers the search for the documentation and the blog. The Algolia index is generated by Hugo, using custom output formats.

These are found in config.toml:

  • outputformats.Algolia: the Algolia search index
  • outputformats.OpenSearch: the template for notifying search engines about the site search

Any Hugo section can have an index generated for it by adding the following to the front matter:

- algolia
- opensearch

The templates for generating the search indexes and open search definitions are:

  • layouts/_default/list.algolia.json
  • layouts/_default/list.opensearch.xml

They are automatically added to the head of the page in layouts/partials/head.html

S3 Redirects

Hugo aliases handles the sites redirects. A valid S3 redirects configuration is generated using custom output formats.

This is found in config.toml:

  • outputformats.Redirects: the redirects output format

Any Hugo section can have an index generated for it's children by adding the following to the front matter:

- redirects

Redirects generated using content/ to generate redirects for all pages on the site.

Testing & Code Quality

This boilerplate comes with standard ESLint, StyleLint, and Prettier configurations that will lint and clean your CSS and JS for errors or common style issues, which work with most popular IDEs.

Popular IDE plugins:

The tests can also be run from the command line:

  • JS: npm run eslint
  • CSS: npm run stylelint

If you want to automatically fix lint errors, you can do this from the command line as well:

  • JS: npm run eslint:fix
  • CSS: npm run stylelint:fix


This boilerplate is self-cleaning, and will remove the production dist/ and development .tmp/ folders every time a command is run to ensure that their contents are always up to date.

If you wish to manually cleanup, run:

npm run clean


All build tasks are handled by Gulp and are located in gulpfile.babel.js. All parts of the build are configurable in discrete files to make management easy.


All build source and destination paths can be configured from gulp.config.js.


The build commands for Hugo can be configured from gulp.config.js. Build commands are set based on the GENERATOR_ARGS environment variable, and will fallback to NODE_ENV if not provided.

Four options are available:

  • default: the default build commands that are always run
  • development: additional build commands for the development server
  • preview: the additional build commands for the development server when serving production build
  • production: additional build commands for production builds and preview server

BrowserSync Development Server

The configuration for BrowserSync is found in browsersync.config.js


The configuration for PostCSS is found in postcss.config.js


The configuration for Webpack is found in webpack.config.js

Browser support

Both PostCSS and Webpack use .browserslistrc to decide on browser support when compiling.

Tips & Resources

  • To learn about how to develop with Hugo, see Hugo's documentation
  • To learn how to use Hugo's templating system, see the documentation
  • Static files should be stored in the hugo/static/ folder as they should appear in the built site E.g, a CNAME file should be stored at hugo/static/CNAME to become /CNAME
  • Javascript files are compiled from the root of src/js/ to js/{filename}.js
    • Javascript can be written using ES6, supporting require() and import statements from npm packages and local JS files
  • CSS files are compiled from the root of src/css/ to css/{filename}.css
    • Import statements are resolved and included in the compiled CSS files
  • For compatibility with Forestry or other CMSs, ensure that compiled CSS and JS files in the hugo/ folder are always committed
  • Environment variables are provided to your templates, which can be accessed in templates as follows: {{ getenv "HUGO_ENV" }}
    • For development pipelines, this is equal to development
    • For production pipelines, this is equal to production
    • For Forestry's in-app preview feature, this is equal to staging

About website






No releases published




  • HTML 47.8%
  • CSS 31.1%
  • JavaScript 20.3%
  • Vim Snippet 0.8%