Getting Started with a Custom HTML Template

HelpDocs ships with a bunch of nice looking templates that work great out of the box. You can customize our default templates easily with CSS and Javascript to make them look however you like. But if you wanna make large changes to the layout, that's where custom HTML templates come in.

This article is about custom HTML templates in Handlebars. If you started a template in or before March 2018 you might see custom Jade templates in your account. We have docs for those here.


We use Handlebars to give our HTML templates superpowers. Handlebars lets you do things like loop through arrays of tags and authors, and output HTML for each. It also lets you register and reuse partials which cleans up your HTML no end.

If you're not familiar with Handlebars you should check out the official documentation. HelpDocs templates are compatible with all the syntax of Handlebars v3, with the addition of Inline Partials from Handlebars v4.

We also support a number of helpers for Handlebars. We've built these helpers in-house to make common tasks like internationalization easier. You can read more about our helpers here.

Enabling Custom HTML Templates

You can enable custom HTML templates in Settings > Brand. Choose Custom from the Template dropdown.

Once you've enabled custom templates you'll get a new tab in Settings called Templates. This is where you'll manage the HTML and Handlebars for each partial of your knowledge base.


Since you only have to provide the content for each page, not the whole HTML (include <head> tags, <link>s, etc.), we call each section you can edit a partial. There's 7 total partials, 6 of which you can edit. Here's a breakdown of what you'll find in Settings > Templates.

Partial Name



This is the default template that includes the main layout of the HTML. It's maintained by us here at HelpDocs and isn't user editable. This is where we insert metadata for SEO, our required Javascript libraries, add your integrations, etc.


You should add your header bar and navigation in here. This appears on every page of your knowledge base. Depending on how you wanna structure your theme, this might also be the right place for your search bar and maybe some secondary navigation like a sidebar. If you need to register inline partials for use in all templates, here's a good place to do that too.


This gets added after your main content (e.g. after the category or article that's being displayed). You can use this to mirror the footer on your main website, or add any scripts to your site that you want before the closing </body> tag.


The entry point of your knowledge base. This is where you display all your categories, so users can easily navigate to a category or article.


Display a single category and all its articles.


Display a single article.


Display search results. Custom templates ship with instant search as standard, but this page is shown when someone hits return in the search bar regardless.

Context Data by Partial

We pass through context data you can use in the templates. This differs slightly on each partial so you only have the information that's actually relevant to that page. Data can be accessed using Handlebars data accessors, e.g. <<categories>>



Available in Partial(s)





category_id: String,
parent_category_id: String,
slug: String,
title: String,
description: String,
url: String,
relative_url: String,
icon: String,
is_featured: Boolean,
created_at: Date,
updated_at: Date,
articles: [Article],
authors: [Author]
meta: {
num_authors: Number,
num_articles: Number,

category.hbs, article.hbs


article_id: String,
category_id: String,
user_id: String,
author: {
profile_image: String,
email: String,
name: String,
slug: String,
title: String,
description: String,
url: String,
relative_url: String,
short_version: String,
body: String,
is_published: Boolean,
is_private: Boolean,
is_featured: Boolean,
show_toc: Boolean,
created_at: Date,
updated_at: Date,
tags: [String]

The full article object is available in article.hbs. In other partials, some fields (notably body) may be missing.


"My super awesome search term"



canonical: String,
home_path: String,
sidebar_categories: [Category],
related_articles: [Article],
top_articles: [Article],
language_code: String,
languages: [
code: String,
name: String,
default_language_code: String,
account_id: String,
is_home_page: Boolean,

meta is available on all partials, but some of its attributes may not be available on some partials. Notably top_articles is only available in home.hbs and related_articles is only available in article.hbs

The header and footer partials inherit the context of the page that's currently being rendered. So if you're rendering an article page, the header and footer will have access to that context, etc.

Starter Templates

It's not always fun, desirable, or time-sensible (totally a phrase now 😹) to create a template totally from scratch. Here's a few of our default layouts you can start with. They're in .zip files, so just unzip, and follow the instructions in

  1. Curve
  2. Boxed
  3. Bars
  4. eCommerce

What did you think of this doc?