Entries

An entry is a Hugo content file: frontmatter on top, Markdown underneath. Emet reads the frontmatter into a form, hands the body to the editor, and on save writes the whole thing back as the same kind of file you’d have written by hand. If you open the file in a text editor afterwards, it should look like you did.

Which folders show up, and which fields each entry has, comes from the sections block of admin/site.yaml. See Sections for the config; this page is about what you do with them.

The entry list#

Pick a section in the sidebar and you get its entries, with _index.md pinned to the top and everything else sorted by date, newest first, falling back to title for entries without a date.

On GitHub-hosted sites, you’ll see filenames first and titles and dates a moment later. Fetching every file in full just to list it would be slow, so Emet shows you what it has and fills in the rest in the background.

Above the list there’s a search box (fuzzy, on titles; Ctrl+F jumps to it when you’re not in an editor) and a status filter with All, Draft, Scheduled and Published. An entry is a draft if its frontmatter says draft: true, regardless of date; a non-draft entry with a future date is scheduled; everything else is published. The filter survives drilling into subfolders but resets when you change section or language.

On a multilingual site the same menu has a second group of translation filters: a Missing in option for each language other than the one you’re viewing, which shows the entries that have no copy in that language; Untranslated anywhere, for entries that exist in no other language at all (only offered with three or more languages); and Translation outdated, for entries whose source has changed since the translation was last edited (see Keeping translations up to date). The search box works on top of all of them.

Under the header, once translation statuses have loaded, a line like DE 9/12 · FR 12/12 summarises how many of the listed entries exist in each other language. It counts only what’s loaded in the current folder, so it’s instant and doesn’t cost extra requests. Click a language to apply its Missing in filter; click it again to clear it. Incomplete languages are tinted amber.

Entries with unsaved changes get an amber dot. If you use the publication workflow, entries that differ from the production branch get an orange left border, so you can see at a glance what’s still waiting to go live. With entry review turned on, cards also carry the entry’s review state.

Each card shows the title and, on a second line, the date. A section can swap that line for something more useful with list.subtitle in site.yaml: the file’s path within the section, its slug, or any frontmatter field (see Sections). When a field is used, the date follows it.

Each entry card has a More actions menu with Translate (on multilingual sites), Duplicate, View on site (needs site.url) and Delete. The checkbox icon in the list header turns on selection mode, which is how you get to bulk actions.

Recent entries#

Pick Recent at the top of the section picker (it’s also what the sidebar shows before you choose a section) and you get the last fifteen entries you opened or saved on this site, newest first. The list is yours alone, kept in the browser, and survives a reload. On GitHub-hosted sites there’s a second tab, Changed, which reads the last fifteen commits that touched content on your branch and lists the entries they changed, with who made the commit and when; it’s handy for seeing what a colleague did this morning.

Searching every section#

Ctrl+K (or the magnifying glass in the header) opens a search across all sections. With nothing typed it shows your recent entries. As you type it matches titles, fuzzily, grouped by section, and then body text, with a snippet around the first hit. Each result links to the entry, with a View on site icon when site.url is set.

Titles come from whatever Emet has already seen: sections you’ve browsed are complete, and sections you haven’t are listed by filename when the search opens. Body text is only searchable for files Emet has already fetched. The footer says how many of the known entries that is, and Index all fetches the rest, including subfolders, so nothing fans out across the repository until you ask for it.

Subfolders#

Hugo lets you nest content as deep as you like, and so does Emet. Subfolders inside a section appear as folder cards; click one to drill in, and use the breadcrumbs at the top of the list to get back out. If a subfolder is itself a declared section in site.yaml, clicking it switches to that section instead.

The folder icon in the header creates a new subfolder. You give it a title and a slug, and Emet writes a <slug>/_index.md with that title and today’s date, which is what Hugo needs to treat the folder as a section.

Creating an entry#

Click the + button in the list header. The modal asks for a title and shows the filename it’s going to use, which is the title slugified. You can edit the filename directly if you don’t like the result; whatever you type gets slugified too, so you can’t end up with spaces or capitals in it.

If the section has a slug pattern, the full filename is shown underneath. The pattern can use {{slug}}, {{year}}, {{month}} and {{day}}:

sections:
  blog:
    folder: content/blog
    slug: "{{year}}/{{slug}}"   # 2026/my-first-post.md

New entries start from the section’s archetype if it has one, and otherwise from a minimal frontmatter of title, date and draft: true. Either way the title is what you typed, the date is now and the entry is a draft, even if the archetype says otherwise.

Set create: false on a section to take the button away.

Editing an entry#

Opening an entry gives you a column with the frontmatter form at the top and the body editor below it. The frontmatter panel collapses (click Fields) and resizes (drag its bottom edge), and in focus mode it disappears along with everything else that isn’t the body.

To the right, optionally, is the preview pane, and beyond that a panel with SEO, AI and Comments tabs, depending on what’s enabled. On a multilingual site, opening a translation side by side puts the source entry in a column on the left.

The frontmatter form#

Fields come from the section config, rendered according to their type; see Fields for all of them. A few things live in the panel that aren’t in your config:

  • URL settings: a Slug field (Hugo’s slug, empty by default, meaning the filename is used), an Aliases list, and the Filename. Editing the filename renames the file on your next save, which changes the page URL and, on multilingual sites, detaches the entry from its translations. Aliases are validated against Hugo’s rules, and an invalid one blocks saving until you fix it. Section index files can’t be renamed.
  • Inherited values: if an ancestor _index.md sets a value through Hugo’s cascade, the field shows it as inherited with an Override button. On a section’s own _index.md there’s a cascade editor for setting those values.
  • Extra keys: any frontmatter key that isn’t in the section config is still shown, with a type guessed from its value, and there’s an Add field row at the bottom for adding new ones. Emet never drops keys it doesn’t know about.

The draft field doesn’t appear in the form. It’s handled by the toggle in the panel header instead.

Draft, published, scheduled#

The Draft / Publish toggle in the panel header sets draft in the frontmatter. Clicking Publish on a draft asks you to confirm and offers to set the date to now, which is usually what you want for a post you’ve just finished. If the date is in the future the button reads Schedule instead, and the entry shows as scheduled until that time passes.

Note that scheduling only works if your site is rebuilt after the date arrives, which is your CI’s job, not Emet’s. If you’re using the publication workflow and a scheduled entry hasn’t reached the production branch yet, the panel says so.

Saving#

Ctrl+S (Cmd+S on a Mac), the save icon in the panel header, or :w if you’re in Vim mode. On GitHub-hosted sites every save is a commit to your branch; the commit message gets a [skip ci] suffix for drafts, so your site doesn’t rebuild for content nobody can see yet. Scheduled entries get a normal commit, since Hugo will build them as soon as their date arrives. See Sync for the details of that.

Unsaved edits live in your browser’s local storage, so a refresh or an accidental tab close doesn’t lose them. Navigating away from a dirty entry inside Emet prompts you first. There’s also a Discard link next to the save icon.

Conflicts#

If someone else commits to the file while you have unsaved changes, Emet notices when you try to save and shows you the recent commits to that file. You get two choices: Keep My Changes, which means your version overwrites theirs on the next save, or Use Latest Version, which throws away your edits and loads what’s on the branch.

Duplicating and deleting#

Duplicate in the card menu asks for a new title and creates a copy. Index pages can’t be duplicated.

Delete asks for confirmation first. The file is removed from your repository in a commit, so it’s recoverable from Git history, but it’s gone from the site on the next build. On GitHub-hosted sites a single delete is queued and pushed by the next sync, which means it can take up to half a minute to reach GitHub.

Where next?#