Sections

A section is a folder of content whose entries share a set of frontmatter fields: posts, pages, projects, docs. The sections block of site.yaml is where you tell Emet which folders those are and what the form for each one should look like. The sidebar lists the sections, the entry list shows what’s in the one you pick, and the frontmatter panel is built from its fields.

A section#

sections:
  blog:
    label: Blog posts
    label_singular: Blog post
    folder: content/blog
    slug: "{{year}}/{{slug}}"
    fields:
      - name: title
        type: string
        required: true
      - name: date
        type: datetime
      - name: tags
        type: list
    body:
      shortcodes: true

The key (blog here) identifies the section. It’s also the default folder and label, so blog: {} is a valid section: Emet will look in content/blog, call it “blog” and show no configured fields. You’d still be able to edit entries, because frontmatter keys that aren’t in the config are shown anyway (see Entries), but you’d lose the type-appropriate widgets.

Key What it does Default
label Name in the sidebar and above the entry list. the key
label_singular Used in the create dialog’s title. label
folder Path to the content, relative to the Hugo root. Prefixed with base_path if you have one. content/<key>
create Whether entries can be created. false removes the + button and the Duplicate action. true
delete Whether entries can be deleted. false hides the delete action for this section’s entries. true
sort Entry list order, as field (date or title) and direction (asc or desc, and asc if you leave it out). _index.md is always pinned to the top, and any other field falls back to the default order. date, descending
slug Filename pattern for new entries. See below. {{slug}}
permalink URL pattern to fall back on when Emet can’t read your Hugo config. See below. none
identifier_field Which frontmatter field to show as an entry’s title in the list. title
list.subtitle What to show under the title on each entry card: date, path (the file’s path within the section), slug, or the name of a frontmatter field. A field value is shown before the date. date
fields The frontmatter form. See Fields. []
field_groups Collapsible groups for the form. See below. none
body.shortcodes Show the shortcode insert menu in the editor for this section. Shortcodes already in a file are shown and preserved either way. false

Filenames#

When someone creates an entry, Emet slugifies the title and runs it through the slug pattern to get a filename. Four variables are available: {{slug}} for the slugified title, and {{year}}, {{month}} and {{day}} for today’s date. .md is added if the pattern doesn’t end in it, and slashes make subfolders:

slug: "{{year}}/{{month}}/{{slug}}"    # 2026/10/my-post.md
slug: "{{year}}-{{month}}-{{day}}-{{slug}}"   # 2026-10-10-my-post.md

The create dialog shows the resulting filename before you commit to it, and lets you edit the slug part.

Emet needs each page’s URL for the View on site buttons and entry card menus, global search, the publish dialog, SEO analysis, social previews and the Hugo server preview. It works the URL out the way Hugo does, from your Hugo config: hugo.toml and friends, or config/_default merged with one environment (production unless preview.hugo_environment says otherwise). There’s nothing to copy into site.yaml.

  • A url in the frontmatter wins.
  • Otherwise the first matching [permalinks] rule applies. Hugo’s forms all work: section keys, which also cover the sections below them; the per-kind tables ([permalinks.page], [permalinks.section], [permalinks.term] and the rest); the [[permalinks]] list with target matchers; and a language’s own permalinks.
  • Otherwise the page goes where Hugo puts it by default: the file’s path under the content directory. content/docs/guides/setup.md is /docs/guides/setup/, a leaf bundle content/blog/post/index.md is /blog/post/, and a slug in the frontmatter replaces the last part.

Slugs and titles are cleaned up as Hugo does it, so slug: " Café/Ünïcode Thing!" becomes /café/ünïcode-thing/. Every token Hugo knows works, including the :sections[1:] slices and Go date layouts such as :2006. Emet also follows uglyURLs, disablePathToLower, removePathAccents, defaultContentLanguageInSubdir, timeZone, [taxonomies], the [frontmatter] date settings and disabled languages. A page Hugo doesn’t publish (build.render: never, including through cascade) gets no link.

Where the URL depends on something Emet can’t see, the page gets no link rather than a wrong one: dates taken from Git (:git) or the file’s modification time, and :sectionslug/:sectionslugs, which need the slug of every section above the page. A slug on a section’s _index.md renames the section’s own URL, but not yet the pages under it, which Hugo does since 0.167.

If Emet can’t read your Hugo config, it falls back to a permalink pattern on the section:

permalink: /:year/:month/:slug/

It applies to regular pages in the section’s folder and the folders below it, with the deepest section winning, and takes the same tokens as Hugo. When the Hugo config can be read it wins and this key is ignored, so an out-of-date copy can’t send links to the wrong place. The setup wizard no longer writes it.

Field groups#

A long form is easier to use in sections. field_groups splits it into collapsible panels:

field_groups:
  - name: main
    label: Content
    fields: [title, date, tags]
  - name: seo
    label: SEO
    fields: [description, image]
    collapsed: true

Each group lists field names from fields, and collapsed: true starts it closed. The groups appear in the order given, with the built-in slug, aliases and filename fields and any unconfigured frontmatter keys after them.

Note that once you have groups, a configured field that isn’t in any group doesn’t appear at all, so put every field somewhere.

Nested sections#

If one section’s folder is inside another’s (content/docs and content/docs/reference, say), the sidebar shows the child indented under its parent, and drilling into that subfolder from the parent’s entry list switches to the child section. You don’t have to declare subfolders to browse them; declaring one is how you give it its own fields.

Fields#

The field types and their options have their own page: Fields. Two things worth knowing at the section level: if you’re migrating from Decap or Netlify CMS, widget: is accepted as an alias for type:, and if two fields share a name Emet warns in the browser console and uses the last one.

Options that don’t do anything#

Some keys are accepted without complaint and then ignored. Older versions of these docs listed them as working, so if you have them in your config, this is why nothing happened.

preview_path, summary, nested, filter.exclude_folders and the whole body.formatting block are never read, and you can delete them.